diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..40974c0
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+  <head>
+    <style>
+      body *:not(script) {
+        display: block;
+        position: relative;
+        width: 250px;
+        margin: 0px;
+        padding: 0px;
+        left: calc(50vw - 125px);
+        top: 20vh;
+      }
+    </style>
+  </head>
+  <body>
+    <audio controls autoplay></audio>
+    <select></select>
+    <textarea></textarea>
+    <button>Save generated WAV file</button>
+    <a target="_blank" href="https://github.com/guest271314/vits-web/tree/patch-1/docs">Source code on GitHub</a>
+    <script type="module" src="./index.js"></script>
+  </body>
+</html>
diff --git a/docs/index.js b/docs/index.js
new file mode 100644
index 0000000..61b28da
--- /dev/null
+++ b/docs/index.js
@@ -0,0 +1,411 @@
+import { createPiperPhonemize } from "./piper.js";
+import * as ort from "./onyx-runtimeweb.js";
+
+const HF_BASE =
+  "https://huggingface.co/diffusionstudio/piper-voices/resolve/main";
+const ONNX_BASE =
+  "https://cdnjs.cloudflare.com/ajax/libs/onnxruntime-web/1.18.0/";
+const WASM_BASE =
+  "https://cdn.jsdelivr.net/npm/@diffusionstudio/piper-wasm@1.0.0/build/piper_phonemize";
+const PATH_MAP = {
+  "ar_JO-kareem-low": "ar/ar_JO/kareem/low/ar_JO-kareem-low.onnx",
+  "ar_JO-kareem-medium": "ar/ar_JO/kareem/medium/ar_JO-kareem-medium.onnx",
+  "ca_ES-upc_ona-medium": "ca/ca_ES/upc_ona/medium/ca_ES-upc_ona-medium.onnx",
+  "ca_ES-upc_ona-x_low": "ca/ca_ES/upc_ona/x_low/ca_ES-upc_ona-x_low.onnx",
+  "ca_ES-upc_pau-x_low": "ca/ca_ES/upc_pau/x_low/ca_ES-upc_pau-x_low.onnx",
+  "cs_CZ-jirka-low": "cs/cs_CZ/jirka/low/cs_CZ-jirka-low.onnx",
+  "cs_CZ-jirka-medium": "cs/cs_CZ/jirka/medium/cs_CZ-jirka-medium.onnx",
+  "da_DK-talesyntese-medium":
+    "da/da_DK/talesyntese/medium/da_DK-talesyntese-medium.onnx",
+  "de_DE-eva_k-x_low": "de/de_DE/eva_k/x_low/de_DE-eva_k-x_low.onnx",
+  "de_DE-karlsson-low": "de/de_DE/karlsson/low/de_DE-karlsson-low.onnx",
+  "de_DE-kerstin-low": "de/de_DE/kerstin/low/de_DE-kerstin-low.onnx",
+  "de_DE-mls-medium": "de/de_DE/mls/medium/de_DE-mls-medium.onnx",
+  "de_DE-pavoque-low": "de/de_DE/pavoque/low/de_DE-pavoque-low.onnx",
+  "de_DE-ramona-low": "de/de_DE/ramona/low/de_DE-ramona-low.onnx",
+  "de_DE-thorsten-high": "de/de_DE/thorsten/high/de_DE-thorsten-high.onnx",
+  "de_DE-thorsten-low": "de/de_DE/thorsten/low/de_DE-thorsten-low.onnx",
+  "de_DE-thorsten-medium":
+    "de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx",
+  "de_DE-thorsten_emotional-medium":
+    "de/de_DE/thorsten_emotional/medium/de_DE-thorsten_emotional-medium.onnx",
+  "el_GR-rapunzelina-low":
+    "el/el_GR/rapunzelina/low/el_GR-rapunzelina-low.onnx",
+  "en_GB-alan-low": "en/en_GB/alan/low/en_GB-alan-low.onnx",
+  "en_GB-alan-medium": "en/en_GB/alan/medium/en_GB-alan-medium.onnx",
+  "en_GB-alba-medium": "en/en_GB/alba/medium/en_GB-alba-medium.onnx",
+  "en_GB-aru-medium": "en/en_GB/aru/medium/en_GB-aru-medium.onnx",
+  "en_GB-cori-high": "en/en_GB/cori/high/en_GB-cori-high.onnx",
+  "en_GB-cori-medium": "en/en_GB/cori/medium/en_GB-cori-medium.onnx",
+  "en_GB-jenny_dioco-medium":
+    "en/en_GB/jenny_dioco/medium/en_GB-jenny_dioco-medium.onnx",
+  "en_GB-northern_english_male-medium":
+    "en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx",
+  "en_GB-semaine-medium": "en/en_GB/semaine/medium/en_GB-semaine-medium.onnx",
+  "en_GB-southern_english_female-low":
+    "en/en_GB/southern_english_female/low/en_GB-southern_english_female-low.onnx",
+  "en_GB-vctk-medium": "en/en_GB/vctk/medium/en_GB-vctk-medium.onnx",
+  "en_US-amy-low": "en/en_US/amy/low/en_US-amy-low.onnx",
+  "en_US-amy-medium": "en/en_US/amy/medium/en_US-amy-medium.onnx",
+  "en_US-arctic-medium": "en/en_US/arctic/medium/en_US-arctic-medium.onnx",
+  "en_US-danny-low": "en/en_US/danny/low/en_US-danny-low.onnx",
+  "en_US-hfc_female-medium":
+    "en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx",
+  "en_US-hfc_male-medium":
+    "en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx",
+  "en_US-joe-medium": "en/en_US/joe/medium/en_US-joe-medium.onnx",
+  "en_US-kathleen-low": "en/en_US/kathleen/low/en_US-kathleen-low.onnx",
+  "en_US-kristin-medium": "en/en_US/kristin/medium/en_US-kristin-medium.onnx",
+  "en_US-kusal-medium": "en/en_US/kusal/medium/en_US-kusal-medium.onnx",
+  "en_US-l2arctic-medium":
+    "en/en_US/l2arctic/medium/en_US-l2arctic-medium.onnx",
+  "en_US-lessac-high": "en/en_US/lessac/high/en_US-lessac-high.onnx",
+  "en_US-lessac-low": "en/en_US/lessac/low/en_US-lessac-low.onnx",
+  "en_US-lessac-medium": "en/en_US/lessac/medium/en_US-lessac-medium.onnx",
+  "en_US-libritts-high": "en/en_US/libritts/high/en_US-libritts-high.onnx",
+  "en_US-libritts_r-medium":
+    "en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx",
+  "en_US-ljspeech-high": "en/en_US/ljspeech/high/en_US-ljspeech-high.onnx",
+  "en_US-ljspeech-medium":
+    "en/en_US/ljspeech/medium/en_US-ljspeech-medium.onnx",
+  "en_US-ryan-high": "en/en_US/ryan/high/en_US-ryan-high.onnx",
+  "en_US-ryan-low": "en/en_US/ryan/low/en_US-ryan-low.onnx",
+  "en_US-ryan-medium": "en/en_US/ryan/medium/en_US-ryan-medium.onnx",
+  "es_ES-carlfm-x_low": "es/es_ES/carlfm/x_low/es_ES-carlfm-x_low.onnx",
+  "es_ES-davefx-medium": "es/es_ES/davefx/medium/es_ES-davefx-medium.onnx",
+  "es_ES-mls_10246-low": "es/es_ES/mls_10246/low/es_ES-mls_10246-low.onnx",
+  "es_ES-mls_9972-low": "es/es_ES/mls_9972/low/es_ES-mls_9972-low.onnx",
+  "es_ES-sharvard-medium":
+    "es/es_ES/sharvard/medium/es_ES-sharvard-medium.onnx",
+  "es_MX-ald-medium": "es/es_MX/ald/medium/es_MX-ald-medium.onnx",
+  "es_MX-claude-high": "es/es_MX/claude/high/es_MX-claude-high.onnx",
+  "fa_IR-amir-medium": "fa/fa_IR/amir/medium/fa_IR-amir-medium.onnx",
+  "fa_IR-gyro-medium": "fa/fa_IR/gyro/medium/fa_IR-gyro-medium.onnx",
+  "fi_FI-harri-low": "fi/fi_FI/harri/low/fi_FI-harri-low.onnx",
+  "fi_FI-harri-medium": "fi/fi_FI/harri/medium/fi_FI-harri-medium.onnx",
+  "fr_FR-gilles-low": "fr/fr_FR/gilles/low/fr_FR-gilles-low.onnx",
+  "fr_FR-mls-medium": "fr/fr_FR/mls/medium/fr_FR-mls-medium.onnx",
+  "fr_FR-mls_1840-low": "fr/fr_FR/mls_1840/low/fr_FR-mls_1840-low.onnx",
+  "fr_FR-siwis-low": "fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx",
+  "fr_FR-siwis-medium": "fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx",
+  "fr_FR-tom-medium": "fr/fr_FR/tom/medium/fr_FR-tom-medium.onnx",
+  "fr_FR-upmc-medium": "fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx",
+  "hu_HU-anna-medium": "hu/hu_HU/anna/medium/hu_HU-anna-medium.onnx",
+  "hu_HU-berta-medium": "hu/hu_HU/berta/medium/hu_HU-berta-medium.onnx",
+  "hu_HU-imre-medium": "hu/hu_HU/imre/medium/hu_HU-imre-medium.onnx",
+  "is_IS-bui-medium": "is/is_IS/bui/medium/is_IS-bui-medium.onnx",
+  "is_IS-salka-medium": "is/is_IS/salka/medium/is_IS-salka-medium.onnx",
+  "is_IS-steinn-medium": "is/is_IS/steinn/medium/is_IS-steinn-medium.onnx",
+  "is_IS-ugla-medium": "is/is_IS/ugla/medium/is_IS-ugla-medium.onnx",
+  "it_IT-riccardo-x_low": "it/it_IT/riccardo/x_low/it_IT-riccardo-x_low.onnx",
+  "ka_GE-natia-medium": "ka/ka_GE/natia/medium/ka_GE-natia-medium.onnx",
+  "kk_KZ-iseke-x_low": "kk/kk_KZ/iseke/x_low/kk_KZ-iseke-x_low.onnx",
+  "kk_KZ-issai-high": "kk/kk_KZ/issai/high/kk_KZ-issai-high.onnx",
+  "kk_KZ-raya-x_low": "kk/kk_KZ/raya/x_low/kk_KZ-raya-x_low.onnx",
+  "lb_LU-marylux-medium": "lb/lb_LU/marylux/medium/lb_LU-marylux-medium.onnx",
+  "ne_NP-google-medium": "ne/ne_NP/google/medium/ne_NP-google-medium.onnx",
+  "ne_NP-google-x_low": "ne/ne_NP/google/x_low/ne_NP-google-x_low.onnx",
+  "nl_BE-nathalie-medium":
+    "nl/nl_BE/nathalie/medium/nl_BE-nathalie-medium.onnx",
+  "nl_BE-nathalie-x_low": "nl/nl_BE/nathalie/x_low/nl_BE-nathalie-x_low.onnx",
+  "nl_BE-rdh-medium": "nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx",
+  "nl_BE-rdh-x_low": "nl/nl_BE/rdh/x_low/nl_BE-rdh-x_low.onnx",
+  "nl_NL-mls-medium": "nl/nl_NL/mls/medium/nl_NL-mls-medium.onnx",
+  "nl_NL-mls_5809-low": "nl/nl_NL/mls_5809/low/nl_NL-mls_5809-low.onnx",
+  "nl_NL-mls_7432-low": "nl/nl_NL/mls_7432/low/nl_NL-mls_7432-low.onnx",
+  "no_NO-talesyntese-medium":
+    "no/no_NO/talesyntese/medium/no_NO-talesyntese-medium.onnx",
+  "pl_PL-darkman-medium": "pl/pl_PL/darkman/medium/pl_PL-darkman-medium.onnx",
+  "pl_PL-gosia-medium": "pl/pl_PL/gosia/medium/pl_PL-gosia-medium.onnx",
+  "pl_PL-mc_speech-medium":
+    "pl/pl_PL/mc_speech/medium/pl_PL-mc_speech-medium.onnx",
+  "pl_PL-mls_6892-low": "pl/pl_PL/mls_6892/low/pl_PL-mls_6892-low.onnx",
+  "pt_BR-edresson-low": "pt/pt_BR/edresson/low/pt_BR-edresson-low.onnx",
+  "pt_BR-faber-medium": "pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx",
+  "pt_PT-tugão-medium": "pt/pt_PT/tugão/medium/pt_PT-tugão-medium.onnx",
+  "ro_RO-mihai-medium": "ro/ro_RO/mihai/medium/ro_RO-mihai-medium.onnx",
+  "ru_RU-denis-medium": "ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx",
+  "ru_RU-dmitri-medium": "ru/ru_RU/dmitri/medium/ru_RU-dmitri-medium.onnx",
+  "ru_RU-irina-medium": "ru/ru_RU/irina/medium/ru_RU-irina-medium.onnx",
+  "ru_RU-ruslan-medium": "ru/ru_RU/ruslan/medium/ru_RU-ruslan-medium.onnx",
+  "sk_SK-lili-medium": "sk/sk_SK/lili/medium/sk_SK-lili-medium.onnx",
+  "sl_SI-artur-medium": "sl/sl_SI/artur/medium/sl_SI-artur-medium.onnx",
+  "sr_RS-serbski_institut-medium":
+    "sr/sr_RS/serbski_institut/medium/sr_RS-serbski_institut-medium.onnx",
+  "sv_SE-nst-medium": "sv/sv_SE/nst/medium/sv_SE-nst-medium.onnx",
+  "sw_CD-lanfrica-medium":
+    "sw/sw_CD/lanfrica/medium/sw_CD-lanfrica-medium.onnx",
+  "tr_TR-dfki-medium": "tr/tr_TR/dfki/medium/tr_TR-dfki-medium.onnx",
+  "tr_TR-fahrettin-medium":
+    "tr/tr_TR/fahrettin/medium/tr_TR-fahrettin-medium.onnx",
+  "tr_TR-fettah-medium": "tr/tr_TR/fettah/medium/tr_TR-fettah-medium.onnx",
+  "uk_UA-lada-x_low": "uk/uk_UA/lada/x_low/uk_UA-lada-x_low.onnx",
+  "uk_UA-ukrainian_tts-medium":
+    "uk/uk_UA/ukrainian_tts/medium/uk_UA-ukrainian_tts-medium.onnx",
+  "vi_VN-25hours_single-low":
+    "vi/vi_VN/25hours_single/low/vi_VN-25hours_single-low.onnx",
+  "vi_VN-vais1000-medium":
+    "vi/vi_VN/vais1000/medium/vi_VN-vais1000-medium.onnx",
+  "vi_VN-vivos-x_low": "vi/vi_VN/vivos/x_low/vi_VN-vivos-x_low.onnx",
+  "zh_CN-huayan-medium": "zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx",
+  "zh_CN-huayan-x_low": "zh/zh_CN/huayan/x_low/zh_CN-huayan-x_low.onnx",
+};
+
+function pcm2wav(buffer, numChannels, sampleRate) {
+  const bufferLength = buffer.length;
+  const view = new DataView(
+    new ArrayBuffer(bufferLength * numChannels * 2 + 44),
+  );
+  view.setUint32(0, 0x46464952, true);
+  view.setUint32(4, view.buffer.byteLength - 8, true);
+  view.setUint32(8, 0x45564157, true);
+  view.setUint32(12, 0x20746d66, true);
+  view.setUint32(16, 0x10, true);
+  view.setUint16(20, 0x0001, true);
+  view.setUint16(22, numChannels, true);
+  view.setUint32(24, sampleRate, true);
+  view.setUint32(28, numChannels * 2 * sampleRate, true);
+  view.setUint16(32, numChannels * 2, true);
+  view.setUint16(34, 16, true);
+  view.setUint32(36, 0x61746164, true);
+  view.setUint32(40, 2 * bufferLength, true);
+  let p = 44;
+  for (let i = 0; i < bufferLength; i++) {
+    const v = buffer[i];
+    if (v >= 1) view.setInt16(p, 0x7fff, true);
+    else if (v <= -1) view.setInt16(p, -0x8000, true);
+    else view.setInt16(p, (v * 0x8000) | 0, true);
+    p += 2;
+  }
+  return view.buffer;
+}
+
+async function predict(config, callback) {
+  const path = PATH_MAP[config.voiceId];
+  const input = JSON.stringify([
+    {
+      text: config.text.trim(),
+    },
+  ]);
+  const piperPhonemizeWasm = (await createBlobUrl(`${WASM_BASE}.wasm`)).url;
+  const piperPhonemizeData = (await createBlobUrl(`${WASM_BASE}.data`)).url;
+  ort.env.wasm.numThreads = navigator.hardwareConcurrency;
+  ort.env.wasm.wasmPaths = ONNX_BASE;
+  const modelConfigBlob = (await createBlobUrl(`${HF_BASE}/${path}.json`)).blob;
+  const modelConfig = JSON.parse(await modelConfigBlob.text());
+  const phonemeIds = await new Promise(async (resolve) => {
+    const module = await createPiperPhonemize({
+      print: (data) => {
+        resolve(JSON.parse(data).phoneme_ids);
+      },
+      printErr: (message) => {
+        throw new Error(message);
+      },
+      locateFile: (url) => {
+        if (url.endsWith(".wasm")) return piperPhonemizeWasm;
+        if (url.endsWith(".data")) return piperPhonemizeData;
+        return url;
+      },
+    });
+    module.callMain([
+      "-l",
+      modelConfig.espeak.voice,
+      "--input",
+      input,
+      "--espeak_data",
+      "/espeak-ng-data",
+    ]);
+  });
+  const sampleRate = modelConfig.audio.sample_rate;
+  const noiseScale = modelConfig.inference.noise_scale;
+  const lengthScale = modelConfig.inference.length_scale;
+  const noiseW = modelConfig.inference.noise_w;
+  const modelBlob = (await createBlobUrl(`${HF_BASE}/${path}`, callback)).url;
+  const session = await ort.InferenceSession.create(modelBlob);
+  const feeds = {
+    input: new ort.Tensor("int64", phonemeIds, [1, phonemeIds.length]),
+    input_lengths: new ort.Tensor("int64", [phonemeIds.length]),
+    scales: new ort.Tensor("float32", [noiseScale, lengthScale, noiseW]),
+  };
+  if (Object.keys(modelConfig.speaker_id_map).length) {
+    Object.assign(feeds, {
+      sid: new ort.Tensor("int64", [0]),
+    });
+  }
+  const {
+    output: { data: pcm },
+  } = await session.run(feeds);
+  return new Blob([pcm2wav(pcm, 1, sampleRate)], {
+    type: "audio/x-wav",
+  });
+}
+
+async function writeBlob(url, blob) {
+  if (!url.match("https://huggingface.co")) {
+    return;
+  }
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle("piper", {
+      create: true,
+    });
+    const path = url.split("/").at(-1);
+    const file = await dir.getFileHandle(path, {
+      create: true,
+    });
+    const writable = await file.createWritable();
+    await writable.write(blob);
+    await writable.close();
+  } catch (e) {
+    console.error(e);
+  }
+}
+async function removeBlob(url) {
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle("piper");
+    const path = url.split("/").at(-1);
+    const file = await dir.getFileHandle(path);
+    await file.remove();
+  } catch (e) {
+    console.error(e);
+  }
+}
+async function readBlob(url) {
+  if (!url.match("https://huggingface.co")) {
+    return;
+  }
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle("piper", {
+      create: true,
+    });
+    const path = url.split("/").at(-1);
+    const file = await dir.getFileHandle(path);
+    return await file.getFile();
+  } catch (e) {
+    return undefined;
+  }
+}
+
+async function createBlobUrl(url, callback) {
+  let blob = await readBlob(url);
+  if (!blob) {
+    blob = await fetchBlob(url, callback);
+    await writeBlob(url, blob);
+  }
+  return {
+    url: URL.createObjectURL(blob),
+    blob,
+  };
+}
+// export { predict as predict };
+async function download(voiceId, callback) {
+  const path = PATH_MAP[voiceId];
+  const urls = [`${HF_BASE}/${path}`, `${HF_BASE}/${path}.json`];
+  await Promise.all(urls.map(async (url) => {
+    writeBlob(
+      url,
+      await fetchBlob(url, url.endsWith(".onnx") ? callback : undefined),
+    );
+  }));
+}
+async function remove(voiceId) {
+  const path = PATH_MAP[voiceId];
+  const urls = [`${HF_BASE}/${path}`, `${HF_BASE}/${path}.json`];
+  await Promise.all(urls.map((url) => removeBlob(url)));
+}
+async function stored() {
+  const root = await navigator.storage.getDirectory();
+  const dir = await root.getDirectoryHandle("piper", {
+    create: true,
+  });
+  const result = [];
+  for await (const name of dir.keys()) {
+    const key = name.split(".")[0];
+    if (name.endsWith(".onnx") && key in PATH_MAP) {
+      result.push(key);
+    }
+  }
+  return result;
+}
+async function flush() {
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle("piper");
+    await dir.remove({
+      recursive: true,
+    });
+  } catch (e) {
+    console.error(e);
+  }
+}
+// export { download as download };
+// export { remove as remove };
+// export { stored as stored };
+// export { flush as flush };
+
+async function fetchBlob(url) {
+  const request = await fetch(url);
+  const type = request.headers.get("content-type");
+  console.log(`Done fetching ${url}. Content-Type: ${type}`);
+  return new Blob([await request.arrayBuffer()], { type });
+}
+async function voices() {
+  const res = await fetch(`${HF_BASE}/voices.json`);
+  if (!res.ok) {
+    throw new Error("Could not retrieve voices file from huggingface");
+  }
+  return Object.values(await res.json());
+}
+
+const text = "Text to speech in the browser is amazing!";
+const select = document.querySelector("select");
+const audio = document.querySelector("audio");
+const textarea = document.querySelector("textarea");
+const button = document.querySelector("button");
+const a = document.querySelector("a");
+textarea.placeholder = text;
+const entries = Object.entries(PATH_MAP);
+
+for (let i = 0; i < entries.length + 1; i++) {
+  if (i === 0) {
+    select[i] = new Option(
+      "Choose a voice for Text-To-Speech:",
+      "",
+      true,
+      true,
+    );
+    continue;
+  }
+  const [key] = entries[i - 1];
+  select[i] = new Option(key);
+}
+
+let blobURL;
+
+select.addEventListener("change", async (e) => {
+  const value = e.target.value.trim();
+  if (value) {
+    await download(value);
+    const wav = await predict({
+      text: textarea.value.trim() ||
+        text,
+      voiceId: value,
+    });
+    if (blobURL?.length) {
+      URL.revokeObjectURL(blobURL);
+    }
+    blobURL = URL.createObjectURL(wav);
+    audio.src = blobURL;
+  }
+});
+
+button.addEventListener("click", (e) => {
+  if (blobURL) {
+    a.href = blobURL;
+    a.download = `${select.value}.wav`
+    a.click();
+  }
+});
+// export { voices as voices };
diff --git a/docs/onyx-runtimeweb.js b/docs/onyx-runtimeweb.js
new file mode 100644
index 0000000..7cb3c7a
--- /dev/null
+++ b/docs/onyx-runtimeweb.js
@@ -0,0 +1,1827 @@
+var W5=function(Q,H){if(!Q)throw new Error(typeof H=="string"?H:H())},N6=function(Q){return(new TextDecoder()).decode(Q)},$H=function(Q){switch(Q){case"bool":case"int8":case"uint8":return 1;case"int16":case"uint16":return 2;case"int32":case"uint32":case"float32":return 4;case"float64":return 8;default:throw new Error(`cannot calculate sizeof() on type ${Q}`)}},f7=function(Q){switch(Q){case o.onnx.TensorProto.DataType.UINT8:case o.onnx.TensorProto.DataType.INT8:case o.onnx.TensorProto.DataType.BOOL:return 1;case o.onnx.TensorProto.DataType.UINT16:case o.onnx.TensorProto.DataType.INT16:return 2;case o.onnx.TensorProto.DataType.FLOAT:case o.onnx.TensorProto.DataType.INT32:case o.onnx.TensorProto.DataType.UINT32:return 4;case o.onnx.TensorProto.DataType.INT64:case o.onnx.TensorProto.DataType.DOUBLE:case o.onnx.TensorProto.DataType.UINT64:return 8;default:throw new Error(`cannot calculate sizeof() on type ${o.onnx.TensorProto.DataType[Q]}`)}},LH=function(Q,H){return new(A2(H))(Q)},A2=function(Q){switch(Q){case"bool":case"uint8":return Uint8Array;case"int8":return Int8Array;case"int16":return Int16Array;case"uint16":return Uint16Array;case"int32":return Int32Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"float32":return Float32Array;case"float64":return Float64Array;default:throw new Error("unspecified error")}},M6=function(Q,H){if(H===o.onnx.TensorProto.DataType.INT64||H===q5.TensorDataType.INT64){if(Q.greaterThanOrEqual(2147483648)||Q.lessThan(-2147483648))throw new TypeError("int64 is not supported")}else if(H===o.onnx.TensorProto.DataType.UINT32||H===q5.TensorDataType.UINT32||H===o.onnx.TensorProto.DataType.UINT64||H===q5.TensorDataType.UINT64){if(Q.greaterThanOrEqual(4294967296)||Q.lessThan(0))throw new TypeError("uint64 is not supported")}else throw new TypeError(`not a LONG type: ${o.onnx.TensorProto.DataType[H]}`);return Q.toNumber()},l7=function(Q,H,j){switch(H){case o.onnx.TensorProto.DataType.BOOL:case o.onnx.TensorProto.DataType.UINT8:return Q.getUint8(j);case o.onnx.TensorProto.DataType.INT8:return Q.getInt8(j);case o.onnx.TensorProto.DataType.UINT16:return Q.getUint16(j,!0);case o.onnx.TensorProto.DataType.INT16:return Q.getInt16(j,!0);case o.onnx.TensorProto.DataType.FLOAT:return Q.getFloat32(j,!0);case o.onnx.TensorProto.DataType.INT32:return Q.getInt32(j,!0);case o.onnx.TensorProto.DataType.UINT32:return Q.getUint32(j,!0);case o.onnx.TensorProto.DataType.INT64:return M6(_3.fromBits(Q.getUint32(j,!0),Q.getUint32(j+4,!0),!1),H);case o.onnx.TensorProto.DataType.DOUBLE:return Q.getFloat64(j,!0);case o.onnx.TensorProto.DataType.UINT64:return M6(_3.fromBits(Q.getUint32(j,!0),Q.getUint32(j+4,!0),!0),H);default:throw new Error(`cannot read from DataView for type ${o.onnx.TensorProto.DataType[H]}`)}},r=function(Q){return Q===1?e2:Q0},vH=function(Q){let H=r(Q);return`${H.version}
+      precision highp float;
+      ${H.attribute} vec3 position;
+      ${H.attribute} vec2 textureCoord;
+
+      ${H.varyingVertex} vec2 TexCoords;
+
+      void main()
+      {
+          gl_Position = vec4(position, 1.0);
+          TexCoords = textureCoord;
+      }`},wH=function(Q){let H=r(Q);return`${H.version}
+    precision highp float;
+    precision highp int;
+    precision highp sampler2D;
+    ${H.varyingFrag} vec2 TexCoords;
+    ${H.outputDeclaration}
+    const vec2 halfCR = vec2(0.5, 0.5);
+
+    // Custom vector types to handle higher dimenalities.
+    struct ivec5
+    {
+      int x;
+      int y;
+      int z;
+      int w;
+      int u;
+    };
+
+    struct ivec6
+    {
+      int x;
+      int y;
+      int z;
+      int w;
+      int u;
+      int v;
+    };
+
+    int imod(int x, int y) {
+      return x - y * (x / y);
+    }
+
+    `},TH=function(Q,H){let j=r(Q);return`
+  void main() {
+    int indices[${H}];
+    toVec(TexCoords, indices);
+    vec4 result = vec4(process(indices));
+    ${j.output} = result;
+  }
+  `};async function u7(Q,H=(K)=>0,j){return new Promise((K,W)=>{let U=0,Z=()=>{if(Q()){K();return}U++;let q=H(U);if(j!=null&&U>=j){W();return}setTimeout(Z,q)};Z()})}var P5=function(Q){return W5(typeof Q<"u"&&Q.length!==0,()=>"empty string found for sampler name"),"get"+Q.charAt(0).toUpperCase()+Q.slice(1)},DH=function(Q){return W5(typeof Q<"u"&&Q.length!==0,()=>"empty string found for sampler name"),"get"+Q.charAt(0).toUpperCase()+Q.slice(1)+"AtOutCoords"},F4=function(Q,H){let j=JSON.parse(JSON.stringify(Q));return j=H,j},k4=function(Q,H){return H.map((j)=>Q[j]).join(", ")},P3=function(Q){if(Q<=1)return"int";if(Q===2)return"ivec2";if(Q===3)return"ivec3";if(Q===4)return"ivec4";if(Q===5)return"ivec5";if(Q===6)return"ivec6";throw Error(`GPU for rank ${Q} is not yet supported`)},H4=function(Q=6){return["x","y","z","w","u","v"].slice(0,Q)},_H=function(Q,H){return H4(H).map((j)=>`${Q}.${j}`)},n6=function(Q,H){return H===1?[Q]:_H(Q,H)},c4=function(){return`
+    float getChannel(vec4 frag, int dim) {
+      int modCoord = imod(dim, 2);
+      return modCoord == 0 ? frag.r : frag.g;
+    }
+
+    float getChannel(vec4 frag, vec2 innerDims) {
+      vec2 modCoord = mod(innerDims, 2.);
+      return modCoord.x == 0. ?
+        (modCoord.y == 0. ? frag.r : frag.g) :
+        (modCoord.y == 0. ? frag.b : frag.a);
+    }
+  `},PH=function(Q,H,j){if(Q===0)return"false";if(Q===1)return`rc > ${H[0]}`;let K="";for(let W=Q-2;W<Q;W++)K+=`${j[W]} >= ${H[W-Q+2]}`,W<Q-1&&(K+="||");return K},EH=function(Q,H){let j=Q.length;if(j===0)return"getA(), 0, 0, 0";if(j===1)return`getA(rc),
+            rc + 1 >= ${Q[0]} ? 0. : getA(rc + 1),
+            0, 0`;let K="r, c",W="r, cp1",U="rp1, c",Z="rp1, cp1",q="";if(j>2)for(let G=0;G<j-2;++G)q=q+`${H[G]},`;return`getA(${q}${K}),
+          rEdge ? 0. : getA(${q}${U}),
+          cEdge ? 0. : getA(${q}${W}),
+          rEdge || cEdge ? 0. : getA(${q}${Z})`},IH=function(Q,H,j,K){return Q===0||Q===1?"":`
+    int r = ${H[Q-2]};
+    int c = ${H[Q-1]};
+    int rp1 = ${H[Q-2]} + 1;
+    int cp1 = ${H[Q-1]} + 1;
+    bool rEdge = rp1 >= ${K};
+    bool cEdge = cp1 >= ${j};
+    `},s7=function(Q){if(Q.length===0)return[1,1,1];let H=1;for(let j=0;j<Q.length-2;++j)H*=Q[j];return[H,Q.length>1?Q[Q.length-2]:1,Q[Q.length-1]]},xH=function(Q,H){let j=!1;return Q.length===0||H.length===0?j=!0:Q.length<2||H.length<2?j=Q[Q.length-1]===H[H.length-1]:j=Q[Q.length-1]===H[H.length-1]&&Q[Q.length-2]===H[H.length-2],j},OH=function(Q){let H=u.computeStrides(Q),j=["b","r","c"],K="index";return`
+    ivec3 inputCoordsFromReshapedOutCoords(int index) {
+      ${H.map((W,U)=>{let Z=`int ${j[U]} = ${K} / ${W}`,q=U===H.length-1?`int ${j[U+1]} = ${K} - ${j[U]} * ${W}`:`index -= ${j[U]} * ${W}`;return`${Z}; ${q};`}).join("")}
+      return ivec3(b, r, c);
+    }
+  `},gH=function(Q){let H=u.computeStrides(Q);return`
+  int getFlattenedIndex(ivec3 coords) {
+    // reverse y, z order
+    return coords.x * ${H[0]} + coords.z * ${H[1]} + coords.y;
+  }
+`},yH=function(Q,H){if(Q===1)return"rc";let j="";for(let K=0;K<Q;K++)j+=H[K],K<Q-1&&(j+=",");return j},dH=function(){let Q="add_";return{body:`
+  float ${Q}(float a, float b) {
+    return a + b;
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return v1 + v2;
+  }
+  `,name:Q,type:0}},pH=function(){let Q="div_";return{body:`
+  float ${Q}(float a, float b) {
+    return a / b;
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return v1 / v2;
+  }
+  `,name:Q,type:0}},hH=function(){let Q="mul_";return{body:`
+  float ${Q}(float a, float b) {
+    return a * b;
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return v1 * v2;
+  }
+  `,name:Q,type:0}},bH=function(){let Q="sub_";return{body:`
+  float ${Q}(float a, float b) {
+    return a - b;
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return v1 - v2;
+  }
+  `,name:Q,type:0}},mH=function(){let Q="equal_";return{body:`
+  float ${Q}(float a, float b) {
+    return float(a == b);
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return vec4(equal(v1, v2));
+  }
+  `,name:Q,type:0}},cH=function(){let Q="greater_";return{body:`
+  float ${Q}(float a, float b) {
+    return float(a > b);
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return vec4( v1.r > v2.r ,
+      v1.g > v2.g,
+      v1.b > v2.b,
+      v1.a > v2.a );
+  }
+  `,name:Q,type:0}},fH=function(){let Q="less_";return{body:`
+  float ${Q}(float a, float b) {
+    return float(a < b);
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return vec4( v1.r < v2.r ,
+                v1.g < v2.g,
+                v1.b < v2.b,
+                v1.a < v2.a );
+  }
+  `,name:Q,type:0}},lH=function(){let Q="and_";return{body:`
+  float ${Q}(float a, float b) {
+    return float( bool(a) && bool(b) );
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    bvec4 b1 = bvec4(v1);
+    bvec4 b2 = bvec4(v2);
+    return vec4( b1.r && b2.r ,
+                b1.g && b2.g,
+                b1.b && b2.b,
+                b1.a && b2.a );
+  }
+  `,name:Q,type:0}},uH=function(){let Q="or_";return{body:`
+  float ${Q}(float a, float b) {
+    return float( bool(a) || bool(b) );
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    bvec4 b1 = bvec4(v1);
+    bvec4 b2 = bvec4(v2);
+    return vec4( b1.r || b2.r ,
+                b1.g || b2.g,
+                b1.b || b2.b,
+                b1.a || b2.a );
+  }
+  `,name:Q,type:0}},sH=function(){let Q="xor_";return{body:`
+  float ${Q}(float a, float b) {
+    return float( bool(a) ^^ bool(b) );
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    bvec4 b1 = bvec4(v1);
+    bvec4 b2 = bvec4(v2);
+    return vec4( b1.r ^^ b2.r ,
+                b1.g ^^ b2.g,
+                b1.b ^^ b2.b,
+                b1.a ^^ b2.a );
+  }
+  `,name:Q,type:0}},iH=function(){return aH("pow")},oH=function(){let Q="prelu_";return{body:`
+  float ${Q}(float a, float b) {
+    return a < 0.0 ? a * b: a;
+  }
+  vec4 ${Q}(vec4 v1, vec4 v2) {
+    return vec4(
+      v1.r < 0.0 ? v1.r * v2.r: v1.r,
+      v1.g < 0.0 ? v1.g * v2.g: v1.g,
+      v1.b < 0.0 ? v1.b * v2.b: v1.b,
+      v1.a < 0.0 ? v1.a * v2.a: v1.a
+      );
+  }
+  `,name:Q,type:0}},aH=function(Q){let H=`${Q}_`;return{body:`
+  float ${H}(float a, float b) {
+    return ${Q}(a, b);
+  }
+  vec4 ${H}(vec4 v1, vec4 v2) {
+    return ${Q}(v1, v2);
+  }
+  `,name:H,type:0}},nH=function(){return Q3("abs")},rH=function(){return Q3("acos")},tH=function(){return Q3("asin")},eH=function(){return Q3("atan")},QZ=function(){return Q3("ceil")},JZ=function(){return Q3("cos")},HZ=function(Q){let H="elu";return{body:`
+  const float alpha = float(${Q});
+
+  float ${H}_(float a) {
+    return a >= 0.0 ? a: (exp(a) - 1.0) * alpha;
+  }
+  vec4 ${H}_(vec4 v) {
+    return vec4(${H}_(v.x), ${H}_(v.y), ${H}_(v.z), ${H}_(v.w));
+  }
+  `,name:H,type:0}},ZZ=function(){return Q3("exp")},jZ=function(){return Q3("floor")},S2=function(Q,H){let j="clip";return{body:`
+  const float min = float(${Q});
+  const float max = float(${H});
+
+  float ${j}_(float a) {
+    return clamp(a, min, max);
+  }
+  vec4 ${j}_(vec4 v) {
+    return clamp(v, min, max);
+  }
+  `,name:j,type:0}},VZ=function(){let Q="indentity";return{body:`
+  float ${Q}_(float a) {
+    return a;
+  }
+  vec4 ${Q}_(vec4 v) {
+    return v;
+  }
+  `,name:Q,type:0}},XZ=function(Q){let H="leakyRelu";return{body:`
+  const float alpha = float(${Q});
+
+  float ${H}_(float a) {
+    return a < 0.0 ? a * alpha : a;
+  }
+  vec4 ${H}_(vec4 v) {
+    return vec4(${H}_(v.x), ${H}_(v.y), ${H}_(v.z), ${H}_(v.w));
+  }
+  `,name:H,type:0}},KZ=function(){return Q3("log")},UZ=function(){let Q="neg";return{body:`
+  float ${Q}_(float a) {
+    return -a;
+  }
+  vec4 ${Q}_(vec4 v) {
+    return -v;
+  }
+  `,name:Q,type:0}},qZ=function(){let Q="not";return{body:`
+  float ${Q}_(float a) {
+    return float( ! bool(a) );
+  }
+  bool ${Q}_(bool a) {
+    return !a;
+  }
+  vec4 ${Q}_(vec4 v) {
+    return vec4(!bool(v.x), !bool(v.y), !bool(v.z), !bool(v.w));
+  }
+  bvec4 ${Q}_(bvec4 v) {
+    return bvec4(!v.x, !v.y, !v.z, !v.w);
+  }
+  `,name:Q,type:0}},WZ=function(){return Q3("sin")},$2=function(){let Q="relu";return{body:`
+  float ${Q}_(float a) {
+    return max( a, 0.0 );
+  }
+  vec4 ${Q}_(vec4 v) {
+    return max( v, 0.0 );
+  }
+  `,name:Q,type:0}},L2=function(){let Q="sigmoid";return{body:`
+  float ${Q}_(float a) {
+    return 1.0 / (1.0 + exp(-a));
+  }
+  vec4 ${Q}_(vec4 v) {
+    return 1.0 / (1.0 + exp(-v));
+  }
+  `,name:Q,type:0}},GZ=function(){return Q3("sqrt")},RZ=function(){return Q3("tan")},zZ=function(){let Q="tanh";return{body:`
+  float ${Q}_(float a) {
+    a = clamp(a, -10., 10.);
+    a = exp(2.*a);
+    return (a - 1.) / (a + 1.);
+  }
+  vec4 ${Q}_(vec4 v) {
+    v = clamp(v, -10., 10.);
+    v = exp(2.*v);
+    return (v - 1.) / (v + 1.);
+  }
+  `,name:Q,type:0}},Q3=function(Q){return{body:`
+  float ${Q}_(float a) {
+    return ${Q}(a);
+  }
+  vec4 ${Q}_(vec4 v) {
+    return ${Q}(v);
+  }
+  `,name:Q,type:0}},f4=function(Q){let H;switch(Q.activation){case"Relu":H=$2();break;case"Sigmoid":H=L2();break;case"Clip":H=S2(Q.clipMin,Q.clipMax);break;default:return{activationFunction:"",applyActivation:""}}let{name:j,body:K}=H,W=`value = ${j}_(value);`;return{activationFunction:K,applyActivation:W}},NZ=function(Q,H,j){let K=H[0].dims,W=H[1].dims,U=R3.calcShape(K,W,!0);if(!U)throw new Error("Can't use matmul on the given tensors");let Z=P3(U.length),q=H4(),{activationFunction:G,applyActivation:J}=f4(j),X=H.length>2,V=X?"value += getBiasForMatmul();":"",R=X?`${w2(Z,q,H[2].dims,U,!1)}`:"",z=U.length,Y=K.length,B=W.length,k=K[K.length-1],w=`
+    ${G}
+    ${R}
+    float process(int indices[${z}]) {
+        int a[${Y}];
+        int b[${B}];
+        bcastMatmulIndices_A(indices, a);
+        bcastMatmulIndices_B(indices, b);
+
+        float value;
+        for (int k=0; k<${k}; ++k) {
+            a[${Y-1}] = k;
+            b[${B-2}] = k;
+            value += _A(a) * _B(b);
+        }
+        ${V}
+        ${J}
+        return value;
+    }`;return{...Q,output:{dims:U,type:H[0].type,textureType:0},shaderSource:w}},v2=function(Q,H){let j=ZQ(Q.length>2,H.activationCacheKey);return{...j,get:()=>NZ(j,Q,H)}},w2=function(Q,H,j,K,W){let U="",Z=j.length,q=K.length,G=q-Z;q<2&&Z>0?U="coords":U=j.map((R,z)=>`coords.${H[z+G]}`).join(", ");let J=R3.getBroadcastDims(j,K).map((R)=>`coords.${H[R+G]} = 0;`).join(`
+`),X=u.size(j)===1,V="vec4(outputValue.xx, outputValue.yy)";return X&&(V="vec4(outputValue.x)"),W?`
+vec4 getBiasForMatmul() {
+  ${Q} coords = getOutputCoords();
+  ${J}
+  vec4 outputValue = getBias(${U});
+  return ${V};
+}`:`
+float getBiasForMatmul() {
+  ${Q} coords = getOutputCoords();
+  ${J}
+  return getBias(coords.x);
+}`},MZ=function(Q,H,j,K){let W=[],U=[],Z=j[0].dims,q=j[1].dims,G=Z.length,J=q.length,X=K.length,V=X-G,R=X-J;W=Z.map((A,D)=>`coords.${H[D+V]}`),W[G-1]="i*2",W.join(", "),U=q.map((A,D)=>`coords.${H[D+R]}`),U[J-2]="i*2",U.join(", ");let z=R3.getBroadcastDims(Z,K),Y=R3.getBroadcastDims(q,K),B=z.map((A)=>`coords.${H[A+V]} = 0;`).join(`
+`),k=Y.map((A)=>`coords.${H[A+R]} = 0;`).join(`
+`),w=`int lastDim = coords.${H[X-1]};
+  coords.${H[X-1]} = coords.${H[X-2]};
+  coords.${H[X-2]} = lastDim;`;return`
+vec4 getAAtOutCoordsMatmul(int i) {
+  ${Q} coords = getOutputCoords();
+  ${w}
+  ${B}
+  vec4 outputValue = getA(${W});
+  return outputValue;
+}
+
+vec4 getBAtOutCoordsMatmul(int i) {
+  ${Q} coords = getOutputCoords();
+  ${w}
+  ${k}
+  vec4 outputValue = getB(${U});
+  return outputValue;
+}`},YZ=function(Q,H){let j="";for(let K=0;K<H-2;K++)j+=`rc.${Q[K]}, `;return j+=`rc.${Q[H-2]}, i*2`,j},CZ=function(Q,H){let j="";for(let K=0;K<H-2;K++)j+=`rc.${Q[K]}, `;return j+=`i*2, rc.${Q[H-1]}`,j},BZ=function(Q,H){let j=Q[0].dims[1],K=Q[0].dims.length,W=-Math.floor((H.size-1)/2),U=Math.ceil((H.size-1)/2),Z=`float(${H.alpha}) / float(${H.size})`,q=`float(${H.bias})`,G=`float(${H.beta})`,J=`
+    float process(int indices[${K}]) {
+        int c = indices[1];
+        float x = _X(indices);
+        float square_sum = 0.0;
+
+        for (int i = ${W}; i <= ${U}; i++) {
+          int idx = c + i;
+          if (c >= 0 && c < ${j}) {
+            indices[1] = idx;
+            float j = _X(indices);
+            square_sum += j * j;
+          }
+        }
+        return x / pow(${q} + ${Z} * square_sum, ${G});
+    }`;return{...K7,cacheHint:H.cacheKey,output:{dims:Q[0].dims,type:Q[0].type,textureType:0},shaderSource:J}},FZ=function(Q,H){return{...K7,cacheHint:H.cacheKey,get:()=>BZ(Q,H)}},kZ=function(Q){let H={},j;for(;(j=m6.exec(Q))!==null;){let K=j[3].split(",").map((W)=>{let U=W.trim().split(" ");return U&&U.length===2?{type:U[0],name:U[1]}:null}).filter((W)=>W!==null);H[j[2]]={params:K,body:j[4]}}for(let K in H){let W=RJ.replace("__FUNC__",K),U=new RegExp(W,"gm");for(;(j=U.exec(Q))!==null;){let Z=j[1],q=j[2],G=j[3].split(","),J=Z?`${Z} ${q};`:"",X=H[K].body,V="";H[K].params.forEach((z,Y)=>{z&&(V+=`${z.type} ${z.name} = ${G[Y]};
+`)}),X=`${V}
+ ${X}`,X=X.replace("return",`${q} = `);let R=`
+      ${J}
+      {
+        ${X}
+      }
+      `;Q=Q.replace(j[0],R)}}return Q=Q.replace(m6,""),Q},E4=function(Q,H){let j=[],K=[],W=H!=null&&Array.isArray(H)&&H.length===0,U=H==null||W?null:AZ(H,Q).sort(),Z=0;for(let q=0;q<Q.length;++q){if(U!=null){if(U[Z]===q&&Q[q]!==1)throw new Error(`Can't squeeze axis ${q} since its dim '${Q[q]}' is not 1`);(U[Z]==null||U[Z]>q)&&Q[q]===1&&(j.push(Q[q]),K.push(q)),U[Z]<=q&&Z++}Q[q]!==1&&(j.push(Q[q]),K.push(q))}return{newShape:j,keptDims:K}},AZ=function(Q,H){let j=H.length;return Q=Q==null?H.map((K,W)=>W):[].concat(Q),W5(Q.every((K)=>K>=-j&&K<j),()=>`All values in axis param must be in range [-${j}, ${j}) but got axis ${Q}`),W5(Q.every(SZ),()=>`All values in axis param must be integers but got axis ${Q}`),Q.map((K)=>K<0?j+K:K)},SZ=function(Q){return Q%1===0},$Z=function(Q){if(Q.length===0)return 1;let H=Q[0];for(let j=1;j<Q.length;j++)H*=Q[j];return H},i7=function(Q){let H=Math.ceil(Math.sqrt(Q));return[H,Math.ceil(Q/H)]},LZ=function(Q){let H=0;for(;H<Q.length&&Q[H]();++H);return H-1},T2=function(Q){let H;if((!Q||Q==="webgl2")&&"webgl2"in u3?H=u3.webgl2:(!Q||Q==="webgl")&&("webgl"in u3)&&(H=u3.webgl),!H)try{let K=wZ();H=o7(K,Q)}catch{let K=vZ();H=o7(K,Q)}Q=Q||H.version===1?"webgl":"webgl2";let j=H.gl;return u3[Q]=H,j.isContextLost()?(delete u3[Q],T2(Q)):(j.disable(j.DEPTH_TEST),j.disable(j.STENCIL_TEST),j.disable(j.BLEND),j.disable(j.DITHER),j.disable(j.POLYGON_OFFSET_FILL),j.disable(j.SAMPLE_COVERAGE),j.enable(j.SCISSOR_TEST),j.enable(j.CULL_FACE),j.cullFace(j.BACK),H)},o7=function(Q,H){let j={alpha:!1,depth:!1,antialias:!1,stencil:!1,preserveDrawingBuffer:!1,premultipliedAlpha:!1,failIfMajorPerformanceCaveat:!1},K,W=j;if((!H||H==="webgl2")&&(K=Q.getContext("webgl2",W),K))try{return new f6(K,2)}catch(U){C1.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl2'. Error: ${U}`)}if((!H||H==="webgl")&&(K=Q.getContext("webgl",W)||Q.getContext("experimental-webgl",W),K))try{return new f6(K,1)}catch(U){C1.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${U}`)}throw new Error("WebGL is not supported")},vZ=function(){if(typeof document>"u")throw new TypeError("failed to create canvas: document is not supported");let Q=document.createElement("canvas");return Q.width=1,Q.height=1,Q},wZ=function(){if(typeof OffscreenCanvas>"u")throw new TypeError("failed to create offscreen canvas: OffscreenCanvas is not supported");return new OffscreenCanvas(1,1)};async function D2(Q){if(Q){let H=typeof Q=="string"?[Q]:Q;for(let j of H){let K=U7.get(j);if(K)return K;let W=await TZ(j);if(W)return W}}else return D2(["webgl"]);throw new Error("no available backend to use")}async function TZ(Q){let H=vJ;if(typeof H[Q]<"u"&&DZ(H[Q])){let j=H[Q],K=j.initialize();if(typeof K=="object"&&"then"in K&&(K=await K),K)return U7.set(Q,j),j}}var DZ=function(Q){let H=Q;return"initialize"in H&&typeof H.initialize=="function"&&"createSessionHandler"in H&&typeof H.createSessionHandler=="function"&&"dispose"in H&&typeof H.dispose=="function"},s3=function(Q,H,j,K){if(H===void 0)return kH(Q);if(j===void 0)H5(Q,H,1);else if(typeof j=="number"&&K===void 0)H5(Q,H,j);else if(typeof j=="string"&&K===void 0)H5(Q,j,1,H);else if(typeof j=="string"&&typeof K=="number")H5(Q,j,K,H);else throw new TypeError("input is valid")},kH=function(Q){return{verbose:s3.verbose.bind(null,Q),info:s3.info.bind(null,Q),warning:s3.warning.bind(null,Q),error:s3.error.bind(null,Q),fatal:s3.fatal.bind(null,Q)}},H5=function(Q,H,j,K){let W=J4[K||""]||J4[""];C6[Q]<C6[W.minimalSeverity]||(W.logDateTime&&(H=`${(new Date()).toISOString()}|${H}`),W.logSourceLocation,i2[W.provider].log(Q,H,K))},AH=function(Q,H,j){for(let K of j){let W=K[0],U=K[1],Z=K[2],q=K[3],G=K[4];if(Q.opType===W){for(let J of H)if((J.domain===U||J.domain==="ai.onnx"&&U==="")&&SH(J.version,Z))return{opImpl:q,opInit:G}}}throw new TypeError(`cannot resolve operator '${Q.opType}' with opsets: ${H.map((K)=>`${K.domain||"ai.onnx"} v${K.version}`).join(", ")}`)},SH=function(Q,H){if(H.endsWith("+")){let j=Number.parseInt(H.substring(0,H.length-1),10);return!isNaN(j)&&j<=Q}else if(H.split("-").length===2){let j=H.split("-"),K=Number.parseInt(j[0],10),W=Number.parseInt(j[1],10);return!isNaN(K)&&!isNaN(W)&&K<=Q&&Q<=W}else return Number.parseInt(H,10)===Q},X1=function(Q,H,j){this.low=Q|0,this.high=H|0,this.unsigned=!!j},I1=function(Q){return(Q&&Q.__isLong__)===!0},c7=function(Q){var H=Math.clz32(Q&-Q);return Q?31-H:H},b3=function(Q,H){var j,K,W;return H?(Q>>>=0,(W=0<=Q&&Q<256)&&(K=F6[Q],K)?K:(j=e(Q,0,!0),W&&(F6[Q]=j),j)):(Q|=0,(W=-128<=Q&&Q<128)&&(K=B6[Q],K)?K:(j=e(Q,Q<0?-1:0,!1),W&&(B6[Q]=j),j))},e1=function(Q,H){if(isNaN(Q))return H?W3:t1;if(H){if(Q<0)return W3;if(Q>=k6)return $6}else{if(Q<=-A6)return y1;if(Q+1>=A6)return S6}return Q<0?e1(-Q,H).neg():e(Q%o3|0,Q/o3|0,H)},e=function(Q,H,j){return new X1(Q,H,j)},a6=function(Q,H,j){if(Q.length===0)throw Error("empty string");if(typeof H=="number"?(j=H,H=!1):H=!!H,Q==="NaN"||Q==="Infinity"||Q==="+Infinity"||Q==="-Infinity")return H?W3:t1;if(j=j||10,j<2||36<j)throw RangeError("radix");var K;if((K=Q.indexOf("-"))>0)throw Error("interior hyphen");if(K===0)return a6(Q.substring(1),H,j).neg();for(var W=e1(O4(j,8)),U=t1,Z=0;Z<Q.length;Z+=8){var q=Math.min(8,Q.length-Z),G=parseInt(Q.substring(Z,Z+q),j);if(q<8){var J=e1(O4(j,q));U=U.mul(J).add(e1(G))}else U=U.mul(W),U=U.add(e1(G))}return U.unsigned=H,U},Z3=function(Q,H){return typeof Q=="number"?e1(Q,H):typeof Q=="string"?a6(Q,H):e(Q.low,Q.high,typeof H=="boolean"?H:Q.unsigned)},r6="./",G5="./onyx-runtimeweb.js";/*!
+ * ONNX Runtime Web v1.18.0
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License.
+ */var{create:_Z,defineProperty:C5,getOwnPropertyDescriptor:PZ,getOwnPropertyNames:EZ,getPrototypeOf:IZ}=Object,xZ=Object.prototype.hasOwnProperty,E=(Q,H)=>()=>(Q&&(H=Q(Q=0)),H),U1=(Q,H)=>()=>(H||Q((H={exports:{}}).exports,H),H.exports),X4=(Q,H)=>{for(var j in H)C5(Q,j,{get:H[j],enumerable:!0})},_2=(Q,H,j,K)=>{if(H&&typeof H=="object"||typeof H=="function")for(let W of EZ(H))!xZ.call(Q,W)&&W!==j&&C5(Q,W,{get:()=>H[W],enumerable:!(K=PZ(H,W))||K.enumerable});return Q},Z4=(Q,H,j)=>(j=Q!=null?_Z(IZ(Q)):{},_2(H||!Q||!Q.__esModule?C5(j,"default",{value:Q,enumerable:!0}):j,Q)),a3=(Q)=>_2(C5({},"__esModule",{value:!0}),Q),A4,v3,p4,a7,t6,e6=E(()=>{A4=new Map,v3=[],p4=(Q,H,j)=>{if(H&&typeof H.init=="function"&&typeof H.createInferenceSessionHandler=="function"){let K=A4.get(Q);if(K===void 0)A4.set(Q,{backend:H,priority:j});else{if(K.priority>j)return;if(K.priority===j&&K.backend!==H)throw new Error(`cannot register backend "${Q}" using priority ${j}`)}if(j>=0){let W=v3.indexOf(Q);W!==-1&&v3.splice(W,1);for(let U=0;U<v3.length;U++)if(A4.get(v3[U]).priority<=j){v3.splice(U,0,Q);return}v3.push(Q)}return}throw new TypeError("not a valid backend")},a7=async(Q)=>{let H=A4.get(Q);if(!H)return"backend not found.";if(H.initialized)return H.backend;if(H.aborted)return H.error;{let j=!!H.initPromise;try{return j||(H.initPromise=H.backend.init(Q)),await H.initPromise,H.initialized=!0,H.backend}catch(K){return j||(H.error=`${K}`,H.aborted=!0),H.error}finally{delete H.initPromise}}},t6=async(Q)=>{let H=Q.executionProviders||[],j=H.map((G)=>typeof G=="string"?G:G.name),K=j.length===0?v3:j,W,U=[],Z=new Set;for(let G of K){let J=await a7(G);typeof J=="string"?U.push({name:G,err:J}):(W||(W=J),W===J&&Z.add(G))}if(!W)throw new Error(`no available backend found. ERR: ${U.map((G)=>`[${G.name}] ${G.err}`).join(", ")}`);for(let{name:G,err:J}of U)j.includes(G)&&console.warn(`removing requested execution provider "${G}" from session options because it is not available: ${J}`);let q=H.filter((G)=>Z.has(typeof G=="string"?G:G.name));return[W,new Proxy(Q,{get:(G,J)=>J==="executionProviders"?q:Reflect.get(G,J)})]}}),OZ=E(()=>{e6()}),P2,gZ=E(()=>{P2="1.18.0"}),E5,r1,E2=E(()=>{gZ(),E5="warning",r1={wasm:{},webgl:{},webgpu:{},versions:{common:P2},set logLevel(Q){if(Q!==void 0){if(typeof Q!="string"||["verbose","info","warning","error","fatal"].indexOf(Q)===-1)throw new Error(`Unsupported logging level: ${Q}`);E5=Q}},get logLevel(){return E5}},Object.defineProperty(r1,"logLevel",{enumerable:!0})}),i,yZ=E(()=>{E2(),i=r1}),I2,x2,dZ=E(()=>{I2=(Q,H)=>{let j=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);j.width=Q.dims[3],j.height=Q.dims[2];let K=j.getContext("2d");if(K!=null){let W,U;H?.tensorLayout!==void 0&&H.tensorLayout==="NHWC"?(W=Q.dims[2],U=Q.dims[3]):(W=Q.dims[3],U=Q.dims[2]);let Z=H?.format!==void 0?H.format:"RGB",q=H?.norm,G,J;q===void 0||q.mean===void 0?G=[255,255,255,255]:typeof q.mean=="number"?G=[q.mean,q.mean,q.mean,q.mean]:(G=[q.mean[0],q.mean[1],q.mean[2],0],q.mean[3]!==void 0&&(G[3]=q.mean[3])),q===void 0||q.bias===void 0?J=[0,0,0,0]:typeof q.bias=="number"?J=[q.bias,q.bias,q.bias,q.bias]:(J=[q.bias[0],q.bias[1],q.bias[2],0],q.bias[3]!==void 0&&(J[3]=q.bias[3]));let X=U*W,V=0,R=X,z=X*2,Y=-1;Z==="RGBA"?(V=0,R=X,z=X*2,Y=X*3):Z==="RGB"?(V=0,R=X,z=X*2):Z==="RBG"&&(V=0,z=X,R=X*2);for(let B=0;B<U;B++)for(let k=0;k<W;k++){let w=(Q.data[V++]-J[0])*G[0],A=(Q.data[R++]-J[1])*G[1],D=(Q.data[z++]-J[2])*G[2],I=Y===-1?255:(Q.data[Y++]-J[3])*G[3];K.fillStyle="rgba("+w+","+A+","+D+","+I+")",K.fillRect(k,B,1,1)}if("toDataURL"in j)return j.toDataURL();throw new Error("toDataURL is not supported")}else throw new Error("Can not access image data")},x2=(Q,H)=>{let j=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),K;if(j!=null){let W,U,Z;H?.tensorLayout!==void 0&&H.tensorLayout==="NHWC"?(W=Q.dims[2],U=Q.dims[1],Z=Q.dims[3]):(W=Q.dims[3],U=Q.dims[2],Z=Q.dims[1]);let q=H!==void 0&&H.format!==void 0?H.format:"RGB",G=H?.norm,J,X;G===void 0||G.mean===void 0?J=[255,255,255,255]:typeof G.mean=="number"?J=[G.mean,G.mean,G.mean,G.mean]:(J=[G.mean[0],G.mean[1],G.mean[2],255],G.mean[3]!==void 0&&(J[3]=G.mean[3])),G===void 0||G.bias===void 0?X=[0,0,0,0]:typeof G.bias=="number"?X=[G.bias,G.bias,G.bias,G.bias]:(X=[G.bias[0],G.bias[1],G.bias[2],0],G.bias[3]!==void 0&&(X[3]=G.bias[3]));let V=U*W;if(H!==void 0&&(H.format!==void 0&&Z===4&&H.format!=="RGBA"||Z===3&&H.format!=="RGB"&&H.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let R=4,z=0,Y=1,B=2,k=3,w=0,A=V,D=V*2,I=-1;q==="RGBA"?(w=0,A=V,D=V*2,I=V*3):q==="RGB"?(w=0,A=V,D=V*2):q==="RBG"&&(w=0,D=V,A=V*2),K=j.createImageData(W,U);for(let h=0;h<U*W;z+=R,Y+=R,B+=R,k+=R,h++)K.data[z]=(Q.data[w++]-X[0])*J[0],K.data[Y]=(Q.data[A++]-X[1])*J[1],K.data[B]=(Q.data[D++]-X[2])*J[2],K.data[k]=I===-1?255:(Q.data[I++]-X[3])*J[3]}else throw new Error("Can not access image data");return K}}),Z5,O2,g2,y2,d2,pZ=E(()=>{Q7(),Z5=(Q,H)=>{if(Q===void 0)throw new Error("Image buffer must be defined");if(H.height===void 0||H.width===void 0)throw new Error("Image height and width must be defined");if(H.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:j,width:K}=H,W=H.norm??{mean:255,bias:0},U,Z;typeof W.mean=="number"?U=[W.mean,W.mean,W.mean,W.mean]:U=[W.mean[0],W.mean[1],W.mean[2],W.mean[3]??255],typeof W.bias=="number"?Z=[W.bias,W.bias,W.bias,W.bias]:Z=[W.bias[0],W.bias[1],W.bias[2],W.bias[3]??0];let q=H.format!==void 0?H.format:"RGBA",G=H.tensorFormat!==void 0&&H.tensorFormat!==void 0?H.tensorFormat:"RGB",J=j*K,X=G==="RGBA"?new Float32Array(J*4):new Float32Array(J*3),V=4,R=0,z=1,Y=2,B=3,k=0,w=J,A=J*2,D=-1;q==="RGB"&&(V=3,R=0,z=1,Y=2,B=-1),G==="RGBA"?D=J*3:G==="RBG"?(k=0,A=J,w=J*2):G==="BGR"&&(A=0,w=J,k=J*2);for(let I=0;I<J;I++,R+=V,Y+=V,z+=V,B+=V)X[k++]=(Q[R]+Z[0])/U[0],X[w++]=(Q[z]+Z[1])/U[1],X[A++]=(Q[Y]+Z[2])/U[2],D!==-1&&B!==-1&&(X[D++]=(Q[B]+Z[3])/U[3]);return G==="RGBA"?new j3("float32",X,[1,4,j,K]):new j3("float32",X,[1,3,j,K])},O2=async(Q,H)=>{let j=typeof HTMLImageElement<"u"&&Q instanceof HTMLImageElement,K=typeof ImageData<"u"&&Q instanceof ImageData,W=typeof ImageBitmap<"u"&&Q instanceof ImageBitmap,U=typeof Q=="string",Z,q=H??{},G=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},J=(X)=>X instanceof HTMLCanvasElement||X instanceof OffscreenCanvas?X.getContext("2d"):null;if(j){let X=G();X.width=Q.width,X.height=Q.height;let V=J(X);if(V!=null){let{height:R,width:z}=Q;if(H!==void 0&&H.resizedHeight!==void 0&&H.resizedWidth!==void 0&&(R=H.resizedHeight,z=H.resizedWidth),H!==void 0){if(q=H,H.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");q.tensorFormat="RGBA",q.height=R,q.width=z}else q.tensorFormat="RGBA",q.height=R,q.width=z;V.drawImage(Q,0,0),Z=V.getImageData(0,0,z,R).data}else throw new Error("Can not access image data")}else if(K){let X,V;if(H!==void 0&&H.resizedWidth!==void 0&&H.resizedHeight!==void 0?(X=H.resizedHeight,V=H.resizedWidth):(X=Q.height,V=Q.width),H!==void 0&&(q=H),q.format="RGBA",q.height=X,q.width=V,H!==void 0){let R=G();R.width=V,R.height=X;let z=J(R);if(z!=null)z.putImageData(Q,0,0),Z=z.getImageData(0,0,V,X).data;else throw new Error("Can not access image data")}else Z=Q.data}else if(W){if(H===void 0)throw new Error("Please provide image config with format for Imagebitmap");let X=G();X.width=Q.width,X.height=Q.height;let V=J(X);if(V!=null){let{height:R,width:z}=Q;return V.drawImage(Q,0,0,z,R),Z=V.getImageData(0,0,z,R).data,q.height=R,q.width=z,Z5(Z,q)}else throw new Error("Can not access image data")}else{if(U)return new Promise((X,V)=>{let R=G(),z=J(R);if(!Q||!z)return V();let Y=new Image;Y.crossOrigin="Anonymous",Y.src=Q,Y.onload=()=>{R.width=Y.width,R.height=Y.height,z.drawImage(Y,0,0,R.width,R.height);let B=z.getImageData(0,0,R.width,R.height);q.height=R.height,q.width=R.width,X(Z5(B.data,q))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(Z!==void 0)return Z5(Z,q);throw new Error("Input data provided is not supported - aborted tensor creation")},g2=(Q,H)=>{let{width:j,height:K,download:W,dispose:U}=H;return new j3({location:"texture",type:"float32",texture:Q,dims:[1,K,j,4],download:W,dispose:U})},y2=(Q,H)=>{let{dataType:j,dims:K,download:W,dispose:U}=H;return new j3({location:"gpu-buffer",type:j??"float32",gpuBuffer:Q,dims:K,download:W,dispose:U})},d2=(Q,H,j)=>new j3({location:"cpu-pinned",type:Q,data:H,dims:j??[H.length]})}),i3,I4,I5,p2,hZ=E(()=>{i3=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array]]),I4=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),I5=!1,p2=()=>{if(!I5){I5=!0;let Q=typeof BigInt64Array<"u"&&BigInt64Array.from,H=typeof BigUint64Array<"u"&&BigUint64Array.from,j=typeof Float16Array<"u"&&Float16Array.from;Q&&(i3.set("int64",BigInt64Array),I4.set(BigInt64Array,"int64")),H&&(i3.set("uint64",BigUint64Array),I4.set(BigUint64Array,"uint64")),j?(i3.set("float16",Float16Array),I4.set(Float16Array,"float16")):i3.set("float16",Uint16Array)}}}),h2,b2,bZ=E(()=>{Q7(),h2=(Q)=>{let H=1;for(let j=0;j<Q.length;j++){let K=Q[j];if(typeof K!="number"||!Number.isSafeInteger(K))throw new TypeError(`dims[${j}] must be an integer, got: ${K}`);if(K<0)throw new RangeError(`dims[${j}] must be a non-negative integer, got: ${K}`);H*=K}return H},b2=(Q,H)=>{switch(Q.location){case"cpu":return new j3(Q.type,Q.data,H);case"cpu-pinned":return new j3({location:"cpu-pinned",data:Q.data,type:Q.type,dims:H});case"texture":return new j3({location:"texture",texture:Q.texture,type:Q.type,dims:H});case"gpu-buffer":return new j3({location:"gpu-buffer",gpuBuffer:Q.gpuBuffer,type:Q.type,dims:H});default:throw new Error(`tensorReshape: tensor location ${Q.location} is not supported`)}}}),j3,Q7=E(()=>{dZ(),pZ(),hZ(),bZ(),j3=class{constructor(Q,H,j){p2();let K,W;if(typeof Q=="object"&&"location"in Q)switch(this.dataLocation=Q.location,K=Q.type,W=Q.dims,Q.location){case"cpu-pinned":{let Z=i3.get(K);if(!Z)throw new TypeError(`unsupported type "${K}" to create tensor from pinned buffer`);if(!(Q.data instanceof Z))throw new TypeError(`buffer should be of type ${Z.name}`);this.cpuData=Q.data;break}case"texture":{if(K!=="float32")throw new TypeError(`unsupported type "${K}" to create tensor from texture`);this.gpuTextureData=Q.texture,this.downloader=Q.download,this.disposer=Q.dispose;break}case"gpu-buffer":{if(K!=="float32"&&K!=="float16"&&K!=="int32"&&K!=="int64"&&K!=="uint32"&&K!=="uint8"&&K!=="bool")throw new TypeError(`unsupported type "${K}" to create tensor from gpu buffer`);this.gpuBufferData=Q.gpuBuffer,this.downloader=Q.download,this.disposer=Q.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let Z,q;if(typeof Q=="string")if(K=Q,q=j,Q==="string"){if(!Array.isArray(H))throw new TypeError("A string tensor's data must be a string array.");Z=H}else{let G=i3.get(Q);if(G===void 0)throw new TypeError(`Unsupported tensor type: ${Q}.`);if(Array.isArray(H)){if(Q==="float16"&&G===Uint16Array)throw new TypeError("Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.");Q==="uint64"||Q==="int64"?Z=G.from(H,BigInt):Z=G.from(H)}else if(H instanceof G)Z=H;else throw new TypeError(`A ${K} tensor's data must be type of ${G}`)}else if(q=H,Array.isArray(Q)){if(Q.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let G=typeof Q[0];if(G==="string")K="string",Z=Q;else if(G==="boolean")K="bool",Z=Uint8Array.from(Q);else throw new TypeError(`Invalid element type of data array: ${G}.`)}else{let G=I4.get(Q.constructor);if(G===void 0)throw new TypeError(`Unsupported type for tensor data: ${Q.constructor}.`);K=G,Z=Q}if(q===void 0)q=[Z.length];else if(!Array.isArray(q))throw new TypeError("A tensor's dims must be a number array");W=q,this.cpuData=Z,this.dataLocation="cpu"}let U=h2(W);if(this.cpuData&&U!==this.cpuData.length)throw new Error(`Tensor's size(${U}) does not match data length(${this.cpuData.length}).`);this.type=K,this.dims=W,this.size=U}static async fromImage(Q,H){return O2(Q,H)}static fromTexture(Q,H){return g2(Q,H)}static fromGpuBuffer(Q,H){return y2(Q,H)}static fromPinnedBuffer(Q,H,j){return d2(Q,H,j)}toDataURL(Q){return I2(this,Q)}toImageData(Q){return x2(this,Q)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}async getData(Q){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let H=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=H,Q&&this.disposer&&(this.disposer(),this.disposer=void 0),H}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(Q){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return b2(this,Q)}}}),d1,J7=E(()=>{Q7(),d1=j3}),Y6,x5,j4,V4,m2=E(()=>{E2(),Y6=(Q,H)=>{(typeof r1.trace>"u"?!r1.wasm.trace:!r1.trace)||console.timeStamp(`${Q}::ORT::${H}`)},x5=(Q,H)=>{let j=new Error().stack?.split(/\r\n|\r|\n/g)||[],K=!1;for(let W=0;W<j.length;W++){if(K&&!j[W].includes("TRACE_FUNC")){let U=`FUNC_${Q}::${j[W].trim().split(" ")[1]}`;H&&(U+=`::${H}`),Y6("CPU",U);return}j[W].includes("TRACE_FUNC")&&(K=!0)}},j4=(Q)=>{(typeof r1.trace>"u"?!r1.wasm.trace:!r1.trace)||x5("BEGIN",Q)},V4=(Q)=>{(typeof r1.trace>"u"?!r1.wasm.trace:!r1.trace)||x5("END",Q)}}),c2,mZ=E(()=>{e6(),J7(),m2(),c2=class Q{constructor(H){this.handler=H}async run(H,j,K){j4();let W={},U={};if(typeof H!="object"||H===null||H instanceof d1||Array.isArray(H))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let Z=!0;if(typeof j=="object"){if(j===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(j instanceof d1)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(j)){if(j.length===0)throw new TypeError("'fetches' cannot be an empty array.");Z=!1;for(let J of j){if(typeof J!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(J)===-1)throw new RangeError(`'fetches' contains invalid output name: ${J}.`);W[J]=null}if(typeof K=="object"&&K!==null)U=K;else if(typeof K<"u")throw new TypeError("'options' must be an object.")}else{let J=!1,X=Object.getOwnPropertyNames(j);for(let V of this.outputNames)if(X.indexOf(V)!==-1){let R=j[V];(R===null||R instanceof d1)&&(J=!0,Z=!1,W[V]=R)}if(J){if(typeof K=="object"&&K!==null)U=K;else if(typeof K<"u")throw new TypeError("'options' must be an object.")}else U=j}}else if(typeof j<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let J of this.inputNames)if(typeof H[J]>"u")throw new Error(`input '${J}' is missing in 'feeds'.`);if(Z)for(let J of this.outputNames)W[J]=null;let q=await this.handler.run(H,W,U),G={};for(let J in q)if(Object.hasOwnProperty.call(q,J)){let X=q[J];X instanceof d1?G[J]=X:G[J]=new d1(X.type,X.data,X.dims)}return V4(),G}async release(){return this.handler.dispose()}static async create(H,j,K,W){j4();let U,Z={};if(typeof H=="string"){if(U=H,typeof j=="object"&&j!==null)Z=j;else if(typeof j<"u")throw new TypeError("'options' must be an object.")}else if(H instanceof Uint8Array){if(U=H,typeof j=="object"&&j!==null)Z=j;else if(typeof j<"u")throw new TypeError("'options' must be an object.")}else if(H instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&H instanceof SharedArrayBuffer){let X=H,V=0,R=H.byteLength;if(typeof j=="object"&&j!==null)Z=j;else if(typeof j=="number"){if(V=j,!Number.isSafeInteger(V))throw new RangeError("'byteOffset' must be an integer.");if(V<0||V>=X.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${X.byteLength}).`);if(R=H.byteLength-V,typeof K=="number"){if(R=K,!Number.isSafeInteger(R))throw new RangeError("'byteLength' must be an integer.");if(R<=0||V+R>X.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${X.byteLength-V}].`);if(typeof W=="object"&&W!==null)Z=W;else if(typeof W<"u")throw new TypeError("'options' must be an object.")}else if(typeof K<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof j<"u")throw new TypeError("'options' must be an object.");U=new Uint8Array(X,V,R)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[q,G]=await t6(Z),J=await q.createInferenceSessionHandler(U,G);return V4(),new Q(J)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}}),f2,cZ=E(()=>{mZ(),f2=c2}),fZ=E(()=>{}),lZ=E(()=>{}),uZ=E(()=>{}),sZ=E(()=>{}),n7,l2,iZ=E(()=>{e6(),J7(),n7="Training backend could not be resolved. Make sure you're using the correct configuration & WebAssembly files.",l2=class Q{constructor(H,j,K){this.handler=H,this.hasOptimizerModel=j,this.hasEvalModel=K}get trainingInputNames(){return this.handler.inputNames}get trainingOutputNames(){return this.handler.outputNames}get evalInputNames(){if(this.hasEvalModel)return this.handler.evalInputNames;throw new Error("This training session has no evalModel loaded.")}get evalOutputNames(){if(this.hasEvalModel)return this.handler.evalOutputNames;throw new Error("This training session has no evalModel loaded.")}static async create(H,j){let K=H.evalModel||"",W=H.optimizerModel||"",U=j||{},[Z,q]=await t6(U);if(Z.createTrainingSessionHandler){let G=await Z.createTrainingSessionHandler(H.checkpointState,H.trainModel,K,W,q);return new Q(G,!!H.optimizerModel,!!H.evalModel)}else throw new Error(n7)}typeNarrowingForRunStep(H,j,K,W,U){let Z={},q={};if(typeof K!="object"||K===null||K instanceof d1||Array.isArray(K))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let G=!0;if(typeof W=="object"){if(W===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(W instanceof d1)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(W)){if(W.length===0)throw new TypeError("'fetches' cannot be an empty array.");G=!1;for(let J of W){if(typeof J!="string")throw new TypeError("'fetches' must be a string array or an object.");if(j.indexOf(J)===-1)throw new RangeError(`'fetches' contains invalid output name: ${J}.`);Z[J]=null}if(typeof U=="object"&&U!==null)q=U;else if(typeof U<"u")throw new TypeError("'options' must be an object.")}else{let J=!1,X=Object.getOwnPropertyNames(W);for(let V of j)if(X.indexOf(V)!==-1){let R=W[V];(R===null||R instanceof d1)&&(J=!0,G=!1,Z[V]=R)}if(J){if(typeof U=="object"&&U!==null)q=U;else if(typeof U<"u")throw new TypeError("'options' must be an object.")}else q=W}}else if(typeof W<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let J of H)if(typeof K[J]>"u")throw new Error(`input '${J}' is missing in 'feeds'.`);if(G)for(let J of j)Z[J]=null;return[Z,q]}convertHandlerReturnTypeToMapOfTensors(H){let j={};for(let K in H)if(Object.hasOwnProperty.call(H,K)){let W=H[K];W instanceof d1?j[K]=W:j[K]=new d1(W.type,W.data,W.dims)}return j}async lazyResetGrad(){await this.handler.lazyResetGrad()}async runTrainStep(H,j,K){let[W,U]=this.typeNarrowingForRunStep(this.trainingInputNames,this.trainingOutputNames,H,j,K),Z=await this.handler.runTrainStep(H,W,U);return this.convertHandlerReturnTypeToMapOfTensors(Z)}async runOptimizerStep(H){if(this.hasOptimizerModel)await this.handler.runOptimizerStep(H||{});else throw new Error("This TrainingSession has no OptimizerModel loaded.")}async runEvalStep(H,j,K){if(this.hasEvalModel){let[W,U]=this.typeNarrowingForRunStep(this.evalInputNames,this.evalOutputNames,H,j,K),Z=await this.handler.runEvalStep(H,W,U);return this.convertHandlerReturnTypeToMapOfTensors(Z)}else throw new Error("This TrainingSession has no EvalModel loaded.")}async getParametersSize(H=!0){return this.handler.getParametersSize(H)}async loadParametersBuffer(H,j=!0){let K=await this.getParametersSize(j);if(H.length!==4*K)throw new Error("Size of the buffer passed into loadParametersBuffer must match the number of parameters in the model. Please use getParametersSize method to check.");return this.handler.loadParametersBuffer(H,j)}async getContiguousParameters(H=!0){return this.handler.getContiguousParameters(H)}async release(){return this.handler.dispose()}}}),u2,oZ=E(()=>{iZ(),u2=l2}),s2={};X4(s2,{InferenceSession:()=>f2,TRACE:()=>Y6,TRACE_FUNC_BEGIN:()=>j4,TRACE_FUNC_END:()=>V4,Tensor:()=>d1,TrainingSession:()=>u2,env:()=>i,registerBackend:()=>p4});var z3=E(()=>{OZ(),yZ(),cZ(),J7(),fZ(),lZ(),m2(),uZ(),sZ(),oZ()}),r7,t7,C6,i2,O5,J4,C1,g5,y5,o2,S4,V3=E(()=>{r7=class{log(Q,H,j){}},t7=class{log(Q,H,j){console.log(`${this.color(Q)} ${j?"\x1B[35m"+j+"\x1B[0m ":""}${H}`)}color(Q){switch(Q){case"verbose":return"\x1B[34;40mv\x1B[0m";case"info":return"\x1B[32mi\x1B[0m";case"warning":return"\x1B[30;43mw\x1B[0m";case"error":return"\x1B[31;40me\x1B[0m";case"fatal":return"\x1B[101mf\x1B[0m";default:throw new Error(`unsupported severity: ${Q}`)}}},C6={verbose:1000,info:2000,warning:4000,error:5000,fatal:6000},i2={none:new r7,console:new t7},O5={provider:"console",minimalSeverity:"warning",logDateTime:!0,logSourceLocation:!1},J4={"":O5},((Q)=>{function H(J,X){Q("verbose",J,X)}Q.verbose=H;function j(J,X){Q("info",J,X)}Q.info=j;function K(J,X){Q("warning",J,X)}Q.warning=K;function W(J,X){Q("error",J,X)}Q.error=W;function U(J,X){Q("fatal",J,X)}Q.fatal=U;function Z(J){J4={},q("",J||{})}Q.reset=Z;function q(J,X){if(J==="*")Z(X);else{let V=J4[J]||O5;J4[J]={provider:X.provider||V.provider,minimalSeverity:X.minimalSeverity||V.minimalSeverity,logDateTime:X.logDateTime===void 0?V.logDateTime:X.logDateTime,logSourceLocation:X.logSourceLocation===void 0?V.logSourceLocation:X.logSourceLocation}}}Q.set=q;function G(J){let X={};J.logLevel&&(X.minimalSeverity=J.logLevel),q("",X)}Q.setWithEnv=G})(s3||={}),C1=s3,g5=class{constructor(Q,H,j,K,W,U){this.category=Q,this.name=H,this.startTime=j,this.endCallback=K,this.timer=W,this.ctx=U}async end(){return this.endCallback(this)}async checkTimer(){if(this.ctx===void 0||this.timer===void 0)throw new Error("No webgl timer found");return this.ctx.endTimer(),this.ctx.waitForQueryAndGetTime(this.timer)}},y5=class{constructor(Q,H,j,K){this.category=Q,this.name=H,this.startTime=j,this.endTime=K}},o2=class{constructor(Q,H,j){this._started=!1,this._flushPointer=0,this._started=!1,this._maxNumberEvents=Q===void 0?1e4:Q,this._flushBatchSize=H===void 0?10:H,this._flushIntervalInMilliseconds=j===void 0?5000:j}static create(Q){return Q===void 0?new this:new this(Q.maxNumberEvents,Q.flushBatchSize,Q.flushIntervalInMilliseconds)}start(){this._started=!0,this._timingEvents=[],this._flushTime=S4(),this._flushPointer=0}stop(){for(this._started=!1;this._flushPointer<this._timingEvents.length;this._flushPointer++)this.logOneEvent(this._timingEvents[this._flushPointer])}event(Q,H,j,K){let W=this._started?this.begin(Q,H,K):void 0,U=!1,Z=j();if(Z&&typeof Z.then=="function")return U=!0,new Promise((q,G)=>{Z.then(async(J)=>{W&&await W.end(),q(J)},async(J)=>{W&&await W.end(),G(J)})});if(!U&&W){let q=W.end();if(q&&typeof q.then=="function")return new Promise((G,J)=>{q.then(()=>{G(Z)},(X)=>{J(X)})})}return Z}begin(Q,H,j){if(!this._started)throw new Error("profiler is not started yet");if(j===void 0){let K=S4();return this.flush(K),new g5(Q,H,K,(W)=>this.endSync(W))}else{let K=j.beginTimer();return new g5(Q,H,0,async(W)=>this.end(W),K,j)}}async end(Q){let H=await Q.checkTimer();this._timingEvents.length<this._maxNumberEvents&&(this._timingEvents.push(new y5(Q.category,Q.name,Q.startTime,H)),this.flush(H))}endSync(Q){let H=S4();this._timingEvents.length<this._maxNumberEvents&&(this._timingEvents.push(new y5(Q.category,Q.name,Q.startTime,H)),this.flush(H))}logOneEvent(Q){C1.verbose(`Profiler.${Q.category}`,`${(Q.endTime-Q.startTime).toFixed(2)}ms on event '${Q.name}' at ${Q.endTime.toFixed(2)}`)}flush(Q){if(this._timingEvents.length-this._flushPointer>=this._flushBatchSize||Q-this._flushTime>=this._flushIntervalInMilliseconds){for(let H=this._flushPointer;this._flushPointer<H+this._flushBatchSize&&this._flushPointer<this._timingEvents.length;this._flushPointer++)this.logOneEvent(this._timingEvents[this._flushPointer]);this._flushTime=S4()}}get started(){return this._started}},S4=typeof performance<"u"&&performance.now?()=>performance.now():Date.now}),aZ=E(()=>{}),nZ=U1((Q)=>{Q.__esModule=!0;var H=function(){function j(K){if(!K)throw new TypeError("Invalid argument; `value` has no value.");this.value=j.EMPTY,K&&j.isGuid(K)&&(this.value=K)}return j.isGuid=function(K){var W=K.toString();return K&&(K instanceof j||j.validator.test(W))},j.create=function(){return new j([j.gen(2),j.gen(1),j.gen(1),j.gen(1),j.gen(3)].join("-"))},j.createEmpty=function(){return new j("emptyguid")},j.parse=function(K){return new j(K)},j.raw=function(){return[j.gen(2),j.gen(1),j.gen(1),j.gen(1),j.gen(3)].join("-")},j.gen=function(K){for(var W="",U=0;U<K;U++)W+=((1+Math.random())*65536|0).toString(16).substring(1);return W},j.prototype.equals=function(K){return j.isGuid(K)&&this.value===K.toString()},j.prototype.isEmpty=function(){return this.value===j.EMPTY},j.prototype.toString=function(){return this.value},j.prototype.toJSON=function(){return{value:this.value}},j.validator=new RegExp("^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$","i"),j.EMPTY="00000000-0000-0000-0000-000000000000",j}();Q.Guid=H}),l1,B6,F6,O4,d5,e7,o3,k6,A6,p5,t1,W3,m3,h5,j5,S6,$6,y1,O,_3,a2=E(()=>{l1=null;try{l1=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}X1.prototype.__isLong__,Object.defineProperty(X1.prototype,"__isLong__",{value:!0}),X1.isLong=I1,B6={},F6={},X1.fromInt=b3,X1.fromNumber=e1,X1.fromBits=e,O4=Math.pow,X1.fromString=a6,X1.fromValue=Z3,d5=65536,e7=1<<24,o3=d5*d5,k6=o3*o3,A6=k6/2,p5=b3(e7),t1=b3(0),X1.ZERO=t1,W3=b3(0,!0),X1.UZERO=W3,m3=b3(1),X1.ONE=m3,h5=b3(1,!0),X1.UONE=h5,j5=b3(-1),X1.NEG_ONE=j5,S6=e(-1,2147483647,!1),X1.MAX_VALUE=S6,$6=e(-1,-1,!0),X1.MAX_UNSIGNED_VALUE=$6,y1=e(0,-2147483648,!1),X1.MIN_VALUE=y1,O=X1.prototype,O.toInt=function(){return this.unsigned?this.low>>>0:this.low},O.toNumber=function(){return this.unsigned?(this.high>>>0)*o3+(this.low>>>0):this.high*o3+(this.low>>>0)},O.toString=function(Q){if(Q=Q||10,Q<2||36<Q)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative())if(this.eq(y1)){var H=e1(Q),j=this.div(H),K=j.mul(H).sub(this);return j.toString(Q)+K.toInt().toString(Q)}else return"-"+this.neg().toString(Q);for(var W=e1(O4(Q,6),this.unsigned),U=this,Z="";;){var q=U.div(W),G=U.sub(q.mul(W)).toInt()>>>0,J=G.toString(Q);if(U=q,U.isZero())return J+Z;for(;J.length<6;)J="0"+J;Z=""+J+Z}},O.getHighBits=function(){return this.high},O.getHighBitsUnsigned=function(){return this.high>>>0},O.getLowBits=function(){return this.low},O.getLowBitsUnsigned=function(){return this.low>>>0},O.getNumBitsAbs=function(){if(this.isNegative())return this.eq(y1)?64:this.neg().getNumBitsAbs();for(var Q=this.high!=0?this.high:this.low,H=31;H>0&&!(Q&1<<H);H--);return this.high!=0?H+33:H+1},O.isZero=function(){return this.high===0&&this.low===0},O.eqz=O.isZero,O.isNegative=function(){return!this.unsigned&&this.high<0},O.isPositive=function(){return this.unsigned||this.high>=0},O.isOdd=function(){return(this.low&1)===1},O.isEven=function(){return(this.low&1)===0},O.equals=function(Q){return I1(Q)||(Q=Z3(Q)),this.unsigned!==Q.unsigned&&this.high>>>31===1&&Q.high>>>31===1?!1:this.high===Q.high&&this.low===Q.low},O.eq=O.equals,O.notEquals=function(Q){return!this.eq(Q)},O.neq=O.notEquals,O.ne=O.notEquals,O.lessThan=function(Q){return this.comp(Q)<0},O.lt=O.lessThan,O.lessThanOrEqual=function(Q){return this.comp(Q)<=0},O.lte=O.lessThanOrEqual,O.le=O.lessThanOrEqual,O.greaterThan=function(Q){return this.comp(Q)>0},O.gt=O.greaterThan,O.greaterThanOrEqual=function(Q){return this.comp(Q)>=0},O.gte=O.greaterThanOrEqual,O.ge=O.greaterThanOrEqual,O.compare=function(Q){if(I1(Q)||(Q=Z3(Q)),this.eq(Q))return 0;var H=this.isNegative(),j=Q.isNegative();return H&&!j?-1:!H&&j?1:this.unsigned?Q.high>>>0>this.high>>>0||Q.high===this.high&&Q.low>>>0>this.low>>>0?-1:1:this.sub(Q).isNegative()?-1:1},O.comp=O.compare,O.negate=function(){return!this.unsigned&&this.eq(y1)?y1:this.not().add(m3)},O.neg=O.negate,O.add=function(Q){I1(Q)||(Q=Z3(Q));var H=this.high>>>16,j=this.high&65535,K=this.low>>>16,W=this.low&65535,U=Q.high>>>16,Z=Q.high&65535,q=Q.low>>>16,G=Q.low&65535,J=0,X=0,V=0,R=0;return R+=W+G,V+=R>>>16,R&=65535,V+=K+q,X+=V>>>16,V&=65535,X+=j+Z,J+=X>>>16,X&=65535,J+=H+U,J&=65535,e(V<<16|R,J<<16|X,this.unsigned)},O.subtract=function(Q){return I1(Q)||(Q=Z3(Q)),this.add(Q.neg())},O.sub=O.subtract,O.multiply=function(Q){if(this.isZero())return this;if(I1(Q)||(Q=Z3(Q)),l1){var H=l1.mul(this.low,this.high,Q.low,Q.high);return e(H,l1.get_high(),this.unsigned)}if(Q.isZero())return this.unsigned?W3:t1;if(this.eq(y1))return Q.isOdd()?y1:t1;if(Q.eq(y1))return this.isOdd()?y1:t1;if(this.isNegative())return Q.isNegative()?this.neg().mul(Q.neg()):this.neg().mul(Q).neg();if(Q.isNegative())return this.mul(Q.neg()).neg();if(this.lt(p5)&&Q.lt(p5))return e1(this.toNumber()*Q.toNumber(),this.unsigned);var j=this.high>>>16,K=this.high&65535,W=this.low>>>16,U=this.low&65535,Z=Q.high>>>16,q=Q.high&65535,G=Q.low>>>16,J=Q.low&65535,X=0,V=0,R=0,z=0;return z+=U*J,R+=z>>>16,z&=65535,R+=W*J,V+=R>>>16,R&=65535,R+=U*G,V+=R>>>16,R&=65535,V+=K*J,X+=V>>>16,V&=65535,V+=W*G,X+=V>>>16,V&=65535,V+=U*q,X+=V>>>16,V&=65535,X+=j*J+K*G+W*q+U*Z,X&=65535,e(R<<16|z,X<<16|V,this.unsigned)},O.mul=O.multiply,O.divide=function(Q){if(I1(Q)||(Q=Z3(Q)),Q.isZero())throw Error("division by zero");if(l1){if(!this.unsigned&&this.high===-2147483648&&Q.low===-1&&Q.high===-1)return this;var H=(this.unsigned?l1.div_u:l1.div_s)(this.low,this.high,Q.low,Q.high);return e(H,l1.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?W3:t1;var j,K,W;if(this.unsigned){if(Q.unsigned||(Q=Q.toUnsigned()),Q.gt(this))return W3;if(Q.gt(this.shru(1)))return h5;W=W3}else{if(this.eq(y1)){if(Q.eq(m3)||Q.eq(j5))return y1;if(Q.eq(y1))return m3;var U=this.shr(1);return j=U.div(Q).shl(1),j.eq(t1)?Q.isNegative()?m3:j5:(K=this.sub(Q.mul(j)),W=j.add(K.div(Q)),W)}else if(Q.eq(y1))return this.unsigned?W3:t1;if(this.isNegative())return Q.isNegative()?this.neg().div(Q.neg()):this.neg().div(Q).neg();if(Q.isNegative())return this.div(Q.neg()).neg();W=t1}for(K=this;K.gte(Q);){j=Math.max(1,Math.floor(K.toNumber()/Q.toNumber()));for(var Z=Math.ceil(Math.log(j)/Math.LN2),q=Z<=48?1:O4(2,Z-48),G=e1(j),J=G.mul(Q);J.isNegative()||J.gt(K);)j-=q,G=e1(j,this.unsigned),J=G.mul(Q);G.isZero()&&(G=m3),W=W.add(G),K=K.sub(J)}return W},O.div=O.divide,O.modulo=function(Q){if(I1(Q)||(Q=Z3(Q)),l1){var H=(this.unsigned?l1.rem_u:l1.rem_s)(this.low,this.high,Q.low,Q.high);return e(H,l1.get_high(),this.unsigned)}return this.sub(this.div(Q).mul(Q))},O.mod=O.modulo,O.rem=O.modulo,O.not=function(){return e(~this.low,~this.high,this.unsigned)},O.countLeadingZeros=function(){return this.high?Math.clz32(this.high):Math.clz32(this.low)+32},O.clz=O.countLeadingZeros,O.countTrailingZeros=function(){return this.low?c7(this.low):c7(this.high)+32},O.ctz=O.countTrailingZeros,O.and=function(Q){return I1(Q)||(Q=Z3(Q)),e(this.low&Q.low,this.high&Q.high,this.unsigned)},O.or=function(Q){return I1(Q)||(Q=Z3(Q)),e(this.low|Q.low,this.high|Q.high,this.unsigned)},O.xor=function(Q){return I1(Q)||(Q=Z3(Q)),e(this.low^Q.low,this.high^Q.high,this.unsigned)},O.shiftLeft=function(Q){return I1(Q)&&(Q=Q.toInt()),(Q&=63)===0?this:Q<32?e(this.low<<Q,this.high<<Q|this.low>>>32-Q,this.unsigned):e(0,this.low<<Q-32,this.unsigned)},O.shl=O.shiftLeft,O.shiftRight=function(Q){return I1(Q)&&(Q=Q.toInt()),(Q&=63)===0?this:Q<32?e(this.low>>>Q|this.high<<32-Q,this.high>>Q,this.unsigned):e(this.high>>Q-32,this.high>=0?0:-1,this.unsigned)},O.shr=O.shiftRight,O.shiftRightUnsigned=function(Q){return I1(Q)&&(Q=Q.toInt()),(Q&=63)===0?this:Q<32?e(this.low>>>Q|this.high<<32-Q,this.high>>>Q,this.unsigned):Q===32?e(this.high,0,this.unsigned):e(this.high>>>Q-32,0,this.unsigned)},O.shru=O.shiftRightUnsigned,O.shr_u=O.shiftRightUnsigned,O.rotateLeft=function(Q){var H;return I1(Q)&&(Q=Q.toInt()),(Q&=63)===0?this:Q===32?e(this.high,this.low,this.unsigned):Q<32?(H=32-Q,e(this.low<<Q|this.high>>>H,this.high<<Q|this.low>>>H,this.unsigned)):(Q-=32,H=32-Q,e(this.high<<Q|this.low>>>H,this.low<<Q|this.high>>>H,this.unsigned))},O.rotl=O.rotateLeft,O.rotateRight=function(Q){var H;return I1(Q)&&(Q=Q.toInt()),(Q&=63)===0?this:Q===32?e(this.high,this.low,this.unsigned):Q<32?(H=32-Q,e(this.high<<H|this.low>>>Q,this.low<<H|this.high>>>Q,this.unsigned)):(Q-=32,H=32-Q,e(this.low<<H|this.high>>>Q,this.high<<H|this.low>>>Q,this.unsigned))},O.rotr=O.rotateRight,O.toSigned=function(){return this.unsigned?e(this.low,this.high,!1):this},O.toUnsigned=function(){return this.unsigned?this:e(this.low,this.high,!0)},O.toBytes=function(Q){return Q?this.toBytesLE():this.toBytesBE()},O.toBytesLE=function(){var Q=this.high,H=this.low;return[H&255,H>>>8&255,H>>>16&255,H>>>24,Q&255,Q>>>8&255,Q>>>16&255,Q>>>24]},O.toBytesBE=function(){var Q=this.high,H=this.low;return[Q>>>24,Q>>>16&255,Q>>>8&255,Q&255,H>>>24,H>>>16&255,H>>>8&255,H&255]},X1.fromBytes=function(Q,H,j){return j?X1.fromBytesLE(Q,H):X1.fromBytesBE(Q,H)},X1.fromBytesLE=function(Q,H){return new X1(Q[0]|Q[1]<<8|Q[2]<<16|Q[3]<<24,Q[4]|Q[5]<<8|Q[6]<<16|Q[7]<<24,H)},X1.fromBytesBE=function(Q,H){return new X1(Q[4]<<24|Q[5]<<16|Q[6]<<8|Q[7],Q[0]<<24|Q[1]<<16|Q[2]<<8|Q[3],H)},_3=X1}),$,H7=E(()=>{$={},$.Offset,$.Table,$.SIZEOF_SHORT=2,$.SIZEOF_INT=4,$.FILE_IDENTIFIER_LENGTH=4,$.SIZE_PREFIX_LENGTH=4,$.Encoding={UTF8_BYTES:1,UTF16_STRING:2},$.int32=new Int32Array(2),$.float32=new Float32Array($.int32.buffer),$.float64=new Float64Array($.int32.buffer),$.isLittleEndian=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1,$.Long=function(Q,H){this.low=Q|0,this.high=H|0},$.Long.create=function(Q,H){return Q==0&&H==0?$.Long.ZERO:new $.Long(Q,H)},$.Long.prototype.toFloat64=function(){return(this.low>>>0)+this.high*4294967296},$.Long.prototype.equals=function(Q){return this.low==Q.low&&this.high==Q.high},$.Long.ZERO=new $.Long(0,0),$.Builder=function(Q){if(Q)var H=Q;else var H=1024;this.bb=$.ByteBuffer.allocate(H),this.space=H,this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1},$.Builder.prototype.clear=function(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1},$.Builder.prototype.forceDefaults=function(Q){this.force_defaults=Q},$.Builder.prototype.dataBuffer=function(){return this.bb},$.Builder.prototype.asUint8Array=function(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())},$.Builder.prototype.prep=function(Q,H){Q>this.minalign&&(this.minalign=Q);for(var j=~(this.bb.capacity()-this.space+H)+1&Q-1;this.space<j+Q+H;){var K=this.bb.capacity();this.bb=$.Builder.growByteBuffer(this.bb),this.space+=this.bb.capacity()-K}this.pad(j)},$.Builder.prototype.pad=function(Q){for(var H=0;H<Q;H++)this.bb.writeInt8(--this.space,0)},$.Builder.prototype.writeInt8=function(Q){this.bb.writeInt8(this.space-=1,Q)},$.Builder.prototype.writeInt16=function(Q){this.bb.writeInt16(this.space-=2,Q)},$.Builder.prototype.writeInt32=function(Q){this.bb.writeInt32(this.space-=4,Q)},$.Builder.prototype.writeInt64=function(Q){this.bb.writeInt64(this.space-=8,Q)},$.Builder.prototype.writeFloat32=function(Q){this.bb.writeFloat32(this.space-=4,Q)},$.Builder.prototype.writeFloat64=function(Q){this.bb.writeFloat64(this.space-=8,Q)},$.Builder.prototype.addInt8=function(Q){this.prep(1,0),this.writeInt8(Q)},$.Builder.prototype.addInt16=function(Q){this.prep(2,0),this.writeInt16(Q)},$.Builder.prototype.addInt32=function(Q){this.prep(4,0),this.writeInt32(Q)},$.Builder.prototype.addInt64=function(Q){this.prep(8,0),this.writeInt64(Q)},$.Builder.prototype.addFloat32=function(Q){this.prep(4,0),this.writeFloat32(Q)},$.Builder.prototype.addFloat64=function(Q){this.prep(8,0),this.writeFloat64(Q)},$.Builder.prototype.addFieldInt8=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addInt8(H),this.slot(Q))},$.Builder.prototype.addFieldInt16=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addInt16(H),this.slot(Q))},$.Builder.prototype.addFieldInt32=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addInt32(H),this.slot(Q))},$.Builder.prototype.addFieldInt64=function(Q,H,j){(this.force_defaults||!H.equals(j))&&(this.addInt64(H),this.slot(Q))},$.Builder.prototype.addFieldFloat32=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addFloat32(H),this.slot(Q))},$.Builder.prototype.addFieldFloat64=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addFloat64(H),this.slot(Q))},$.Builder.prototype.addFieldOffset=function(Q,H,j){(this.force_defaults||H!=j)&&(this.addOffset(H),this.slot(Q))},$.Builder.prototype.addFieldStruct=function(Q,H,j){H!=j&&(this.nested(H),this.slot(Q))},$.Builder.prototype.nested=function(Q){if(Q!=this.offset())throw new Error("FlatBuffers: struct must be serialized inline.")},$.Builder.prototype.notNested=function(){if(this.isNested)throw new Error("FlatBuffers: object serialization must not be nested.")},$.Builder.prototype.slot=function(Q){this.vtable[Q]=this.offset()},$.Builder.prototype.offset=function(){return this.bb.capacity()-this.space},$.Builder.growByteBuffer=function(Q){var H=Q.capacity();if(H&3221225472)throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes.");var j=H<<1,K=$.ByteBuffer.allocate(j);return K.setPosition(j-H),K.bytes().set(Q.bytes(),j-H),K},$.Builder.prototype.addOffset=function(Q){this.prep($.SIZEOF_INT,0),this.writeInt32(this.offset()-Q+$.SIZEOF_INT)},$.Builder.prototype.startObject=function(Q){this.notNested(),this.vtable==null&&(this.vtable=[]),this.vtable_in_use=Q;for(var H=0;H<Q;H++)this.vtable[H]=0;this.isNested=!0,this.object_start=this.offset()},$.Builder.prototype.endObject=function(){if(this.vtable==null||!this.isNested)throw new Error("FlatBuffers: endObject called without startObject");this.addInt32(0);for(var Q=this.offset(),H=this.vtable_in_use-1;H>=0&&this.vtable[H]==0;H--);for(var j=H+1;H>=0;H--)this.addInt16(this.vtable[H]!=0?Q-this.vtable[H]:0);var K=2;this.addInt16(Q-this.object_start);var W=(j+K)*$.SIZEOF_SHORT;this.addInt16(W);var U=0,Z=this.space;Q:for(H=0;H<this.vtables.length;H++){var q=this.bb.capacity()-this.vtables[H];if(W==this.bb.readInt16(q)){for(var G=$.SIZEOF_SHORT;G<W;G+=$.SIZEOF_SHORT)if(this.bb.readInt16(Z+G)!=this.bb.readInt16(q+G))continue Q;U=this.vtables[H];break}}return U?(this.space=this.bb.capacity()-Q,this.bb.writeInt32(this.space,U-Q)):(this.vtables.push(this.offset()),this.bb.writeInt32(this.bb.capacity()-Q,this.offset()-Q)),this.isNested=!1,Q},$.Builder.prototype.finish=function(Q,H,j){var K=j?$.SIZE_PREFIX_LENGTH:0;if(H){var W=H;if(this.prep(this.minalign,$.SIZEOF_INT+$.FILE_IDENTIFIER_LENGTH+K),W.length!=$.FILE_IDENTIFIER_LENGTH)throw new Error("FlatBuffers: file identifier must be length "+$.FILE_IDENTIFIER_LENGTH);for(var U=$.FILE_IDENTIFIER_LENGTH-1;U>=0;U--)this.writeInt8(W.charCodeAt(U))}this.prep(this.minalign,$.SIZEOF_INT+K),this.addOffset(Q),K&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)},$.Builder.prototype.finishSizePrefixed=function(Q,H){this.finish(Q,H,!0)},$.Builder.prototype.requiredField=function(Q,H){var j=this.bb.capacity()-Q,K=j-this.bb.readInt32(j),W=this.bb.readInt16(K+H)!=0;if(!W)throw new Error("FlatBuffers: field "+H+" must be set")},$.Builder.prototype.startVector=function(Q,H,j){this.notNested(),this.vector_num_elems=H,this.prep($.SIZEOF_INT,Q*H),this.prep(j,Q*H)},$.Builder.prototype.endVector=function(){return this.writeInt32(this.vector_num_elems),this.offset()},$.Builder.prototype.createString=function(Q){if(Q instanceof Uint8Array)var H=Q;else for(var H=[],j=0;j<Q.length;){var K,W=Q.charCodeAt(j++);if(W<55296||W>=56320)K=W;else{var U=Q.charCodeAt(j++);K=(W<<10)+U+-56613888}K<128?H.push(K):(K<2048?H.push(K>>6&31|192):(K<65536?H.push(K>>12&15|224):H.push(K>>18&7|240,K>>12&63|128),H.push(K>>6&63|128)),H.push(K&63|128))}this.addInt8(0),this.startVector(1,H.length,1),this.bb.setPosition(this.space-=H.length);for(var j=0,Z=this.space,q=this.bb.bytes();j<H.length;j++)q[Z++]=H[j];return this.endVector()},$.Builder.prototype.createLong=function(Q,H){return $.Long.create(Q,H)},$.ByteBuffer=function(Q){this.bytes_=Q,this.position_=0},$.ByteBuffer.allocate=function(Q){return new $.ByteBuffer(new Uint8Array(Q))},$.ByteBuffer.prototype.clear=function(){this.position_=0},$.ByteBuffer.prototype.bytes=function(){return this.bytes_},$.ByteBuffer.prototype.position=function(){return this.position_},$.ByteBuffer.prototype.setPosition=function(Q){this.position_=Q},$.ByteBuffer.prototype.capacity=function(){return this.bytes_.length},$.ByteBuffer.prototype.readInt8=function(Q){return this.readUint8(Q)<<24>>24},$.ByteBuffer.prototype.readUint8=function(Q){return this.bytes_[Q]},$.ByteBuffer.prototype.readInt16=function(Q){return this.readUint16(Q)<<16>>16},$.ByteBuffer.prototype.readUint16=function(Q){return this.bytes_[Q]|this.bytes_[Q+1]<<8},$.ByteBuffer.prototype.readInt32=function(Q){return this.bytes_[Q]|this.bytes_[Q+1]<<8|this.bytes_[Q+2]<<16|this.bytes_[Q+3]<<24},$.ByteBuffer.prototype.readUint32=function(Q){return this.readInt32(Q)>>>0},$.ByteBuffer.prototype.readInt64=function(Q){return new $.Long(this.readInt32(Q),this.readInt32(Q+4))},$.ByteBuffer.prototype.readUint64=function(Q){return new $.Long(this.readUint32(Q),this.readUint32(Q+4))},$.ByteBuffer.prototype.readFloat32=function(Q){return $.int32[0]=this.readInt32(Q),$.float32[0]},$.ByteBuffer.prototype.readFloat64=function(Q){return $.int32[$.isLittleEndian?0:1]=this.readInt32(Q),$.int32[$.isLittleEndian?1:0]=this.readInt32(Q+4),$.float64[0]},$.ByteBuffer.prototype.writeInt8=function(Q,H){this.bytes_[Q]=H},$.ByteBuffer.prototype.writeUint8=function(Q,H){this.bytes_[Q]=H},$.ByteBuffer.prototype.writeInt16=function(Q,H){this.bytes_[Q]=H,this.bytes_[Q+1]=H>>8},$.ByteBuffer.prototype.writeUint16=function(Q,H){this.bytes_[Q]=H,this.bytes_[Q+1]=H>>8},$.ByteBuffer.prototype.writeInt32=function(Q,H){this.bytes_[Q]=H,this.bytes_[Q+1]=H>>8,this.bytes_[Q+2]=H>>16,this.bytes_[Q+3]=H>>24},$.ByteBuffer.prototype.writeUint32=function(Q,H){this.bytes_[Q]=H,this.bytes_[Q+1]=H>>8,this.bytes_[Q+2]=H>>16,this.bytes_[Q+3]=H>>24},$.ByteBuffer.prototype.writeInt64=function(Q,H){this.writeInt32(Q,H.low),this.writeInt32(Q+4,H.high)},$.ByteBuffer.prototype.writeUint64=function(Q,H){this.writeUint32(Q,H.low),this.writeUint32(Q+4,H.high)},$.ByteBuffer.prototype.writeFloat32=function(Q,H){$.float32[0]=H,this.writeInt32(Q,$.int32[0])},$.ByteBuffer.prototype.writeFloat64=function(Q,H){$.float64[0]=H,this.writeInt32(Q,$.int32[$.isLittleEndian?0:1]),this.writeInt32(Q+4,$.int32[$.isLittleEndian?1:0])},$.ByteBuffer.prototype.getBufferIdentifier=function(){if(this.bytes_.length<this.position_+$.SIZEOF_INT+$.FILE_IDENTIFIER_LENGTH)throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier.");for(var Q="",H=0;H<$.FILE_IDENTIFIER_LENGTH;H++)Q+=String.fromCharCode(this.readInt8(this.position_+$.SIZEOF_INT+H));return Q},$.ByteBuffer.prototype.__offset=function(Q,H){var j=Q-this.readInt32(Q);return H<this.readInt16(j)?this.readInt16(j+H):0},$.ByteBuffer.prototype.__union=function(Q,H){return Q.bb_pos=H+this.readInt32(H),Q.bb=this,Q},$.ByteBuffer.prototype.__string=function(Q,H){Q+=this.readInt32(Q);var j=this.readInt32(Q),K="",W=0;if(Q+=$.SIZEOF_INT,H===$.Encoding.UTF8_BYTES)return this.bytes_.subarray(Q,Q+j);for(;W<j;){var U,Z=this.readUint8(Q+W++);if(Z<192)U=Z;else{var q=this.readUint8(Q+W++);if(Z<224)U=(Z&31)<<6|q&63;else{var G=this.readUint8(Q+W++);if(Z<240)U=(Z&15)<<12|(q&63)<<6|G&63;else{var J=this.readUint8(Q+W++);U=(Z&7)<<18|(q&63)<<12|(G&63)<<6|J&63}}}U<65536?K+=String.fromCharCode(U):(U-=65536,K+=String.fromCharCode((U>>10)+55296,(U&1023)+56320))}return K},$.ByteBuffer.prototype.__indirect=function(Q){return Q+this.readInt32(Q)},$.ByteBuffer.prototype.__vector=function(Q){return Q+this.readInt32(Q)+$.SIZEOF_INT},$.ByteBuffer.prototype.__vector_len=function(Q){return this.readInt32(Q+this.readInt32(Q))},$.ByteBuffer.prototype.__has_identifier=function(Q){if(Q.length!=$.FILE_IDENTIFIER_LENGTH)throw new Error("FlatBuffers: file identifier must be length "+$.FILE_IDENTIFIER_LENGTH);for(var H=0;H<$.FILE_IDENTIFIER_LENGTH;H++)if(Q.charCodeAt(H)!=this.readInt8(this.position_+$.SIZEOF_INT+H))return!1;return!0},$.ByteBuffer.prototype.createLong=function(Q,H){return $.Long.create(Q,H)}}),H1,B5=E(()=>{H7(),((Q)=>{let H;((j)=>{let K;((W)=>{let U;((Z)=>(Z[Z.UNDEFINED=0]="UNDEFINED",Z[Z.FLOAT=1]="FLOAT",Z[Z.INT=2]="INT",Z[Z.STRING=3]="STRING",Z[Z.TENSOR=4]="TENSOR",Z[Z.GRAPH=5]="GRAPH",Z[Z.FLOATS=6]="FLOATS",Z[Z.INTS=7]="INTS",Z[Z.STRINGS=8]="STRINGS",Z[Z.TENSORS=9]="TENSORS",Z[Z.GRAPHS=10]="GRAPHS",Z[Z.SPARSE_TENSOR=11]="SPARSE_TENSOR",Z[Z.SPARSE_TENSORS=12]="SPARSE_TENSORS"))(U=W.AttributeType||={})})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{let U;((Z)=>(Z[Z.UNKNOWN=0]="UNKNOWN",Z[Z.VALUE=1]="VALUE",Z[Z.PARAM=2]="PARAM"))(U=W.DimensionValueType||={})})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{let U;((Z)=>(Z[Z.UNDEFINED=0]="UNDEFINED",Z[Z.FLOAT=1]="FLOAT",Z[Z.UINT8=2]="UINT8",Z[Z.INT8=3]="INT8",Z[Z.UINT16=4]="UINT16",Z[Z.INT16=5]="INT16",Z[Z.INT32=6]="INT32",Z[Z.INT64=7]="INT64",Z[Z.STRING=8]="STRING",Z[Z.BOOL=9]="BOOL",Z[Z.FLOAT16=10]="FLOAT16",Z[Z.DOUBLE=11]="DOUBLE",Z[Z.UINT32=12]="UINT32",Z[Z.UINT64=13]="UINT64",Z[Z.COMPLEX64=14]="COMPLEX64",Z[Z.COMPLEX128=15]="COMPLEX128",Z[Z.BFLOAT16=16]="BFLOAT16",Z[Z.FLOAT8E4M3FN=17]="FLOAT8E4M3FN",Z[Z.FLOAT8E4M3FNUZ=18]="FLOAT8E4M3FNUZ",Z[Z.FLOAT8E5M2=19]="FLOAT8E5M2",Z[Z.FLOAT8E5M2FNUZ=20]="FLOAT8E5M2FNUZ"))(U=W.TensorDataType||={})})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{let U;((Z)=>(Z[Z.Primitive=0]="Primitive",Z[Z.Fused=1]="Fused"))(U=W.NodeType||={})})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{let U;((Z)=>(Z[Z.NONE=0]="NONE",Z[Z.tensor_type=1]="tensor_type",Z[Z.sequence_type=2]="sequence_type",Z[Z.map_type=3]="map_type"))(U=W.TypeInfoValue||={})})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsShape(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsShape(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}dim(Z,q){let G=this.bb.__offset(this.bb_pos,4);return G?(q||new Q.experimental.fbs.Dimension).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}dimLength(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startShape(Z){Z.startObject(1)}static addDim(Z,q){Z.addFieldOffset(0,q,0)}static createDimVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startDimVector(Z,q){Z.startVector(4,q,4)}static endShape(Z){return Z.endObject()}static createShape(Z,q){return U.startShape(Z),U.addDim(Z,q),U.endShape(Z)}}W.Shape=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsDimension(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsDimension(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}value(Z){let q=this.bb.__offset(this.bb_pos,4);return q?(Z||new Q.experimental.fbs.DimensionValue).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}denotation(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.__string(this.bb_pos+q,Z):null}static startDimension(Z){Z.startObject(2)}static addValue(Z,q){Z.addFieldOffset(0,q,0)}static addDenotation(Z,q){Z.addFieldOffset(1,q,0)}static endDimension(Z){return Z.endObject()}static createDimension(Z,q,G){return U.startDimension(Z),U.addValue(Z,q),U.addDenotation(Z,G),U.endDimension(Z)}}W.Dimension=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsDimensionValue(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsDimensionValue(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}dimType(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.readInt8(this.bb_pos+Z):0}dimValue(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.readInt64(this.bb_pos+Z):this.bb.createLong(0,0)}dimParam(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.__string(this.bb_pos+q,Z):null}static startDimensionValue(Z){Z.startObject(3)}static addDimType(Z,q){Z.addFieldInt8(0,q,0)}static addDimValue(Z,q){Z.addFieldInt64(1,q,Z.createLong(0,0))}static addDimParam(Z,q){Z.addFieldOffset(2,q,0)}static endDimensionValue(Z){return Z.endObject()}static createDimensionValue(Z,q,G,J){return U.startDimensionValue(Z),U.addDimType(Z,q),U.addDimValue(Z,G),U.addDimParam(Z,J),U.endDimensionValue(Z)}}W.DimensionValue=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsTensorTypeAndShape(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsTensorTypeAndShape(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}elemType(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.readInt32(this.bb_pos+Z):0}shape(Z){let q=this.bb.__offset(this.bb_pos,6);return q?(Z||new Q.experimental.fbs.Shape).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startTensorTypeAndShape(Z){Z.startObject(2)}static addElemType(Z,q){Z.addFieldInt32(0,q,0)}static addShape(Z,q){Z.addFieldOffset(1,q,0)}static endTensorTypeAndShape(Z){return Z.endObject()}static createTensorTypeAndShape(Z,q,G){return U.startTensorTypeAndShape(Z),U.addElemType(Z,q),U.addShape(Z,G),U.endTensorTypeAndShape(Z)}}W.TensorTypeAndShape=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsMapType(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsMapType(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}keyType(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.readInt32(this.bb_pos+Z):0}valueType(Z){let q=this.bb.__offset(this.bb_pos,6);return q?(Z||new Q.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startMapType(Z){Z.startObject(2)}static addKeyType(Z,q){Z.addFieldInt32(0,q,0)}static addValueType(Z,q){Z.addFieldOffset(1,q,0)}static endMapType(Z){return Z.endObject()}static createMapType(Z,q,G){return U.startMapType(Z),U.addKeyType(Z,q),U.addValueType(Z,G),U.endMapType(Z)}}W.MapType=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsSequenceType(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsSequenceType(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}elemType(Z){let q=this.bb.__offset(this.bb_pos,4);return q?(Z||new Q.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startSequenceType(Z){Z.startObject(1)}static addElemType(Z,q){Z.addFieldOffset(0,q,0)}static endSequenceType(Z){return Z.endObject()}static createSequenceType(Z,q){return U.startSequenceType(Z),U.addElemType(Z,q),U.endSequenceType(Z)}}W.SequenceType=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}nodeIndex(){return this.bb.readUint32(this.bb_pos)}srcArgIndex(){return this.bb.readInt32(this.bb_pos+4)}dstArgIndex(){return this.bb.readInt32(this.bb_pos+8)}static createEdgeEnd(Z,q,G,J){return Z.prep(4,12),Z.writeInt32(J),Z.writeInt32(G),Z.writeInt32(q),Z.offset()}}W.EdgeEnd=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsNodeEdge(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsNodeEdge(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}nodeIndex(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.readUint32(this.bb_pos+Z):0}inputEdges(Z,q){let G=this.bb.__offset(this.bb_pos,6);return G?(q||new Q.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+G)+Z*12,this.bb):null}inputEdgesLength(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.__vector_len(this.bb_pos+Z):0}outputEdges(Z,q){let G=this.bb.__offset(this.bb_pos,8);return G?(q||new Q.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+G)+Z*12,this.bb):null}outputEdgesLength(){let Z=this.bb.__offset(this.bb_pos,8);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startNodeEdge(Z){Z.startObject(3)}static addNodeIndex(Z,q){Z.addFieldInt32(0,q,0)}static addInputEdges(Z,q){Z.addFieldOffset(1,q,0)}static startInputEdgesVector(Z,q){Z.startVector(12,q,4)}static addOutputEdges(Z,q){Z.addFieldOffset(2,q,0)}static startOutputEdgesVector(Z,q){Z.startVector(12,q,4)}static endNodeEdge(Z){return Z.endObject()}static createNodeEdge(Z,q,G,J){return U.startNodeEdge(Z),U.addNodeIndex(Z,q),U.addInputEdges(Z,G),U.addOutputEdges(Z,J),U.endNodeEdge(Z)}}W.NodeEdge=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsNode(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsNode(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}name(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}docString(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.__string(this.bb_pos+q,Z):null}domain(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.__string(this.bb_pos+q,Z):null}sinceVersion(){let Z=this.bb.__offset(this.bb_pos,10);return Z?this.bb.readInt32(this.bb_pos+Z):0}index(){let Z=this.bb.__offset(this.bb_pos,12);return Z?this.bb.readUint32(this.bb_pos+Z):0}opType(Z){let q=this.bb.__offset(this.bb_pos,14);return q?this.bb.__string(this.bb_pos+q,Z):null}type(){let Z=this.bb.__offset(this.bb_pos,16);return Z?this.bb.readInt32(this.bb_pos+Z):0}executionProviderType(Z){let q=this.bb.__offset(this.bb_pos,18);return q?this.bb.__string(this.bb_pos+q,Z):null}inputs(Z,q){let G=this.bb.__offset(this.bb_pos,20);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}inputsLength(){let Z=this.bb.__offset(this.bb_pos,20);return Z?this.bb.__vector_len(this.bb_pos+Z):0}outputs(Z,q){let G=this.bb.__offset(this.bb_pos,22);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}outputsLength(){let Z=this.bb.__offset(this.bb_pos,22);return Z?this.bb.__vector_len(this.bb_pos+Z):0}attributes(Z,q){let G=this.bb.__offset(this.bb_pos,24);return G?(q||new Q.experimental.fbs.Attribute).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}attributesLength(){let Z=this.bb.__offset(this.bb_pos,24);return Z?this.bb.__vector_len(this.bb_pos+Z):0}inputArgCounts(Z){let q=this.bb.__offset(this.bb_pos,26);return q?this.bb.readInt32(this.bb.__vector(this.bb_pos+q)+Z*4):0}inputArgCountsLength(){let Z=this.bb.__offset(this.bb_pos,26);return Z?this.bb.__vector_len(this.bb_pos+Z):0}inputArgCountsArray(){let Z=this.bb.__offset(this.bb_pos,26);return Z?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+Z),this.bb.__vector_len(this.bb_pos+Z)):null}implicitInputs(Z,q){let G=this.bb.__offset(this.bb_pos,28);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}implicitInputsLength(){let Z=this.bb.__offset(this.bb_pos,28);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startNode(Z){Z.startObject(13)}static addName(Z,q){Z.addFieldOffset(0,q,0)}static addDocString(Z,q){Z.addFieldOffset(1,q,0)}static addDomain(Z,q){Z.addFieldOffset(2,q,0)}static addSinceVersion(Z,q){Z.addFieldInt32(3,q,0)}static addIndex(Z,q){Z.addFieldInt32(4,q,0)}static addOpType(Z,q){Z.addFieldOffset(5,q,0)}static addType(Z,q){Z.addFieldInt32(6,q,0)}static addExecutionProviderType(Z,q){Z.addFieldOffset(7,q,0)}static addInputs(Z,q){Z.addFieldOffset(8,q,0)}static createInputsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startInputsVector(Z,q){Z.startVector(4,q,4)}static addOutputs(Z,q){Z.addFieldOffset(9,q,0)}static createOutputsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startOutputsVector(Z,q){Z.startVector(4,q,4)}static addAttributes(Z,q){Z.addFieldOffset(10,q,0)}static createAttributesVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startAttributesVector(Z,q){Z.startVector(4,q,4)}static addInputArgCounts(Z,q){Z.addFieldOffset(11,q,0)}static createInputArgCountsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addInt32(q[G]);return Z.endVector()}static startInputArgCountsVector(Z,q){Z.startVector(4,q,4)}static addImplicitInputs(Z,q){Z.addFieldOffset(12,q,0)}static createImplicitInputsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startImplicitInputsVector(Z,q){Z.startVector(4,q,4)}static endNode(Z){return Z.endObject()}static createNode(Z,q,G,J,X,V,R,z,Y,B,k,w,A,D){return U.startNode(Z),U.addName(Z,q),U.addDocString(Z,G),U.addDomain(Z,J),U.addSinceVersion(Z,X),U.addIndex(Z,V),U.addOpType(Z,R),U.addType(Z,z),U.addExecutionProviderType(Z,Y),U.addInputs(Z,B),U.addOutputs(Z,k),U.addAttributes(Z,w),U.addInputArgCounts(Z,A),U.addImplicitInputs(Z,D),U.endNode(Z)}}W.Node=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsValueInfo(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsValueInfo(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}name(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}docString(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.__string(this.bb_pos+q,Z):null}type(Z){let q=this.bb.__offset(this.bb_pos,8);return q?(Z||new Q.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startValueInfo(Z){Z.startObject(3)}static addName(Z,q){Z.addFieldOffset(0,q,0)}static addDocString(Z,q){Z.addFieldOffset(1,q,0)}static addType(Z,q){Z.addFieldOffset(2,q,0)}static endValueInfo(Z){return Z.endObject()}static createValueInfo(Z,q,G,J){return U.startValueInfo(Z),U.addName(Z,q),U.addDocString(Z,G),U.addType(Z,J),U.endValueInfo(Z)}}W.ValueInfo=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsTypeInfo(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsTypeInfo(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}denotation(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}valueType(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.readUint8(this.bb_pos+Z):0}value(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.__union(Z,this.bb_pos+q):null}static startTypeInfo(Z){Z.startObject(3)}static addDenotation(Z,q){Z.addFieldOffset(0,q,0)}static addValueType(Z,q){Z.addFieldInt8(1,q,0)}static addValue(Z,q){Z.addFieldOffset(2,q,0)}static endTypeInfo(Z){return Z.endObject()}static createTypeInfo(Z,q,G,J){return U.startTypeInfo(Z),U.addDenotation(Z,q),U.addValueType(Z,G),U.addValue(Z,J),U.endTypeInfo(Z)}}W.TypeInfo=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsOperatorSetId(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsOperatorSetId(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}domain(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}version(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.readInt64(this.bb_pos+Z):this.bb.createLong(0,0)}static startOperatorSetId(Z){Z.startObject(2)}static addDomain(Z,q){Z.addFieldOffset(0,q,0)}static addVersion(Z,q){Z.addFieldInt64(1,q,Z.createLong(0,0))}static endOperatorSetId(Z){return Z.endObject()}static createOperatorSetId(Z,q,G){return U.startOperatorSetId(Z),U.addDomain(Z,q),U.addVersion(Z,G),U.endOperatorSetId(Z)}}W.OperatorSetId=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsTensor(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsTensor(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}name(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}docString(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.__string(this.bb_pos+q,Z):null}dims(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.readInt64(this.bb.__vector(this.bb_pos+q)+Z*8):this.bb.createLong(0,0)}dimsLength(){let Z=this.bb.__offset(this.bb_pos,8);return Z?this.bb.__vector_len(this.bb_pos+Z):0}dataType(){let Z=this.bb.__offset(this.bb_pos,10);return Z?this.bb.readInt32(this.bb_pos+Z):0}rawData(Z){let q=this.bb.__offset(this.bb_pos,12);return q?this.bb.readUint8(this.bb.__vector(this.bb_pos+q)+Z):0}rawDataLength(){let Z=this.bb.__offset(this.bb_pos,12);return Z?this.bb.__vector_len(this.bb_pos+Z):0}rawDataArray(){let Z=this.bb.__offset(this.bb_pos,12);return Z?new Uint8Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+Z),this.bb.__vector_len(this.bb_pos+Z)):null}stringData(Z,q){let G=this.bb.__offset(this.bb_pos,14);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}stringDataLength(){let Z=this.bb.__offset(this.bb_pos,14);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startTensor(Z){Z.startObject(6)}static addName(Z,q){Z.addFieldOffset(0,q,0)}static addDocString(Z,q){Z.addFieldOffset(1,q,0)}static addDims(Z,q){Z.addFieldOffset(2,q,0)}static createDimsVector(Z,q){Z.startVector(8,q.length,8);for(let G=q.length-1;G>=0;G--)Z.addInt64(q[G]);return Z.endVector()}static startDimsVector(Z,q){Z.startVector(8,q,8)}static addDataType(Z,q){Z.addFieldInt32(3,q,0)}static addRawData(Z,q){Z.addFieldOffset(4,q,0)}static createRawDataVector(Z,q){Z.startVector(1,q.length,1);for(let G=q.length-1;G>=0;G--)Z.addInt8(q[G]);return Z.endVector()}static startRawDataVector(Z,q){Z.startVector(1,q,1)}static addStringData(Z,q){Z.addFieldOffset(5,q,0)}static createStringDataVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startStringDataVector(Z,q){Z.startVector(4,q,4)}static endTensor(Z){return Z.endObject()}static createTensor(Z,q,G,J,X,V,R){return U.startTensor(Z),U.addName(Z,q),U.addDocString(Z,G),U.addDims(Z,J),U.addDataType(Z,X),U.addRawData(Z,V),U.addStringData(Z,R),U.endTensor(Z)}}W.Tensor=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsSparseTensor(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsSparseTensor(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}values(Z){let q=this.bb.__offset(this.bb_pos,4);return q?(Z||new Q.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}indices(Z){let q=this.bb.__offset(this.bb_pos,6);return q?(Z||new Q.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}dims(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.readInt64(this.bb.__vector(this.bb_pos+q)+Z*8):this.bb.createLong(0,0)}dimsLength(){let Z=this.bb.__offset(this.bb_pos,8);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startSparseTensor(Z){Z.startObject(3)}static addValues(Z,q){Z.addFieldOffset(0,q,0)}static addIndices(Z,q){Z.addFieldOffset(1,q,0)}static addDims(Z,q){Z.addFieldOffset(2,q,0)}static createDimsVector(Z,q){Z.startVector(8,q.length,8);for(let G=q.length-1;G>=0;G--)Z.addInt64(q[G]);return Z.endVector()}static startDimsVector(Z,q){Z.startVector(8,q,8)}static endSparseTensor(Z){return Z.endObject()}static createSparseTensor(Z,q,G,J){return U.startSparseTensor(Z),U.addValues(Z,q),U.addIndices(Z,G),U.addDims(Z,J),U.endSparseTensor(Z)}}W.SparseTensor=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsAttribute(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsAttribute(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}name(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}docString(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.__string(this.bb_pos+q,Z):null}type(){let Z=this.bb.__offset(this.bb_pos,8);return Z?this.bb.readInt32(this.bb_pos+Z):0}f(){let Z=this.bb.__offset(this.bb_pos,10);return Z?this.bb.readFloat32(this.bb_pos+Z):0}i(){let Z=this.bb.__offset(this.bb_pos,12);return Z?this.bb.readInt64(this.bb_pos+Z):this.bb.createLong(0,0)}s(Z){let q=this.bb.__offset(this.bb_pos,14);return q?this.bb.__string(this.bb_pos+q,Z):null}t(Z){let q=this.bb.__offset(this.bb_pos,16);return q?(Z||new Q.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}g(Z){let q=this.bb.__offset(this.bb_pos,18);return q?(Z||new Q.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}floats(Z){let q=this.bb.__offset(this.bb_pos,20);return q?this.bb.readFloat32(this.bb.__vector(this.bb_pos+q)+Z*4):0}floatsLength(){let Z=this.bb.__offset(this.bb_pos,20);return Z?this.bb.__vector_len(this.bb_pos+Z):0}floatsArray(){let Z=this.bb.__offset(this.bb_pos,20);return Z?new Float32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+Z),this.bb.__vector_len(this.bb_pos+Z)):null}ints(Z){let q=this.bb.__offset(this.bb_pos,22);return q?this.bb.readInt64(this.bb.__vector(this.bb_pos+q)+Z*8):this.bb.createLong(0,0)}intsLength(){let Z=this.bb.__offset(this.bb_pos,22);return Z?this.bb.__vector_len(this.bb_pos+Z):0}strings(Z,q){let G=this.bb.__offset(this.bb_pos,24);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}stringsLength(){let Z=this.bb.__offset(this.bb_pos,24);return Z?this.bb.__vector_len(this.bb_pos+Z):0}tensors(Z,q){let G=this.bb.__offset(this.bb_pos,26);return G?(q||new Q.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}tensorsLength(){let Z=this.bb.__offset(this.bb_pos,26);return Z?this.bb.__vector_len(this.bb_pos+Z):0}graphs(Z,q){let G=this.bb.__offset(this.bb_pos,28);return G?(q||new Q.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}graphsLength(){let Z=this.bb.__offset(this.bb_pos,28);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startAttribute(Z){Z.startObject(13)}static addName(Z,q){Z.addFieldOffset(0,q,0)}static addDocString(Z,q){Z.addFieldOffset(1,q,0)}static addType(Z,q){Z.addFieldInt32(2,q,0)}static addF(Z,q){Z.addFieldFloat32(3,q,0)}static addI(Z,q){Z.addFieldInt64(4,q,Z.createLong(0,0))}static addS(Z,q){Z.addFieldOffset(5,q,0)}static addT(Z,q){Z.addFieldOffset(6,q,0)}static addG(Z,q){Z.addFieldOffset(7,q,0)}static addFloats(Z,q){Z.addFieldOffset(8,q,0)}static createFloatsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addFloat32(q[G]);return Z.endVector()}static startFloatsVector(Z,q){Z.startVector(4,q,4)}static addInts(Z,q){Z.addFieldOffset(9,q,0)}static createIntsVector(Z,q){Z.startVector(8,q.length,8);for(let G=q.length-1;G>=0;G--)Z.addInt64(q[G]);return Z.endVector()}static startIntsVector(Z,q){Z.startVector(8,q,8)}static addStrings(Z,q){Z.addFieldOffset(10,q,0)}static createStringsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startStringsVector(Z,q){Z.startVector(4,q,4)}static addTensors(Z,q){Z.addFieldOffset(11,q,0)}static createTensorsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startTensorsVector(Z,q){Z.startVector(4,q,4)}static addGraphs(Z,q){Z.addFieldOffset(12,q,0)}static createGraphsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startGraphsVector(Z,q){Z.startVector(4,q,4)}static endAttribute(Z){return Z.endObject()}static createAttribute(Z,q,G,J,X,V,R,z,Y,B,k,w,A,D){return U.startAttribute(Z),U.addName(Z,q),U.addDocString(Z,G),U.addType(Z,J),U.addF(Z,X),U.addI(Z,V),U.addS(Z,R),U.addT(Z,z),U.addG(Z,Y),U.addFloats(Z,B),U.addInts(Z,k),U.addStrings(Z,w),U.addTensors(Z,A),U.addGraphs(Z,D),U.endAttribute(Z)}}W.Attribute=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsGraph(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsGraph(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}initializers(Z,q){let G=this.bb.__offset(this.bb_pos,4);return G?(q||new Q.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}initializersLength(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.__vector_len(this.bb_pos+Z):0}nodeArgs(Z,q){let G=this.bb.__offset(this.bb_pos,6);return G?(q||new Q.experimental.fbs.ValueInfo).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}nodeArgsLength(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.__vector_len(this.bb_pos+Z):0}nodes(Z,q){let G=this.bb.__offset(this.bb_pos,8);return G?(q||new Q.experimental.fbs.Node).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}nodesLength(){let Z=this.bb.__offset(this.bb_pos,8);return Z?this.bb.__vector_len(this.bb_pos+Z):0}maxNodeIndex(){let Z=this.bb.__offset(this.bb_pos,10);return Z?this.bb.readUint32(this.bb_pos+Z):0}nodeEdges(Z,q){let G=this.bb.__offset(this.bb_pos,12);return G?(q||new Q.experimental.fbs.NodeEdge).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}nodeEdgesLength(){let Z=this.bb.__offset(this.bb_pos,12);return Z?this.bb.__vector_len(this.bb_pos+Z):0}inputs(Z,q){let G=this.bb.__offset(this.bb_pos,14);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}inputsLength(){let Z=this.bb.__offset(this.bb_pos,14);return Z?this.bb.__vector_len(this.bb_pos+Z):0}outputs(Z,q){let G=this.bb.__offset(this.bb_pos,16);return G?this.bb.__string(this.bb.__vector(this.bb_pos+G)+Z*4,q):null}outputsLength(){let Z=this.bb.__offset(this.bb_pos,16);return Z?this.bb.__vector_len(this.bb_pos+Z):0}sparseInitializers(Z,q){let G=this.bb.__offset(this.bb_pos,18);return G?(q||new Q.experimental.fbs.SparseTensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}sparseInitializersLength(){let Z=this.bb.__offset(this.bb_pos,18);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startGraph(Z){Z.startObject(8)}static addInitializers(Z,q){Z.addFieldOffset(0,q,0)}static createInitializersVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startInitializersVector(Z,q){Z.startVector(4,q,4)}static addNodeArgs(Z,q){Z.addFieldOffset(1,q,0)}static createNodeArgsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startNodeArgsVector(Z,q){Z.startVector(4,q,4)}static addNodes(Z,q){Z.addFieldOffset(2,q,0)}static createNodesVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startNodesVector(Z,q){Z.startVector(4,q,4)}static addMaxNodeIndex(Z,q){Z.addFieldInt32(3,q,0)}static addNodeEdges(Z,q){Z.addFieldOffset(4,q,0)}static createNodeEdgesVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startNodeEdgesVector(Z,q){Z.startVector(4,q,4)}static addInputs(Z,q){Z.addFieldOffset(5,q,0)}static createInputsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startInputsVector(Z,q){Z.startVector(4,q,4)}static addOutputs(Z,q){Z.addFieldOffset(6,q,0)}static createOutputsVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startOutputsVector(Z,q){Z.startVector(4,q,4)}static addSparseInitializers(Z,q){Z.addFieldOffset(7,q,0)}static createSparseInitializersVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startSparseInitializersVector(Z,q){Z.startVector(4,q,4)}static endGraph(Z){return Z.endObject()}static createGraph(Z,q,G,J,X,V,R,z,Y){return U.startGraph(Z),U.addInitializers(Z,q),U.addNodeArgs(Z,G),U.addNodes(Z,J),U.addMaxNodeIndex(Z,X),U.addNodeEdges(Z,V),U.addInputs(Z,R),U.addOutputs(Z,z),U.addSparseInitializers(Z,Y),U.endGraph(Z)}}W.Graph=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsModel(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsModel(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}irVersion(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.readInt64(this.bb_pos+Z):this.bb.createLong(0,0)}opsetImport(Z,q){let G=this.bb.__offset(this.bb_pos,6);return G?(q||new Q.experimental.fbs.OperatorSetId).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}opsetImportLength(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.__vector_len(this.bb_pos+Z):0}producerName(Z){let q=this.bb.__offset(this.bb_pos,8);return q?this.bb.__string(this.bb_pos+q,Z):null}producerVersion(Z){let q=this.bb.__offset(this.bb_pos,10);return q?this.bb.__string(this.bb_pos+q,Z):null}domain(Z){let q=this.bb.__offset(this.bb_pos,12);return q?this.bb.__string(this.bb_pos+q,Z):null}modelVersion(){let Z=this.bb.__offset(this.bb_pos,14);return Z?this.bb.readInt64(this.bb_pos+Z):this.bb.createLong(0,0)}docString(Z){let q=this.bb.__offset(this.bb_pos,16);return q?this.bb.__string(this.bb_pos+q,Z):null}graph(Z){let q=this.bb.__offset(this.bb_pos,18);return q?(Z||new Q.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}graphDocString(Z){let q=this.bb.__offset(this.bb_pos,20);return q?this.bb.__string(this.bb_pos+q,Z):null}static startModel(Z){Z.startObject(9)}static addIrVersion(Z,q){Z.addFieldInt64(0,q,Z.createLong(0,0))}static addOpsetImport(Z,q){Z.addFieldOffset(1,q,0)}static createOpsetImportVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startOpsetImportVector(Z,q){Z.startVector(4,q,4)}static addProducerName(Z,q){Z.addFieldOffset(2,q,0)}static addProducerVersion(Z,q){Z.addFieldOffset(3,q,0)}static addDomain(Z,q){Z.addFieldOffset(4,q,0)}static addModelVersion(Z,q){Z.addFieldInt64(5,q,Z.createLong(0,0))}static addDocString(Z,q){Z.addFieldOffset(6,q,0)}static addGraph(Z,q){Z.addFieldOffset(7,q,0)}static addGraphDocString(Z,q){Z.addFieldOffset(8,q,0)}static endModel(Z){return Z.endObject()}static createModel(Z,q,G,J,X,V,R,z,Y,B){return U.startModel(Z),U.addIrVersion(Z,q),U.addOpsetImport(Z,G),U.addProducerName(Z,J),U.addProducerVersion(Z,X),U.addDomain(Z,V),U.addModelVersion(Z,R),U.addDocString(Z,z),U.addGraph(Z,Y),U.addGraphDocString(Z,B),U.endModel(Z)}}W.Model=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsKernelCreateInfos(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsKernelCreateInfos(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}nodeIndices(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.readUint32(this.bb.__vector(this.bb_pos+q)+Z*4):0}nodeIndicesLength(){let Z=this.bb.__offset(this.bb_pos,4);return Z?this.bb.__vector_len(this.bb_pos+Z):0}nodeIndicesArray(){let Z=this.bb.__offset(this.bb_pos,4);return Z?new Uint32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+Z),this.bb.__vector_len(this.bb_pos+Z)):null}kernelDefHashes(Z){let q=this.bb.__offset(this.bb_pos,6);return q?this.bb.readUint64(this.bb.__vector(this.bb_pos+q)+Z*8):this.bb.createLong(0,0)}kernelDefHashesLength(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startKernelCreateInfos(Z){Z.startObject(2)}static addNodeIndices(Z,q){Z.addFieldOffset(0,q,0)}static createNodeIndicesVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addInt32(q[G]);return Z.endVector()}static startNodeIndicesVector(Z,q){Z.startVector(4,q,4)}static addKernelDefHashes(Z,q){Z.addFieldOffset(1,q,0)}static createKernelDefHashesVector(Z,q){Z.startVector(8,q.length,8);for(let G=q.length-1;G>=0;G--)Z.addInt64(q[G]);return Z.endVector()}static startKernelDefHashesVector(Z,q){Z.startVector(8,q,8)}static endKernelCreateInfos(Z){return Z.endObject()}static createKernelCreateInfos(Z,q,G){return U.startKernelCreateInfos(Z),U.addNodeIndices(Z,q),U.addKernelDefHashes(Z,G),U.endKernelCreateInfos(Z)}}W.KernelCreateInfos=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsSubGraphSessionState(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsSubGraphSessionState(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}graphId(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}sessionState(Z){let q=this.bb.__offset(this.bb_pos,6);return q?(Z||new Q.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startSubGraphSessionState(Z){Z.startObject(2)}static addGraphId(Z,q){Z.addFieldOffset(0,q,0)}static addSessionState(Z,q){Z.addFieldOffset(1,q,0)}static endSubGraphSessionState(Z){let q=Z.endObject();return Z.requiredField(q,4),q}static createSubGraphSessionState(Z,q,G){return U.startSubGraphSessionState(Z),U.addGraphId(Z,q),U.addSessionState(Z,G),U.endSubGraphSessionState(Z)}}W.SubGraphSessionState=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsSessionState(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsSessionState(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}kernels(Z){let q=this.bb.__offset(this.bb_pos,4);return q?(Z||new Q.experimental.fbs.KernelCreateInfos).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}subGraphSessionStates(Z,q){let G=this.bb.__offset(this.bb_pos,6);return G?(q||new Q.experimental.fbs.SubGraphSessionState).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+G)+Z*4),this.bb):null}subGraphSessionStatesLength(){let Z=this.bb.__offset(this.bb_pos,6);return Z?this.bb.__vector_len(this.bb_pos+Z):0}static startSessionState(Z){Z.startObject(2)}static addKernels(Z,q){Z.addFieldOffset(0,q,0)}static addSubGraphSessionStates(Z,q){Z.addFieldOffset(1,q,0)}static createSubGraphSessionStatesVector(Z,q){Z.startVector(4,q.length,4);for(let G=q.length-1;G>=0;G--)Z.addOffset(q[G]);return Z.endVector()}static startSubGraphSessionStatesVector(Z,q){Z.startVector(4,q,4)}static endSessionState(Z){return Z.endObject()}static createSessionState(Z,q,G){return U.startSessionState(Z),U.addKernels(Z,q),U.addSubGraphSessionStates(Z,G),U.endSessionState(Z)}}W.SessionState=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={}),((Q)=>{let H;((j)=>{let K;((W)=>{class U{constructor(){this.bb=null,this.bb_pos=0}__init(Z,q){return this.bb_pos=Z,this.bb=q,this}static getRootAsInferenceSession(Z,q){return(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static getSizePrefixedRootAsInferenceSession(Z,q){return Z.setPosition(Z.position()+$.SIZE_PREFIX_LENGTH),(q||new U).__init(Z.readInt32(Z.position())+Z.position(),Z)}static bufferHasIdentifier(Z){return Z.__has_identifier("ORTM")}ortVersion(Z){let q=this.bb.__offset(this.bb_pos,4);return q?this.bb.__string(this.bb_pos+q,Z):null}model(Z){let q=this.bb.__offset(this.bb_pos,6);return q?(Z||new Q.experimental.fbs.Model).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}sessionState(Z){let q=this.bb.__offset(this.bb_pos,8);return q?(Z||new Q.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+q),this.bb):null}static startInferenceSession(Z){Z.startObject(3)}static addOrtVersion(Z,q){Z.addFieldOffset(0,q,0)}static addModel(Z,q){Z.addFieldOffset(1,q,0)}static addSessionState(Z,q){Z.addFieldOffset(2,q,0)}static endInferenceSession(Z){return Z.endObject()}static finishInferenceSessionBuffer(Z,q){Z.finish(q,"ORTM")}static finishSizePrefixedInferenceSessionBuffer(Z,q){Z.finish(q,"ORTM",!0)}static createInferenceSession(Z,q,G,J){return U.startInferenceSession(Z),U.addOrtVersion(Z,q),U.addModel(Z,G),U.addSessionState(Z,J),U.endInferenceSession(Z)}}W.InferenceSession=U})(K=j.fbs||={})})(H=Q.experimental||={})})(H1||={})}),rZ=U1((Q,H)=>{H.exports=j;function j(K,W){for(var U=new Array(arguments.length-1),Z=0,q=2,G=!0;q<arguments.length;)U[Z++]=arguments[q++];return new Promise(function(J,X){U[Z]=function(V){if(G)if(G=!1,V)X(V);else{for(var R=new Array(arguments.length-1),z=0;z<R.length;)R[z++]=arguments[z];J.apply(null,R)}};try{K.apply(W||null,U)}catch(V){G&&(G=!1,X(V))}})}}),tZ=U1((Q)=>{var H=Q;H.length=function(Z){var q=Z.length;if(!q)return 0;for(var G=0;--q%4>1&&Z.charAt(q)==="=";)++G;return Math.ceil(Z.length*3)/4-G};var j=new Array(64),K=new Array(123);for(W=0;W<64;)K[j[W]=W<26?W+65:W<52?W+71:W<62?W-4:W-59|43]=W++;var W;H.encode=function(Z,q,G){for(var J=null,X=[],V=0,R=0,z;q<G;){var Y=Z[q++];switch(R){case 0:X[V++]=j[Y>>2],z=(Y&3)<<4,R=1;break;case 1:X[V++]=j[z|Y>>4],z=(Y&15)<<2,R=2;break;case 2:X[V++]=j[z|Y>>6],X[V++]=j[Y&63],R=0;break}V>8191&&((J||(J=[])).push(String.fromCharCode.apply(String,X)),V=0)}return R&&(X[V++]=j[z],X[V++]=61,R===1&&(X[V++]=61)),J?(V&&J.push(String.fromCharCode.apply(String,X.slice(0,V))),J.join("")):String.fromCharCode.apply(String,X.slice(0,V))};var U="invalid encoding";H.decode=function(Z,q,G){for(var J=G,X=0,V,R=0;R<Z.length;){var z=Z.charCodeAt(R++);if(z===61&&X>1)break;if((z=K[z])===void 0)throw Error(U);switch(X){case 0:V=z,X=1;break;case 1:q[G++]=V<<2|(z&48)>>4,V=z,X=2;break;case 2:q[G++]=(V&15)<<4|(z&60)>>2,V=z,X=3;break;case 3:q[G++]=(V&3)<<6|z,X=0;break}}if(X===1)throw Error(U);return G-J},H.test=function(Z){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(Z)}}),eZ=U1((Q,H)=>{H.exports=j;function j(){this._listeners={}}j.prototype.on=function(K,W,U){return(this._listeners[K]||(this._listeners[K]=[])).push({fn:W,ctx:U||this}),this},j.prototype.off=function(K,W){if(K===void 0)this._listeners={};else if(W===void 0)this._listeners[K]=[];else for(var U=this._listeners[K],Z=0;Z<U.length;)U[Z].fn===W?U.splice(Z,1):++Z;return this},j.prototype.emit=function(K){var W=this._listeners[K];if(W){for(var U=[],Z=1;Z<arguments.length;)U.push(arguments[Z++]);for(Z=0;Z<W.length;)W[Z].fn.apply(W[Z++].ctx,U)}return this}}),Qj=U1((Q,H)=>{H.exports=j(j);function j(q){return typeof Float32Array<"u"?function(){var G=new Float32Array([-0]),J=new Uint8Array(G.buffer),X=J[3]===128;function V(B,k,w){G[0]=B,k[w]=J[0],k[w+1]=J[1],k[w+2]=J[2],k[w+3]=J[3]}function R(B,k,w){G[0]=B,k[w]=J[3],k[w+1]=J[2],k[w+2]=J[1],k[w+3]=J[0]}q.writeFloatLE=X?V:R,q.writeFloatBE=X?R:V;function z(B,k){return J[0]=B[k],J[1]=B[k+1],J[2]=B[k+2],J[3]=B[k+3],G[0]}function Y(B,k){return J[3]=B[k],J[2]=B[k+1],J[1]=B[k+2],J[0]=B[k+3],G[0]}q.readFloatLE=X?z:Y,q.readFloatBE=X?Y:z}():function(){function G(X,V,R,z){var Y=V<0?1:0;if(Y&&(V=-V),V===0)X(1/V>0?0:2147483648,R,z);else if(isNaN(V))X(2143289344,R,z);else if(V>340282346638528860000000000000000000000)X((Y<<31|2139095040)>>>0,R,z);else if(V<0.000000000000000000000000000000000000011754943508222875)X((Y<<31|Math.round(V/0.000000000000000000000000000000000000000000001401298464324817))>>>0,R,z);else{var B=Math.floor(Math.log(V)/Math.LN2),k=Math.round(V*Math.pow(2,-B)*8388608)&8388607;X((Y<<31|B+127<<23|k)>>>0,R,z)}}q.writeFloatLE=G.bind(null,K),q.writeFloatBE=G.bind(null,W);function J(X,V,R){var z=X(V,R),Y=(z>>31)*2+1,B=z>>>23&255,k=z&8388607;return B===255?k?NaN:Y*(1/0):B===0?Y*0.000000000000000000000000000000000000000000001401298464324817*k:Y*Math.pow(2,B-150)*(k+8388608)}q.readFloatLE=J.bind(null,U),q.readFloatBE=J.bind(null,Z)}(),typeof Float64Array<"u"?function(){var G=new Float64Array([-0]),J=new Uint8Array(G.buffer),X=J[7]===128;function V(B,k,w){G[0]=B,k[w]=J[0],k[w+1]=J[1],k[w+2]=J[2],k[w+3]=J[3],k[w+4]=J[4],k[w+5]=J[5],k[w+6]=J[6],k[w+7]=J[7]}function R(B,k,w){G[0]=B,k[w]=J[7],k[w+1]=J[6],k[w+2]=J[5],k[w+3]=J[4],k[w+4]=J[3],k[w+5]=J[2],k[w+6]=J[1],k[w+7]=J[0]}q.writeDoubleLE=X?V:R,q.writeDoubleBE=X?R:V;function z(B,k){return J[0]=B[k],J[1]=B[k+1],J[2]=B[k+2],J[3]=B[k+3],J[4]=B[k+4],J[5]=B[k+5],J[6]=B[k+6],J[7]=B[k+7],G[0]}function Y(B,k){return J[7]=B[k],J[6]=B[k+1],J[5]=B[k+2],J[4]=B[k+3],J[3]=B[k+4],J[2]=B[k+5],J[1]=B[k+6],J[0]=B[k+7],G[0]}q.readDoubleLE=X?z:Y,q.readDoubleBE=X?Y:z}():function(){function G(X,V,R,z,Y,B){var k=z<0?1:0;if(k&&(z=-z),z===0)X(0,Y,B+V),X(1/z>0?0:2147483648,Y,B+R);else if(isNaN(z))X(0,Y,B+V),X(2146959360,Y,B+R);else if(z>179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)X(0,Y,B+V),X((k<<31|2146435072)>>>0,Y,B+R);else{var w;if(z<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072014)w=z/0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005,X(w>>>0,Y,B+V),X((k<<31|w/4294967296)>>>0,Y,B+R);else{var A=Math.floor(Math.log(z)/Math.LN2);A===1024&&(A=1023),w=z*Math.pow(2,-A),X(w*4503599627370496>>>0,Y,B+V),X((k<<31|A+1023<<20|w*1048576&1048575)>>>0,Y,B+R)}}}q.writeDoubleLE=G.bind(null,K,0,4),q.writeDoubleBE=G.bind(null,W,4,0);function J(X,V,R,z,Y){var B=X(z,Y+V),k=X(z,Y+R),w=(k>>31)*2+1,A=k>>>20&2047,D=4294967296*(k&1048575)+B;return A===2047?D?NaN:w*(1/0):A===0?w*0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005*D:w*Math.pow(2,A-1075)*(D+4503599627370496)}q.readDoubleLE=J.bind(null,U,0,4),q.readDoubleBE=J.bind(null,Z,4,0)}(),q}function K(q,G,J){G[J]=q&255,G[J+1]=q>>>8&255,G[J+2]=q>>>16&255,G[J+3]=q>>>24}function W(q,G,J){G[J]=q>>>24,G[J+1]=q>>>16&255,G[J+2]=q>>>8&255,G[J+3]=q&255}function U(q,G){return(q[G]|q[G+1]<<8|q[G+2]<<16|q[G+3]<<24)>>>0}function Z(q,G){return(q[G]<<24|q[G+1]<<16|q[G+2]<<8|q[G+3])>>>0}}),Jj=U1((exports,module)=>{module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(Q){}return null}}),Hj=U1((Q)=>{var H=Q;H.length=function(j){for(var K=0,W=0,U=0;U<j.length;++U)W=j.charCodeAt(U),W<128?K+=1:W<2048?K+=2:(W&64512)===55296&&(j.charCodeAt(U+1)&64512)===56320?(++U,K+=4):K+=3;return K},H.read=function(j,K,W){var U=W-K;if(U<1)return"";for(var Z=null,q=[],G=0,J;K<W;)J=j[K++],J<128?q[G++]=J:J>191&&J<224?q[G++]=(J&31)<<6|j[K++]&63:J>239&&J<365?(J=((J&7)<<18|(j[K++]&63)<<12|(j[K++]&63)<<6|j[K++]&63)-65536,q[G++]=55296+(J>>10),q[G++]=56320+(J&1023)):q[G++]=(J&15)<<12|(j[K++]&63)<<6|j[K++]&63,G>8191&&((Z||(Z=[])).push(String.fromCharCode.apply(String,q)),G=0);return Z?(G&&Z.push(String.fromCharCode.apply(String,q.slice(0,G))),Z.join("")):String.fromCharCode.apply(String,q.slice(0,G))},H.write=function(j,K,W){for(var U=W,Z,q,G=0;G<j.length;++G)Z=j.charCodeAt(G),Z<128?K[W++]=Z:Z<2048?(K[W++]=Z>>6|192,K[W++]=Z&63|128):(Z&64512)===55296&&((q=j.charCodeAt(G+1))&64512)===56320?(Z=65536+((Z&1023)<<10)+(q&1023),++G,K[W++]=Z>>18|240,K[W++]=Z>>12&63|128,K[W++]=Z>>6&63|128,K[W++]=Z&63|128):(K[W++]=Z>>12|224,K[W++]=Z>>6&63|128,K[W++]=Z&63|128);return W-U}}),Zj=U1((Q,H)=>{H.exports=j;function j(K,W,U){var Z=U||8192,q=Z>>>1,G=null,J=Z;return function(X){if(X<1||X>q)return K(X);J+X>Z&&(G=K(Z),J=0);var V=W.call(G,J,J+=X);return J&7&&(J=(J|7)+1),V}}}),jj=U1((Q,H)=>{H.exports=K;var j=n3();function K(q,G){this.lo=q>>>0,this.hi=G>>>0}var W=K.zero=new K(0,0);W.toNumber=function(){return 0},W.zzEncode=W.zzDecode=function(){return this},W.length=function(){return 1};var U=K.zeroHash="\0\0\0\0\0\0\0\0";K.fromNumber=function(q){if(q===0)return W;var G=q<0;G&&(q=-q);var J=q>>>0,X=(q-J)/4294967296>>>0;return G&&(X=~X>>>0,J=~J>>>0,++J>4294967295&&(J=0,++X>4294967295&&(X=0))),new K(J,X)},K.from=function(q){if(typeof q=="number")return K.fromNumber(q);if(j.isString(q))if(j.Long)q=j.Long.fromString(q);else return K.fromNumber(parseInt(q,10));return q.low||q.high?new K(q.low>>>0,q.high>>>0):W},K.prototype.toNumber=function(q){if(!q&&this.hi>>>31){var G=~this.lo+1>>>0,J=~this.hi>>>0;return G||(J=J+1>>>0),-(G+J*4294967296)}return this.lo+this.hi*4294967296},K.prototype.toLong=function(q){return j.Long?new j.Long(this.lo|0,this.hi|0,!!q):{low:this.lo|0,high:this.hi|0,unsigned:!!q}};var Z=String.prototype.charCodeAt;K.fromHash=function(q){return q===U?W:new K((Z.call(q,0)|Z.call(q,1)<<8|Z.call(q,2)<<16|Z.call(q,3)<<24)>>>0,(Z.call(q,4)|Z.call(q,5)<<8|Z.call(q,6)<<16|Z.call(q,7)<<24)>>>0)},K.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},K.prototype.zzEncode=function(){var q=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^q)>>>0,this.lo=(this.lo<<1^q)>>>0,this},K.prototype.zzDecode=function(){var q=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^q)>>>0,this.hi=(this.hi>>>1^q)>>>0,this},K.prototype.length=function(){var q=this.lo,G=(this.lo>>>28|this.hi<<4)>>>0,J=this.hi>>>24;return J===0?G===0?q<16384?q<128?1:2:q<2097152?3:4:G<16384?G<128?5:6:G<2097152?7:8:J<128?9:10}}),n3=U1((Q)=>{var H=Q;H.asPromise=rZ(),H.base64=tZ(),H.EventEmitter=eZ(),H.float=Qj(),H.inquire=Jj(),H.utf8=Hj(),H.pool=Zj(),H.LongBits=jj(),H.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node),H.global=H.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||Q,H.emptyArray=Object.freeze?Object.freeze([]):[],H.emptyObject=Object.freeze?Object.freeze({}):{},H.isInteger=Number.isInteger||function(W){return typeof W=="number"&&isFinite(W)&&Math.floor(W)===W},H.isString=function(W){return typeof W=="string"||W instanceof String},H.isObject=function(W){return W&&typeof W=="object"},H.isset=H.isSet=function(W,U){var Z=W[U];return Z!=null&&W.hasOwnProperty(U)?typeof Z!="object"||(Array.isArray(Z)?Z.length:Object.keys(Z).length)>0:!1},H.Buffer=function(){try{var W=H.inquire("buffer").Buffer;return W.prototype.utf8Write?W:null}catch{return null}}(),H._Buffer_from=null,H._Buffer_allocUnsafe=null,H.newBuffer=function(W){return typeof W=="number"?H.Buffer?H._Buffer_allocUnsafe(W):new H.Array(W):H.Buffer?H._Buffer_from(W):typeof Uint8Array>"u"?W:new Uint8Array(W)},H.Array=typeof Uint8Array<"u"?Uint8Array:Array,H.Long=H.global.dcodeIO&&H.global.dcodeIO.Long||H.global.Long||H.inquire("long"),H.key2Re=/^true|false|0|1$/,H.key32Re=/^-?(?:0|[1-9][0-9]*)$/,H.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/,H.longToHash=function(W){return W?H.LongBits.from(W).toHash():H.LongBits.zeroHash},H.longFromHash=function(W,U){var Z=H.LongBits.fromHash(W);return H.Long?H.Long.fromBits(Z.lo,Z.hi,U):Z.toNumber(!!U)};function j(W,U,Z){for(var q=Object.keys(U),G=0;G<q.length;++G)(W[q[G]]===void 0||!Z)&&(W[q[G]]=U[q[G]]);return W}H.merge=j,H.lcFirst=function(W){return W.charAt(0).toLowerCase()+W.substring(1)};function K(W){function U(Z,q){if(!(this instanceof U))return new U(Z,q);Object.defineProperty(this,"message",{get:function(){return Z}}),Error.captureStackTrace?Error.captureStackTrace(this,U):Object.defineProperty(this,"stack",{value:new Error().stack||""}),q&&j(this,q)}return U.prototype=Object.create(Error.prototype,{constructor:{value:U,writable:!0,enumerable:!1,configurable:!0},name:{get:function(){return W},set:void 0,enumerable:!1,configurable:!0},toString:{value:function(){return this.name+": "+this.message},writable:!0,enumerable:!1,configurable:!0}}),U}H.newError=K,H.ProtocolError=K("ProtocolError"),H.oneOfGetter=function(W){for(var U={},Z=0;Z<W.length;++Z)U[W[Z]]=1;return function(){for(var q=Object.keys(this),G=q.length-1;G>-1;--G)if(U[q[G]]===1&&this[q[G]]!==void 0&&this[q[G]]!==null)return q[G]}},H.oneOfSetter=function(W){return function(U){for(var Z=0;Z<W.length;++Z)W[Z]!==U&&delete this[W[Z]]}},H.toJSONOptions={longs:String,enums:String,bytes:String,json:!0},H._configure=function(){var W=H.Buffer;if(!W){H._Buffer_from=H._Buffer_allocUnsafe=null;return}H._Buffer_from=W.from!==Uint8Array.from&&W.from||function(U,Z){return new W(U,Z)},H._Buffer_allocUnsafe=W.allocUnsafe||function(U){return new W(U)}}}),n2=U1((Q,H)=>{H.exports=X;var j=n3(),K,W=j.LongBits,U=j.base64,Z=j.utf8;function q(A,D,I){this.fn=A,this.len=D,this.next=void 0,this.val=I}function G(){}function J(A){this.head=A.head,this.tail=A.tail,this.len=A.len,this.next=A.states}function X(){this.len=0,this.head=new q(G,0,0),this.tail=this.head,this.states=null}var V=function(){return j.Buffer?function(){return(X.create=function(){return new K})()}:function(){return new X}};X.create=V(),X.alloc=function(A){return new j.Array(A)},j.Array!==Array&&(X.alloc=j.pool(X.alloc,j.Array.prototype.subarray)),X.prototype._push=function(A,D,I){return this.tail=this.tail.next=new q(A,D,I),this.len+=D,this};function R(A,D,I){D[I]=A&255}function z(A,D,I){for(;A>127;)D[I++]=A&127|128,A>>>=7;D[I]=A}function Y(A,D){this.len=A,this.next=void 0,this.val=D}Y.prototype=Object.create(q.prototype),Y.prototype.fn=z,X.prototype.uint32=function(A){return this.len+=(this.tail=this.tail.next=new Y((A=A>>>0)<128?1:A<16384?2:A<2097152?3:A<268435456?4:5,A)).len,this},X.prototype.int32=function(A){return A<0?this._push(B,10,W.fromNumber(A)):this.uint32(A)},X.prototype.sint32=function(A){return this.uint32((A<<1^A>>31)>>>0)};function B(A,D,I){for(;A.hi;)D[I++]=A.lo&127|128,A.lo=(A.lo>>>7|A.hi<<25)>>>0,A.hi>>>=7;for(;A.lo>127;)D[I++]=A.lo&127|128,A.lo=A.lo>>>7;D[I++]=A.lo}X.prototype.uint64=function(A){var D=W.from(A);return this._push(B,D.length(),D)},X.prototype.int64=X.prototype.uint64,X.prototype.sint64=function(A){var D=W.from(A).zzEncode();return this._push(B,D.length(),D)},X.prototype.bool=function(A){return this._push(R,1,A?1:0)};function k(A,D,I){D[I]=A&255,D[I+1]=A>>>8&255,D[I+2]=A>>>16&255,D[I+3]=A>>>24}X.prototype.fixed32=function(A){return this._push(k,4,A>>>0)},X.prototype.sfixed32=X.prototype.fixed32,X.prototype.fixed64=function(A){var D=W.from(A);return this._push(k,4,D.lo)._push(k,4,D.hi)},X.prototype.sfixed64=X.prototype.fixed64,X.prototype.float=function(A){return this._push(j.float.writeFloatLE,4,A)},X.prototype.double=function(A){return this._push(j.float.writeDoubleLE,8,A)};var w=j.Array.prototype.set?function(A,D,I){D.set(A,I)}:function(A,D,I){for(var h=0;h<A.length;++h)D[I+h]=A[h]};X.prototype.bytes=function(A){var D=A.length>>>0;if(!D)return this._push(R,1,0);if(j.isString(A)){var I=X.alloc(D=U.length(A));U.decode(A,I,0),A=I}return this.uint32(D)._push(w,D,A)},X.prototype.string=function(A){var D=Z.length(A);return D?this.uint32(D)._push(Z.write,D,A):this._push(R,1,0)},X.prototype.fork=function(){return this.states=new J(this),this.head=this.tail=new q(G,0,0),this.len=0,this},X.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new q(G,0,0),this.len=0),this},X.prototype.ldelim=function(){var A=this.head,D=this.tail,I=this.len;return this.reset().uint32(I),I&&(this.tail.next=A.next,this.tail=D,this.len+=I),this},X.prototype.finish=function(){for(var A=this.head.next,D=this.constructor.alloc(this.len),I=0;A;)A.fn(A.val,D,I),I+=A.len,A=A.next;return D},X._configure=function(A){K=A,X.create=V(),K._configure()}}),Vj=U1((Q,H)=>{H.exports=W;var j=n2();(W.prototype=Object.create(j.prototype)).constructor=W;var K=n3();function W(){j.call(this)}W._configure=function(){W.alloc=K._Buffer_allocUnsafe,W.writeBytesBuffer=K.Buffer&&K.Buffer.prototype instanceof Uint8Array&&K.Buffer.prototype.set.name==="set"?function(Z,q,G){q.set(Z,G)}:function(Z,q,G){if(Z.copy)Z.copy(q,G,0,Z.length);else for(var J=0;J<Z.length;)q[G++]=Z[J++]}},W.prototype.bytes=function(Z){K.isString(Z)&&(Z=K._Buffer_from(Z,"base64"));var q=Z.length>>>0;return this.uint32(q),q&&this._push(W.writeBytesBuffer,q,Z),this};function U(Z,q,G){Z.length<40?K.utf8.write(Z,q,G):q.utf8Write?q.utf8Write(Z,G):q.write(Z,G)}W.prototype.string=function(Z){var q=K.Buffer.byteLength(Z);return this.uint32(q),q&&this._push(U,q,Z),this},W._configure()}),r2=U1((Q,H)=>{H.exports=q;var j=n3(),K,W=j.LongBits,U=j.utf8;function Z(z,Y){return RangeError("index out of range: "+z.pos+" + "+(Y||1)+" > "+z.len)}function q(z){this.buf=z,this.pos=0,this.len=z.length}var G=typeof Uint8Array<"u"?function(z){if(z instanceof Uint8Array||Array.isArray(z))return new q(z);throw Error("illegal buffer")}:function(z){if(Array.isArray(z))return new q(z);throw Error("illegal buffer")},J=function(){return j.Buffer?function(z){return(q.create=function(Y){return j.Buffer.isBuffer(Y)?new K(Y):G(Y)})(z)}:G};q.create=J(),q.prototype._slice=j.Array.prototype.subarray||j.Array.prototype.slice,q.prototype.uint32=function(){var z=4294967295;return function(){if(z=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(z=(z|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(z=(z|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(z=(z|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(z=(z|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return z;if((this.pos+=5)>this.len)throw this.pos=this.len,Z(this,10);return z}}(),q.prototype.int32=function(){return this.uint32()|0},q.prototype.sint32=function(){var z=this.uint32();return z>>>1^-(z&1)|0};function X(){var z=new W(0,0),Y=0;if(this.len-this.pos>4){for(;Y<4;++Y)if(z.lo=(z.lo|(this.buf[this.pos]&127)<<Y*7)>>>0,this.buf[this.pos++]<128)return z;if(z.lo=(z.lo|(this.buf[this.pos]&127)<<28)>>>0,z.hi=(z.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return z;Y=0}else{for(;Y<3;++Y){if(this.pos>=this.len)throw Z(this);if(z.lo=(z.lo|(this.buf[this.pos]&127)<<Y*7)>>>0,this.buf[this.pos++]<128)return z}return z.lo=(z.lo|(this.buf[this.pos++]&127)<<Y*7)>>>0,z}if(this.len-this.pos>4){for(;Y<5;++Y)if(z.hi=(z.hi|(this.buf[this.pos]&127)<<Y*7+3)>>>0,this.buf[this.pos++]<128)return z}else for(;Y<5;++Y){if(this.pos>=this.len)throw Z(this);if(z.hi=(z.hi|(this.buf[this.pos]&127)<<Y*7+3)>>>0,this.buf[this.pos++]<128)return z}throw Error("invalid varint encoding")}q.prototype.bool=function(){return this.uint32()!==0};function V(z,Y){return(z[Y-4]|z[Y-3]<<8|z[Y-2]<<16|z[Y-1]<<24)>>>0}q.prototype.fixed32=function(){if(this.pos+4>this.len)throw Z(this,4);return V(this.buf,this.pos+=4)},q.prototype.sfixed32=function(){if(this.pos+4>this.len)throw Z(this,4);return V(this.buf,this.pos+=4)|0};function R(){if(this.pos+8>this.len)throw Z(this,8);return new W(V(this.buf,this.pos+=4),V(this.buf,this.pos+=4))}q.prototype.float=function(){if(this.pos+4>this.len)throw Z(this,4);var z=j.float.readFloatLE(this.buf,this.pos);return this.pos+=4,z},q.prototype.double=function(){if(this.pos+8>this.len)throw Z(this,4);var z=j.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,z},q.prototype.bytes=function(){var z=this.uint32(),Y=this.pos,B=this.pos+z;if(B>this.len)throw Z(this,z);if(this.pos+=z,Array.isArray(this.buf))return this.buf.slice(Y,B);if(Y===B){var k=j.Buffer;return k?k.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,Y,B)},q.prototype.string=function(){var z=this.bytes();return U.read(z,0,z.length)},q.prototype.skip=function(z){if(typeof z=="number"){if(this.pos+z>this.len)throw Z(this,z);this.pos+=z}else do if(this.pos>=this.len)throw Z(this);while(this.buf[this.pos++]&128);return this},q.prototype.skipType=function(z){switch(z){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(z=this.uint32()&7)!==4;)this.skipType(z);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+z+" at offset "+this.pos)}return this},q._configure=function(z){K=z,q.create=J(),K._configure();var Y=j.Long?"toLong":"toNumber";j.merge(q.prototype,{int64:function(){return X.call(this)[Y](!1)},uint64:function(){return X.call(this)[Y](!0)},sint64:function(){return X.call(this).zzDecode()[Y](!1)},fixed64:function(){return R.call(this)[Y](!0)},sfixed64:function(){return R.call(this)[Y](!1)}})}}),Xj=U1((Q,H)=>{H.exports=W;var j=r2();(W.prototype=Object.create(j.prototype)).constructor=W;var K=n3();function W(U){j.call(this,U)}W._configure=function(){K.Buffer&&(W.prototype._slice=K.Buffer.prototype.slice)},W.prototype.string=function(){var U=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+U,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+U,this.len))},W._configure()}),Kj=U1((Q,H)=>{H.exports=K;var j=n3();(K.prototype=Object.create(j.EventEmitter.prototype)).constructor=K;function K(W,U,Z){if(typeof W!="function")throw TypeError("rpcImpl must be a function");j.EventEmitter.call(this),this.rpcImpl=W,this.requestDelimited=!!U,this.responseDelimited=!!Z}K.prototype.rpcCall=function W(U,Z,q,G,J){if(!G)throw TypeError("request must be specified");var X=this;if(!J)return j.asPromise(W,X,U,Z,q,G);if(!X.rpcImpl){setTimeout(function(){J(Error("already ended"))},0);return}try{return X.rpcImpl(U,Z[X.requestDelimited?"encodeDelimited":"encode"](G).finish(),function(V,R){if(V)return X.emit("error",V,U),J(V);if(R===null){X.end(!0);return}if(!(R instanceof q))try{R=q[X.responseDelimited?"decodeDelimited":"decode"](R)}catch(z){return X.emit("error",z,U),J(z)}return X.emit("data",R,U),J(null,R)})}catch(V){X.emit("error",V,U),setTimeout(function(){J(V)},0);return}},K.prototype.end=function(W){return this.rpcImpl&&(W||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}}),Uj=U1((Q)=>{var H=Q;H.Service=Kj()}),qj=U1((Q,H)=>{H.exports={}}),Wj=U1((Q)=>{var H=Q;H.build="minimal",H.Writer=n2(),H.BufferWriter=Vj(),H.Reader=r2(),H.BufferReader=Xj(),H.util=n3(),H.rpc=Uj(),H.roots=qj(),H.configure=j;function j(){H.util._configure(),H.Writer._configure(H.BufferWriter),H.Reader._configure(H.BufferReader)}j()}),Gj=U1((Q,H)=>{H.exports=Wj()}),l4=U1((Q,H)=>{var j=Gj(),K=j.Reader,W=j.Writer,U=j.util,Z=j.roots.default||(j.roots.default={});Z.onnx=function(){var q={};return q.Version=function(){var G={},J=Object.create(G);return J[G[0]="_START_VERSION"]=0,J[G[1]="IR_VERSION_2017_10_10"]=1,J[G[2]="IR_VERSION_2017_10_30"]=2,J[G[3]="IR_VERSION_2017_11_3"]=3,J[G[4]="IR_VERSION_2019_1_22"]=4,J[G[5]="IR_VERSION_2019_3_18"]=5,J[G[6]="IR_VERSION_2019_9_19"]=6,J[G[7]="IR_VERSION_2020_5_8"]=7,J[G[8]="IR_VERSION_2021_7_30"]=8,J[G[9]="IR_VERSION"]=9,J}(),q.AttributeProto=function(){function G(J){if(this.floats=[],this.ints=[],this.strings=[],this.tensors=[],this.graphs=[],this.sparseTensors=[],this.typeProtos=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.name="",G.prototype.refAttrName="",G.prototype.docString="",G.prototype.type=0,G.prototype.f=0,G.prototype.i=U.Long?U.Long.fromBits(0,0,!1):0,G.prototype.s=U.newBuffer([]),G.prototype.t=null,G.prototype.g=null,G.prototype.sparseTensor=null,G.prototype.tp=null,G.prototype.floats=U.emptyArray,G.prototype.ints=U.emptyArray,G.prototype.strings=U.emptyArray,G.prototype.tensors=U.emptyArray,G.prototype.graphs=U.emptyArray,G.prototype.sparseTensors=U.emptyArray,G.prototype.typeProtos=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(10).string(J.name),J.f!=null&&Object.hasOwnProperty.call(J,"f")&&X.uint32(21).float(J.f),J.i!=null&&Object.hasOwnProperty.call(J,"i")&&X.uint32(24).int64(J.i),J.s!=null&&Object.hasOwnProperty.call(J,"s")&&X.uint32(34).bytes(J.s),J.t!=null&&Object.hasOwnProperty.call(J,"t")&&Z.onnx.TensorProto.encode(J.t,X.uint32(42).fork()).ldelim(),J.g!=null&&Object.hasOwnProperty.call(J,"g")&&Z.onnx.GraphProto.encode(J.g,X.uint32(50).fork()).ldelim(),J.floats!=null&&J.floats.length){X.uint32(58).fork();for(var V=0;V<J.floats.length;++V)X.float(J.floats[V]);X.ldelim()}if(J.ints!=null&&J.ints.length){X.uint32(66).fork();for(var V=0;V<J.ints.length;++V)X.int64(J.ints[V]);X.ldelim()}if(J.strings!=null&&J.strings.length)for(var V=0;V<J.strings.length;++V)X.uint32(74).bytes(J.strings[V]);if(J.tensors!=null&&J.tensors.length)for(var V=0;V<J.tensors.length;++V)Z.onnx.TensorProto.encode(J.tensors[V],X.uint32(82).fork()).ldelim();if(J.graphs!=null&&J.graphs.length)for(var V=0;V<J.graphs.length;++V)Z.onnx.GraphProto.encode(J.graphs[V],X.uint32(90).fork()).ldelim();if(J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(106).string(J.docString),J.tp!=null&&Object.hasOwnProperty.call(J,"tp")&&Z.onnx.TypeProto.encode(J.tp,X.uint32(114).fork()).ldelim(),J.typeProtos!=null&&J.typeProtos.length)for(var V=0;V<J.typeProtos.length;++V)Z.onnx.TypeProto.encode(J.typeProtos[V],X.uint32(122).fork()).ldelim();if(J.type!=null&&Object.hasOwnProperty.call(J,"type")&&X.uint32(160).int32(J.type),J.refAttrName!=null&&Object.hasOwnProperty.call(J,"refAttrName")&&X.uint32(170).string(J.refAttrName),J.sparseTensor!=null&&Object.hasOwnProperty.call(J,"sparseTensor")&&Z.onnx.SparseTensorProto.encode(J.sparseTensor,X.uint32(178).fork()).ldelim(),J.sparseTensors!=null&&J.sparseTensors.length)for(var V=0;V<J.sparseTensors.length;++V)Z.onnx.SparseTensorProto.encode(J.sparseTensors[V],X.uint32(186).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.AttributeProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.name=J.string();break}case 21:{R.refAttrName=J.string();break}case 13:{R.docString=J.string();break}case 20:{R.type=J.int32();break}case 2:{R.f=J.float();break}case 3:{R.i=J.int64();break}case 4:{R.s=J.bytes();break}case 5:{R.t=Z.onnx.TensorProto.decode(J,J.uint32());break}case 6:{R.g=Z.onnx.GraphProto.decode(J,J.uint32());break}case 22:{R.sparseTensor=Z.onnx.SparseTensorProto.decode(J,J.uint32());break}case 14:{R.tp=Z.onnx.TypeProto.decode(J,J.uint32());break}case 7:{if(R.floats&&R.floats.length||(R.floats=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.floats.push(J.float());else R.floats.push(J.float());break}case 8:{if(R.ints&&R.ints.length||(R.ints=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.ints.push(J.int64());else R.ints.push(J.int64());break}case 9:{R.strings&&R.strings.length||(R.strings=[]),R.strings.push(J.bytes());break}case 10:{R.tensors&&R.tensors.length||(R.tensors=[]),R.tensors.push(Z.onnx.TensorProto.decode(J,J.uint32()));break}case 11:{R.graphs&&R.graphs.length||(R.graphs=[]),R.graphs.push(Z.onnx.GraphProto.decode(J,J.uint32()));break}case 23:{R.sparseTensors&&R.sparseTensors.length||(R.sparseTensors=[]),R.sparseTensors.push(Z.onnx.SparseTensorProto.decode(J,J.uint32()));break}case 15:{R.typeProtos&&R.typeProtos.length||(R.typeProtos=[]),R.typeProtos.push(Z.onnx.TypeProto.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.refAttrName!=null&&J.hasOwnProperty("refAttrName")&&!U.isString(J.refAttrName))return"refAttrName: string expected";if(J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString))return"docString: string expected";if(J.type!=null&&J.hasOwnProperty("type"))switch(J.type){default:return"type: enum value expected";case 0:case 1:case 2:case 3:case 4:case 5:case 11:case 13:case 6:case 7:case 8:case 9:case 10:case 12:case 14:break}if(J.f!=null&&J.hasOwnProperty("f")&&typeof J.f!="number")return"f: number expected";if(J.i!=null&&J.hasOwnProperty("i")&&!U.isInteger(J.i)&&!(J.i&&U.isInteger(J.i.low)&&U.isInteger(J.i.high)))return"i: integer|Long expected";if(J.s!=null&&J.hasOwnProperty("s")&&!(J.s&&typeof J.s.length=="number"||U.isString(J.s)))return"s: buffer expected";if(J.t!=null&&J.hasOwnProperty("t")){var X=Z.onnx.TensorProto.verify(J.t);if(X)return"t."+X}if(J.g!=null&&J.hasOwnProperty("g")){var X=Z.onnx.GraphProto.verify(J.g);if(X)return"g."+X}if(J.sparseTensor!=null&&J.hasOwnProperty("sparseTensor")){var X=Z.onnx.SparseTensorProto.verify(J.sparseTensor);if(X)return"sparseTensor."+X}if(J.tp!=null&&J.hasOwnProperty("tp")){var X=Z.onnx.TypeProto.verify(J.tp);if(X)return"tp."+X}if(J.floats!=null&&J.hasOwnProperty("floats")){if(!Array.isArray(J.floats))return"floats: array expected";for(var V=0;V<J.floats.length;++V)if(typeof J.floats[V]!="number")return"floats: number[] expected"}if(J.ints!=null&&J.hasOwnProperty("ints")){if(!Array.isArray(J.ints))return"ints: array expected";for(var V=0;V<J.ints.length;++V)if(!U.isInteger(J.ints[V])&&!(J.ints[V]&&U.isInteger(J.ints[V].low)&&U.isInteger(J.ints[V].high)))return"ints: integer|Long[] expected"}if(J.strings!=null&&J.hasOwnProperty("strings")){if(!Array.isArray(J.strings))return"strings: array expected";for(var V=0;V<J.strings.length;++V)if(!(J.strings[V]&&typeof J.strings[V].length=="number"||U.isString(J.strings[V])))return"strings: buffer[] expected"}if(J.tensors!=null&&J.hasOwnProperty("tensors")){if(!Array.isArray(J.tensors))return"tensors: array expected";for(var V=0;V<J.tensors.length;++V){var X=Z.onnx.TensorProto.verify(J.tensors[V]);if(X)return"tensors."+X}}if(J.graphs!=null&&J.hasOwnProperty("graphs")){if(!Array.isArray(J.graphs))return"graphs: array expected";for(var V=0;V<J.graphs.length;++V){var X=Z.onnx.GraphProto.verify(J.graphs[V]);if(X)return"graphs."+X}}if(J.sparseTensors!=null&&J.hasOwnProperty("sparseTensors")){if(!Array.isArray(J.sparseTensors))return"sparseTensors: array expected";for(var V=0;V<J.sparseTensors.length;++V){var X=Z.onnx.SparseTensorProto.verify(J.sparseTensors[V]);if(X)return"sparseTensors."+X}}if(J.typeProtos!=null&&J.hasOwnProperty("typeProtos")){if(!Array.isArray(J.typeProtos))return"typeProtos: array expected";for(var V=0;V<J.typeProtos.length;++V){var X=Z.onnx.TypeProto.verify(J.typeProtos[V]);if(X)return"typeProtos."+X}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.AttributeProto)return J;var X=new Z.onnx.AttributeProto;switch(J.name!=null&&(X.name=String(J.name)),J.refAttrName!=null&&(X.refAttrName=String(J.refAttrName)),J.docString!=null&&(X.docString=String(J.docString)),J.type){default:if(typeof J.type=="number"){X.type=J.type;break}break;case"UNDEFINED":case 0:X.type=0;break;case"FLOAT":case 1:X.type=1;break;case"INT":case 2:X.type=2;break;case"STRING":case 3:X.type=3;break;case"TENSOR":case 4:X.type=4;break;case"GRAPH":case 5:X.type=5;break;case"SPARSE_TENSOR":case 11:X.type=11;break;case"TYPE_PROTO":case 13:X.type=13;break;case"FLOATS":case 6:X.type=6;break;case"INTS":case 7:X.type=7;break;case"STRINGS":case 8:X.type=8;break;case"TENSORS":case 9:X.type=9;break;case"GRAPHS":case 10:X.type=10;break;case"SPARSE_TENSORS":case 12:X.type=12;break;case"TYPE_PROTOS":case 14:X.type=14;break}if(J.f!=null&&(X.f=Number(J.f)),J.i!=null&&(U.Long?(X.i=U.Long.fromValue(J.i)).unsigned=!1:typeof J.i=="string"?X.i=parseInt(J.i,10):typeof J.i=="number"?X.i=J.i:typeof J.i=="object"&&(X.i=new U.LongBits(J.i.low>>>0,J.i.high>>>0).toNumber())),J.s!=null&&(typeof J.s=="string"?U.base64.decode(J.s,X.s=U.newBuffer(U.base64.length(J.s)),0):J.s.length>=0&&(X.s=J.s)),J.t!=null){if(typeof J.t!="object")throw TypeError(".onnx.AttributeProto.t: object expected");X.t=Z.onnx.TensorProto.fromObject(J.t)}if(J.g!=null){if(typeof J.g!="object")throw TypeError(".onnx.AttributeProto.g: object expected");X.g=Z.onnx.GraphProto.fromObject(J.g)}if(J.sparseTensor!=null){if(typeof J.sparseTensor!="object")throw TypeError(".onnx.AttributeProto.sparseTensor: object expected");X.sparseTensor=Z.onnx.SparseTensorProto.fromObject(J.sparseTensor)}if(J.tp!=null){if(typeof J.tp!="object")throw TypeError(".onnx.AttributeProto.tp: object expected");X.tp=Z.onnx.TypeProto.fromObject(J.tp)}if(J.floats){if(!Array.isArray(J.floats))throw TypeError(".onnx.AttributeProto.floats: array expected");X.floats=[];for(var V=0;V<J.floats.length;++V)X.floats[V]=Number(J.floats[V])}if(J.ints){if(!Array.isArray(J.ints))throw TypeError(".onnx.AttributeProto.ints: array expected");X.ints=[];for(var V=0;V<J.ints.length;++V)U.Long?(X.ints[V]=U.Long.fromValue(J.ints[V])).unsigned=!1:typeof J.ints[V]=="string"?X.ints[V]=parseInt(J.ints[V],10):typeof J.ints[V]=="number"?X.ints[V]=J.ints[V]:typeof J.ints[V]=="object"&&(X.ints[V]=new U.LongBits(J.ints[V].low>>>0,J.ints[V].high>>>0).toNumber())}if(J.strings){if(!Array.isArray(J.strings))throw TypeError(".onnx.AttributeProto.strings: array expected");X.strings=[];for(var V=0;V<J.strings.length;++V)typeof J.strings[V]=="string"?U.base64.decode(J.strings[V],X.strings[V]=U.newBuffer(U.base64.length(J.strings[V])),0):J.strings[V].length>=0&&(X.strings[V]=J.strings[V])}if(J.tensors){if(!Array.isArray(J.tensors))throw TypeError(".onnx.AttributeProto.tensors: array expected");X.tensors=[];for(var V=0;V<J.tensors.length;++V){if(typeof J.tensors[V]!="object")throw TypeError(".onnx.AttributeProto.tensors: object expected");X.tensors[V]=Z.onnx.TensorProto.fromObject(J.tensors[V])}}if(J.graphs){if(!Array.isArray(J.graphs))throw TypeError(".onnx.AttributeProto.graphs: array expected");X.graphs=[];for(var V=0;V<J.graphs.length;++V){if(typeof J.graphs[V]!="object")throw TypeError(".onnx.AttributeProto.graphs: object expected");X.graphs[V]=Z.onnx.GraphProto.fromObject(J.graphs[V])}}if(J.sparseTensors){if(!Array.isArray(J.sparseTensors))throw TypeError(".onnx.AttributeProto.sparseTensors: array expected");X.sparseTensors=[];for(var V=0;V<J.sparseTensors.length;++V){if(typeof J.sparseTensors[V]!="object")throw TypeError(".onnx.AttributeProto.sparseTensors: object expected");X.sparseTensors[V]=Z.onnx.SparseTensorProto.fromObject(J.sparseTensors[V])}}if(J.typeProtos){if(!Array.isArray(J.typeProtos))throw TypeError(".onnx.AttributeProto.typeProtos: array expected");X.typeProtos=[];for(var V=0;V<J.typeProtos.length;++V){if(typeof J.typeProtos[V]!="object")throw TypeError(".onnx.AttributeProto.typeProtos: object expected");X.typeProtos[V]=Z.onnx.TypeProto.fromObject(J.typeProtos[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.floats=[],V.ints=[],V.strings=[],V.tensors=[],V.graphs=[],V.typeProtos=[],V.sparseTensors=[]),X.defaults){if(V.name="",V.f=0,U.Long){var R=new U.Long(0,0,!1);V.i=X.longs===String?R.toString():X.longs===Number?R.toNumber():R}else V.i=X.longs===String?"0":0;X.bytes===String?V.s="":(V.s=[],X.bytes!==Array&&(V.s=U.newBuffer(V.s))),V.t=null,V.g=null,V.docString="",V.tp=null,V.type=X.enums===String?"UNDEFINED":0,V.refAttrName="",V.sparseTensor=null}if(J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.f!=null&&J.hasOwnProperty("f")&&(V.f=X.json&&!isFinite(J.f)?String(J.f):J.f),J.i!=null&&J.hasOwnProperty("i")&&(typeof J.i=="number"?V.i=X.longs===String?String(J.i):J.i:V.i=X.longs===String?U.Long.prototype.toString.call(J.i):X.longs===Number?new U.LongBits(J.i.low>>>0,J.i.high>>>0).toNumber():J.i),J.s!=null&&J.hasOwnProperty("s")&&(V.s=X.bytes===String?U.base64.encode(J.s,0,J.s.length):X.bytes===Array?Array.prototype.slice.call(J.s):J.s),J.t!=null&&J.hasOwnProperty("t")&&(V.t=Z.onnx.TensorProto.toObject(J.t,X)),J.g!=null&&J.hasOwnProperty("g")&&(V.g=Z.onnx.GraphProto.toObject(J.g,X)),J.floats&&J.floats.length){V.floats=[];for(var z=0;z<J.floats.length;++z)V.floats[z]=X.json&&!isFinite(J.floats[z])?String(J.floats[z]):J.floats[z]}if(J.ints&&J.ints.length){V.ints=[];for(var z=0;z<J.ints.length;++z)typeof J.ints[z]=="number"?V.ints[z]=X.longs===String?String(J.ints[z]):J.ints[z]:V.ints[z]=X.longs===String?U.Long.prototype.toString.call(J.ints[z]):X.longs===Number?new U.LongBits(J.ints[z].low>>>0,J.ints[z].high>>>0).toNumber():J.ints[z]}if(J.strings&&J.strings.length){V.strings=[];for(var z=0;z<J.strings.length;++z)V.strings[z]=X.bytes===String?U.base64.encode(J.strings[z],0,J.strings[z].length):X.bytes===Array?Array.prototype.slice.call(J.strings[z]):J.strings[z]}if(J.tensors&&J.tensors.length){V.tensors=[];for(var z=0;z<J.tensors.length;++z)V.tensors[z]=Z.onnx.TensorProto.toObject(J.tensors[z],X)}if(J.graphs&&J.graphs.length){V.graphs=[];for(var z=0;z<J.graphs.length;++z)V.graphs[z]=Z.onnx.GraphProto.toObject(J.graphs[z],X)}if(J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.tp!=null&&J.hasOwnProperty("tp")&&(V.tp=Z.onnx.TypeProto.toObject(J.tp,X)),J.typeProtos&&J.typeProtos.length){V.typeProtos=[];for(var z=0;z<J.typeProtos.length;++z)V.typeProtos[z]=Z.onnx.TypeProto.toObject(J.typeProtos[z],X)}if(J.type!=null&&J.hasOwnProperty("type")&&(V.type=X.enums===String?Z.onnx.AttributeProto.AttributeType[J.type]===void 0?J.type:Z.onnx.AttributeProto.AttributeType[J.type]:J.type),J.refAttrName!=null&&J.hasOwnProperty("refAttrName")&&(V.refAttrName=J.refAttrName),J.sparseTensor!=null&&J.hasOwnProperty("sparseTensor")&&(V.sparseTensor=Z.onnx.SparseTensorProto.toObject(J.sparseTensor,X)),J.sparseTensors&&J.sparseTensors.length){V.sparseTensors=[];for(var z=0;z<J.sparseTensors.length;++z)V.sparseTensors[z]=Z.onnx.SparseTensorProto.toObject(J.sparseTensors[z],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.AttributeProto"},G.AttributeType=function(){var J={},X=Object.create(J);return X[J[0]="UNDEFINED"]=0,X[J[1]="FLOAT"]=1,X[J[2]="INT"]=2,X[J[3]="STRING"]=3,X[J[4]="TENSOR"]=4,X[J[5]="GRAPH"]=5,X[J[11]="SPARSE_TENSOR"]=11,X[J[13]="TYPE_PROTO"]=13,X[J[6]="FLOATS"]=6,X[J[7]="INTS"]=7,X[J[8]="STRINGS"]=8,X[J[9]="TENSORS"]=9,X[J[10]="GRAPHS"]=10,X[J[12]="SPARSE_TENSORS"]=12,X[J[14]="TYPE_PROTOS"]=14,X}(),G}(),q.ValueInfoProto=function(){function G(J){if(J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.name="",G.prototype.type=null,G.prototype.docString="",G.create=function(J){return new G(J)},G.encode=function(J,X){return X||(X=W.create()),J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(10).string(J.name),J.type!=null&&Object.hasOwnProperty.call(J,"type")&&Z.onnx.TypeProto.encode(J.type,X.uint32(18).fork()).ldelim(),J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(26).string(J.docString),X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.ValueInfoProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.name=J.string();break}case 2:{R.type=Z.onnx.TypeProto.decode(J,J.uint32());break}case 3:{R.docString=J.string();break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.type!=null&&J.hasOwnProperty("type")){var X=Z.onnx.TypeProto.verify(J.type);if(X)return"type."+X}return J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString)?"docString: string expected":null},G.fromObject=function(J){if(J instanceof Z.onnx.ValueInfoProto)return J;var X=new Z.onnx.ValueInfoProto;if(J.name!=null&&(X.name=String(J.name)),J.type!=null){if(typeof J.type!="object")throw TypeError(".onnx.ValueInfoProto.type: object expected");X.type=Z.onnx.TypeProto.fromObject(J.type)}return J.docString!=null&&(X.docString=String(J.docString)),X},G.toObject=function(J,X){X||(X={});var V={};return X.defaults&&(V.name="",V.type=null,V.docString=""),J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.type!=null&&J.hasOwnProperty("type")&&(V.type=Z.onnx.TypeProto.toObject(J.type,X)),J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.ValueInfoProto"},G}(),q.NodeProto=function(){function G(J){if(this.input=[],this.output=[],this.attribute=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.input=U.emptyArray,G.prototype.output=U.emptyArray,G.prototype.name="",G.prototype.opType="",G.prototype.domain="",G.prototype.attribute=U.emptyArray,G.prototype.docString="",G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.input!=null&&J.input.length)for(var V=0;V<J.input.length;++V)X.uint32(10).string(J.input[V]);if(J.output!=null&&J.output.length)for(var V=0;V<J.output.length;++V)X.uint32(18).string(J.output[V]);if(J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(26).string(J.name),J.opType!=null&&Object.hasOwnProperty.call(J,"opType")&&X.uint32(34).string(J.opType),J.attribute!=null&&J.attribute.length)for(var V=0;V<J.attribute.length;++V)Z.onnx.AttributeProto.encode(J.attribute[V],X.uint32(42).fork()).ldelim();return J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(50).string(J.docString),J.domain!=null&&Object.hasOwnProperty.call(J,"domain")&&X.uint32(58).string(J.domain),X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.NodeProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.input&&R.input.length||(R.input=[]),R.input.push(J.string());break}case 2:{R.output&&R.output.length||(R.output=[]),R.output.push(J.string());break}case 3:{R.name=J.string();break}case 4:{R.opType=J.string();break}case 7:{R.domain=J.string();break}case 5:{R.attribute&&R.attribute.length||(R.attribute=[]),R.attribute.push(Z.onnx.AttributeProto.decode(J,J.uint32()));break}case 6:{R.docString=J.string();break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.input!=null&&J.hasOwnProperty("input")){if(!Array.isArray(J.input))return"input: array expected";for(var X=0;X<J.input.length;++X)if(!U.isString(J.input[X]))return"input: string[] expected"}if(J.output!=null&&J.hasOwnProperty("output")){if(!Array.isArray(J.output))return"output: array expected";for(var X=0;X<J.output.length;++X)if(!U.isString(J.output[X]))return"output: string[] expected"}if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.opType!=null&&J.hasOwnProperty("opType")&&!U.isString(J.opType))return"opType: string expected";if(J.domain!=null&&J.hasOwnProperty("domain")&&!U.isString(J.domain))return"domain: string expected";if(J.attribute!=null&&J.hasOwnProperty("attribute")){if(!Array.isArray(J.attribute))return"attribute: array expected";for(var X=0;X<J.attribute.length;++X){var V=Z.onnx.AttributeProto.verify(J.attribute[X]);if(V)return"attribute."+V}}return J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString)?"docString: string expected":null},G.fromObject=function(J){if(J instanceof Z.onnx.NodeProto)return J;var X=new Z.onnx.NodeProto;if(J.input){if(!Array.isArray(J.input))throw TypeError(".onnx.NodeProto.input: array expected");X.input=[];for(var V=0;V<J.input.length;++V)X.input[V]=String(J.input[V])}if(J.output){if(!Array.isArray(J.output))throw TypeError(".onnx.NodeProto.output: array expected");X.output=[];for(var V=0;V<J.output.length;++V)X.output[V]=String(J.output[V])}if(J.name!=null&&(X.name=String(J.name)),J.opType!=null&&(X.opType=String(J.opType)),J.domain!=null&&(X.domain=String(J.domain)),J.attribute){if(!Array.isArray(J.attribute))throw TypeError(".onnx.NodeProto.attribute: array expected");X.attribute=[];for(var V=0;V<J.attribute.length;++V){if(typeof J.attribute[V]!="object")throw TypeError(".onnx.NodeProto.attribute: object expected");X.attribute[V]=Z.onnx.AttributeProto.fromObject(J.attribute[V])}}return J.docString!=null&&(X.docString=String(J.docString)),X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.input=[],V.output=[],V.attribute=[]),X.defaults&&(V.name="",V.opType="",V.docString="",V.domain=""),J.input&&J.input.length){V.input=[];for(var R=0;R<J.input.length;++R)V.input[R]=J.input[R]}if(J.output&&J.output.length){V.output=[];for(var R=0;R<J.output.length;++R)V.output[R]=J.output[R]}if(J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.opType!=null&&J.hasOwnProperty("opType")&&(V.opType=J.opType),J.attribute&&J.attribute.length){V.attribute=[];for(var R=0;R<J.attribute.length;++R)V.attribute[R]=Z.onnx.AttributeProto.toObject(J.attribute[R],X)}return J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.domain!=null&&J.hasOwnProperty("domain")&&(V.domain=J.domain),V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.NodeProto"},G}(),q.TrainingInfoProto=function(){function G(J){if(this.initializationBinding=[],this.updateBinding=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.initialization=null,G.prototype.algorithm=null,G.prototype.initializationBinding=U.emptyArray,G.prototype.updateBinding=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.initialization!=null&&Object.hasOwnProperty.call(J,"initialization")&&Z.onnx.GraphProto.encode(J.initialization,X.uint32(10).fork()).ldelim(),J.algorithm!=null&&Object.hasOwnProperty.call(J,"algorithm")&&Z.onnx.GraphProto.encode(J.algorithm,X.uint32(18).fork()).ldelim(),J.initializationBinding!=null&&J.initializationBinding.length)for(var V=0;V<J.initializationBinding.length;++V)Z.onnx.StringStringEntryProto.encode(J.initializationBinding[V],X.uint32(26).fork()).ldelim();if(J.updateBinding!=null&&J.updateBinding.length)for(var V=0;V<J.updateBinding.length;++V)Z.onnx.StringStringEntryProto.encode(J.updateBinding[V],X.uint32(34).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.TrainingInfoProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.initialization=Z.onnx.GraphProto.decode(J,J.uint32());break}case 2:{R.algorithm=Z.onnx.GraphProto.decode(J,J.uint32());break}case 3:{R.initializationBinding&&R.initializationBinding.length||(R.initializationBinding=[]),R.initializationBinding.push(Z.onnx.StringStringEntryProto.decode(J,J.uint32()));break}case 4:{R.updateBinding&&R.updateBinding.length||(R.updateBinding=[]),R.updateBinding.push(Z.onnx.StringStringEntryProto.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.initialization!=null&&J.hasOwnProperty("initialization")){var X=Z.onnx.GraphProto.verify(J.initialization);if(X)return"initialization."+X}if(J.algorithm!=null&&J.hasOwnProperty("algorithm")){var X=Z.onnx.GraphProto.verify(J.algorithm);if(X)return"algorithm."+X}if(J.initializationBinding!=null&&J.hasOwnProperty("initializationBinding")){if(!Array.isArray(J.initializationBinding))return"initializationBinding: array expected";for(var V=0;V<J.initializationBinding.length;++V){var X=Z.onnx.StringStringEntryProto.verify(J.initializationBinding[V]);if(X)return"initializationBinding."+X}}if(J.updateBinding!=null&&J.hasOwnProperty("updateBinding")){if(!Array.isArray(J.updateBinding))return"updateBinding: array expected";for(var V=0;V<J.updateBinding.length;++V){var X=Z.onnx.StringStringEntryProto.verify(J.updateBinding[V]);if(X)return"updateBinding."+X}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.TrainingInfoProto)return J;var X=new Z.onnx.TrainingInfoProto;if(J.initialization!=null){if(typeof J.initialization!="object")throw TypeError(".onnx.TrainingInfoProto.initialization: object expected");X.initialization=Z.onnx.GraphProto.fromObject(J.initialization)}if(J.algorithm!=null){if(typeof J.algorithm!="object")throw TypeError(".onnx.TrainingInfoProto.algorithm: object expected");X.algorithm=Z.onnx.GraphProto.fromObject(J.algorithm)}if(J.initializationBinding){if(!Array.isArray(J.initializationBinding))throw TypeError(".onnx.TrainingInfoProto.initializationBinding: array expected");X.initializationBinding=[];for(var V=0;V<J.initializationBinding.length;++V){if(typeof J.initializationBinding[V]!="object")throw TypeError(".onnx.TrainingInfoProto.initializationBinding: object expected");X.initializationBinding[V]=Z.onnx.StringStringEntryProto.fromObject(J.initializationBinding[V])}}if(J.updateBinding){if(!Array.isArray(J.updateBinding))throw TypeError(".onnx.TrainingInfoProto.updateBinding: array expected");X.updateBinding=[];for(var V=0;V<J.updateBinding.length;++V){if(typeof J.updateBinding[V]!="object")throw TypeError(".onnx.TrainingInfoProto.updateBinding: object expected");X.updateBinding[V]=Z.onnx.StringStringEntryProto.fromObject(J.updateBinding[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.initializationBinding=[],V.updateBinding=[]),X.defaults&&(V.initialization=null,V.algorithm=null),J.initialization!=null&&J.hasOwnProperty("initialization")&&(V.initialization=Z.onnx.GraphProto.toObject(J.initialization,X)),J.algorithm!=null&&J.hasOwnProperty("algorithm")&&(V.algorithm=Z.onnx.GraphProto.toObject(J.algorithm,X)),J.initializationBinding&&J.initializationBinding.length){V.initializationBinding=[];for(var R=0;R<J.initializationBinding.length;++R)V.initializationBinding[R]=Z.onnx.StringStringEntryProto.toObject(J.initializationBinding[R],X)}if(J.updateBinding&&J.updateBinding.length){V.updateBinding=[];for(var R=0;R<J.updateBinding.length;++R)V.updateBinding[R]=Z.onnx.StringStringEntryProto.toObject(J.updateBinding[R],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.TrainingInfoProto"},G}(),q.ModelProto=function(){function G(J){if(this.opsetImport=[],this.metadataProps=[],this.trainingInfo=[],this.functions=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.irVersion=U.Long?U.Long.fromBits(0,0,!1):0,G.prototype.opsetImport=U.emptyArray,G.prototype.producerName="",G.prototype.producerVersion="",G.prototype.domain="",G.prototype.modelVersion=U.Long?U.Long.fromBits(0,0,!1):0,G.prototype.docString="",G.prototype.graph=null,G.prototype.metadataProps=U.emptyArray,G.prototype.trainingInfo=U.emptyArray,G.prototype.functions=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.irVersion!=null&&Object.hasOwnProperty.call(J,"irVersion")&&X.uint32(8).int64(J.irVersion),J.producerName!=null&&Object.hasOwnProperty.call(J,"producerName")&&X.uint32(18).string(J.producerName),J.producerVersion!=null&&Object.hasOwnProperty.call(J,"producerVersion")&&X.uint32(26).string(J.producerVersion),J.domain!=null&&Object.hasOwnProperty.call(J,"domain")&&X.uint32(34).string(J.domain),J.modelVersion!=null&&Object.hasOwnProperty.call(J,"modelVersion")&&X.uint32(40).int64(J.modelVersion),J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(50).string(J.docString),J.graph!=null&&Object.hasOwnProperty.call(J,"graph")&&Z.onnx.GraphProto.encode(J.graph,X.uint32(58).fork()).ldelim(),J.opsetImport!=null&&J.opsetImport.length)for(var V=0;V<J.opsetImport.length;++V)Z.onnx.OperatorSetIdProto.encode(J.opsetImport[V],X.uint32(66).fork()).ldelim();if(J.metadataProps!=null&&J.metadataProps.length)for(var V=0;V<J.metadataProps.length;++V)Z.onnx.StringStringEntryProto.encode(J.metadataProps[V],X.uint32(114).fork()).ldelim();if(J.trainingInfo!=null&&J.trainingInfo.length)for(var V=0;V<J.trainingInfo.length;++V)Z.onnx.TrainingInfoProto.encode(J.trainingInfo[V],X.uint32(162).fork()).ldelim();if(J.functions!=null&&J.functions.length)for(var V=0;V<J.functions.length;++V)Z.onnx.FunctionProto.encode(J.functions[V],X.uint32(202).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.ModelProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.irVersion=J.int64();break}case 8:{R.opsetImport&&R.opsetImport.length||(R.opsetImport=[]),R.opsetImport.push(Z.onnx.OperatorSetIdProto.decode(J,J.uint32()));break}case 2:{R.producerName=J.string();break}case 3:{R.producerVersion=J.string();break}case 4:{R.domain=J.string();break}case 5:{R.modelVersion=J.int64();break}case 6:{R.docString=J.string();break}case 7:{R.graph=Z.onnx.GraphProto.decode(J,J.uint32());break}case 14:{R.metadataProps&&R.metadataProps.length||(R.metadataProps=[]),R.metadataProps.push(Z.onnx.StringStringEntryProto.decode(J,J.uint32()));break}case 20:{R.trainingInfo&&R.trainingInfo.length||(R.trainingInfo=[]),R.trainingInfo.push(Z.onnx.TrainingInfoProto.decode(J,J.uint32()));break}case 25:{R.functions&&R.functions.length||(R.functions=[]),R.functions.push(Z.onnx.FunctionProto.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.irVersion!=null&&J.hasOwnProperty("irVersion")&&!U.isInteger(J.irVersion)&&!(J.irVersion&&U.isInteger(J.irVersion.low)&&U.isInteger(J.irVersion.high)))return"irVersion: integer|Long expected";if(J.opsetImport!=null&&J.hasOwnProperty("opsetImport")){if(!Array.isArray(J.opsetImport))return"opsetImport: array expected";for(var X=0;X<J.opsetImport.length;++X){var V=Z.onnx.OperatorSetIdProto.verify(J.opsetImport[X]);if(V)return"opsetImport."+V}}if(J.producerName!=null&&J.hasOwnProperty("producerName")&&!U.isString(J.producerName))return"producerName: string expected";if(J.producerVersion!=null&&J.hasOwnProperty("producerVersion")&&!U.isString(J.producerVersion))return"producerVersion: string expected";if(J.domain!=null&&J.hasOwnProperty("domain")&&!U.isString(J.domain))return"domain: string expected";if(J.modelVersion!=null&&J.hasOwnProperty("modelVersion")&&!U.isInteger(J.modelVersion)&&!(J.modelVersion&&U.isInteger(J.modelVersion.low)&&U.isInteger(J.modelVersion.high)))return"modelVersion: integer|Long expected";if(J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString))return"docString: string expected";if(J.graph!=null&&J.hasOwnProperty("graph")){var V=Z.onnx.GraphProto.verify(J.graph);if(V)return"graph."+V}if(J.metadataProps!=null&&J.hasOwnProperty("metadataProps")){if(!Array.isArray(J.metadataProps))return"metadataProps: array expected";for(var X=0;X<J.metadataProps.length;++X){var V=Z.onnx.StringStringEntryProto.verify(J.metadataProps[X]);if(V)return"metadataProps."+V}}if(J.trainingInfo!=null&&J.hasOwnProperty("trainingInfo")){if(!Array.isArray(J.trainingInfo))return"trainingInfo: array expected";for(var X=0;X<J.trainingInfo.length;++X){var V=Z.onnx.TrainingInfoProto.verify(J.trainingInfo[X]);if(V)return"trainingInfo."+V}}if(J.functions!=null&&J.hasOwnProperty("functions")){if(!Array.isArray(J.functions))return"functions: array expected";for(var X=0;X<J.functions.length;++X){var V=Z.onnx.FunctionProto.verify(J.functions[X]);if(V)return"functions."+V}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.ModelProto)return J;var X=new Z.onnx.ModelProto;if(J.irVersion!=null&&(U.Long?(X.irVersion=U.Long.fromValue(J.irVersion)).unsigned=!1:typeof J.irVersion=="string"?X.irVersion=parseInt(J.irVersion,10):typeof J.irVersion=="number"?X.irVersion=J.irVersion:typeof J.irVersion=="object"&&(X.irVersion=new U.LongBits(J.irVersion.low>>>0,J.irVersion.high>>>0).toNumber())),J.opsetImport){if(!Array.isArray(J.opsetImport))throw TypeError(".onnx.ModelProto.opsetImport: array expected");X.opsetImport=[];for(var V=0;V<J.opsetImport.length;++V){if(typeof J.opsetImport[V]!="object")throw TypeError(".onnx.ModelProto.opsetImport: object expected");X.opsetImport[V]=Z.onnx.OperatorSetIdProto.fromObject(J.opsetImport[V])}}if(J.producerName!=null&&(X.producerName=String(J.producerName)),J.producerVersion!=null&&(X.producerVersion=String(J.producerVersion)),J.domain!=null&&(X.domain=String(J.domain)),J.modelVersion!=null&&(U.Long?(X.modelVersion=U.Long.fromValue(J.modelVersion)).unsigned=!1:typeof J.modelVersion=="string"?X.modelVersion=parseInt(J.modelVersion,10):typeof J.modelVersion=="number"?X.modelVersion=J.modelVersion:typeof J.modelVersion=="object"&&(X.modelVersion=new U.LongBits(J.modelVersion.low>>>0,J.modelVersion.high>>>0).toNumber())),J.docString!=null&&(X.docString=String(J.docString)),J.graph!=null){if(typeof J.graph!="object")throw TypeError(".onnx.ModelProto.graph: object expected");X.graph=Z.onnx.GraphProto.fromObject(J.graph)}if(J.metadataProps){if(!Array.isArray(J.metadataProps))throw TypeError(".onnx.ModelProto.metadataProps: array expected");X.metadataProps=[];for(var V=0;V<J.metadataProps.length;++V){if(typeof J.metadataProps[V]!="object")throw TypeError(".onnx.ModelProto.metadataProps: object expected");X.metadataProps[V]=Z.onnx.StringStringEntryProto.fromObject(J.metadataProps[V])}}if(J.trainingInfo){if(!Array.isArray(J.trainingInfo))throw TypeError(".onnx.ModelProto.trainingInfo: array expected");X.trainingInfo=[];for(var V=0;V<J.trainingInfo.length;++V){if(typeof J.trainingInfo[V]!="object")throw TypeError(".onnx.ModelProto.trainingInfo: object expected");X.trainingInfo[V]=Z.onnx.TrainingInfoProto.fromObject(J.trainingInfo[V])}}if(J.functions){if(!Array.isArray(J.functions))throw TypeError(".onnx.ModelProto.functions: array expected");X.functions=[];for(var V=0;V<J.functions.length;++V){if(typeof J.functions[V]!="object")throw TypeError(".onnx.ModelProto.functions: object expected");X.functions[V]=Z.onnx.FunctionProto.fromObject(J.functions[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.opsetImport=[],V.metadataProps=[],V.trainingInfo=[],V.functions=[]),X.defaults){if(U.Long){var R=new U.Long(0,0,!1);V.irVersion=X.longs===String?R.toString():X.longs===Number?R.toNumber():R}else V.irVersion=X.longs===String?"0":0;if(V.producerName="",V.producerVersion="",V.domain="",U.Long){var R=new U.Long(0,0,!1);V.modelVersion=X.longs===String?R.toString():X.longs===Number?R.toNumber():R}else V.modelVersion=X.longs===String?"0":0;V.docString="",V.graph=null}if(J.irVersion!=null&&J.hasOwnProperty("irVersion")&&(typeof J.irVersion=="number"?V.irVersion=X.longs===String?String(J.irVersion):J.irVersion:V.irVersion=X.longs===String?U.Long.prototype.toString.call(J.irVersion):X.longs===Number?new U.LongBits(J.irVersion.low>>>0,J.irVersion.high>>>0).toNumber():J.irVersion),J.producerName!=null&&J.hasOwnProperty("producerName")&&(V.producerName=J.producerName),J.producerVersion!=null&&J.hasOwnProperty("producerVersion")&&(V.producerVersion=J.producerVersion),J.domain!=null&&J.hasOwnProperty("domain")&&(V.domain=J.domain),J.modelVersion!=null&&J.hasOwnProperty("modelVersion")&&(typeof J.modelVersion=="number"?V.modelVersion=X.longs===String?String(J.modelVersion):J.modelVersion:V.modelVersion=X.longs===String?U.Long.prototype.toString.call(J.modelVersion):X.longs===Number?new U.LongBits(J.modelVersion.low>>>0,J.modelVersion.high>>>0).toNumber():J.modelVersion),J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.graph!=null&&J.hasOwnProperty("graph")&&(V.graph=Z.onnx.GraphProto.toObject(J.graph,X)),J.opsetImport&&J.opsetImport.length){V.opsetImport=[];for(var z=0;z<J.opsetImport.length;++z)V.opsetImport[z]=Z.onnx.OperatorSetIdProto.toObject(J.opsetImport[z],X)}if(J.metadataProps&&J.metadataProps.length){V.metadataProps=[];for(var z=0;z<J.metadataProps.length;++z)V.metadataProps[z]=Z.onnx.StringStringEntryProto.toObject(J.metadataProps[z],X)}if(J.trainingInfo&&J.trainingInfo.length){V.trainingInfo=[];for(var z=0;z<J.trainingInfo.length;++z)V.trainingInfo[z]=Z.onnx.TrainingInfoProto.toObject(J.trainingInfo[z],X)}if(J.functions&&J.functions.length){V.functions=[];for(var z=0;z<J.functions.length;++z)V.functions[z]=Z.onnx.FunctionProto.toObject(J.functions[z],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.ModelProto"},G}(),q.StringStringEntryProto=function(){function G(J){if(J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.key="",G.prototype.value="",G.create=function(J){return new G(J)},G.encode=function(J,X){return X||(X=W.create()),J.key!=null&&Object.hasOwnProperty.call(J,"key")&&X.uint32(10).string(J.key),J.value!=null&&Object.hasOwnProperty.call(J,"value")&&X.uint32(18).string(J.value),X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.StringStringEntryProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.key=J.string();break}case 2:{R.value=J.string();break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){return typeof J!="object"||J===null?"object expected":J.key!=null&&J.hasOwnProperty("key")&&!U.isString(J.key)?"key: string expected":J.value!=null&&J.hasOwnProperty("value")&&!U.isString(J.value)?"value: string expected":null},G.fromObject=function(J){if(J instanceof Z.onnx.StringStringEntryProto)return J;var X=new Z.onnx.StringStringEntryProto;return J.key!=null&&(X.key=String(J.key)),J.value!=null&&(X.value=String(J.value)),X},G.toObject=function(J,X){X||(X={});var V={};return X.defaults&&(V.key="",V.value=""),J.key!=null&&J.hasOwnProperty("key")&&(V.key=J.key),J.value!=null&&J.hasOwnProperty("value")&&(V.value=J.value),V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.StringStringEntryProto"},G}(),q.TensorAnnotation=function(){function G(J){if(this.quantParameterTensorNames=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.tensorName="",G.prototype.quantParameterTensorNames=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.tensorName!=null&&Object.hasOwnProperty.call(J,"tensorName")&&X.uint32(10).string(J.tensorName),J.quantParameterTensorNames!=null&&J.quantParameterTensorNames.length)for(var V=0;V<J.quantParameterTensorNames.length;++V)Z.onnx.StringStringEntryProto.encode(J.quantParameterTensorNames[V],X.uint32(18).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.TensorAnnotation;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.tensorName=J.string();break}case 2:{R.quantParameterTensorNames&&R.quantParameterTensorNames.length||(R.quantParameterTensorNames=[]),R.quantParameterTensorNames.push(Z.onnx.StringStringEntryProto.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.tensorName!=null&&J.hasOwnProperty("tensorName")&&!U.isString(J.tensorName))return"tensorName: string expected";if(J.quantParameterTensorNames!=null&&J.hasOwnProperty("quantParameterTensorNames")){if(!Array.isArray(J.quantParameterTensorNames))return"quantParameterTensorNames: array expected";for(var X=0;X<J.quantParameterTensorNames.length;++X){var V=Z.onnx.StringStringEntryProto.verify(J.quantParameterTensorNames[X]);if(V)return"quantParameterTensorNames."+V}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.TensorAnnotation)return J;var X=new Z.onnx.TensorAnnotation;if(J.tensorName!=null&&(X.tensorName=String(J.tensorName)),J.quantParameterTensorNames){if(!Array.isArray(J.quantParameterTensorNames))throw TypeError(".onnx.TensorAnnotation.quantParameterTensorNames: array expected");X.quantParameterTensorNames=[];for(var V=0;V<J.quantParameterTensorNames.length;++V){if(typeof J.quantParameterTensorNames[V]!="object")throw TypeError(".onnx.TensorAnnotation.quantParameterTensorNames: object expected");X.quantParameterTensorNames[V]=Z.onnx.StringStringEntryProto.fromObject(J.quantParameterTensorNames[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.quantParameterTensorNames=[]),X.defaults&&(V.tensorName=""),J.tensorName!=null&&J.hasOwnProperty("tensorName")&&(V.tensorName=J.tensorName),J.quantParameterTensorNames&&J.quantParameterTensorNames.length){V.quantParameterTensorNames=[];for(var R=0;R<J.quantParameterTensorNames.length;++R)V.quantParameterTensorNames[R]=Z.onnx.StringStringEntryProto.toObject(J.quantParameterTensorNames[R],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.TensorAnnotation"},G}(),q.GraphProto=function(){function G(J){if(this.node=[],this.initializer=[],this.sparseInitializer=[],this.input=[],this.output=[],this.valueInfo=[],this.quantizationAnnotation=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.node=U.emptyArray,G.prototype.name="",G.prototype.initializer=U.emptyArray,G.prototype.sparseInitializer=U.emptyArray,G.prototype.docString="",G.prototype.input=U.emptyArray,G.prototype.output=U.emptyArray,G.prototype.valueInfo=U.emptyArray,G.prototype.quantizationAnnotation=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.node!=null&&J.node.length)for(var V=0;V<J.node.length;++V)Z.onnx.NodeProto.encode(J.node[V],X.uint32(10).fork()).ldelim();if(J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(18).string(J.name),J.initializer!=null&&J.initializer.length)for(var V=0;V<J.initializer.length;++V)Z.onnx.TensorProto.encode(J.initializer[V],X.uint32(42).fork()).ldelim();if(J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(82).string(J.docString),J.input!=null&&J.input.length)for(var V=0;V<J.input.length;++V)Z.onnx.ValueInfoProto.encode(J.input[V],X.uint32(90).fork()).ldelim();if(J.output!=null&&J.output.length)for(var V=0;V<J.output.length;++V)Z.onnx.ValueInfoProto.encode(J.output[V],X.uint32(98).fork()).ldelim();if(J.valueInfo!=null&&J.valueInfo.length)for(var V=0;V<J.valueInfo.length;++V)Z.onnx.ValueInfoProto.encode(J.valueInfo[V],X.uint32(106).fork()).ldelim();if(J.quantizationAnnotation!=null&&J.quantizationAnnotation.length)for(var V=0;V<J.quantizationAnnotation.length;++V)Z.onnx.TensorAnnotation.encode(J.quantizationAnnotation[V],X.uint32(114).fork()).ldelim();if(J.sparseInitializer!=null&&J.sparseInitializer.length)for(var V=0;V<J.sparseInitializer.length;++V)Z.onnx.SparseTensorProto.encode(J.sparseInitializer[V],X.uint32(122).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.GraphProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.node&&R.node.length||(R.node=[]),R.node.push(Z.onnx.NodeProto.decode(J,J.uint32()));break}case 2:{R.name=J.string();break}case 5:{R.initializer&&R.initializer.length||(R.initializer=[]),R.initializer.push(Z.onnx.TensorProto.decode(J,J.uint32()));break}case 15:{R.sparseInitializer&&R.sparseInitializer.length||(R.sparseInitializer=[]),R.sparseInitializer.push(Z.onnx.SparseTensorProto.decode(J,J.uint32()));break}case 10:{R.docString=J.string();break}case 11:{R.input&&R.input.length||(R.input=[]),R.input.push(Z.onnx.ValueInfoProto.decode(J,J.uint32()));break}case 12:{R.output&&R.output.length||(R.output=[]),R.output.push(Z.onnx.ValueInfoProto.decode(J,J.uint32()));break}case 13:{R.valueInfo&&R.valueInfo.length||(R.valueInfo=[]),R.valueInfo.push(Z.onnx.ValueInfoProto.decode(J,J.uint32()));break}case 14:{R.quantizationAnnotation&&R.quantizationAnnotation.length||(R.quantizationAnnotation=[]),R.quantizationAnnotation.push(Z.onnx.TensorAnnotation.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.node!=null&&J.hasOwnProperty("node")){if(!Array.isArray(J.node))return"node: array expected";for(var X=0;X<J.node.length;++X){var V=Z.onnx.NodeProto.verify(J.node[X]);if(V)return"node."+V}}if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.initializer!=null&&J.hasOwnProperty("initializer")){if(!Array.isArray(J.initializer))return"initializer: array expected";for(var X=0;X<J.initializer.length;++X){var V=Z.onnx.TensorProto.verify(J.initializer[X]);if(V)return"initializer."+V}}if(J.sparseInitializer!=null&&J.hasOwnProperty("sparseInitializer")){if(!Array.isArray(J.sparseInitializer))return"sparseInitializer: array expected";for(var X=0;X<J.sparseInitializer.length;++X){var V=Z.onnx.SparseTensorProto.verify(J.sparseInitializer[X]);if(V)return"sparseInitializer."+V}}if(J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString))return"docString: string expected";if(J.input!=null&&J.hasOwnProperty("input")){if(!Array.isArray(J.input))return"input: array expected";for(var X=0;X<J.input.length;++X){var V=Z.onnx.ValueInfoProto.verify(J.input[X]);if(V)return"input."+V}}if(J.output!=null&&J.hasOwnProperty("output")){if(!Array.isArray(J.output))return"output: array expected";for(var X=0;X<J.output.length;++X){var V=Z.onnx.ValueInfoProto.verify(J.output[X]);if(V)return"output."+V}}if(J.valueInfo!=null&&J.hasOwnProperty("valueInfo")){if(!Array.isArray(J.valueInfo))return"valueInfo: array expected";for(var X=0;X<J.valueInfo.length;++X){var V=Z.onnx.ValueInfoProto.verify(J.valueInfo[X]);if(V)return"valueInfo."+V}}if(J.quantizationAnnotation!=null&&J.hasOwnProperty("quantizationAnnotation")){if(!Array.isArray(J.quantizationAnnotation))return"quantizationAnnotation: array expected";for(var X=0;X<J.quantizationAnnotation.length;++X){var V=Z.onnx.TensorAnnotation.verify(J.quantizationAnnotation[X]);if(V)return"quantizationAnnotation."+V}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.GraphProto)return J;var X=new Z.onnx.GraphProto;if(J.node){if(!Array.isArray(J.node))throw TypeError(".onnx.GraphProto.node: array expected");X.node=[];for(var V=0;V<J.node.length;++V){if(typeof J.node[V]!="object")throw TypeError(".onnx.GraphProto.node: object expected");X.node[V]=Z.onnx.NodeProto.fromObject(J.node[V])}}if(J.name!=null&&(X.name=String(J.name)),J.initializer){if(!Array.isArray(J.initializer))throw TypeError(".onnx.GraphProto.initializer: array expected");X.initializer=[];for(var V=0;V<J.initializer.length;++V){if(typeof J.initializer[V]!="object")throw TypeError(".onnx.GraphProto.initializer: object expected");X.initializer[V]=Z.onnx.TensorProto.fromObject(J.initializer[V])}}if(J.sparseInitializer){if(!Array.isArray(J.sparseInitializer))throw TypeError(".onnx.GraphProto.sparseInitializer: array expected");X.sparseInitializer=[];for(var V=0;V<J.sparseInitializer.length;++V){if(typeof J.sparseInitializer[V]!="object")throw TypeError(".onnx.GraphProto.sparseInitializer: object expected");X.sparseInitializer[V]=Z.onnx.SparseTensorProto.fromObject(J.sparseInitializer[V])}}if(J.docString!=null&&(X.docString=String(J.docString)),J.input){if(!Array.isArray(J.input))throw TypeError(".onnx.GraphProto.input: array expected");X.input=[];for(var V=0;V<J.input.length;++V){if(typeof J.input[V]!="object")throw TypeError(".onnx.GraphProto.input: object expected");X.input[V]=Z.onnx.ValueInfoProto.fromObject(J.input[V])}}if(J.output){if(!Array.isArray(J.output))throw TypeError(".onnx.GraphProto.output: array expected");X.output=[];for(var V=0;V<J.output.length;++V){if(typeof J.output[V]!="object")throw TypeError(".onnx.GraphProto.output: object expected");X.output[V]=Z.onnx.ValueInfoProto.fromObject(J.output[V])}}if(J.valueInfo){if(!Array.isArray(J.valueInfo))throw TypeError(".onnx.GraphProto.valueInfo: array expected");X.valueInfo=[];for(var V=0;V<J.valueInfo.length;++V){if(typeof J.valueInfo[V]!="object")throw TypeError(".onnx.GraphProto.valueInfo: object expected");X.valueInfo[V]=Z.onnx.ValueInfoProto.fromObject(J.valueInfo[V])}}if(J.quantizationAnnotation){if(!Array.isArray(J.quantizationAnnotation))throw TypeError(".onnx.GraphProto.quantizationAnnotation: array expected");X.quantizationAnnotation=[];for(var V=0;V<J.quantizationAnnotation.length;++V){if(typeof J.quantizationAnnotation[V]!="object")throw TypeError(".onnx.GraphProto.quantizationAnnotation: object expected");X.quantizationAnnotation[V]=Z.onnx.TensorAnnotation.fromObject(J.quantizationAnnotation[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.node=[],V.initializer=[],V.input=[],V.output=[],V.valueInfo=[],V.quantizationAnnotation=[],V.sparseInitializer=[]),X.defaults&&(V.name="",V.docString=""),J.node&&J.node.length){V.node=[];for(var R=0;R<J.node.length;++R)V.node[R]=Z.onnx.NodeProto.toObject(J.node[R],X)}if(J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.initializer&&J.initializer.length){V.initializer=[];for(var R=0;R<J.initializer.length;++R)V.initializer[R]=Z.onnx.TensorProto.toObject(J.initializer[R],X)}if(J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.input&&J.input.length){V.input=[];for(var R=0;R<J.input.length;++R)V.input[R]=Z.onnx.ValueInfoProto.toObject(J.input[R],X)}if(J.output&&J.output.length){V.output=[];for(var R=0;R<J.output.length;++R)V.output[R]=Z.onnx.ValueInfoProto.toObject(J.output[R],X)}if(J.valueInfo&&J.valueInfo.length){V.valueInfo=[];for(var R=0;R<J.valueInfo.length;++R)V.valueInfo[R]=Z.onnx.ValueInfoProto.toObject(J.valueInfo[R],X)}if(J.quantizationAnnotation&&J.quantizationAnnotation.length){V.quantizationAnnotation=[];for(var R=0;R<J.quantizationAnnotation.length;++R)V.quantizationAnnotation[R]=Z.onnx.TensorAnnotation.toObject(J.quantizationAnnotation[R],X)}if(J.sparseInitializer&&J.sparseInitializer.length){V.sparseInitializer=[];for(var R=0;R<J.sparseInitializer.length;++R)V.sparseInitializer[R]=Z.onnx.SparseTensorProto.toObject(J.sparseInitializer[R],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.GraphProto"},G}(),q.TensorProto=function(){function G(J){if(this.dims=[],this.floatData=[],this.int32Data=[],this.stringData=[],this.int64Data=[],this.externalData=[],this.doubleData=[],this.uint64Data=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.dims=U.emptyArray,G.prototype.dataType=0,G.prototype.segment=null,G.prototype.floatData=U.emptyArray,G.prototype.int32Data=U.emptyArray,G.prototype.stringData=U.emptyArray,G.prototype.int64Data=U.emptyArray,G.prototype.name="",G.prototype.docString="",G.prototype.rawData=U.newBuffer([]),G.prototype.externalData=U.emptyArray,G.prototype.dataLocation=0,G.prototype.doubleData=U.emptyArray,G.prototype.uint64Data=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.dims!=null&&J.dims.length){X.uint32(10).fork();for(var V=0;V<J.dims.length;++V)X.int64(J.dims[V]);X.ldelim()}if(J.dataType!=null&&Object.hasOwnProperty.call(J,"dataType")&&X.uint32(16).int32(J.dataType),J.segment!=null&&Object.hasOwnProperty.call(J,"segment")&&Z.onnx.TensorProto.Segment.encode(J.segment,X.uint32(26).fork()).ldelim(),J.floatData!=null&&J.floatData.length){X.uint32(34).fork();for(var V=0;V<J.floatData.length;++V)X.float(J.floatData[V]);X.ldelim()}if(J.int32Data!=null&&J.int32Data.length){X.uint32(42).fork();for(var V=0;V<J.int32Data.length;++V)X.int32(J.int32Data[V]);X.ldelim()}if(J.stringData!=null&&J.stringData.length)for(var V=0;V<J.stringData.length;++V)X.uint32(50).bytes(J.stringData[V]);if(J.int64Data!=null&&J.int64Data.length){X.uint32(58).fork();for(var V=0;V<J.int64Data.length;++V)X.int64(J.int64Data[V]);X.ldelim()}if(J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(66).string(J.name),J.rawData!=null&&Object.hasOwnProperty.call(J,"rawData")&&X.uint32(74).bytes(J.rawData),J.doubleData!=null&&J.doubleData.length){X.uint32(82).fork();for(var V=0;V<J.doubleData.length;++V)X.double(J.doubleData[V]);X.ldelim()}if(J.uint64Data!=null&&J.uint64Data.length){X.uint32(90).fork();for(var V=0;V<J.uint64Data.length;++V)X.uint64(J.uint64Data[V]);X.ldelim()}if(J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(98).string(J.docString),J.externalData!=null&&J.externalData.length)for(var V=0;V<J.externalData.length;++V)Z.onnx.StringStringEntryProto.encode(J.externalData[V],X.uint32(106).fork()).ldelim();return J.dataLocation!=null&&Object.hasOwnProperty.call(J,"dataLocation")&&X.uint32(112).int32(J.dataLocation),X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.TensorProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{if(R.dims&&R.dims.length||(R.dims=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.dims.push(J.int64());else R.dims.push(J.int64());break}case 2:{R.dataType=J.int32();break}case 3:{R.segment=Z.onnx.TensorProto.Segment.decode(J,J.uint32());break}case 4:{if(R.floatData&&R.floatData.length||(R.floatData=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.floatData.push(J.float());else R.floatData.push(J.float());break}case 5:{if(R.int32Data&&R.int32Data.length||(R.int32Data=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.int32Data.push(J.int32());else R.int32Data.push(J.int32());break}case 6:{R.stringData&&R.stringData.length||(R.stringData=[]),R.stringData.push(J.bytes());break}case 7:{if(R.int64Data&&R.int64Data.length||(R.int64Data=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.int64Data.push(J.int64());else R.int64Data.push(J.int64());break}case 8:{R.name=J.string();break}case 12:{R.docString=J.string();break}case 9:{R.rawData=J.bytes();break}case 13:{R.externalData&&R.externalData.length||(R.externalData=[]),R.externalData.push(Z.onnx.StringStringEntryProto.decode(J,J.uint32()));break}case 14:{R.dataLocation=J.int32();break}case 10:{if(R.doubleData&&R.doubleData.length||(R.doubleData=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.doubleData.push(J.double());else R.doubleData.push(J.double());break}case 11:{if(R.uint64Data&&R.uint64Data.length||(R.uint64Data=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.uint64Data.push(J.uint64());else R.uint64Data.push(J.uint64());break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.dims!=null&&J.hasOwnProperty("dims")){if(!Array.isArray(J.dims))return"dims: array expected";for(var X=0;X<J.dims.length;++X)if(!U.isInteger(J.dims[X])&&!(J.dims[X]&&U.isInteger(J.dims[X].low)&&U.isInteger(J.dims[X].high)))return"dims: integer|Long[] expected"}if(J.dataType!=null&&J.hasOwnProperty("dataType")&&!U.isInteger(J.dataType))return"dataType: integer expected";if(J.segment!=null&&J.hasOwnProperty("segment")){var V=Z.onnx.TensorProto.Segment.verify(J.segment);if(V)return"segment."+V}if(J.floatData!=null&&J.hasOwnProperty("floatData")){if(!Array.isArray(J.floatData))return"floatData: array expected";for(var X=0;X<J.floatData.length;++X)if(typeof J.floatData[X]!="number")return"floatData: number[] expected"}if(J.int32Data!=null&&J.hasOwnProperty("int32Data")){if(!Array.isArray(J.int32Data))return"int32Data: array expected";for(var X=0;X<J.int32Data.length;++X)if(!U.isInteger(J.int32Data[X]))return"int32Data: integer[] expected"}if(J.stringData!=null&&J.hasOwnProperty("stringData")){if(!Array.isArray(J.stringData))return"stringData: array expected";for(var X=0;X<J.stringData.length;++X)if(!(J.stringData[X]&&typeof J.stringData[X].length=="number"||U.isString(J.stringData[X])))return"stringData: buffer[] expected"}if(J.int64Data!=null&&J.hasOwnProperty("int64Data")){if(!Array.isArray(J.int64Data))return"int64Data: array expected";for(var X=0;X<J.int64Data.length;++X)if(!U.isInteger(J.int64Data[X])&&!(J.int64Data[X]&&U.isInteger(J.int64Data[X].low)&&U.isInteger(J.int64Data[X].high)))return"int64Data: integer|Long[] expected"}if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString))return"docString: string expected";if(J.rawData!=null&&J.hasOwnProperty("rawData")&&!(J.rawData&&typeof J.rawData.length=="number"||U.isString(J.rawData)))return"rawData: buffer expected";if(J.externalData!=null&&J.hasOwnProperty("externalData")){if(!Array.isArray(J.externalData))return"externalData: array expected";for(var X=0;X<J.externalData.length;++X){var V=Z.onnx.StringStringEntryProto.verify(J.externalData[X]);if(V)return"externalData."+V}}if(J.dataLocation!=null&&J.hasOwnProperty("dataLocation"))switch(J.dataLocation){default:return"dataLocation: enum value expected";case 0:case 1:break}if(J.doubleData!=null&&J.hasOwnProperty("doubleData")){if(!Array.isArray(J.doubleData))return"doubleData: array expected";for(var X=0;X<J.doubleData.length;++X)if(typeof J.doubleData[X]!="number")return"doubleData: number[] expected"}if(J.uint64Data!=null&&J.hasOwnProperty("uint64Data")){if(!Array.isArray(J.uint64Data))return"uint64Data: array expected";for(var X=0;X<J.uint64Data.length;++X)if(!U.isInteger(J.uint64Data[X])&&!(J.uint64Data[X]&&U.isInteger(J.uint64Data[X].low)&&U.isInteger(J.uint64Data[X].high)))return"uint64Data: integer|Long[] expected"}return null},G.fromObject=function(J){if(J instanceof Z.onnx.TensorProto)return J;var X=new Z.onnx.TensorProto;if(J.dims){if(!Array.isArray(J.dims))throw TypeError(".onnx.TensorProto.dims: array expected");X.dims=[];for(var V=0;V<J.dims.length;++V)U.Long?(X.dims[V]=U.Long.fromValue(J.dims[V])).unsigned=!1:typeof J.dims[V]=="string"?X.dims[V]=parseInt(J.dims[V],10):typeof J.dims[V]=="number"?X.dims[V]=J.dims[V]:typeof J.dims[V]=="object"&&(X.dims[V]=new U.LongBits(J.dims[V].low>>>0,J.dims[V].high>>>0).toNumber())}if(J.dataType!=null&&(X.dataType=J.dataType|0),J.segment!=null){if(typeof J.segment!="object")throw TypeError(".onnx.TensorProto.segment: object expected");X.segment=Z.onnx.TensorProto.Segment.fromObject(J.segment)}if(J.floatData){if(!Array.isArray(J.floatData))throw TypeError(".onnx.TensorProto.floatData: array expected");X.floatData=[];for(var V=0;V<J.floatData.length;++V)X.floatData[V]=Number(J.floatData[V])}if(J.int32Data){if(!Array.isArray(J.int32Data))throw TypeError(".onnx.TensorProto.int32Data: array expected");X.int32Data=[];for(var V=0;V<J.int32Data.length;++V)X.int32Data[V]=J.int32Data[V]|0}if(J.stringData){if(!Array.isArray(J.stringData))throw TypeError(".onnx.TensorProto.stringData: array expected");X.stringData=[];for(var V=0;V<J.stringData.length;++V)typeof J.stringData[V]=="string"?U.base64.decode(J.stringData[V],X.stringData[V]=U.newBuffer(U.base64.length(J.stringData[V])),0):J.stringData[V].length>=0&&(X.stringData[V]=J.stringData[V])}if(J.int64Data){if(!Array.isArray(J.int64Data))throw TypeError(".onnx.TensorProto.int64Data: array expected");X.int64Data=[];for(var V=0;V<J.int64Data.length;++V)U.Long?(X.int64Data[V]=U.Long.fromValue(J.int64Data[V])).unsigned=!1:typeof J.int64Data[V]=="string"?X.int64Data[V]=parseInt(J.int64Data[V],10):typeof J.int64Data[V]=="number"?X.int64Data[V]=J.int64Data[V]:typeof J.int64Data[V]=="object"&&(X.int64Data[V]=new U.LongBits(J.int64Data[V].low>>>0,J.int64Data[V].high>>>0).toNumber())}if(J.name!=null&&(X.name=String(J.name)),J.docString!=null&&(X.docString=String(J.docString)),J.rawData!=null&&(typeof J.rawData=="string"?U.base64.decode(J.rawData,X.rawData=U.newBuffer(U.base64.length(J.rawData)),0):J.rawData.length>=0&&(X.rawData=J.rawData)),J.externalData){if(!Array.isArray(J.externalData))throw TypeError(".onnx.TensorProto.externalData: array expected");X.externalData=[];for(var V=0;V<J.externalData.length;++V){if(typeof J.externalData[V]!="object")throw TypeError(".onnx.TensorProto.externalData: object expected");X.externalData[V]=Z.onnx.StringStringEntryProto.fromObject(J.externalData[V])}}switch(J.dataLocation){default:if(typeof J.dataLocation=="number"){X.dataLocation=J.dataLocation;break}break;case"DEFAULT":case 0:X.dataLocation=0;break;case"EXTERNAL":case 1:X.dataLocation=1;break}if(J.doubleData){if(!Array.isArray(J.doubleData))throw TypeError(".onnx.TensorProto.doubleData: array expected");X.doubleData=[];for(var V=0;V<J.doubleData.length;++V)X.doubleData[V]=Number(J.doubleData[V])}if(J.uint64Data){if(!Array.isArray(J.uint64Data))throw TypeError(".onnx.TensorProto.uint64Data: array expected");X.uint64Data=[];for(var V=0;V<J.uint64Data.length;++V)U.Long?(X.uint64Data[V]=U.Long.fromValue(J.uint64Data[V])).unsigned=!0:typeof J.uint64Data[V]=="string"?X.uint64Data[V]=parseInt(J.uint64Data[V],10):typeof J.uint64Data[V]=="number"?X.uint64Data[V]=J.uint64Data[V]:typeof J.uint64Data[V]=="object"&&(X.uint64Data[V]=new U.LongBits(J.uint64Data[V].low>>>0,J.uint64Data[V].high>>>0).toNumber(!0))}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.dims=[],V.floatData=[],V.int32Data=[],V.stringData=[],V.int64Data=[],V.doubleData=[],V.uint64Data=[],V.externalData=[]),X.defaults&&(V.dataType=0,V.segment=null,V.name="",X.bytes===String?V.rawData="":(V.rawData=[],X.bytes!==Array&&(V.rawData=U.newBuffer(V.rawData))),V.docString="",V.dataLocation=X.enums===String?"DEFAULT":0),J.dims&&J.dims.length){V.dims=[];for(var R=0;R<J.dims.length;++R)typeof J.dims[R]=="number"?V.dims[R]=X.longs===String?String(J.dims[R]):J.dims[R]:V.dims[R]=X.longs===String?U.Long.prototype.toString.call(J.dims[R]):X.longs===Number?new U.LongBits(J.dims[R].low>>>0,J.dims[R].high>>>0).toNumber():J.dims[R]}if(J.dataType!=null&&J.hasOwnProperty("dataType")&&(V.dataType=J.dataType),J.segment!=null&&J.hasOwnProperty("segment")&&(V.segment=Z.onnx.TensorProto.Segment.toObject(J.segment,X)),J.floatData&&J.floatData.length){V.floatData=[];for(var R=0;R<J.floatData.length;++R)V.floatData[R]=X.json&&!isFinite(J.floatData[R])?String(J.floatData[R]):J.floatData[R]}if(J.int32Data&&J.int32Data.length){V.int32Data=[];for(var R=0;R<J.int32Data.length;++R)V.int32Data[R]=J.int32Data[R]}if(J.stringData&&J.stringData.length){V.stringData=[];for(var R=0;R<J.stringData.length;++R)V.stringData[R]=X.bytes===String?U.base64.encode(J.stringData[R],0,J.stringData[R].length):X.bytes===Array?Array.prototype.slice.call(J.stringData[R]):J.stringData[R]}if(J.int64Data&&J.int64Data.length){V.int64Data=[];for(var R=0;R<J.int64Data.length;++R)typeof J.int64Data[R]=="number"?V.int64Data[R]=X.longs===String?String(J.int64Data[R]):J.int64Data[R]:V.int64Data[R]=X.longs===String?U.Long.prototype.toString.call(J.int64Data[R]):X.longs===Number?new U.LongBits(J.int64Data[R].low>>>0,J.int64Data[R].high>>>0).toNumber():J.int64Data[R]}if(J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.rawData!=null&&J.hasOwnProperty("rawData")&&(V.rawData=X.bytes===String?U.base64.encode(J.rawData,0,J.rawData.length):X.bytes===Array?Array.prototype.slice.call(J.rawData):J.rawData),J.doubleData&&J.doubleData.length){V.doubleData=[];for(var R=0;R<J.doubleData.length;++R)V.doubleData[R]=X.json&&!isFinite(J.doubleData[R])?String(J.doubleData[R]):J.doubleData[R]}if(J.uint64Data&&J.uint64Data.length){V.uint64Data=[];for(var R=0;R<J.uint64Data.length;++R)typeof J.uint64Data[R]=="number"?V.uint64Data[R]=X.longs===String?String(J.uint64Data[R]):J.uint64Data[R]:V.uint64Data[R]=X.longs===String?U.Long.prototype.toString.call(J.uint64Data[R]):X.longs===Number?new U.LongBits(J.uint64Data[R].low>>>0,J.uint64Data[R].high>>>0).toNumber(!0):J.uint64Data[R]}if(J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.externalData&&J.externalData.length){V.externalData=[];for(var R=0;R<J.externalData.length;++R)V.externalData[R]=Z.onnx.StringStringEntryProto.toObject(J.externalData[R],X)}return J.dataLocation!=null&&J.hasOwnProperty("dataLocation")&&(V.dataLocation=X.enums===String?Z.onnx.TensorProto.DataLocation[J.dataLocation]===void 0?J.dataLocation:Z.onnx.TensorProto.DataLocation[J.dataLocation]:J.dataLocation),V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.TensorProto"},G.DataType=function(){var J={},X=Object.create(J);return X[J[0]="UNDEFINED"]=0,X[J[1]="FLOAT"]=1,X[J[2]="UINT8"]=2,X[J[3]="INT8"]=3,X[J[4]="UINT16"]=4,X[J[5]="INT16"]=5,X[J[6]="INT32"]=6,X[J[7]="INT64"]=7,X[J[8]="STRING"]=8,X[J[9]="BOOL"]=9,X[J[10]="FLOAT16"]=10,X[J[11]="DOUBLE"]=11,X[J[12]="UINT32"]=12,X[J[13]="UINT64"]=13,X[J[14]="COMPLEX64"]=14,X[J[15]="COMPLEX128"]=15,X[J[16]="BFLOAT16"]=16,X[J[17]="FLOAT8E4M3FN"]=17,X[J[18]="FLOAT8E4M3FNUZ"]=18,X[J[19]="FLOAT8E5M2"]=19,X[J[20]="FLOAT8E5M2FNUZ"]=20,X}(),G.Segment=function(){function J(X){if(X)for(var V=Object.keys(X),R=0;R<V.length;++R)X[V[R]]!=null&&(this[V[R]]=X[V[R]])}return J.prototype.begin=U.Long?U.Long.fromBits(0,0,!1):0,J.prototype.end=U.Long?U.Long.fromBits(0,0,!1):0,J.create=function(X){return new J(X)},J.encode=function(X,V){return V||(V=W.create()),X.begin!=null&&Object.hasOwnProperty.call(X,"begin")&&V.uint32(8).int64(X.begin),X.end!=null&&Object.hasOwnProperty.call(X,"end")&&V.uint32(16).int64(X.end),V},J.encodeDelimited=function(X,V){return this.encode(X,V).ldelim()},J.decode=function(X,V){X instanceof K||(X=K.create(X));for(var R=V===void 0?X.len:X.pos+V,z=new Z.onnx.TensorProto.Segment;X.pos<R;){var Y=X.uint32();switch(Y>>>3){case 1:{z.begin=X.int64();break}case 2:{z.end=X.int64();break}default:X.skipType(Y&7);break}}return z},J.decodeDelimited=function(X){return X instanceof K||(X=new K(X)),this.decode(X,X.uint32())},J.verify=function(X){return typeof X!="object"||X===null?"object expected":X.begin!=null&&X.hasOwnProperty("begin")&&!U.isInteger(X.begin)&&!(X.begin&&U.isInteger(X.begin.low)&&U.isInteger(X.begin.high))?"begin: integer|Long expected":X.end!=null&&X.hasOwnProperty("end")&&!U.isInteger(X.end)&&!(X.end&&U.isInteger(X.end.low)&&U.isInteger(X.end.high))?"end: integer|Long expected":null},J.fromObject=function(X){if(X instanceof Z.onnx.TensorProto.Segment)return X;var V=new Z.onnx.TensorProto.Segment;return X.begin!=null&&(U.Long?(V.begin=U.Long.fromValue(X.begin)).unsigned=!1:typeof X.begin=="string"?V.begin=parseInt(X.begin,10):typeof X.begin=="number"?V.begin=X.begin:typeof X.begin=="object"&&(V.begin=new U.LongBits(X.begin.low>>>0,X.begin.high>>>0).toNumber())),X.end!=null&&(U.Long?(V.end=U.Long.fromValue(X.end)).unsigned=!1:typeof X.end=="string"?V.end=parseInt(X.end,10):typeof X.end=="number"?V.end=X.end:typeof X.end=="object"&&(V.end=new U.LongBits(X.end.low>>>0,X.end.high>>>0).toNumber())),V},J.toObject=function(X,V){V||(V={});var R={};if(V.defaults){if(U.Long){var z=new U.Long(0,0,!1);R.begin=V.longs===String?z.toString():V.longs===Number?z.toNumber():z}else R.begin=V.longs===String?"0":0;if(U.Long){var z=new U.Long(0,0,!1);R.end=V.longs===String?z.toString():V.longs===Number?z.toNumber():z}else R.end=V.longs===String?"0":0}return X.begin!=null&&X.hasOwnProperty("begin")&&(typeof X.begin=="number"?R.begin=V.longs===String?String(X.begin):X.begin:R.begin=V.longs===String?U.Long.prototype.toString.call(X.begin):V.longs===Number?new U.LongBits(X.begin.low>>>0,X.begin.high>>>0).toNumber():X.begin),X.end!=null&&X.hasOwnProperty("end")&&(typeof X.end=="number"?R.end=V.longs===String?String(X.end):X.end:R.end=V.longs===String?U.Long.prototype.toString.call(X.end):V.longs===Number?new U.LongBits(X.end.low>>>0,X.end.high>>>0).toNumber():X.end),R},J.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},J.getTypeUrl=function(X){return X===void 0&&(X="type.googleapis.com"),X+"/onnx.TensorProto.Segment"},J}(),G.DataLocation=function(){var J={},X=Object.create(J);return X[J[0]="DEFAULT"]=0,X[J[1]="EXTERNAL"]=1,X}(),G}(),q.SparseTensorProto=function(){function G(J){if(this.dims=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.values=null,G.prototype.indices=null,G.prototype.dims=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.values!=null&&Object.hasOwnProperty.call(J,"values")&&Z.onnx.TensorProto.encode(J.values,X.uint32(10).fork()).ldelim(),J.indices!=null&&Object.hasOwnProperty.call(J,"indices")&&Z.onnx.TensorProto.encode(J.indices,X.uint32(18).fork()).ldelim(),J.dims!=null&&J.dims.length){X.uint32(26).fork();for(var V=0;V<J.dims.length;++V)X.int64(J.dims[V]);X.ldelim()}return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.SparseTensorProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.values=Z.onnx.TensorProto.decode(J,J.uint32());break}case 2:{R.indices=Z.onnx.TensorProto.decode(J,J.uint32());break}case 3:{if(R.dims&&R.dims.length||(R.dims=[]),(z&7)===2)for(var Y=J.uint32()+J.pos;J.pos<Y;)R.dims.push(J.int64());else R.dims.push(J.int64());break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.values!=null&&J.hasOwnProperty("values")){var X=Z.onnx.TensorProto.verify(J.values);if(X)return"values."+X}if(J.indices!=null&&J.hasOwnProperty("indices")){var X=Z.onnx.TensorProto.verify(J.indices);if(X)return"indices."+X}if(J.dims!=null&&J.hasOwnProperty("dims")){if(!Array.isArray(J.dims))return"dims: array expected";for(var V=0;V<J.dims.length;++V)if(!U.isInteger(J.dims[V])&&!(J.dims[V]&&U.isInteger(J.dims[V].low)&&U.isInteger(J.dims[V].high)))return"dims: integer|Long[] expected"}return null},G.fromObject=function(J){if(J instanceof Z.onnx.SparseTensorProto)return J;var X=new Z.onnx.SparseTensorProto;if(J.values!=null){if(typeof J.values!="object")throw TypeError(".onnx.SparseTensorProto.values: object expected");X.values=Z.onnx.TensorProto.fromObject(J.values)}if(J.indices!=null){if(typeof J.indices!="object")throw TypeError(".onnx.SparseTensorProto.indices: object expected");X.indices=Z.onnx.TensorProto.fromObject(J.indices)}if(J.dims){if(!Array.isArray(J.dims))throw TypeError(".onnx.SparseTensorProto.dims: array expected");X.dims=[];for(var V=0;V<J.dims.length;++V)U.Long?(X.dims[V]=U.Long.fromValue(J.dims[V])).unsigned=!1:typeof J.dims[V]=="string"?X.dims[V]=parseInt(J.dims[V],10):typeof J.dims[V]=="number"?X.dims[V]=J.dims[V]:typeof J.dims[V]=="object"&&(X.dims[V]=new U.LongBits(J.dims[V].low>>>0,J.dims[V].high>>>0).toNumber())}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.dims=[]),X.defaults&&(V.values=null,V.indices=null),J.values!=null&&J.hasOwnProperty("values")&&(V.values=Z.onnx.TensorProto.toObject(J.values,X)),J.indices!=null&&J.hasOwnProperty("indices")&&(V.indices=Z.onnx.TensorProto.toObject(J.indices,X)),J.dims&&J.dims.length){V.dims=[];for(var R=0;R<J.dims.length;++R)typeof J.dims[R]=="number"?V.dims[R]=X.longs===String?String(J.dims[R]):J.dims[R]:V.dims[R]=X.longs===String?U.Long.prototype.toString.call(J.dims[R]):X.longs===Number?new U.LongBits(J.dims[R].low>>>0,J.dims[R].high>>>0).toNumber():J.dims[R]}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.SparseTensorProto"},G}(),q.TensorShapeProto=function(){function G(J){if(this.dim=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.dim=U.emptyArray,G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.dim!=null&&J.dim.length)for(var V=0;V<J.dim.length;++V)Z.onnx.TensorShapeProto.Dimension.encode(J.dim[V],X.uint32(10).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.TensorShapeProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.dim&&R.dim.length||(R.dim=[]),R.dim.push(Z.onnx.TensorShapeProto.Dimension.decode(J,J.uint32()));break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.dim!=null&&J.hasOwnProperty("dim")){if(!Array.isArray(J.dim))return"dim: array expected";for(var X=0;X<J.dim.length;++X){var V=Z.onnx.TensorShapeProto.Dimension.verify(J.dim[X]);if(V)return"dim."+V}}return null},G.fromObject=function(J){if(J instanceof Z.onnx.TensorShapeProto)return J;var X=new Z.onnx.TensorShapeProto;if(J.dim){if(!Array.isArray(J.dim))throw TypeError(".onnx.TensorShapeProto.dim: array expected");X.dim=[];for(var V=0;V<J.dim.length;++V){if(typeof J.dim[V]!="object")throw TypeError(".onnx.TensorShapeProto.dim: object expected");X.dim[V]=Z.onnx.TensorShapeProto.Dimension.fromObject(J.dim[V])}}return X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.dim=[]),J.dim&&J.dim.length){V.dim=[];for(var R=0;R<J.dim.length;++R)V.dim[R]=Z.onnx.TensorShapeProto.Dimension.toObject(J.dim[R],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.TensorShapeProto"},G.Dimension=function(){function J(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}J.prototype.dimValue=null,J.prototype.dimParam=null,J.prototype.denotation="";var X;return Object.defineProperty(J.prototype,"value",{get:U.oneOfGetter(X=["dimValue","dimParam"]),set:U.oneOfSetter(X)}),J.create=function(V){return new J(V)},J.encode=function(V,R){return R||(R=W.create()),V.dimValue!=null&&Object.hasOwnProperty.call(V,"dimValue")&&R.uint32(8).int64(V.dimValue),V.dimParam!=null&&Object.hasOwnProperty.call(V,"dimParam")&&R.uint32(18).string(V.dimParam),V.denotation!=null&&Object.hasOwnProperty.call(V,"denotation")&&R.uint32(26).string(V.denotation),R},J.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},J.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TensorShapeProto.Dimension;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.dimValue=V.int64();break}case 2:{Y.dimParam=V.string();break}case 3:{Y.denotation=V.string();break}default:V.skipType(B&7);break}}return Y},J.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},J.verify=function(V){if(typeof V!="object"||V===null)return"object expected";var R={};if(V.dimValue!=null&&V.hasOwnProperty("dimValue")&&(R.value=1,!U.isInteger(V.dimValue)&&!(V.dimValue&&U.isInteger(V.dimValue.low)&&U.isInteger(V.dimValue.high))))return"dimValue: integer|Long expected";if(V.dimParam!=null&&V.hasOwnProperty("dimParam")){if(R.value===1)return"value: multiple values";if(R.value=1,!U.isString(V.dimParam))return"dimParam: string expected"}return V.denotation!=null&&V.hasOwnProperty("denotation")&&!U.isString(V.denotation)?"denotation: string expected":null},J.fromObject=function(V){if(V instanceof Z.onnx.TensorShapeProto.Dimension)return V;var R=new Z.onnx.TensorShapeProto.Dimension;return V.dimValue!=null&&(U.Long?(R.dimValue=U.Long.fromValue(V.dimValue)).unsigned=!1:typeof V.dimValue=="string"?R.dimValue=parseInt(V.dimValue,10):typeof V.dimValue=="number"?R.dimValue=V.dimValue:typeof V.dimValue=="object"&&(R.dimValue=new U.LongBits(V.dimValue.low>>>0,V.dimValue.high>>>0).toNumber())),V.dimParam!=null&&(R.dimParam=String(V.dimParam)),V.denotation!=null&&(R.denotation=String(V.denotation)),R},J.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.denotation=""),V.dimValue!=null&&V.hasOwnProperty("dimValue")&&(typeof V.dimValue=="number"?z.dimValue=R.longs===String?String(V.dimValue):V.dimValue:z.dimValue=R.longs===String?U.Long.prototype.toString.call(V.dimValue):R.longs===Number?new U.LongBits(V.dimValue.low>>>0,V.dimValue.high>>>0).toNumber():V.dimValue,R.oneofs&&(z.value="dimValue")),V.dimParam!=null&&V.hasOwnProperty("dimParam")&&(z.dimParam=V.dimParam,R.oneofs&&(z.value="dimParam")),V.denotation!=null&&V.hasOwnProperty("denotation")&&(z.denotation=V.denotation),z},J.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},J.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TensorShapeProto.Dimension"},J}(),G}(),q.TypeProto=function(){function G(X){if(X)for(var V=Object.keys(X),R=0;R<V.length;++R)X[V[R]]!=null&&(this[V[R]]=X[V[R]])}G.prototype.tensorType=null,G.prototype.sequenceType=null,G.prototype.mapType=null,G.prototype.optionalType=null,G.prototype.sparseTensorType=null,G.prototype.denotation="";var J;return Object.defineProperty(G.prototype,"value",{get:U.oneOfGetter(J=["tensorType","sequenceType","mapType","optionalType","sparseTensorType"]),set:U.oneOfSetter(J)}),G.create=function(X){return new G(X)},G.encode=function(X,V){return V||(V=W.create()),X.tensorType!=null&&Object.hasOwnProperty.call(X,"tensorType")&&Z.onnx.TypeProto.Tensor.encode(X.tensorType,V.uint32(10).fork()).ldelim(),X.sequenceType!=null&&Object.hasOwnProperty.call(X,"sequenceType")&&Z.onnx.TypeProto.Sequence.encode(X.sequenceType,V.uint32(34).fork()).ldelim(),X.mapType!=null&&Object.hasOwnProperty.call(X,"mapType")&&Z.onnx.TypeProto.Map.encode(X.mapType,V.uint32(42).fork()).ldelim(),X.denotation!=null&&Object.hasOwnProperty.call(X,"denotation")&&V.uint32(50).string(X.denotation),X.sparseTensorType!=null&&Object.hasOwnProperty.call(X,"sparseTensorType")&&Z.onnx.TypeProto.SparseTensor.encode(X.sparseTensorType,V.uint32(66).fork()).ldelim(),X.optionalType!=null&&Object.hasOwnProperty.call(X,"optionalType")&&Z.onnx.TypeProto.Optional.encode(X.optionalType,V.uint32(74).fork()).ldelim(),V},G.encodeDelimited=function(X,V){return this.encode(X,V).ldelim()},G.decode=function(X,V){X instanceof K||(X=K.create(X));for(var R=V===void 0?X.len:X.pos+V,z=new Z.onnx.TypeProto;X.pos<R;){var Y=X.uint32();switch(Y>>>3){case 1:{z.tensorType=Z.onnx.TypeProto.Tensor.decode(X,X.uint32());break}case 4:{z.sequenceType=Z.onnx.TypeProto.Sequence.decode(X,X.uint32());break}case 5:{z.mapType=Z.onnx.TypeProto.Map.decode(X,X.uint32());break}case 9:{z.optionalType=Z.onnx.TypeProto.Optional.decode(X,X.uint32());break}case 8:{z.sparseTensorType=Z.onnx.TypeProto.SparseTensor.decode(X,X.uint32());break}case 6:{z.denotation=X.string();break}default:X.skipType(Y&7);break}}return z},G.decodeDelimited=function(X){return X instanceof K||(X=new K(X)),this.decode(X,X.uint32())},G.verify=function(X){if(typeof X!="object"||X===null)return"object expected";var V={};if(X.tensorType!=null&&X.hasOwnProperty("tensorType")){V.value=1;{var R=Z.onnx.TypeProto.Tensor.verify(X.tensorType);if(R)return"tensorType."+R}}if(X.sequenceType!=null&&X.hasOwnProperty("sequenceType")){if(V.value===1)return"value: multiple values";V.value=1;{var R=Z.onnx.TypeProto.Sequence.verify(X.sequenceType);if(R)return"sequenceType."+R}}if(X.mapType!=null&&X.hasOwnProperty("mapType")){if(V.value===1)return"value: multiple values";V.value=1;{var R=Z.onnx.TypeProto.Map.verify(X.mapType);if(R)return"mapType."+R}}if(X.optionalType!=null&&X.hasOwnProperty("optionalType")){if(V.value===1)return"value: multiple values";V.value=1;{var R=Z.onnx.TypeProto.Optional.verify(X.optionalType);if(R)return"optionalType."+R}}if(X.sparseTensorType!=null&&X.hasOwnProperty("sparseTensorType")){if(V.value===1)return"value: multiple values";V.value=1;{var R=Z.onnx.TypeProto.SparseTensor.verify(X.sparseTensorType);if(R)return"sparseTensorType."+R}}return X.denotation!=null&&X.hasOwnProperty("denotation")&&!U.isString(X.denotation)?"denotation: string expected":null},G.fromObject=function(X){if(X instanceof Z.onnx.TypeProto)return X;var V=new Z.onnx.TypeProto;if(X.tensorType!=null){if(typeof X.tensorType!="object")throw TypeError(".onnx.TypeProto.tensorType: object expected");V.tensorType=Z.onnx.TypeProto.Tensor.fromObject(X.tensorType)}if(X.sequenceType!=null){if(typeof X.sequenceType!="object")throw TypeError(".onnx.TypeProto.sequenceType: object expected");V.sequenceType=Z.onnx.TypeProto.Sequence.fromObject(X.sequenceType)}if(X.mapType!=null){if(typeof X.mapType!="object")throw TypeError(".onnx.TypeProto.mapType: object expected");V.mapType=Z.onnx.TypeProto.Map.fromObject(X.mapType)}if(X.optionalType!=null){if(typeof X.optionalType!="object")throw TypeError(".onnx.TypeProto.optionalType: object expected");V.optionalType=Z.onnx.TypeProto.Optional.fromObject(X.optionalType)}if(X.sparseTensorType!=null){if(typeof X.sparseTensorType!="object")throw TypeError(".onnx.TypeProto.sparseTensorType: object expected");V.sparseTensorType=Z.onnx.TypeProto.SparseTensor.fromObject(X.sparseTensorType)}return X.denotation!=null&&(V.denotation=String(X.denotation)),V},G.toObject=function(X,V){V||(V={});var R={};return V.defaults&&(R.denotation=""),X.tensorType!=null&&X.hasOwnProperty("tensorType")&&(R.tensorType=Z.onnx.TypeProto.Tensor.toObject(X.tensorType,V),V.oneofs&&(R.value="tensorType")),X.sequenceType!=null&&X.hasOwnProperty("sequenceType")&&(R.sequenceType=Z.onnx.TypeProto.Sequence.toObject(X.sequenceType,V),V.oneofs&&(R.value="sequenceType")),X.mapType!=null&&X.hasOwnProperty("mapType")&&(R.mapType=Z.onnx.TypeProto.Map.toObject(X.mapType,V),V.oneofs&&(R.value="mapType")),X.denotation!=null&&X.hasOwnProperty("denotation")&&(R.denotation=X.denotation),X.sparseTensorType!=null&&X.hasOwnProperty("sparseTensorType")&&(R.sparseTensorType=Z.onnx.TypeProto.SparseTensor.toObject(X.sparseTensorType,V),V.oneofs&&(R.value="sparseTensorType")),X.optionalType!=null&&X.hasOwnProperty("optionalType")&&(R.optionalType=Z.onnx.TypeProto.Optional.toObject(X.optionalType,V),V.oneofs&&(R.value="optionalType")),R},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(X){return X===void 0&&(X="type.googleapis.com"),X+"/onnx.TypeProto"},G.Tensor=function(){function X(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}return X.prototype.elemType=0,X.prototype.shape=null,X.create=function(V){return new X(V)},X.encode=function(V,R){return R||(R=W.create()),V.elemType!=null&&Object.hasOwnProperty.call(V,"elemType")&&R.uint32(8).int32(V.elemType),V.shape!=null&&Object.hasOwnProperty.call(V,"shape")&&Z.onnx.TensorShapeProto.encode(V.shape,R.uint32(18).fork()).ldelim(),R},X.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},X.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TypeProto.Tensor;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.elemType=V.int32();break}case 2:{Y.shape=Z.onnx.TensorShapeProto.decode(V,V.uint32());break}default:V.skipType(B&7);break}}return Y},X.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},X.verify=function(V){if(typeof V!="object"||V===null)return"object expected";if(V.elemType!=null&&V.hasOwnProperty("elemType")&&!U.isInteger(V.elemType))return"elemType: integer expected";if(V.shape!=null&&V.hasOwnProperty("shape")){var R=Z.onnx.TensorShapeProto.verify(V.shape);if(R)return"shape."+R}return null},X.fromObject=function(V){if(V instanceof Z.onnx.TypeProto.Tensor)return V;var R=new Z.onnx.TypeProto.Tensor;if(V.elemType!=null&&(R.elemType=V.elemType|0),V.shape!=null){if(typeof V.shape!="object")throw TypeError(".onnx.TypeProto.Tensor.shape: object expected");R.shape=Z.onnx.TensorShapeProto.fromObject(V.shape)}return R},X.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.elemType=0,z.shape=null),V.elemType!=null&&V.hasOwnProperty("elemType")&&(z.elemType=V.elemType),V.shape!=null&&V.hasOwnProperty("shape")&&(z.shape=Z.onnx.TensorShapeProto.toObject(V.shape,R)),z},X.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},X.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TypeProto.Tensor"},X}(),G.Sequence=function(){function X(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}return X.prototype.elemType=null,X.create=function(V){return new X(V)},X.encode=function(V,R){return R||(R=W.create()),V.elemType!=null&&Object.hasOwnProperty.call(V,"elemType")&&Z.onnx.TypeProto.encode(V.elemType,R.uint32(10).fork()).ldelim(),R},X.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},X.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TypeProto.Sequence;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.elemType=Z.onnx.TypeProto.decode(V,V.uint32());break}default:V.skipType(B&7);break}}return Y},X.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},X.verify=function(V){if(typeof V!="object"||V===null)return"object expected";if(V.elemType!=null&&V.hasOwnProperty("elemType")){var R=Z.onnx.TypeProto.verify(V.elemType);if(R)return"elemType."+R}return null},X.fromObject=function(V){if(V instanceof Z.onnx.TypeProto.Sequence)return V;var R=new Z.onnx.TypeProto.Sequence;if(V.elemType!=null){if(typeof V.elemType!="object")throw TypeError(".onnx.TypeProto.Sequence.elemType: object expected");R.elemType=Z.onnx.TypeProto.fromObject(V.elemType)}return R},X.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.elemType=null),V.elemType!=null&&V.hasOwnProperty("elemType")&&(z.elemType=Z.onnx.TypeProto.toObject(V.elemType,R)),z},X.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},X.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TypeProto.Sequence"},X}(),G.Map=function(){function X(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}return X.prototype.keyType=0,X.prototype.valueType=null,X.create=function(V){return new X(V)},X.encode=function(V,R){return R||(R=W.create()),V.keyType!=null&&Object.hasOwnProperty.call(V,"keyType")&&R.uint32(8).int32(V.keyType),V.valueType!=null&&Object.hasOwnProperty.call(V,"valueType")&&Z.onnx.TypeProto.encode(V.valueType,R.uint32(18).fork()).ldelim(),R},X.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},X.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TypeProto.Map;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.keyType=V.int32();break}case 2:{Y.valueType=Z.onnx.TypeProto.decode(V,V.uint32());break}default:V.skipType(B&7);break}}return Y},X.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},X.verify=function(V){if(typeof V!="object"||V===null)return"object expected";if(V.keyType!=null&&V.hasOwnProperty("keyType")&&!U.isInteger(V.keyType))return"keyType: integer expected";if(V.valueType!=null&&V.hasOwnProperty("valueType")){var R=Z.onnx.TypeProto.verify(V.valueType);if(R)return"valueType."+R}return null},X.fromObject=function(V){if(V instanceof Z.onnx.TypeProto.Map)return V;var R=new Z.onnx.TypeProto.Map;if(V.keyType!=null&&(R.keyType=V.keyType|0),V.valueType!=null){if(typeof V.valueType!="object")throw TypeError(".onnx.TypeProto.Map.valueType: object expected");R.valueType=Z.onnx.TypeProto.fromObject(V.valueType)}return R},X.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.keyType=0,z.valueType=null),V.keyType!=null&&V.hasOwnProperty("keyType")&&(z.keyType=V.keyType),V.valueType!=null&&V.hasOwnProperty("valueType")&&(z.valueType=Z.onnx.TypeProto.toObject(V.valueType,R)),z},X.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},X.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TypeProto.Map"},X}(),G.Optional=function(){function X(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}return X.prototype.elemType=null,X.create=function(V){return new X(V)},X.encode=function(V,R){return R||(R=W.create()),V.elemType!=null&&Object.hasOwnProperty.call(V,"elemType")&&Z.onnx.TypeProto.encode(V.elemType,R.uint32(10).fork()).ldelim(),R},X.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},X.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TypeProto.Optional;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.elemType=Z.onnx.TypeProto.decode(V,V.uint32());break}default:V.skipType(B&7);break}}return Y},X.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},X.verify=function(V){if(typeof V!="object"||V===null)return"object expected";if(V.elemType!=null&&V.hasOwnProperty("elemType")){var R=Z.onnx.TypeProto.verify(V.elemType);if(R)return"elemType."+R}return null},X.fromObject=function(V){if(V instanceof Z.onnx.TypeProto.Optional)return V;var R=new Z.onnx.TypeProto.Optional;if(V.elemType!=null){if(typeof V.elemType!="object")throw TypeError(".onnx.TypeProto.Optional.elemType: object expected");R.elemType=Z.onnx.TypeProto.fromObject(V.elemType)}return R},X.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.elemType=null),V.elemType!=null&&V.hasOwnProperty("elemType")&&(z.elemType=Z.onnx.TypeProto.toObject(V.elemType,R)),z},X.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},X.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TypeProto.Optional"},X}(),G.SparseTensor=function(){function X(V){if(V)for(var R=Object.keys(V),z=0;z<R.length;++z)V[R[z]]!=null&&(this[R[z]]=V[R[z]])}return X.prototype.elemType=0,X.prototype.shape=null,X.create=function(V){return new X(V)},X.encode=function(V,R){return R||(R=W.create()),V.elemType!=null&&Object.hasOwnProperty.call(V,"elemType")&&R.uint32(8).int32(V.elemType),V.shape!=null&&Object.hasOwnProperty.call(V,"shape")&&Z.onnx.TensorShapeProto.encode(V.shape,R.uint32(18).fork()).ldelim(),R},X.encodeDelimited=function(V,R){return this.encode(V,R).ldelim()},X.decode=function(V,R){V instanceof K||(V=K.create(V));for(var z=R===void 0?V.len:V.pos+R,Y=new Z.onnx.TypeProto.SparseTensor;V.pos<z;){var B=V.uint32();switch(B>>>3){case 1:{Y.elemType=V.int32();break}case 2:{Y.shape=Z.onnx.TensorShapeProto.decode(V,V.uint32());break}default:V.skipType(B&7);break}}return Y},X.decodeDelimited=function(V){return V instanceof K||(V=new K(V)),this.decode(V,V.uint32())},X.verify=function(V){if(typeof V!="object"||V===null)return"object expected";if(V.elemType!=null&&V.hasOwnProperty("elemType")&&!U.isInteger(V.elemType))return"elemType: integer expected";if(V.shape!=null&&V.hasOwnProperty("shape")){var R=Z.onnx.TensorShapeProto.verify(V.shape);if(R)return"shape."+R}return null},X.fromObject=function(V){if(V instanceof Z.onnx.TypeProto.SparseTensor)return V;var R=new Z.onnx.TypeProto.SparseTensor;if(V.elemType!=null&&(R.elemType=V.elemType|0),V.shape!=null){if(typeof V.shape!="object")throw TypeError(".onnx.TypeProto.SparseTensor.shape: object expected");R.shape=Z.onnx.TensorShapeProto.fromObject(V.shape)}return R},X.toObject=function(V,R){R||(R={});var z={};return R.defaults&&(z.elemType=0,z.shape=null),V.elemType!=null&&V.hasOwnProperty("elemType")&&(z.elemType=V.elemType),V.shape!=null&&V.hasOwnProperty("shape")&&(z.shape=Z.onnx.TensorShapeProto.toObject(V.shape,R)),z},X.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},X.getTypeUrl=function(V){return V===void 0&&(V="type.googleapis.com"),V+"/onnx.TypeProto.SparseTensor"},X}(),G}(),q.OperatorSetIdProto=function(){function G(J){if(J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.domain="",G.prototype.version=U.Long?U.Long.fromBits(0,0,!1):0,G.create=function(J){return new G(J)},G.encode=function(J,X){return X||(X=W.create()),J.domain!=null&&Object.hasOwnProperty.call(J,"domain")&&X.uint32(10).string(J.domain),J.version!=null&&Object.hasOwnProperty.call(J,"version")&&X.uint32(16).int64(J.version),X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.OperatorSetIdProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.domain=J.string();break}case 2:{R.version=J.int64();break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){return typeof J!="object"||J===null?"object expected":J.domain!=null&&J.hasOwnProperty("domain")&&!U.isString(J.domain)?"domain: string expected":J.version!=null&&J.hasOwnProperty("version")&&!U.isInteger(J.version)&&!(J.version&&U.isInteger(J.version.low)&&U.isInteger(J.version.high))?"version: integer|Long expected":null},G.fromObject=function(J){if(J instanceof Z.onnx.OperatorSetIdProto)return J;var X=new Z.onnx.OperatorSetIdProto;return J.domain!=null&&(X.domain=String(J.domain)),J.version!=null&&(U.Long?(X.version=U.Long.fromValue(J.version)).unsigned=!1:typeof J.version=="string"?X.version=parseInt(J.version,10):typeof J.version=="number"?X.version=J.version:typeof J.version=="object"&&(X.version=new U.LongBits(J.version.low>>>0,J.version.high>>>0).toNumber())),X},G.toObject=function(J,X){X||(X={});var V={};if(X.defaults)if(V.domain="",U.Long){var R=new U.Long(0,0,!1);V.version=X.longs===String?R.toString():X.longs===Number?R.toNumber():R}else V.version=X.longs===String?"0":0;return J.domain!=null&&J.hasOwnProperty("domain")&&(V.domain=J.domain),J.version!=null&&J.hasOwnProperty("version")&&(typeof J.version=="number"?V.version=X.longs===String?String(J.version):J.version:V.version=X.longs===String?U.Long.prototype.toString.call(J.version):X.longs===Number?new U.LongBits(J.version.low>>>0,J.version.high>>>0).toNumber():J.version),V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.OperatorSetIdProto"},G}(),q.OperatorStatus=function(){var G={},J=Object.create(G);return J[G[0]="EXPERIMENTAL"]=0,J[G[1]="STABLE"]=1,J}(),q.FunctionProto=function(){function G(J){if(this.input=[],this.output=[],this.attribute=[],this.attributeProto=[],this.node=[],this.opsetImport=[],J)for(var X=Object.keys(J),V=0;V<X.length;++V)J[X[V]]!=null&&(this[X[V]]=J[X[V]])}return G.prototype.name="",G.prototype.input=U.emptyArray,G.prototype.output=U.emptyArray,G.prototype.attribute=U.emptyArray,G.prototype.attributeProto=U.emptyArray,G.prototype.node=U.emptyArray,G.prototype.docString="",G.prototype.opsetImport=U.emptyArray,G.prototype.domain="",G.create=function(J){return new G(J)},G.encode=function(J,X){if(X||(X=W.create()),J.name!=null&&Object.hasOwnProperty.call(J,"name")&&X.uint32(10).string(J.name),J.input!=null&&J.input.length)for(var V=0;V<J.input.length;++V)X.uint32(34).string(J.input[V]);if(J.output!=null&&J.output.length)for(var V=0;V<J.output.length;++V)X.uint32(42).string(J.output[V]);if(J.attribute!=null&&J.attribute.length)for(var V=0;V<J.attribute.length;++V)X.uint32(50).string(J.attribute[V]);if(J.node!=null&&J.node.length)for(var V=0;V<J.node.length;++V)Z.onnx.NodeProto.encode(J.node[V],X.uint32(58).fork()).ldelim();if(J.docString!=null&&Object.hasOwnProperty.call(J,"docString")&&X.uint32(66).string(J.docString),J.opsetImport!=null&&J.opsetImport.length)for(var V=0;V<J.opsetImport.length;++V)Z.onnx.OperatorSetIdProto.encode(J.opsetImport[V],X.uint32(74).fork()).ldelim();if(J.domain!=null&&Object.hasOwnProperty.call(J,"domain")&&X.uint32(82).string(J.domain),J.attributeProto!=null&&J.attributeProto.length)for(var V=0;V<J.attributeProto.length;++V)Z.onnx.AttributeProto.encode(J.attributeProto[V],X.uint32(90).fork()).ldelim();return X},G.encodeDelimited=function(J,X){return this.encode(J,X).ldelim()},G.decode=function(J,X){J instanceof K||(J=K.create(J));for(var V=X===void 0?J.len:J.pos+X,R=new Z.onnx.FunctionProto;J.pos<V;){var z=J.uint32();switch(z>>>3){case 1:{R.name=J.string();break}case 4:{R.input&&R.input.length||(R.input=[]),R.input.push(J.string());break}case 5:{R.output&&R.output.length||(R.output=[]),R.output.push(J.string());break}case 6:{R.attribute&&R.attribute.length||(R.attribute=[]),R.attribute.push(J.string());break}case 11:{R.attributeProto&&R.attributeProto.length||(R.attributeProto=[]),R.attributeProto.push(Z.onnx.AttributeProto.decode(J,J.uint32()));break}case 7:{R.node&&R.node.length||(R.node=[]),R.node.push(Z.onnx.NodeProto.decode(J,J.uint32()));break}case 8:{R.docString=J.string();break}case 9:{R.opsetImport&&R.opsetImport.length||(R.opsetImport=[]),R.opsetImport.push(Z.onnx.OperatorSetIdProto.decode(J,J.uint32()));break}case 10:{R.domain=J.string();break}default:J.skipType(z&7);break}}return R},G.decodeDelimited=function(J){return J instanceof K||(J=new K(J)),this.decode(J,J.uint32())},G.verify=function(J){if(typeof J!="object"||J===null)return"object expected";if(J.name!=null&&J.hasOwnProperty("name")&&!U.isString(J.name))return"name: string expected";if(J.input!=null&&J.hasOwnProperty("input")){if(!Array.isArray(J.input))return"input: array expected";for(var X=0;X<J.input.length;++X)if(!U.isString(J.input[X]))return"input: string[] expected"}if(J.output!=null&&J.hasOwnProperty("output")){if(!Array.isArray(J.output))return"output: array expected";for(var X=0;X<J.output.length;++X)if(!U.isString(J.output[X]))return"output: string[] expected"}if(J.attribute!=null&&J.hasOwnProperty("attribute")){if(!Array.isArray(J.attribute))return"attribute: array expected";for(var X=0;X<J.attribute.length;++X)if(!U.isString(J.attribute[X]))return"attribute: string[] expected"}if(J.attributeProto!=null&&J.hasOwnProperty("attributeProto")){if(!Array.isArray(J.attributeProto))return"attributeProto: array expected";for(var X=0;X<J.attributeProto.length;++X){var V=Z.onnx.AttributeProto.verify(J.attributeProto[X]);if(V)return"attributeProto."+V}}if(J.node!=null&&J.hasOwnProperty("node")){if(!Array.isArray(J.node))return"node: array expected";for(var X=0;X<J.node.length;++X){var V=Z.onnx.NodeProto.verify(J.node[X]);if(V)return"node."+V}}if(J.docString!=null&&J.hasOwnProperty("docString")&&!U.isString(J.docString))return"docString: string expected";if(J.opsetImport!=null&&J.hasOwnProperty("opsetImport")){if(!Array.isArray(J.opsetImport))return"opsetImport: array expected";for(var X=0;X<J.opsetImport.length;++X){var V=Z.onnx.OperatorSetIdProto.verify(J.opsetImport[X]);if(V)return"opsetImport."+V}}return J.domain!=null&&J.hasOwnProperty("domain")&&!U.isString(J.domain)?"domain: string expected":null},G.fromObject=function(J){if(J instanceof Z.onnx.FunctionProto)return J;var X=new Z.onnx.FunctionProto;if(J.name!=null&&(X.name=String(J.name)),J.input){if(!Array.isArray(J.input))throw TypeError(".onnx.FunctionProto.input: array expected");X.input=[];for(var V=0;V<J.input.length;++V)X.input[V]=String(J.input[V])}if(J.output){if(!Array.isArray(J.output))throw TypeError(".onnx.FunctionProto.output: array expected");X.output=[];for(var V=0;V<J.output.length;++V)X.output[V]=String(J.output[V])}if(J.attribute){if(!Array.isArray(J.attribute))throw TypeError(".onnx.FunctionProto.attribute: array expected");X.attribute=[];for(var V=0;V<J.attribute.length;++V)X.attribute[V]=String(J.attribute[V])}if(J.attributeProto){if(!Array.isArray(J.attributeProto))throw TypeError(".onnx.FunctionProto.attributeProto: array expected");X.attributeProto=[];for(var V=0;V<J.attributeProto.length;++V){if(typeof J.attributeProto[V]!="object")throw TypeError(".onnx.FunctionProto.attributeProto: object expected");X.attributeProto[V]=Z.onnx.AttributeProto.fromObject(J.attributeProto[V])}}if(J.node){if(!Array.isArray(J.node))throw TypeError(".onnx.FunctionProto.node: array expected");X.node=[];for(var V=0;V<J.node.length;++V){if(typeof J.node[V]!="object")throw TypeError(".onnx.FunctionProto.node: object expected");X.node[V]=Z.onnx.NodeProto.fromObject(J.node[V])}}if(J.docString!=null&&(X.docString=String(J.docString)),J.opsetImport){if(!Array.isArray(J.opsetImport))throw TypeError(".onnx.FunctionProto.opsetImport: array expected");X.opsetImport=[];for(var V=0;V<J.opsetImport.length;++V){if(typeof J.opsetImport[V]!="object")throw TypeError(".onnx.FunctionProto.opsetImport: object expected");X.opsetImport[V]=Z.onnx.OperatorSetIdProto.fromObject(J.opsetImport[V])}}return J.domain!=null&&(X.domain=String(J.domain)),X},G.toObject=function(J,X){X||(X={});var V={};if((X.arrays||X.defaults)&&(V.input=[],V.output=[],V.attribute=[],V.node=[],V.opsetImport=[],V.attributeProto=[]),X.defaults&&(V.name="",V.docString="",V.domain=""),J.name!=null&&J.hasOwnProperty("name")&&(V.name=J.name),J.input&&J.input.length){V.input=[];for(var R=0;R<J.input.length;++R)V.input[R]=J.input[R]}if(J.output&&J.output.length){V.output=[];for(var R=0;R<J.output.length;++R)V.output[R]=J.output[R]}if(J.attribute&&J.attribute.length){V.attribute=[];for(var R=0;R<J.attribute.length;++R)V.attribute[R]=J.attribute[R]}if(J.node&&J.node.length){V.node=[];for(var R=0;R<J.node.length;++R)V.node[R]=Z.onnx.NodeProto.toObject(J.node[R],X)}if(J.docString!=null&&J.hasOwnProperty("docString")&&(V.docString=J.docString),J.opsetImport&&J.opsetImport.length){V.opsetImport=[];for(var R=0;R<J.opsetImport.length;++R)V.opsetImport[R]=Z.onnx.OperatorSetIdProto.toObject(J.opsetImport[R],X)}if(J.domain!=null&&J.hasOwnProperty("domain")&&(V.domain=J.domain),J.attributeProto&&J.attributeProto.length){V.attributeProto=[];for(var R=0;R<J.attributeProto.length;++R)V.attributeProto[R]=Z.onnx.AttributeProto.toObject(J.attributeProto[R],X)}return V},G.prototype.toJSON=function(){return this.constructor.toObject(this,j.util.toJSONOptions)},G.getTypeUrl=function(J){return J===void 0&&(J="type.googleapis.com"),J+"/onnx.FunctionProto"},G}(),q}(),H.exports=Z}),V1,x4,Q8,R3,t2,i1,G3,u,L6,R5,h4,b4,Q1=E(()=>{H7(),a2(),V1=Z4(l4()),K4(),x4=class{static arraysEqual(Q,H){if(Q.length!==H.length)return!1;for(let j=0;j<Q.length;j++)if(Q[j]!==H[j])return!1;return!0}},Q8=class{static preprocessInputShapes(Q,H){let j=Q.length===1?[1,Q[0]]:Q,K=H.length===1?[H[0],1]:H;return[j,K]}static postprocessOutputShape(Q,H,j){H===1&&Q.splice(Q.length-2,1),j===1&&Q.pop()}static calcMatMulShape(Q,H){return Q[1]!==H[0]?void 0:[Q[0],H[1]]}},R3=class Q{static calcShape(H,j,K=!1){let W=H.length,U=j.length;if(W===0)return j;if(U===0)return H;let Z=Math.max(H.length,j.length),q=new Array(Z);if(K){if(W<2||U<2)return;let G=Q8.calcMatMulShape([H[W-2],H[W-1]],[j[U-2],j[U-1]]);if(G===void 0)return;[q[Z-2],q[Z-1]]=G}for(let G=K?3:1;G<=Z;G++){let J=W-G<0?1:H[W-G],X=U-G<0?1:j[U-G];if(J!==X&&J>1&&X>1)return;q[Z-G]=Math.max(J,X)}return q}static index(H,j){let K=new Array(j.length);return Q.fillIndex(H,j,K),K}static fillIndex(H,j,K){let W=H.length-j.length;for(let U=0;U<j.length;U++)K[U]=H[W+U]%j[U]}static calc(H,j,K,W,U){let Z=Q.calcShape(H.dims,j.dims);if(Z){if(W&&!u.areEqual(Z,H.dims))return;let q=u.size(Z),G=W?H:new o1(Z,U||H.type);if(Z.length===0)G.set([],K(H.get([]),j.get([])));else{let J=new Array(Z.length),X=new Array(H.dims.length),V=new Array(j.dims.length),R=0,z=0,Y=!1,B=!1;H.dims.length===0&&(R=H.get([]),Y=!0),j.dims.length===0&&(z=j.get([]),B=!0);let k;for(let w=0;w<q;w++){k=w;for(let A=Z.length-1;A>=0;A--)J[A]=k%Z[A],k=Math.floor(k/Z[A]);Y||(Q.fillIndex(J,H.dims,X),R=H.get(X)),B||(Q.fillIndex(J,j.dims,V),z=j.get(V)),G.set(J,K(R,z))}}return G}}static isValidBroadcast(H,j){let K=H.length,W=j.length;if(K>W)return!1;for(let U=1;U<=K;U++)if(H[K-U]!==1&&H[K-U]!==j[W-U])return!1;return!0}static getBroadcastDims(H,j){let K=H.length,W=[];for(let U=0;U<K;U++){let Z=K-1-U,q=H[Z]||1;(j[j.length-1-U]||1)>1&&q===1&&W.unshift(Z)}return W}},t2=class{static getShapeOfGemmResult(Q,H,j,K,W){if(Q.length!==2||j.length!==2)throw new Error("shape need to be of size 2");let U,Z,q;H?(U=Q[1],Z=Q[0]):(U=Q[0],Z=Q[1]);let G=-1;if(K?(q=j[0],G=1):(q=j[1],G=0),j[G]!==Z)throw new Error("dimension mismatch");if(U<=0||q<=0||Z<=0)throw new Error("invalid shape specified");if(W&&!R3.isValidBroadcast(W,[U,q]))throw new Error("gemm: invalid bias shape for broadcast");return[U,q,Z]}},i1=class Q{static tensorDataTypeFromProto(H){switch(H){case V1.onnx.TensorProto.DataType.INT8:return"int8";case V1.onnx.TensorProto.DataType.UINT8:return"uint8";case V1.onnx.TensorProto.DataType.BOOL:return"bool";case V1.onnx.TensorProto.DataType.INT16:return"int16";case V1.onnx.TensorProto.DataType.UINT16:return"uint16";case V1.onnx.TensorProto.DataType.INT32:return"int32";case V1.onnx.TensorProto.DataType.UINT32:return"uint32";case V1.onnx.TensorProto.DataType.FLOAT:return"float32";case V1.onnx.TensorProto.DataType.DOUBLE:return"float64";case V1.onnx.TensorProto.DataType.STRING:return"string";case V1.onnx.TensorProto.DataType.INT64:return"int32";case V1.onnx.TensorProto.DataType.UINT64:return"uint32";default:throw new Error(`unsupported data type: ${V1.onnx.TensorProto.DataType[H]}`)}}static tensorDataTypeStringToEnum(H){switch(H){case"int8":return V1.onnx.TensorProto.DataType.INT8;case"uint8":return V1.onnx.TensorProto.DataType.UINT8;case"bool":return V1.onnx.TensorProto.DataType.BOOL;case"int16":return V1.onnx.TensorProto.DataType.INT16;case"uint16":return V1.onnx.TensorProto.DataType.UINT16;case"int32":return V1.onnx.TensorProto.DataType.INT32;case"uint32":return V1.onnx.TensorProto.DataType.UINT32;case"float32":return V1.onnx.TensorProto.DataType.FLOAT;case"float64":return V1.onnx.TensorProto.DataType.DOUBLE;case"string":return V1.onnx.TensorProto.DataType.STRING;case"int64":return V1.onnx.TensorProto.DataType.INT64;case"uint64":return V1.onnx.TensorProto.DataType.UINT64;default:throw new Error(`unsupported data type: ${H}`)}}static tensorDimsFromProto(H){return H.map((j)=>_3.isLong(j)?j.toNumber():j)}static tensorValueTypeFromProto(H){return{tensorType:Q.tensorDataTypeFromProto(H.elemType),shape:{dims:Q.tensorDimsFromProto(H.shape.dim.map((j)=>j.dimValue))}}}static tensorDimsFromORTFormat(H){let j=[];for(let K=0;K<H.dimsLength();K++)j.push(G3.longToNumber(H.dims(K)));return j}static tensorAttributesFromORTFormat(H){let j=[];for(let K=0;K<H.attributesLength();K++)j.push(H.attributes(K));return j}},G3=class{static longToNumber(Q,H){return _3.isLong(Q)?Q.toNumber():Q instanceof $.Long?_3.fromValue({low:Q.low,high:Q.high,unsigned:H??!1}).toNumber():Q}static isLong(Q){return _3.isLong(Q)||Q instanceof $.Long}},u=class Q{static size(H){return Q.getSizeFromDimensionRange(H,0,H.length)}static sizeFromDimension(H,j){if(j<0||j>H.length)throw new Error(`invalid dimension of ${j} for sizeFromDimension as Tensor has ${H.length} dimensions.`);return Q.getSizeFromDimensionRange(H,j,H.length)}static sizeToDimension(H,j){if(j<0||j>H.length)throw new Error(`invalid dimension of ${j} for sizeToDimension as Tensor has ${H.length} dimensions.`);return Q.getSizeFromDimensionRange(H,0,j)}static getSizeFromDimensionRange(H,j,K){let W=1;for(let U=j;U<K;U++){if(H[U]<=0)throw new Error("cannot get valid size from specified dimension range. Most likely the range contains 0 or negative values in them.");W*=H[U]}return W}static computeStrides(H){let j=H.length;if(j===0)return[];if(j===1)return[1];let K=new Array(j);K[j-1]=1,K[j-2]=H[j-1];for(let W=j-3;W>=0;--W)K[W]=K[W+1]*H[W+1];return K}static transpose(H){return H.slice().reverse()}static indicesToOffset(H,j,K){K===void 0&&(K=H.length);let W=0;for(let U=0;U<K;++U)W+=j[U]*H[U];return W}static offsetToIndices(H,j){let K=j.length;if(K===0)return[];if(K===1)return[H*j[0]];let W=new Array(j.length);for(let U=0;U<W.length-1;++U)W[U]=Math.floor(H/j[U]),H-=W[U]*j[U];return W[W.length-1]=H,W}static normalizeAxis(H,j){if(H<-j&&H>=j)throw new Error("unsupported axis for this operation.");return H<0?H+j:H}static normalizeAxes(H,j){return H.map((K)=>this.normalizeAxis(K,j))}static incrementIndex(H,j,K){if(j.length===0||H.length===0)throw new Error("Index incrementing unsupported for scalar Tensor");if(K===void 0)K=j.length;else if(K<=0||K>j.length)throw new Error("Incorrect axis to increment on");for(let W=K-1;W>=0&&(H[W]++,!(H[W]<j[W]));--W)H[W]=0}static calculateReshapedDims(H,j){if(j.length===0){if(H.length===0||Q.size(H)===1)return[];throw new Error("cannot reshape to a scalar Tensor")}let K=j.length,W=new Array(K),U=-1,Z=1;for(let G=0;G<K;G++){if(j[G]<-1)throw new Error("a dimension in shape hints cannot be less than -1");if(j[G]===-1){if(U!==-1)throw new Error("at most one dimension in shape hints can be -1");U=G}else{if(j[G]===0){if(G>=H.length)throw new Error("the dimension with value zero exceeds the dimension size of the input tensor");W[G]=H[G]}else W[G]=j[G];Z*=W[G]}}let q=Q.size(H);if(U!==-1){if(q%Z!==0)throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${H}] Output shape: [${j}]`);W[U]=q/Z}else if(Z!==q)throw new Error("reshapedDims and originalDims don't have matching sizes");return W}static sortBasedOnPerm(H,j){return j?j.map((K)=>H[K]):H.slice().reverse()}static padShape(H,j){let K=H.length;return H.map((W,U)=>W+j[U]+j[U+K])}static areEqual(H,j){return H.length!==j.length?!1:H.every((K,W)=>K===j[W])}static validateDimsAndCalcSize(H){if(H.length>6)throw new TypeError("Only rank 0 to 6 is supported for tensor shape.");let j=1;for(let K of H){if(!Number.isInteger(K))throw new TypeError(`Invalid shape: ${K} is not an integer`);if(K<0||K>2147483647)throw new TypeError(`Invalid shape: length ${K} is not allowed`);j*=K}return j}static flattenShape(H,j){j<0&&(j+=H.length);let K=H.reduce((U,Z)=>U*Z,1),W=H.slice(j).reduce((U,Z)=>U*Z,1);return[K/W,W]}static squeezeShape(H,j){let K=new Array;j=Q.normalizeAxes(j,H.length);for(let W=0;W<H.length;W++){let U=j.indexOf(W)>=0;if(U&&H[W]!==1)throw new Error("squeeze an axis of size different than 1");(j.length===0&&H[W]>1||j.length>0&&!U)&&K.push(H[W])}return K}static unsqueezeShape(H,j){let K=new Array(H.length+j.length);K.fill(0);for(let U=0;U<j.length;U++){let Z=Q.normalizeAxis(j[U],K.length);if(Z>=K.length)throw new Error("'axes' has an out of range axis");if(K[Z]!==0)throw new Error("'axes' has a duplicate axis");K[Z]=1}let W=0;for(let U=0;U<K.length;U++)K[U]===0&&(K[U]=H[W++]);if(W!==H.length)throw new Error("the unsqueezed dimension could not be established");return K}},L6=class Q{static splitShape(H,j,K,W){if(K.length===0){if(!W)throw new Error("need to know number of outputs when the 'split' attribute is not specified");Q.determineSplit(H[j],W,K)}let U=[],Z=[0];for(let q=0;q<K.length;++q){q!==0&&Z.push(Z[q-1]+K[q-1]);let G=H.slice();G[j]=K[q],U.push(G)}return[U,Z]}static determineSplit(H,j,K){if(H%j!==0)throw new Error("cannot split tensor to equal sized parts");for(let W=0;W<j;++W)K.push(H/j)}},R5=class Q{static adjustPoolAttributes(H,j,K,W,U,Z){if(!H&&K.length!==j.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(H)for(let q=0;q<j.length-2;q++)q>=K.length?K.push(j[q+2]):K[q]=j[q+2];for(let q=0;q<K.length;q++)if(q<W.length){if(W[q]<0)throw new Error("strides should be greater than or equal to 1")}else W.push(1);for(let q=0;q<K.length;q++)if(q<U.length){if(U[q]<0)throw new Error("dilations should be greater than or equal to 1")}else U.push(1);for(let q=0;q<K.length*2;q++)if(q<Z.length){if(Z[q]<0)throw new Error("pad should be greater than or equal to 1")}else Z.push(0);for(let q=0;q<K.length;q++){if(K[q]<=0)throw new Error("kernel shapes need to be greater than 0");if(Z[q]>=K[q]||Z[q+K.length]>=K[q])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(H,j,K,W,U,Z){if(Z){if(U.length!==2*(H.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(j.length!==H.length-2)throw new Error("length of strides should be the length of data dimensions");if(W.length!==H.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let q=0;q<H.length-2;q++)Q.adjustPadAndReturnShape(H[q+2],j[q],K[q],W[q],U,q,q+H.length-2,Z)}}static computePoolOutputShape(H,j,K,W,U,Z,q){if(j.length<=0)throw new Error("input shape must be of size greater than 0");let G=[j[0],j[1]];return Q.computeShapeHelper(H,j,G,K,W,U,Z,q),G}static computeConvOutputShape(H,j,K,W,U,Z,q){if(H.length<=0||j.length<=0)throw new Error("invalid input tensor dims or invalid filter tensor dims");let G=[H[0],j[0]];return Q.computeShapeHelper(!1,H,G,K,W,U,Z,q),G}static computeShapeHelper(H,j,K,W,U,Z,q,G){if(H)for(let J=0;J<j.length-2;J++)K.push(1);else for(let J=0;J<j.length-2;J++)K.push(Q.adjustPadAndReturnShape(j[J+2],W[J],U[J],Z[J],q,J,J+j.length-2,G))}static adjustPadAndReturnShape(H,j,K,W,U,Z,q,G){let J=K*(W-1)+1;if(G&&G!=="NOTSET")switch(G){case"VALID":return U[Z]=0,U[q]=0,Math.floor((H-J)/j+1);case"SAME_LOWER":case"SAME_UPPER":if(K!==1)throw new Error("Dilation not supported for SAME_UPPER or SAME_LOWER");{let X=((H+j-1)/j-1)*j+W-H;return U[Z]=Math.floor(G==="SAME_LOWER"?(X+1)/2:X/2),U[q]=X-U[Z],Math.floor((H+X-W)/j+1)}default:throw new Error("Unsupported AutoPad type")}else return Math.floor((H+U[Z]+U[q]-J)/j+1)}},h4=-340282346638528860000000000000000000000,b4=340282346638528860000000000000000000000}),J8,o,q5,o1,K4=E(()=>{J8=Z4(nZ()),a2(),B5(),o=Z4(l4()),Q1(),q5=H1.experimental.fbs,o1=class Q{constructor(H,j,K,W,U,Z=J8.Guid.create()){this.dims=H,this.type=j,this.dataProvider=K,this.asyncDataProvider=W,this.cache=U,this.dataId=Z,this.size=u.validateDimsAndCalcSize(H);let q=this.size,G=K===void 0&&W===void 0&&U===void 0;if(U!==void 0&&U.length!==q)throw new RangeError("Input dims doesn't match data length.");if(j==="string"){if(U!==void 0&&(!Array.isArray(U)||!U.every((J)=>typeof J=="string")))throw new TypeError("cache should be a string array");G&&(this.cache=new Array(q))}else{if(U!==void 0){let J=A2(j);if(!(U instanceof J))throw new TypeError(`cache should be type ${J.name}`)}if(G){let J=new ArrayBuffer(q*$H(j));this.cache=LH(J,j)}}}get data(){if(this.cache===void 0){let H=this.dataProvider(this.dataId);if(H.length!==this.size)throw new Error("Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.");this.cache=H}return this.cache}get stringData(){if(this.type!=="string")throw new TypeError("data type is not string");return this.data}get integerData(){switch(this.type){case"uint8":case"int8":case"uint16":case"int16":case"int32":case"uint32":case"bool":return this.data;default:throw new TypeError("data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)")}}get floatData(){switch(this.type){case"float32":case"float64":return this.data;default:throw new TypeError("data type is not float (float32, float64)")}}get numberData(){if(this.type!=="string")return this.data;throw new TypeError("type cannot be non-number (string)")}get(H){return this.data[u.indicesToOffset(H,this.strides)]}set(H,j){this.data[u.indicesToOffset(H,this.strides)]=j}async getData(){return this.cache===void 0&&(this.cache=await this.asyncDataProvider(this.dataId)),this.cache}get strides(){return this._strides||(this._strides=u.computeStrides(this.dims)),this._strides}static fromProto(H){if(!H)throw new Error("cannot construct Value from an empty tensor");let j=i1.tensorDataTypeFromProto(H.dataType),K=i1.tensorDimsFromProto(H.dims),W=new Q(K,j);if(j==="string")H.stringData.forEach((U,Z)=>{W.data[Z]=N6(U)});else if(H.rawData&&typeof H.rawData.byteLength=="number"&&H.rawData.byteLength>0){let U=W.data,Z=new DataView(H.rawData.buffer,H.rawData.byteOffset,H.rawData.byteLength),q=f7(H.dataType),G=H.rawData.byteLength/q;if(H.rawData.byteLength%q!==0)throw new Error("invalid buffer length");if(U.length!==G)throw new Error("buffer length mismatch");for(let J=0;J<G;J++){let X=l7(Z,H.dataType,J*q);U[J]=X}}else{let U;switch(H.dataType){case o.onnx.TensorProto.DataType.FLOAT:U=H.floatData;break;case o.onnx.TensorProto.DataType.INT32:case o.onnx.TensorProto.DataType.INT16:case o.onnx.TensorProto.DataType.UINT16:case o.onnx.TensorProto.DataType.INT8:case o.onnx.TensorProto.DataType.UINT8:case o.onnx.TensorProto.DataType.BOOL:U=H.int32Data;break;case o.onnx.TensorProto.DataType.INT64:U=H.int64Data;break;case o.onnx.TensorProto.DataType.DOUBLE:U=H.doubleData;break;case o.onnx.TensorProto.DataType.UINT32:case o.onnx.TensorProto.DataType.UINT64:U=H.uint64Data;break;default:throw new Error("unspecific error")}if(U==null)throw new Error("failed to populate data from a tensorproto value");let Z=W.data;if(Z.length!==U.length)throw new Error("array length mismatch");for(let q=0;q<U.length;q++){let G=U[q];_3.isLong(G)?Z[q]=M6(G,H.dataType):Z[q]=G}}return W}static fromData(H,j,K){return new Q(j,K,void 0,void 0,H)}static fromOrtTensor(H){if(!H)throw new Error("cannot construct Value from an empty tensor");let j=i1.tensorDimsFromORTFormat(H),K=i1.tensorDataTypeFromProto(H.dataType()),W=new Q(j,K);if(K==="string")for(let U=0;U<H.stringDataLength();U++)W.data[U]=H.stringData(U);else if(H.rawDataArray()&&typeof H.rawDataLength()=="number"&&H.rawDataLength()>0){let U=W.data,Z=new DataView(H.rawDataArray().buffer,H.rawDataArray().byteOffset,H.rawDataLength()),q=f7(H.dataType()),G=H.rawDataLength()/q;if(H.rawDataLength()%q!==0)throw new Error("invalid buffer length");if(U.length!==G)throw new Error("buffer length mismatch");for(let J=0;J<G;J++){let X=l7(Z,H.dataType(),J*q);U[J]=X}}return W}}}),e2,Q0,W1=E(()=>{e2={version:"",attribute:"attribute",varyingVertex:"varying",varyingFrag:"varying",texture2D:"texture2D",output:"gl_FragColor",outputDeclaration:""},Q0={version:"#version 300 es",attribute:"in",varyingVertex:"out",varyingFrag:"in",texture2D:"texture",output:"outputColor",outputDeclaration:"out vec4 outputColor;"}}),t=E(()=>{}),F3=E(()=>{Q1()}),U4=E(()=>{F3()}),b5,H8,J0,Rj=E(()=>{W1(),t(),F3(),U4(),b5={name:"pack",inputNames:["A"],inputTypes:[1]},H8=(Q,H)=>{let j=r(Q.session.backend.glContext.version),K=H.dims,W=K.length,U=H.dims.length,Z=P3(U),q=n6("rc",U),G=IH(U,q,K[K.length-2],K[K.length-1]),J;W===0?J=[1,1]:W===1?J=[K[0],1]:J=[K[U-1],K[U-2]];let X=PH(U,J,q),V=EH(K,q),R=`
+        void main() {
+          ${Z} rc = getOutputCoords();
+
+          if(${X}) {
+            ${j.output} = vec4(0);
+          } else {
+            ${G}
+
+            ${j.output} = vec4(${V});
+          }
+        }
+      `;return{...b5,hasMain:!0,output:{dims:H.dims,type:H.type,textureType:2},shaderSource:R}},J0=(Q,H)=>({...b5,get:()=>H8(Q,H)})}),Z8,j8,H0,zj=E(()=>{Q1(),W1(),t(),U4(),Z8=(Q)=>({name:"Reshape (packed)",inputTypes:[2],inputNames:["A"],cacheHint:`${Q}`}),j8=(Q,H,j,K)=>{let W=H.dims,U=K,Z="";for(let J=0;J<4;J++){let X="";switch(J){case 0:X="outputCoords = rc;";break;case 1:X="outputCoords = ivec3(rc.x, rc.y+1, rc.z);";break;case 2:X="outputCoords = ivec3(rc.x, rc.y, rc.z+1);";break;case 3:X="outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);";break;default:throw new Error}Z+=`
+        ${X}
+        ${J>0?"if(outputCoords.y < rows && outputCoords.z < cols){":""}
+          int flattenedIndex = getFlattenedIndex(outputCoords);
+
+          ivec3 inputRC = inputCoordsFromReshapedOutCoords(flattenedIndex);
+          vec2 innerDims = vec2(float(inputRC.y),float(inputRC.z));
+
+          result[${J}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), innerDims);
+
+        ${J>0?"}":""}
+      `}let q=r(Q.session.backend.glContext.version),G=`
+      ${OH(W)}
+      ${gH(U)}
+      ${c4()}
+
+      void main() {
+        ivec3 rc = getOutputCoords();
+
+        vec4 result = vec4(0.0);
+
+        ivec3 outputCoords;
+        int rows = ${U[2]};
+        int cols = ${U[1]};
+
+        ${Z}
+        ${q.output} = result;
+      }
+    `;return{...j,output:{dims:U,type:H.type,textureType:2},shaderSource:G,hasMain:!0}},H0=(Q,H,j)=>{let K=Z8(j);return{...K,get:()=>j8(Q,H,K,j)}}}),v6,Nj=E(()=>{W1(),t(),v6=(Q,H)=>{let j=H.shape,K=r(Q.session.backend.glContext.version),W=`
+    const float FLOAT_MAX = 1.70141184e38;
+    const float FLOAT_MIN = 1.17549435e-38;
+
+    bool isNaN(float val) {
+      return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true;
+    }
+
+    highp vec4 encodeAsUint8(highp float v) {
+      if (isNaN(v)) {
+        return vec4(255, 255, 255, 255);
+      }
+
+      highp float av = abs(v);
+
+      if(av < FLOAT_MIN) {
+        return vec4(0.0, 0.0, 0.0, 0.0);
+      } else if(v > FLOAT_MAX) {
+        return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;
+      } else if(v < -FLOAT_MAX) {
+        return vec4(0.0, 0.0,  128.0, 255.0) / 255.0;
+      }
+
+      highp vec4 c = vec4(0,0,0,0);
+
+      highp float e = floor(log2(av));
+      highp float m = exp2(fract(log2(av))) - 1.0;
+
+      c[2] = floor(128.0 * m);
+      m -= c[2] / 128.0;
+      c[1] = floor(32768.0 * m);
+      m -= c[1] / 32768.0;
+      c[0] = floor(8388608.0 * m);
+
+      highp float ebias = e + 127.0;
+      c[3] = floor(ebias / 2.0);
+      ebias -= c[3] * 2.0;
+      c[2] += floor(ebias) * 128.0;
+
+      c[3] += 128.0 * step(0.0, -v);
+
+      return c / 255.0;
+    }
+
+    void main() {
+      float value = ${K.texture2D}(X,TexCoords).r;
+      ${K.output} = encodeAsUint8(value);
+    }`,U={name:"Uint8Encode",inputTypes:[0],inputNames:["X"],output:{dims:j,type:H.tensor.type,textureType:3},shaderSource:W,hasMain:!0};return Q.executeProgram(U,[H.tensor])}}),m5,V8,Z0,Mj=E(()=>{W1(),t(),F3(),U4(),m5={name:"unpack",inputNames:["A"],inputTypes:[2]},V8=(Q,H)=>{let j=H.dims.length,K=n6("rc",j),W=K.slice(-2),U=P3(j),Z=c4(),q=H.dims.length===0?"":yH(j,K),G=j<=1?"rc":`vec2(${W.join(",")})`,J=r(Q.session.backend.glContext.version),X=`
+    ${Z}
+    void main() {
+      ${U} rc = getOutputCoords();
+
+       // Sample the texture with the coords to get the rgba channel value.
+       vec4 packedInput = getA(${q});
+
+       ${J.output} = vec4(getChannel(packedInput, ${G}), 0, 0, 0);
+     }
+   `;return{...m5,hasMain:!0,output:{dims:H.dims,type:H.type,textureType:0},shaderSource:X}},Z0=(Q,H)=>({...m5,get:()=>V8(Q,H)})}),j0,w6,V0,z5=E(()=>{V3(),j0=class{constructor(Q,H=1){if(H===1)this.internalFormat=Q.R32F,this.format=Q.RED,this.textureType=Q.FLOAT,this.channelSize=H;else if(H===4)this.internalFormat=Q.RGBA32F,this.format=Q.RGBA,this.textureType=Q.FLOAT,this.channelSize=H;else throw new Error(`Invalid number of channels: ${H}`)}encode(Q,H){let j,K;return Q.constructor!==Float32Array&&(C1.warning("Encoder","data was not of type Float32; creating new Float32Array"),K=new Float32Array(Q)),H*this.channelSize>Q.length?(C1.warning("Encoder","Source data too small. Allocating larger array"),K=Q,j=this.allocate(H*this.channelSize),K.forEach((W,U)=>j[U]=W)):(K=Q,j=K),j}allocate(Q){return new Float32Array(Q*4)}decode(Q,H){return this.channelSize===1?Q.filter((j,K)=>K%4===0).subarray(0,H):Q.subarray(0,H)}},w6=class{constructor(Q,H=1,j){if(H!==1&&H!==4)throw new Error(`Invalid number of channels: ${H}`);this.internalFormat=Q.RGBA,this.format=Q.RGBA,this.channelSize=H,this.textureType=j||Q.FLOAT}encode(Q,H){let j=Q;return this.channelSize===1&&(C1.verbose("Encoder","Exploding into a larger array"),j=this.allocate(H),Q.forEach((K,W)=>j[W*4]=K)),j}allocate(Q){return new Float32Array(Q*4)}decode(Q,H){return this.channelSize===1?Q.filter((j,K)=>K%4===0).subarray(0,H):Q.subarray(0,H)}},V0=class{constructor(Q,H=1){if(this.channelSize=4,H===1)this.internalFormat=Q.ALPHA,this.format=Q.ALPHA,this.textureType=Q.UNSIGNED_BYTE,this.channelSize=H;else if(H===4)this.internalFormat=Q.RGBA,this.format=Q.RGBA,this.textureType=Q.UNSIGNED_BYTE,this.channelSize=H;else throw new Error(`Invalid number of channels: ${H}`)}encode(Q,H){return new Uint8Array(Q.buffer,Q.byteOffset,Q.byteLength)}allocate(Q){return new Uint8Array(Q*this.channelSize)}decode(Q,H){if(Q instanceof Uint8Array)return Q.subarray(0,H);throw new Error(`Invalid array type: ${Q.constructor}`)}}}),g4,X0,T6,Yj=E(()=>{Q1(),t(),g4=(Q,H,j)=>{let K=j===0||j===1?1:4,W=j===2,U=j===1||j===2,Z=j===4?H.length-1:void 0,q=j===4?H.map((G,J)=>J===H.length-1?G*4:G):void 0;return T6(Q,H,K,q,{isPacked:W,reverseWH:U,breakAxis:Z})},X0=(Q,H,j)=>{let K=g4(Q,H,j);return[K.width,K.height]},T6=(Q,H,j=1,K,W)=>{let U=!!(W&&W.isPacked),[Z,q]=Q.computeTextureWH(U&&K||H,W),G=H.length,J=H.slice(0);if(G===0&&(J=[1]),j===1)K=H;else if(U){if(j!==4)throw new Error("a packed texture must be 4-channel");K=H,G>0&&(J[G-1]=Math.ceil(J[G-1]/2)),G>1&&(J[G-2]=Math.ceil(J[G-2]/2))}else if(!K)throw new Error("Unpacked shape is needed when using channels > 1");return{width:Z,height:q,channels:j,isPacked:U,shape:J,strides:u.computeStrides(J),unpackedShape:K,reversedWH:W&&W.reverseWH}}}),X8,K0,Cj=E(()=>{V3(),K4(),Q1(),Rj(),zj(),Nj(),Mj(),z5(),Yj(),t(),X8=(Q,H)=>{let j=H.map((W)=>`${W.unpackedShape.join(",")};${W.width}x${W.height}`).join("_"),K=Q.name;return Q.cacheHint&&(K+="["+Q.cacheHint+"]"),K+=":"+j,K},K0=class{constructor(Q){this.session=Q,this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map}calculateTextureWidthAndHeight(Q,H){return X0(this.session.layoutStrategy,Q,H)}executeProgram(Q,H){if(H.length<Q.inputNames.length)throw new Error(`Input size mustn't be less than ${Q.inputNames.length}.`);if(Q.inputNames.length!==Q.inputTypes.length)throw new Error("input names size does not match input types");let j=[];for(let G=0;G<Q.inputNames.length;++G)j[G]=this.getOrCreateTextureData(H[G],Q.inputTypes[G]);let K=X8(Q,j),W=this.session.programManager.getArtifact(K),U=W?W.programInfo:typeof Q.get=="function"?Q.get():Q,Z=g4(this.session.layoutStrategy,U.output.dims,U.output.textureType),q=this.createTextureData(Z,U.output.type);return W||(W=this.session.programManager.build(U,j,q),this.session.programManager.setArtifact(K,W)),this.runProgram(W,j,q),q}run(Q,H){return this.executeProgram(Q,H).tensor}runProgram(Q,H,j){for(let K=0;K<H.length;++K)if(!!H[K].isPacked!=(Q.programInfo.inputTypes[K]===2))throw new Error(`input[${K}] property packed inconsistent`);if(!!j.isPacked!=(Q.programInfo.output.textureType===2))throw new Error("output property packed inconsistent");this.session.programManager.run(Q,H,j)}getOrCreateTextureData(Q,H){let j=this.getTextureData(Q.dataId,H===2);if(!j&&(j=this.getTextureData(Q.dataId,H!==2),j))return H===2?this.pack(j):this.unpack(j);if(!j){let K=g4(this.session.layoutStrategy,Q.dims,H);if(H===4){let W=Q.dims;if(W.length===4){let U=[W[0],Math.ceil(W[1]*W[2]*W[3]/4)],Z=g4(this.session.layoutStrategy,U,H),q=Q.numberData;if(W[1]*W[2]*W[3]%4!==0){let G=W[0],J=W[1]*W[2]*W[3],X=Math.ceil(J*1/4)*4,V=G*X;q=new Float32Array(V);for(let R=0;R<G;++R){let z=R*J,Y=R*X+R%1*J;q.set(Q.numberData.subarray(z,z+J),Y)}}return this.createTextureData(Z,Q.type,q,Q,1)}}if(H===2){let W=T6(this.session.layoutStrategy,Q.dims,1,[],{reverseWH:!0}),U=this.createTextureData(W,Q.type,Q.numberData,Q,1);j=this.pack(U)}else j=this.createTextureData(K,Q.type,Q.numberData,Q,1)}return j}createTextureDataFromLayoutBindTensor(Q,H,j,K){return this.createTextureData(Q,H,j,K,1)}createTextureData(Q,H,j,K,W){C1.verbose("InferenceHandler",`Creating TextureData: layout:[${JSON.stringify(Q)}]`);let U=this.session.textureManager.createTextureFromLayout(H,Q,j,W);return this.createTextureDataFromTexture(Q,H,U,K)}reshapeUnpacked(Q,H){let j=this.getOrCreateTextureData(Q,0),K={channels:j.channels,height:j.height,width:j.width,shape:H.length!==0?H:[1],strides:u.computeStrides(H),unpackedShape:H};return this.createTextureDataFromTexture(K,Q.type,j.texture).tensor}reshapePacked(Q,H){let j=this.getOrCreateTextureData(Q,2);if(xH(Q.dims,H)){let q={channels:j.channels,height:j.height,width:j.width,shape:H.length!==0?H:[1],strides:u.computeStrides(H),unpackedShape:H,isPacked:!0};return this.createTextureDataFromTexture(q,Q.type,j.texture).tensor}let K=s7(Q.dims),W=s7(H),U=this.reshapePacked(Q,K),Z=this.run(H0(this,U,W),[U]);return this.reshapePacked(Z,H)}cast(Q,H){let j=this.getOrCreateTextureData(Q,0);return this.createTextureDataFromTexture(j,H,j.texture).tensor}createTextureDataFromTexture(Q,H,j,K,W){let U={...Q,tensor:K||new o1(Q.unpackedShape,H,(Z)=>this.readTexture(U),async(Z)=>this.readTextureAsync(U),void 0,W),texture:j};return this.setTextureData(U.tensor.dataId,U,Q.isPacked),U}getTextureData(Q,H=!1){return this.session.isInitializer(Q)?this.session.getTextureData(Q,H):H?this.packedTextureDataCache.get(Q):this.unpackedTextureDataCache.get(Q)}setTextureData(Q,H,j=!1){this.session.isInitializer(Q)?this.session.setTextureData(Q,H,j):(j?this.packedTextureDataCache:this.unpackedTextureDataCache).set(Q,H)}isTextureLayoutCached(Q,H=!1){return!!this.getTextureData(Q.dataId,H)}dispose(){this.session.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach((Q)=>this.session.textureManager.releaseTexture(Q)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach((Q)=>this.session.textureManager.releaseTexture(Q)),this.unpackedTextureDataCache=new Map}readTexture(Q){return Q.isPacked?this.readTexture(this.unpack(Q)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTexture(Q,Q.tensor.type,Q.channels):this.session.textureManager.readUint8TextureAsFloat(v6(this,Q))}async readTextureAsync(Q){return Q.isPacked?this.readTextureAsync(this.unpack(Q)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTextureAsync(Q,Q.tensor.type,Q.channels):this.session.textureManager.readUint8TextureAsFloat(v6(this,Q))}pack(Q){return this.executeProgram(J0(this,Q.tensor),[Q.tensor])}unpack(Q){return this.executeProgram(Z0(this,Q.tensor),[Q.tensor])}}}),K8,K1,_1=E(()=>{K8=class{constructor(Q){Object.assign(this,Q)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map((Q)=>`${this[Q]}`).join(";")),this.key}},K1=(Q)=>new K8(Q)}),c5,U0,q0,U8,q8,Bj=E(()=>{_1(),W1(),t(),c5={name:"BatchNormalization",inputNames:["A","Scale","B","Mean","Variance"],inputTypes:[0,0,0,0,0]},U0=(Q,H,j)=>(q8(H),[Q.run({...c5,cacheHint:j.cacheKey,get:()=>U8(Q,H,j)},H)]),q0=(Q)=>{let H=Q.attributes.getFloat("epsilon",0.00001),j=Q.attributes.getFloat("momentum",0.9),K=Q.attributes.getInt("spatial",1);return K1({epsilon:H,momentum:j,spatial:K})},U8=(Q,H,j)=>{let K=r(Q.session.backend.glContext.version),W=H[0].dims.length,[U,Z]=Q.calculateTextureWidthAndHeight(H[1].dims,0),q=`
+  float process(int[${W}] indices) {
+    vec2 position = offsetToCoords(indices[1], ${U}, ${Z});
+    float scale = getColorAsFloat(${K.texture2D}(Scale, position));
+    float mean = getColorAsFloat(${K.texture2D}(Mean, position));
+    float variance = getColorAsFloat(${K.texture2D}(Variance, position));
+    float b = getColorAsFloat(${K.texture2D}(B, position));
+
+    return scale * ( (_A(indices) - mean) / sqrt(variance + float(${j.epsilon})) ) + b;
+  }`;return{...c5,output:{dims:H[0].dims,type:H[0].type,textureType:0},shaderSource:q}},q8=(Q)=>{if(!Q||Q.length!==5)throw new Error("BatchNormalization requires 5 inputs.");let H=Q[0],j=Q[1],K=Q[2],W=Q[3],U=Q[4];if(H.dims.length<3||j.dims.length!==1||K.dims.length!==1||W.dims.length!==1||U.dims.length!==1)throw new Error("invalid input shape.");if(j.dims[0]!==H.dims[1]||K.dims[0]!==H.dims[1]||W.dims[0]!==H.dims[1]||U.dims[0]!==H.dims[1])throw new Error("invalid input shape.");if(H.type!=="float32"&&H.type!=="float64"||j.type!=="float32"&&j.type!=="float64"||K.type!=="float32"&&K.type!=="float64"||W.type!=="float32"&&W.type!=="float64"||U.type!=="float32"&&U.type!=="float64")throw new Error("invalid input tensor types.")}}),W0,q4,y,D6,G0,E3=E(()=>{W0=class{constructor(Q,H,j,K){this.glContext=Q,this.programInfo=H,this.inputTextureLayouts=j,this.outputTextureLayout=K}},q4=class{constructor(Q){this.context=Q}},y=class{constructor(Q,H){this.routineBody=Q,this.dependencies=H}},D6=class{constructor(Q,H,j){this.name=Q,j?this.dependencies=j:this.dependencies=[],H&&(this.routineBody=H)}addDependency(Q){Q&&this.dependencies.push(Q)}},G0=class{static returnOrderedNodes(Q){if(!Q||Q.length===0)return[];if(Q.length===1)return Q;let H=new Set,j=new Set,K=new Array;return this.createOrderedNodes(Q,H,j,K),K}static createOrderedNodes(Q,H,j,K){for(let W=0;W<Q.length;++W)this.dfsTraverse(Q[W],H,j,K)}static dfsTraverse(Q,H,j,K){if(!Q||j.has(Q.name))return;if(H.has(Q.name))throw new Error("Cyclic dependency detected. Can't topologically sort routines needed for shader.");H.add(Q.name);let W=Q.dependencies;if(W&&W.length>0)for(let U=0;U<W.length;++U)this.dfsTraverse(W[U],H,j,K);K.push(Q),j.add(Q.name),H.delete(Q.name)}}}),u1,W8,R0,z0,N0,M0,Y0,C0,B0,F0,k0,A0,S0,$0,Fj=E(()=>{Q1(),E3(),W1(),t(),u1=(Q,H,j,K=H[0].type,W)=>{let U=Q.session.pack?2:0;return{name:j.name,inputNames:["A","B"],inputTypes:[U,U],cacheHint:W,get:()=>W8(Q,H,j,K)}},W8=(Q,H,j,K=H[0].type)=>{let W=Q.session.pack?2:0,U=!u.areEqual(H[0].dims,H[1].dims),Z=H[0].dims,q=Q.session.pack;if(U){let X=R3.calcShape(H[0].dims,H[1].dims,!1);if(!X)throw new Error("Can't perform binary op on the given tensors");Z=X;let V=Z.length,R=H[0].dims.length!==0?H[0].dims.length:1,z=H[1].dims.length!==0?H[1].dims.length:1,Y=H[0].dims.length!==0?"bcastIndices_A(indices, aindices);":"aindices[0] = 0;",B=H[1].dims.length!==0?"bcastIndices_B(indices, bindices);":"bindices[0] = 0;",k=r(Q.session.backend.glContext.version),w=q?`
+      ${j.body}
+      void main() {
+        vec4 a = getAAtOutCoords();
+        vec4 b = getBAtOutCoords();
+        vec4 result = ${j.name}(a, b);
+        ${k.output} = result;
+      }`:`
+      ${j.body}
+      float process(int indices[${V}]) {
+        int aindices[${R}];
+        int bindices[${z}];
+        ${Y}
+        ${B}
+        return ${j.name}(_A(aindices), _B(bindices));
+      }`;return{name:j.name,inputNames:["A","B"],inputTypes:[W,W],output:{dims:Z,type:K,textureType:W},shaderSource:w,hasMain:q}}let G=r(Q.session.backend.glContext.version),J=`
+    ${j.body}
+    void main() {
+      vec4 v1 = ${G.texture2D}(A, TexCoords);
+      vec4 v2 = ${G.texture2D}(B, TexCoords);
+      vec4 result = ${j.name}(v1, v2);
+      ${G.output} = result;
+    }
+    `;return{name:j.name,inputNames:["A","B"],inputTypes:[W,W],output:{dims:H[0].dims,type:K,textureType:W},shaderSource:J,hasMain:!0}},R0=(Q,H)=>[Q.run(u1(Q,H,dH()),H)],z0=(Q,H)=>[Q.run(u1(Q,H,lH(),"bool"),H)],N0=(Q,H)=>[Q.run(u1(Q,H,pH()),H)],M0=(Q,H)=>[Q.run(u1(Q,H,mH(),"bool"),H)],Y0=(Q,H)=>[Q.run(u1(Q,H,cH(),"bool"),H)],C0=(Q,H)=>[Q.run(u1(Q,H,fH(),"bool"),H)],B0=(Q,H)=>[Q.run(u1(Q,H,hH()),H)],F0=(Q,H)=>[Q.run(u1(Q,H,uH(),"bool"),H)],k0=(Q,H)=>[Q.run(u1(Q,H,iH()),H)],A0=(Q,H)=>[Q.run(u1(Q,H,oH()),H)],S0=(Q,H)=>[Q.run(u1(Q,H,bH()),H)],$0=(Q,H)=>[Q.run(u1(Q,H,sH(),"bool"),H)]}),L0,v0,G8,kj=E(()=>{Q1(),L0=(Q,H,j)=>(G8(H),[Q.cast(H[0],j)]),v0=(Q)=>i1.tensorDataTypeFromProto(Q.attributes.getInt("to")),G8=(Q)=>{if(!Q||Q.length!==1)throw new Error("Cast requires 1 input.");if(Q[0].type==="string")throw new Error("Invalid input type.")}}),R8,z8,w0,$4,Aj=E(()=>{W1(),t(),F3(),U4(),R8=(Q,H)=>({name:"Concat (packed)",inputNames:Array.from({length:Q},(j,K)=>`X${K}`),inputTypes:Array(Q).fill(2),cacheHint:H}),z8=(Q,H,j,K)=>{let W=j[0].dims.slice();if(K>=W.length||K<-1*W.length)throw new Error("axis specified for concat doesn't match input dimensionality");K<0&&(K=W.length+K);let U=W.slice(0);for(let h=1;h<j.length;h++){let $1=j[h].dims.slice();for(let L1=0;L1<W.length;L1++)if(L1===K)U[K]+=$1[L1];else if(W[L1]!==$1[L1])throw new Error("non concat dimensions must match")}let Z=U.length,q=n6("coords",Z),G=P3(Z),J=c4(),X=j.map((h)=>h.dims),V=H4(Z),R=new Array(X.length-1);R[0]=X[0][K];for(let h=1;h<R.length;h++)R[h]=R[h-1]+X[h][K];let z=V[K],Y=V.slice(-2),B=V.join(),k=`if (${z} < ${R[0]}) {
+        return getChannel(
+            getX0(${B}), vec2(${Y.join()}));
+        }`;for(let h=1;h<R.length;h++){let $1=R[h-1];k+=`
+            if (${z} < ${R[h]}  && ${z} >= ${R[h-1]}) {
+              return getChannel(
+                getX${h}(${$4(V,z,$1)}),
+                vec2(${$4(Y,z,$1)}));
+            }`}let w=R.length,A=R[R.length-1];k+=`
+            return getChannel(
+              getX${w}(${$4(V,z,A)}),
+              vec2(${$4(Y,z,A)}));`;let D=r(Q.session.backend.glContext.version),I=`
+          ${J}
+          float getValue(${V.map((h)=>"int "+h)}) {
+            ${k}
+          }
+
+          void main() {
+            ${G} coords = getOutputCoords();
+            int lastDim = coords.${V[Z-1]};
+            coords.${V[Z-1]} = coords.${V[Z-2]};
+            coords.${V[Z-2]} = lastDim;
+
+            vec4 result = vec4(getValue(${q}), 0., 0., 0.);
+
+            ${q[Z-1]} = ${q[Z-1]} + 1;
+            if (${q[Z-1]} < ${U[Z-1]}) {
+              result.g = getValue(${q});
+            }
+
+            ${q[Z-2]} = ${q[Z-2]} + 1;
+            if (${q[Z-2]} < ${U[Z-2]}) {
+              result.a = getValue(${q});
+            }
+
+            ${q[Z-1]} = ${q[Z-1]} - 1;
+            if (${q[Z-2]} < ${U[Z-2]} &&
+                ${q[Z-1]} < ${U[Z-1]}) {
+              result.b = getValue(${q});
+            }
+            ${D.output} = result;
+          }
+        `;return{...H,output:{dims:U,type:j[0].type,textureType:2},shaderSource:I,hasMain:!0}},w0=(Q,H,j)=>{let K=R8(H.length,j.cacheKey);return{...K,get:()=>z8(Q,K,H,j.axis)}},$4=(Q,H,j)=>{let K=Q.indexOf(H);return Q.map((W,U)=>U===K?`${W} - ${j}`:W).join()}}),T0,N8,M8,Y8,f5,C8,B8,F8,D0,k8,Sj=E(()=>{_1(),t(),Aj(),T0=(Q,H,j)=>(k8(H),Q.session.pack&&H[0].dims.length>1?[Q.run(w0(Q,H,j),H)]:[Q.run(Y8(Q,H,j),H)]),N8=(Q,H)=>({name:"Concat",inputNames:Array.from({length:Q},(j,K)=>`X${K}`),inputTypes:Array(Q).fill(0),cacheHint:H}),M8=(Q,H,j,K)=>{let W=j[0].dims.slice();if(K>=W.length||K<-1*W.length)throw new Error("axis specified for concat doesn't match input dimensionality");K<0&&(K=W.length+K);let U=W.slice(0);for(let z=1;z<j.length;z++){let Y=j[z].dims.slice();for(let B=0;B<W.length;B++)if(B===K)U[K]+=Y[B];else if(W[B]!==Y[B])throw new Error("non concat dimensions must match")}let Z=U.length,q=new Array(j.length),G=0;for(let z=0;z<q.length;++z)G+=j[z].dims[K],q[z]=G;let J="";j.length<5?J=f5(q):J=C8(q);let X=B8(j.length,Z),V=F8(q),R=`
+        ${X}
+        ${V}
+        ${J}
+        float process(int indices[${Z}]) {
+          int textureIndex = getTextureWhereDataResides (indices[${K}]);
+
+          if(textureIndex != 0) {
+            indices[${K}] = indices[${K}] - int(getSizeInConcatAxisValueFromIndex(textureIndex-int(1)));
+          }
+
+          return fetchDataFromCorrectTexture(textureIndex, indices);
+        }`;return{...H,output:{dims:U,type:j[0].type,textureType:0},shaderSource:R}},Y8=(Q,H,j)=>{let K=N8(H.length,j.cacheKey);return{...K,get:()=>M8(Q,K,H,j.axis)}},f5=(Q)=>`int getTextureWhereDataResides(int index) {
+      ${Q.map((H,j)=>`if(index<${H}) {return ${j};}
+`).join("")}
+    }`,C8=(Q)=>f5(Q),B8=(Q,H)=>{let j=[`float fetchDataFromCorrectTexture(int textureIndex, int indices[${H}]) {`];for(let K=0;K<Q;++K)K===0?j.push(`	if (textureIndex == ${K}) { return _X${K}(indices); }`):K===Q-1?j.push(`	else { return _X${K}(indices); }`):j.push(`	else if (textureIndex == ${K}) { return _X${K}(indices); }`);return j.push("	}"),j.join(`
+`)},F8=(Q)=>{let H=["int getSizeInConcatAxisValueFromIndex(int index) {"];for(let j=0;j<Q.length;++j)j===0?H.push(`	if (index == ${j}) { return ${Q[j]}; }`):j===Q.length-1?H.push(`	else { return ${Q[j]}; }`):H.push(`	else if (index == ${j}) { return ${Q[j]}; }`);return H.push("	}"),H.join(`
+`)},D0=(Q)=>K1({axis:Q.attributes.getInt("axis")}),k8=(Q)=>{if(!Q||Q.length<1)throw new Error("too few inputs");let H=Q[0].type,j=Q[0].dims.length;if(H==="string")throw new Error("string tensor is not supported yet");for(let K of Q){if(K.type!==H)throw new Error("input tensors should be one type");if(K.dims.length!==j)throw new Error("input tensors should have the same shape")}}}),A8,Y1,_0,P0,E0,I0,_6,x0,O0,S8,g0,y0,d0,p0,h0,b0,P6,m0,c0,f0,l0,u0,s0,i0,o0,a0,n0,r0,t0=E(()=>{_1(),Q1(),E3(),W1(),t(),A8=(Q,H,j,K)=>{let W=Q.session.pack?2:0,U=r(Q.session.backend.glContext.version);return{...H,output:{dims:j.dims,type:j.type,textureType:W},shaderSource:`
+     ${K.body}
+     void main() {
+       vec4 v = ${U.texture2D}(A, TexCoords);
+       v = ${K.name}_(v);
+       ${U.output} = v;
+     }
+     `,hasMain:!0}},Y1=(Q,H,j,K)=>{let W=Q.session.pack?2:0,U={name:j.name,inputTypes:[W],inputNames:["A"],cacheHint:K};return{...U,get:()=>A8(Q,U,H,j)}},_0=(Q,H)=>[Q.run(Y1(Q,H[0],nH()),H)],P0=(Q,H)=>[Q.run(Y1(Q,H[0],rH()),H)],E0=(Q,H)=>[Q.run(Y1(Q,H[0],tH()),H)],I0=(Q,H)=>[Q.run(Y1(Q,H[0],eH()),H)],_6=(Q,H,j)=>[Q.run(Y1(Q,H[0],S2(j.min,j.max),j.cacheKey),H)],x0=(Q)=>K1({min:Q.attributes.getFloat("min",h4),max:Q.attributes.getFloat("max",b4)}),O0=(Q,H)=>{let j=S8(Q,H);return _6(Q,[H[0]],j)},S8=(Q,H)=>{if(H.length>=3&&(!Q.session.isInitializer(H[1].dataId)||!Q.session.isInitializer(H[2].dataId)))throw new Error("dynamic clip attributes are not allowed");let j=H.length>=3?H[1].numberData[0]:h4,K=H.length>=3?H[2].numberData[0]:b4;return K1({min:j,max:K})},g0=(Q,H)=>[Q.run(Y1(Q,H[0],QZ()),H)],y0=(Q,H)=>[Q.run(Y1(Q,H[0],JZ()),H)],d0=(Q,H,j)=>[Q.run(Y1(Q,H[0],HZ(j.alpha),j.cacheKey),H)],p0=(Q)=>K1({alpha:Q.attributes.getFloat("alpha",1)}),h0=(Q,H)=>[Q.run(Y1(Q,H[0],ZZ()),H)],b0=(Q,H)=>[Q.run(Y1(Q,H[0],jZ()),H)],P6=(Q,H)=>[Q.run(Y1(Q,H[0],VZ()),H)],m0=(Q,H,j)=>[Q.run(Y1(Q,H[0],XZ(j.alpha),j.cacheKey),H)],c0=(Q)=>K1({alpha:Q.attributes.getFloat("alpha",0.01)}),f0=(Q,H)=>[Q.run(Y1(Q,H[0],KZ()),H)],l0=(Q,H)=>[Q.run(Y1(Q,H[0],UZ()),H)],u0=(Q,H)=>[Q.run(Y1(Q,H[0],qZ()),H)],s0=(Q,H)=>[Q.run(Y1(Q,H[0],$2()),H)],i0=(Q,H)=>[Q.run(Y1(Q,H[0],L2()),H)],o0=(Q,H)=>[Q.run(Y1(Q,H[0],WZ()),H)],a0=(Q,H)=>[Q.run(Y1(Q,H[0],GZ()),H)],n0=(Q,H)=>[Q.run(Y1(Q,H[0],RZ()),H)],r0=(Q,H)=>[Q.run(Y1(Q,H[0],zZ()),H)]}),F5,W4=E(()=>{Q1(),t0(),F5=(Q)=>{let H=Q.getString("activation","");if(H==="Clip"){let[j,K]=Q.getFloats("activation_params",[h4,b4]);return{activation:H,clipMax:K,clipMin:j,activationCacheKey:`${H}:${j},${K}`}}return{activation:H,activationCacheKey:H}}}),$8,L8,e0,$j=E(()=>{V3(),W1(),t(),V7(),W4(),$8=(Q,H)=>({name:"GroupedConv",inputNames:Q?["X","W","Bias"]:["X","W"],inputTypes:Q?[0,0,0]:[0,0],cacheHint:H}),L8=(Q,H,j,K)=>{let W=H.length>2?"value += getBias(output_channel);":"",U=H[0].dims.slice(),Z=H[1].dims.slice(),q=Z[0]/K.group;C1.verbose("GroupedConv",`autpPad:${K.autoPad}, dilations:${K.dilations}, group:${K.group}, kernelShape:${K.kernelShape}, pads:${K.pads}, strides:${K.strides}`);let G=y4(U,Z,K.dilations,K.pads,K.strides),J=r(Q.session.backend.glContext.version),{activationFunction:X,applyActivation:V}=f4(K),R=`
+  const ivec2 strides = ivec2(${K.strides[0]}, ${K.strides[1]});
+  const ivec2 pads = ivec2(${K.pads[0]}, ${K.pads[1]});
+  ${X}
+  void main() {
+    ivec4 coords = getOutputCoords();
+    int batch = coords.x;
+    int output_channel = coords.y;
+    ivec2 xRCCorner = coords.zw * strides - pads;
+    int group_id = output_channel / ${q};
+
+    float value = 0.0;
+    for (int wInChannel = 0; wInChannel < ${Z[1]}; wInChannel++) {
+      int input_channel = group_id * ${Z[1]} + wInChannel;
+      for (int wHeight = 0; wHeight < ${Z[2]}; wHeight++) {
+        int xHeight = xRCCorner.x + wHeight * ${K.dilations[0]};
+
+        if (xHeight < 0 || xHeight >= ${U[2]}) {
+          continue;
+        }
+
+        for (int wWidth = 0; wWidth < ${Z[3]}; wWidth++) {
+          int xWidth = xRCCorner.y + wWidth * ${K.dilations[1]};
+          if (xWidth < 0 || xWidth >= ${U[3]}) {
+            continue;
+          }
+
+          float xVal = getX(batch, input_channel, xWidth, xHeight);
+          float wVal = getW(output_channel, wInChannel, wWidth, wHeight);
+          value += xVal*wVal;
+        }
+      }
+    }
+    ${W}
+    ${V}
+    ${J.output} = vec4(value, .0, .0, .0);
+  }
+`;return{...j,output:{dims:G,type:H[0].type,textureType:0},shaderSource:R,hasMain:!0}},e0=(Q,H,j)=>{let K=$8(H.length>2,j.cacheKey);return{...K,get:()=>L8(Q,H,K,j)}}}),v8,w8,QQ,Lj=E(()=>{W1(),t(),U4(),v8=(Q)=>({name:"Im2Col (packed)",inputNames:["A"],inputTypes:[2],cacheHint:Q}),w8=(Q,H,j,K,W,U)=>{let Z=j.dims,q=K.dims,G=2,J=3,X=W.length,V=[q[1]*q[2]*q[3],W[2]*W[3]],R=q[2]*q[3],z=c4(),Y=r(Q.session.backend.glContext.version),B="";for(let w=0;w<=1;w++)for(let A=0;A<=1;A++)B+=`
+            blockIndex = rc.x + ${A};
+            pos = rc.y + ${w};
+
+            if(blockIndex < ${V[1]} && pos < ${V[0]}) {
+              offsetY = int(blockIndex / (${W[X-1]})) * ${U.strides[0]} -
+                ${U.pads[0]};
+              d0 = offsetY + ${U.dilations[0]} * (imod(pos, ${R}) / ${q[2]});
+
+              if(d0 < ${Z[G]} && d0 >= 0) {
+                offsetX = imod(blockIndex, ${W[X-1]}) * ${U.strides[1]} -
+                  ${U.pads[1]};
+                d1 = offsetX + ${U.dilations[1]} * imod(imod(pos, ${R}), ${q[2]});
+
+                if(d1 < ${Z[J]} && d1 >= 0) {
+
+                  ch = int(float(pos)/ ${R}.);
+                    innerDims = vec2(d0, d1);
+                    result[${w*2+A}] = getChannel(
+                      getA(0, ch, int(innerDims.x),
+                      int(innerDims.y)), innerDims);
+                }
+              }
+            }
+
+          `;let k=`
+      ${z}
+
+      void main() {
+        ivec2 rc = getOutputCoords();
+          vec4 result = vec4(0.0);
+          int blockIndex, pos, offsetY, d0, offsetX, d1, ch;
+          vec2 innerDims;
+          ${B}
+          ${Y.output} = result;
+      }
+            `;return{...H,output:{dims:V,type:j.type,textureType:2},shaderSource:k,hasMain:!0}},QQ=(Q,H,j,K,W)=>{let U=v8(W.cacheKey);return{...U,get:()=>w8(Q,U,H,j,K,W)}}}),JQ,HQ,ZQ,T8,Z7=E(()=>{Q1(),t(),F3(),W4(),jQ(),JQ=(Q,H,j)=>(T8(H),Q.session.pack?[Q.run(j7(Q,H,j),H)]:[Q.run(v2(H,j),H)]),HQ=(Q)=>F5(Q.attributes),ZQ=(Q,H)=>({name:"MatMul",inputNames:Q?["A","B","Bias"]:["A","B"],inputTypes:Q?[0,0,0]:[0,0],cacheHint:H}),T8=(Q)=>{if(!Q||Q.length!==2)throw new Error("MatMul requires 2 inputs.");if(Q[0].dims[Q[0].dims.length-1]!==Q[1].dims[Q[1].dims.length-2])throw new Error("shared dimension does not match.");if(Q[0].type!=="float32"&&Q[0].type!=="float64"||Q[1].type!=="float32"&&Q[1].type!=="float64")throw new Error("inputs should be float type");if(Q[0].type!==Q[1].type)throw new Error("inputs types should match")}}),D8,_8,j7,jQ=E(()=>{Q1(),W1(),t(),F3(),W4(),Z7(),D8=(Q,H)=>({name:"MatMul (packed)",inputNames:Q?["A","B","Bias"]:["A","B"],inputTypes:Q?[2,2,2]:[2,2],cacheHint:H}),_8=(Q,H,j,K)=>{let W=j.length>2,U=W?"value += getBiasForMatmul();":"",Z=j[0].dims,q=j[1].dims,G=R3.calcShape(Z,q,!0),J=!u.areEqual(j[0].dims,j[1].dims);if(!G)throw new Error("Can't use matmul on the given tensors");let X=Z[Z.length-1],V=Math.ceil(X/2),R=Z.length,z=q.length,Y=r(Q.session.backend.glContext.version),B=P3(G.length),k=G.length,w=H4(),{activationFunction:A,applyActivation:D}=f4(K),I=W?`${w2(B,w,j[2].dims,G,!0)}`:"",h=J?`${MZ(B,w,j,G)}`:"",$1=J?"getAAtOutCoordsMatmul(i)":`getA(${YZ(w,R)})`,L1=J?"getBAtOutCoordsMatmul(i)":`getB(${CZ(w,z)})`,x1=J?"":`${B} rc =
+          getOutputCoords(); int lastDim = rc.${w[k-1]}; rc.${w[k-1]} =
+          rc.${w[k-2]}; rc.${w[k-2]} = lastDim;
+      `,G1=`
+            ${h}
+            ${I}
+            ${A}
+            void main() {
+              ${x1}
+
+              vec4 value = vec4(0);
+              for (int i = 0; i < ${V}; i++) {
+                vec4 a = ${$1};
+                vec4 b = ${L1};
+
+                value += (a.rrbb * b.rgrg);
+                value += (a.ggaa * b.baba);
+              }
+              ${U}
+              ${D}
+              ${Y.output} = value;
+            }`;return{...H,output:{dims:G,type:j[0].type,textureType:2},shaderSource:G1,hasMain:!0}},j7=(Q,H,j)=>{let K=D8(H.length>2,j.activationCacheKey);return{...K,get:()=>_8(Q,K,H,j)}}}),VQ,vj=E(()=>{V7(),Lj(),jQ(),VQ=(Q,H,j)=>{let K=H[0].dims,W=H[1].dims,U=y4(K,W,j.dilations,j.pads,j.strides),Z=Q.run(QQ(Q,H[0],H[1],U,j),[H[0]]),q=Q.reshapePacked(H[1],[W[0],W[1]*W[2]*W[3]]),G=H.length===3?[q,Z,H[2]]:[q,Z],J=Q.run(j7(Q,G,j),G);return Q.reshapePacked(J,U)}}),P8,E8,XQ,E6,KQ=E(()=>{t(),P8=(Q)=>({name:"Im2Col",inputNames:["X"],inputTypes:[0],cacheHint:Q}),E8=(Q,H,j,K,W,U)=>{let Z=j.dims,q=K.dims,G=W.length,J=E6(Z,q,W,4),X=`
+        const int XC = ${Z[1]};
+        const int XH = ${Z[2]};
+        const int XW = ${Z[3]};
+        const int KH = ${U.kernelShape[0]};
+        const int KW = ${U.kernelShape[1]};
+        const int dilationH = ${U.dilations[0]};
+        const int dilationW = ${U.dilations[1]};
+        const int strideH = ${U.strides[0]};
+        const int strideW = ${U.strides[1]};
+        const int padH = ${U.pads[0]};
+        const int padW = ${U.pads[1]};
+        const int KHKW = KH*KW;
+        const int XCKHKW = XC * KHKW;
+        const int outputChannels = 4;
+        vec4 process(int indices[${G}]) {
+          int b  = indices[0]; // batch size
+          int oh = indices[1] * strideH - padH; //output height
+          int ow = indices[2] * strideW - padW; //output width
+          int p = indices[3] * outputChannels; //patch
+          vec4 value = vec4(0.0);
+          for(int i=0; i < outputChannels; ++i) {
+            if(p < XCKHKW) {
+              int patchC = p / KHKW;
+              int patchH = (p - patchC*KHKW) / KW;
+              int patchW = (p - patchC*KHKW) - patchH * KW;
+              int xh2 = oh + patchH * dilationH;
+              int xw2 = ow + patchW * dilationW;
+              int x[${Z.length}];
+              x[0] = b;
+              x[1] = patchC;
+              x[2] = xh2;
+              x[3] = xw2;
+              if(xh2 >= 0 &&
+                  xh2 < XH &&
+                  xw2 >= 0 &&
+                  xw2 < XW) {
+                value[i] = _X(x);
+              }
+            }
+            ++p;
+          }
+          return value;
+        }
+        `;return{...H,output:{dims:J,type:j.type,textureType:4},shaderSource:X}},XQ=(Q,H,j,K,W)=>{let U=P8(W.cacheKey);return{...U,get:()=>E8(Q,U,H,j,K,W)}},E6=(Q,H,j,K=4)=>[j[0],j[2],j[3],Math.ceil(Q[1]*H[2]*H[3]/K)]}),I8,x8,UQ,wj=E(()=>{Q1(),W1(),t(),W4(),KQ(),I8=(Q,H)=>({name:"ConvDotProduct",inputNames:Q?["Im2Col","K","B"]:["Im2Col","K"],inputTypes:Q?[0,4,0]:[0,4],cacheKey:H.activationCacheKey}),x8=(Q,H,j,K,W)=>{let U=j[0].dims,Z=j[1].dims,q=[Z[0],Math.ceil(U[1]*Z[2]*Z[3]/4)],G=E6(U,Z,K),[J,X]=Q.calculateTextureWidthAndHeight(q,4),V=u.computeStrides(G),[R,z]=Q.calculateTextureWidthAndHeight(G,4),Y=K.length,B=j.length<3?"0.0":"_B(b)",k=Math.ceil(U[1]*Z[2]*Z[3]/4),{activationFunction:w,applyActivation:A}=f4(W),D=r(Q.session.backend.glContext.version),I=`
+${w}
+float process(int indices[${Y}]) {
+  int b[1];
+  b[0] = indices[1];
+  int im2col[4];
+  im2col[0] = indices[0];
+  im2col[1] = indices[2];
+  im2col[2] = indices[3];
+  int im2colOffset = im2col[0] * ${V[0]} + im2col[1] * ${V[1]} + im2col[2] * ${V[2]};
+  int kernelOffset = indices[1] * ${q[1]};
+  float value = ${B};
+  for (int i = 0; i < ${k}; ++i) {
+    vec2 im2colCoords = offsetToCoords(im2colOffset, ${R}, ${z});
+    vec2 kernelCoords = offsetToCoords(kernelOffset, ${J}, ${X});
+    value += dot(${D.texture2D}(Im2Col, im2colCoords), ${D.texture2D}(K, kernelCoords));
+    ++im2colOffset;
+    ++kernelOffset;
+  }
+  ${A}
+  return value;
+}`;return{...H,output:{dims:K,type:j[0].type,textureType:0},shaderSource:I}},UQ=(Q,H,j,K)=>{let W=I8(H.length>2,K);return{...W,get:()=>x8(Q,W,H,j,K)}}}),y4,I6,O8,g8,y8,d8,x6,p8,V7=E(()=>{_1(),Q1(),$j(),vj(),wj(),W4(),KQ(),Z7(),y4=(Q,H,j,K,W)=>{let U=Q[0],Z=Q.slice(2),q=Z.length,G=H[0],J=H.slice(2).map((V,R)=>V+(V-1)*(j[R]-1)),X=Z.map((V,R)=>V+K[R]+K[R+q]).map((V,R)=>Math.floor((V-J[R]+W[R])/W[R]));return[U,G].concat(...X)},I6=(Q,H,j)=>(p8(H,j),O8(Q,H,j)),O8=(Q,H,j)=>{let K=d8(j,H),W=Q.session.pack,U=K.kernelShape[0]===1&&K.kernelShape[1]===1;return K.group>1?[Q.run(e0(Q,H,K),H)]:U&&W?[g8(Q,H,K)]:W&&H[0].dims.length===4&&H[0].dims[0]===1&&!U?[VQ(Q,H,K)]:[y8(Q,H,K)]},g8=(Q,H,j)=>{let K=H[0].dims,W=H[1].dims,U=y4(K,W,j.dilations,j.pads,j.strides),Z=Q.reshapeUnpacked(H[0],[K[1],K[2]*K[3]]),q=Q.reshapeUnpacked(H[1],[W[0],W[1]]),G=H.length>2?[q,Z,H[2]]:[q,Z],J=Q.run(v2(G,j),G);return Q.reshapeUnpacked(J,U)},y8=(Q,H,j)=>{let K=H[0].dims,W=H[1].dims,U=y4(K,W,j.dilations,j.pads,j.strides),Z=Q.run(XQ(Q,H[0],H[1],U,j),[H[0]]),q=H.length===3?[Z,H[1],H[2]]:[Z,H[1]];return Q.run(UQ(Q,H,U,j),q)},d8=(Q,H)=>{let j=Q.kernelShape.slice();if(Q.kernelShape.length===0)for(let U=2;U<H[1].dims.length;++U)j.push(H[1].dims[U]);let K=Q.pads.slice();R5.adjustPadsBasedOnAutoPad(H[0].dims,Q.strides,Q.dilations,j,K,Q.autoPad);let W=Object.assign({},Q);return Object.assign(W,{kernelShape:j,pads:K,cacheKey:Q.cacheKey}),W},x6=(Q)=>{let H=Q.attributes,j=F5(H),K=H.getString("auto_pad","NOTSET"),W=H.getInts("dilations",[1,1]),U=H.getInt("group",1),Z=H.getInts("kernel_shape",[]),q=H.getInts("pads",[0,0,0,0]),G=H.getInts("strides",[1,1]);return K1({autoPad:K,dilations:W,group:U,kernelShape:Z,pads:q,strides:G,...j})},p8=(Q,H)=>{if(!Q||Q.length!==2&&Q.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(Q[0].dims.length!==4||Q[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let j=Q[0].dims[1],K=Q[1].dims[1]*H.group;if(j!==K)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(Q.length===3&&(Q[2].dims.length!==1||Q[1].dims[0]!==Q[2].dims[0]))throw new Error("invalid bias");let W=Q[0].dims.length-2;if(H.dilations.length!==W)throw new Error(`dilations should be ${W}D`);if(H.strides.length!==W)throw new Error(`strides should be ${W}D`);if(H.pads.length!==W*2)throw new Error(`pads should be ${W*2}D`);if(H.kernelShape.length!==0&&H.kernelShape.length!==Q[1].dims.length-2)throw new Error("invalid kernel shape");if(Q[0].type!=="float32"||Q[1].type!=="float32")throw new Error("Conv input(X,W) should be float tensor");if(Q.length===3&&Q[2].type!=="float32")throw new Error("Conv input(bias) should be float tensor")}}),h8,b8,m8,qQ,c8,f8,l8,u8,s8,i8,WQ,o8,Tj=E(()=>{_1(),W1(),t(),W4(),h8=(Q,H,j,K,W,U)=>(Q-1)*H+j+(K-1)*W+1-U,b8=(Q,H,j,K,W)=>{let U=Math.floor(Q/2);H==="SAME_UPPER"?(j[K]=U,j[W]=Q-U):H==="SAME_LOWER"&&(j[K]=Q-U,j[W]=U)},m8=(Q,H,j,K,W,U,Z,q)=>{let G=Q.length-2,J=q.length===0;for(let X=0;X<G;++X){let V=J?Q[X+2]*U[X]:q[X],R=h8(Q[X+2],U[X],W[X],H[X],j[X],V);b8(R,K,W,X,X+G),J&&q.push(U[X]*(Q[X+2]-1)+Z[X]+(H[X]-1)*j[X]+1-W[X]-W[X+G])}},qQ=(Q,H,j)=>(o8(H,j),c8(Q,H,j)),c8=(Q,H,j)=>{let K=i8(j,H);return[s8(Q,H,K)]},f8=(Q,H)=>({name:"ConvTranspose",inputNames:Q?["X","W","B"]:["X","W"],inputTypes:Q?[0,0,0]:[0,0],cacheHint:H}),l8=(Q,H,j,K)=>{let W=H.length>2?"getB(output_channel)":"0.0",U=H[0].dims,Z=H[1].dims,q=Z[1],G=Z[0]/K.group,J=[H[0].dims[0],H[1].dims[1]*K.group,...K.outputShape],X=r(Q.session.backend.glContext.version),{activationFunction:V,applyActivation:R}=f4(K),z=`
+  const ivec2 strides = ivec2(${K.strides[0]}, ${K.strides[1]});
+  const ivec2 pads = ivec2(${K.pads[0]}, ${K.pads[1]});
+  ${V}
+  void main() {
+    ivec4 coords = getOutputCoords();
+    int batch = coords.x;
+    int output_channel = coords.y;
+
+    ivec2 loc = coords.zw + pads;
+
+    int group_id = output_channel / ${q};
+    int wOutChannel = output_channel - group_id * ${q};
+
+    float value = ${W};
+    for (int inChannelOffset = 0; inChannelOffset < ${G}; inChannelOffset++) {
+      int input_channel = group_id * ${G} + inChannelOffset;
+      for (int wWOff = 0; wWOff < ${Z[2]}; wWOff++) {
+        for (int wHOff = 0; wHOff < ${Z[3]}; wHOff++) {
+          ivec2 wOff = ivec2(wWOff * ${K.dilations[0]}, wHOff * ${K.dilations[1]});
+          ivec2 wLoc = loc - wOff;
+          ivec2 wLocIn = wLoc / strides;
+          if (
+            wLocIn * strides == wLoc &&
+            wLocIn.x >= 0 && wLocIn.x < ${U[2]} &&
+            wLocIn.y >= 0 && wLocIn.y < ${U[3]}
+          ) {
+            float xVal = getX(batch, input_channel, wLocIn.y, wLocIn.x);
+            float wVal = getW(input_channel, wOutChannel, wHOff, wWOff);
+            value += xVal * wVal;
+          }
+        }
+      }
+    }
+    ${R}
+    ${X.output} = vec4(value, .0, .0, .0);
+  }
+`;return{...j,output:{dims:J,type:H[0].type,textureType:0},shaderSource:z,hasMain:!0}},u8=(Q,H,j)=>{let K=f8(H.length>2,j.cacheKey);return{...K,get:()=>l8(Q,H,K,j)}},s8=(Q,H,j)=>Q.run(u8(Q,H,j),H),i8=(Q,H)=>{let j=Q.kernelShape.slice();if(Q.kernelShape.length===0)for(let q=2;q<H[1].dims.length;++q)j.push(H[1].dims[q]);let K=Q.pads.slice(),W=Q.outputShape.slice(),U=H[0].dims;m8(U,j,Q.dilations,Q.autoPad,K,Q.strides,Q.outputPadding,W);let Z=Object.assign({},Q);return Object.assign(Z,{kernelShape:j,pads:K,outputShape:W,cacheKey:Q.cacheKey}),Z},WQ=(Q)=>{let H=Q.attributes,j=F5(H),K=H.getString("auto_pad","NOTSET"),W=H.getInts("dilations",[1,1]),U=H.getInt("group",1),Z=H.getInts("kernel_shape",[]),q=H.getInts("output_padding",[0,0]),G=H.getInts("output_shape",[]),J=H.getInts("pads",[0,0,0,0]),X=H.getInts("strides",[1,1]);return K1({autoPad:K,dilations:W,group:U,kernelShape:Z,outputPadding:q,outputShape:G,pads:J,strides:X,...j})},o8=(Q,H)=>{if(!Q||Q.length!==2&&Q.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(Q[0].dims.length!==4||Q[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let j=Q[0].dims[1],K=Q[1].dims[0];if(j!==K)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let W=Q[1].dims[1]*H.group;if(Q.length===3&&(Q[2].dims.length!==1||Q[2].dims[0]!==W))throw new Error("invalid bias");let U=Q[0].dims.length-2;if(H.dilations.length!==U)throw new Error(`dilations should be ${U}D`);if(H.strides.length!==U)throw new Error(`strides should be ${U}D`);if(H.pads.length!==U*2)throw new Error(`pads should be ${U*2}D`);if(H.outputPadding.length!==U)throw new Error(`output_padding should be ${U}D`);if(H.kernelShape.length!==0&&H.kernelShape.length!==Q[1].dims.length-2)throw new Error("invalid kernel shape");if(H.outputShape.length!==0&&H.outputShape.length!==Q[0].dims.length-2)throw new Error("invalid output shape");if(Q[0].type!=="float32"||Q[1].type!=="float32")throw new Error("ConvTranspose input(X,W) should be float tensor");if(Q.length===3&&Q[2].type!=="float32")throw new Error("ConvTranspose input(bias) should be float tensor")}}),l5,m4,GQ,a8,u5,n8,r8,t8,X7=E(()=>{_1(),Q1(),t(),l5={name:"Transpose",inputNames:["A"],inputTypes:[0]},m4=(Q,H,j)=>(t8(H),[Q.run({...l5,cacheHint:j.cacheKey,get:()=>a8(Q,H[0],j.perm)},H)]),GQ=(Q)=>K1({perm:Q.attributes.getInts("perm",[])}),a8=(Q,H,j)=>{let K=H.dims;j=u5(K,j);let W=n8(K,j),U=K.length,Z=`
+      ${r8("perm",j,U)}
+      float process(int indices[${U}]) {
+        int a[${U}];
+        perm(a, indices);
+        return _A(a);
+      }`;return{...l5,output:{dims:W,type:H.type,textureType:0},shaderSource:Z}},u5=(Q,H)=>(H&&H.length!==Q.length&&(H=[...Q.keys()].reverse()),H),n8=(Q,H)=>(H=u5(Q,H),u.sortBasedOnPerm(Q,H)),r8=(Q,H,j)=>{let K=[];K.push(`void ${Q}(out int a[${j}], int src[${j}]) {`);for(let W=0;W<j;++W)K.push(`	a[${H[W]}]=src[${W}];`);return K.push("	}"),K.join(`
+`)},t8=(Q)=>{if(!Q||Q.length!==1)throw new Error("Transpose requires 1 input.");if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("input should be float tensor")}}),RQ,zQ,e8,Dj=E(()=>{X7(),RQ=(Q,H,j)=>{e8(H);let K=j.blocksize,W=K*K,U=j.mode==="DCR"?[0,3,4,1,5,2]:[0,1,4,2,5,3],Z=j.mode==="DCR"?[H[0].dims[0],K,K,H[0].dims[1]/W,H[0].dims[2],H[0].dims[3]]:[H[0].dims[0],H[0].dims[1]/W,K,K,H[0].dims[2],H[0].dims[3]],q=Q.reshapeUnpacked(H[0],Z),G={perm:U,cacheKey:`${U}`},[J]=m4(Q,[q],G),X=[H[0].dims[0],H[0].dims[1]/W,H[0].dims[2]*K,H[0].dims[3]*K];return[Q.reshapeUnpacked(J,X)]},zQ=(Q)=>{let H=Q.attributes.getInt("blocksize");if(H<1)throw new Error(`blocksize must be >= 1, but got : ${H} for DepthToSpace`);let j=Q.attributes.getString("mode","DCR");if(j!=="DCR"&&j!=="CRD")throw new Error(`unrecognized mode: ${j} for DepthToSpace`);return{mode:j,blocksize:H}},e8=(Q)=>{if(Q.length!==1)throw new Error(`DepthToSpace expect 1 inputs, but got ${Q.length}`);if(Q[0].type==="string"||Q[0].dims.length!==4)throw new TypeError("DepthToSpace input should be a 4-D numeric tensor")}}),NQ,MQ,Q9,_j=E(()=>{Q1(),NQ=(Q,H,j)=>{Q9(H,j);let K=u.flattenShape(H[0].dims,j);return[Q.reshapeUnpacked(H[0],K)]},MQ=(Q)=>Q.attributes.getInt("axis",1),Q9=(Q,H)=>{if(!Q||Q.length!==1)throw new Error("Flatten requires 1 input.");let j=Q[0].dims.length;if(j===0)throw new Error("scalar tensor is not supported.");if(H<-j||H>j)throw new Error("Invalid axis");if(Q[0].type==="string")throw new Error("string tensor is not supported.")}}),u4,k5=E(()=>{u4=["float32","float64","int32","int16","int8","uint16","uint32","uint8"]}),YQ,CQ,J9,H9,Z9,j9,Pj=E(()=>{_1(),k5(),Q1(),t(),YQ=(Q,H,j)=>(j9(H,j.axis),[Q.run(Z9(Q,H,j),H)]),CQ=(Q)=>K1({axis:Q.attributes.getInt("axis",0)}),J9={name:"Gather",inputNames:["A","B"],inputTypes:[0,0]},H9=(Q,H,j,K)=>{let W=j[0].dims.slice(),U=j[1].dims.slice(),Z=new Array(W.length+U.length-1);K=u.normalizeAxis(K,W.length);let q=[];for(let R=0;R<Z.length;R++)R<K?(Z[R]=W[R],q.push(`inputIdx[${R}] = outputIdx[${R}];`)):R<K+U.length?(Z[R]=U[R-K],q.push(`indexDataIdx[${R-K}] = outputIdx[${R}];`)):(Z[R]=W[R-U.length+1],q.push(`inputIdx[${R-U.length+1}] = outputIdx[${R}];`));let G=Z.length||1,J=W.length,X=U.length||1,V=`
+      float process(int outputIdx[${G}]) {
+        int inputIdx[${J}];
+        int indexDataIdx[${X}];
+        indexDataIdx[0] = 0;
+        ${q.join(`
+        `)}
+        int idx = int(_B(indexDataIdx));
+        inputIdx[${K}] = idx < 0 ? idx + ${W[K]} : idx;
+        return _A(inputIdx);
+      }`;return{...H,output:{dims:Z,type:j[0].type,textureType:0},shaderSource:V}},Z9=(Q,H,j)=>{let K={...J9,cacheHint:j.cacheKey};return{...K,get:()=>H9(Q,K,H,j.axis)}},j9=(Q,H)=>{if(!Q||Q.length!==2)throw new Error("Gather requires 2 inputs.");let j=Q[0].dims.length;if(j<1)throw new Error("Invalid input shape.");if(H<-j||H>j-1)throw new Error("Invalid axis.");if(u4.indexOf(Q[0].type)===-1)throw new Error("Invaid input type.");if(Q[1].type!=="int32"&&Q[1].type!=="int16")throw new Error("Invaid input type.")}}),O6,s5,BQ,FQ,V9,X9,K9,Ej=E(()=>{_1(),Q1(),t(),O6=(Q,H,j)=>(K9(H,j),[Q.run(V9(H,j),H)]),s5=(Q,H)=>{let j=Q.attributes.getInt("transA",0)!==0,K=Q.attributes.getInt("transB",0)!==0,W=Q.attributes.getFloat("alpha",1),U=Q.attributes.getFloat("beta",1);return K1({transA:j,transB:K,alpha:W,beta:U,isOptionalC:H})},BQ=(Q)=>s5(Q,!1),FQ=(Q)=>s5(Q,!0),V9=(Q,H)=>{let j={name:"Gemm",inputNames:Q.length===3?["A","B","C"]:["A","B"],inputTypes:Q.length===3?[0,0,0]:[0,0],key:H.cacheKey};return{...j,get:()=>X9(j,Q,H)}},X9=(Q,H,j)=>{let K=H[0].dims.slice(),W=H[1].dims.slice(),[U,Z]=t2.getShapeOfGemmResult(K,j.transA,W,j.transB,H.length===3?H[2].dims:void 0),q=[U,Z];if(!q)throw new Error("Can't use gemm on the given tensors");let G=K[K.length-1],J="";j.transA&&(G=K[0]),j.transA&&j.transB?J="value += _A_T(a) * _B_T(b);":j.transA&&!j.transB?J="value += _A_T(a) * _B(b);":!j.transA&&j.transB?J="value += _A(a) * _B_T(b);":!j.transA&&!j.transB&&(J="value += _A(a) * _B(b);");let X=q.length,V=H.length===3?`int c[${H[2].dims.length}];`:"",R=H.length===3?"bcastIndices_C(indices, c);":"",z=H.length===3?"value += beta * _C(c);":"",Y=`
+      float process(int indices[${X}]) {
+          int a[${X}];
+          int b[${X}];
+          ${V}
+
+          copyVec(indices, a);
+          copyVec(indices, b);
+          ${R}
+
+          float value = 0.0;
+          for (int k=0; k<${G}; ++k) {
+              a[${X-1}] = k;
+              b[${X-2}] = k;
+              ${J}
+          }
+
+          value = value * alpha;
+          ${z}
+          return value;
+      }`;return{...Q,output:{dims:q,type:H[0].type,textureType:0},variables:[{name:"alpha",type:"float",data:j.alpha},{name:"beta",type:"float",data:j.beta}],shaderSource:Y}},K9=(Q,H)=>{if(!Q)throw new Error("Input is missing");if(H.isOptionalC&&(Q.length<2||Q.length>3))throw new Error("Invaid input shape.");if(!H.isOptionalC&&Q.length!==3)throw new Error("Gemm requires 3 inputs");if(Q.length===3&&Q[2].dims.length!==1&&Q[2].dims.length!==2)throw new Error("Invalid input shape of C");if(Q[0].type!=="float32"&&Q[0].type!=="float64"||Q[1].type!=="float32"&&Q[1].type!=="float64"||Q.length===3&&Q[2].type!=="float32"&&Q[2].type!=="float64")throw new Error("Invalid input type.");if(Q[0].type!==Q[1].type||Q.length===3&&Q[0].type!==Q[2].type)throw new Error("Input types are mismatched")}}),kQ,AQ,U9,q9,W9,G9,R9,Ij=E(()=>{_1(),t(),kQ=(Q,H,j)=>(R9(H),[Q.run(W9(Q,H,j),H)]),AQ=(Q)=>{let H=Q.attributes.getFloat("scale"),j=Q.attributes.getFloats("bias");return K1({scale:H,bias:j})},U9={name:"ImageScaler",inputNames:["X"],inputTypes:[0]},q9=(Q,H,j,K)=>{let W=j[0].dims.slice(),U=W.length,Z=`
+      ${G9(K.bias.length)}
+      float process(int indices[${U}]) {
+        return _X(indices) * scale + getBias(bias, indices[1]);
+      }`;return{...H,output:{dims:W,type:j[0].type,textureType:0},variables:[{name:"bias",type:"float",arrayLength:K.bias.length,data:K.bias},{name:"scale",type:"float",data:K.scale}],shaderSource:Z}},W9=(Q,H,j)=>{let K={...U9,cacheHint:j.cacheKey};return{...K,get:()=>q9(Q,K,H,j)}},G9=(Q)=>{let H=[`float getBias(float bias[${Q}], int channel) {`];for(let j=0;j<Q;++j)j===0?H.push(`	if (channel == ${j}) { return bias[${j}]; }`):j===Q-1?H.push(`	else { return bias[${j}]; }`):H.push(`	else if (channel == ${j}) { return bias[${j}]; }`);return H.push("	}"),H.join(`
+`)},R9=(Q)=>{if(!Q||Q.length!==1)throw new Error("ImageScaler requires 1 input.");if(Q[0].dims.length!==4)throw new Error("Invalid input shape.");if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("Invalid input type.")}}),SQ,$Q,i5,z9,N9,M9,Y9,C9,B9,xj=E(()=>{W1(),t(),SQ=(Q,H,j)=>{B9(H);let K=Q.run(N9(H[0]),H);return[Q.run(C9(Q,H[0],j,K.dims),[H[0],K,H[1],H[2]])]},$Q=(Q)=>Q.attributes.getFloat("epsilon",0.00001),i5={name:"InstanceNormalization_MeanAndVariance",inputNames:["X"],inputTypes:[0]},z9=(Q,H)=>{let j=H.dims.slice(),K=j[1],W=j[2]*j[3],U=[j[0],K],Z=`
+      vec4 process(int[2] indices) {
+        vec4 v = vec4(0.0);
+        int a[4];
+        a[0] = indices[0];
+        a[1] = indices[1];
+        float temp = 0.0;
+        for(int a2=0; a2<${j[2]}; a2++) {
+          a[2] = a2;
+          for(int a3=0; a3<${j[3]}; a3++) {
+            a[3] = a3;
+            float x = _X(a);
+            temp += x;
+          }
+        }
+        float mean = temp / float(${W});
+        temp = 0.0;
+        for(int a2=0; a2<${j[2]}; a2++) {
+          a[2] = a2;
+          for(int a3=0; a3<${j[3]}; a3++) {
+            a[3] = a3;
+            float x = _X(a);
+            temp += (x - mean) * (x - mean);
+          }
+        }
+        v.r = mean;
+        v.g = temp / float(${W});
+
+        return v;
+      }`;return{...Q,output:{dims:U,type:H.type,textureType:4},shaderSource:Z}},N9=(Q)=>({...i5,get:()=>z9(i5,Q)}),M9={name:"InstanceNormalization_ComputeOutput",inputNames:["X","MeanAndVariance","Scale","B"],inputTypes:[0,4,0,0]},Y9=(Q,H,j,K,W)=>{let U=r(Q.session.backend.glContext.version),[Z,q]=Q.calculateTextureWidthAndHeight(W,4),[G,J]=[Z/4,q],X=`
+      vec4 get_MeanAndVariance(int[2] mv) {
+        int offset = indicesToOffset_MeanAndVariance(mv);
+        vec2 coords = offsetToCoords(offset, ${G}, ${J});
+        return ${U.texture2D}(MeanAndVariance, coords);
+      }
+
+      float process(int[4] indices) {
+        int mv[2];
+        mv[0] = indices[0];
+        mv[1] = indices[1];
+        vec4 mean_and_variance = get_MeanAndVariance(mv);
+        float mean = mean_and_variance.r;
+        float variance = mean_and_variance.g;
+
+        int sb[1];
+        sb[0] = indices[1];
+        float scale = _Scale(sb);
+        float b = _B(sb);
+
+        return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b;
+      }`;return{...H,output:{dims:j.dims,type:j.type,textureType:0},variables:[{name:"epsilon",type:"float",data:K}],shaderSource:X}},C9=(Q,H,j,K)=>{let W={...M9,cacheHint:`${j}`};return{...W,get:()=>Y9(Q,W,H,j,K)}},B9=(Q)=>{if(!Q||Q.length!==3)throw new Error("InstanceNormalization requires 3 inputs.");let H=Q[0],j=Q[1],K=Q[2];if(H.dims.length<3||j.dims.length!==1||K.dims.length!==1)throw new Error("Invalid input shape.");if(j.dims[0]!==H.dims[1]||K.dims[0]!==H.dims[1])throw new Error("Input shapes are mismatched.");if(H.type!=="float32"&&H.type!=="float64"||j.type!=="float32"&&j.type!=="float64"||K.type!=="float32"&&K.type!=="float64")throw new Error("Invalid input type.");if(Q[0].dims.length!==4)throw new Error("Only support 4-D input shape.")}}),LQ,vQ,K7,F9,Oj=E(()=>{_1(),t(),LQ=(Q,H,j)=>(F9(H),[Q.run(FZ(H,j),H)]),vQ=(Q)=>{let H=Q.attributes.getFloat("alpha",0.0001),j=Q.attributes.getFloat("beta",0.75),K=Q.attributes.getFloat("bias",1),W=Q.attributes.getInt("size");return K1({alpha:H,beta:j,bias:K,size:W})},K7={name:"LRN",inputNames:["X"],inputTypes:[0]},F9=(Q)=>{if(!Q||Q.length!==1)throw new Error("LRN requires 1 input.");if(Q[0].dims.length!==4)throw new Error('currently only support LRN for input with "NCHW" format');if(Q[0].type!=="float32")throw new Error("input should be float type")}}),k9,g6,wQ,TQ,DQ,A9,S9,$9,L9,v9,w9,T9,D9,gj=E(()=>{_1(),Q1(),W1(),t(),k9={name:"Pad",inputNames:["A"],inputTypes:[0]},g6=(Q,H,j)=>($9(H),[Q.run({...k9,cacheHint:j.cacheKey,get:()=>S9(Q,H[0],j)},H)]),wQ=(Q)=>{let H=Q.attributes.getString("mode","constant"),j=Q.attributes.getFloat("value",0),K=Q.attributes.getInts("pads");return K1({mode:H,value:j,pads:K})},TQ=(Q,H,j)=>{L9(H);let K=A9(Q,H,j);return g6(Q,[H[0]],K)},DQ=(Q)=>Q.attributes.getString("mode","constant"),A9=(Q,H,j)=>{if(!Q.session.isInitializer(H[1].dataId)||H.length>=3&&!Q.session.isInitializer(H[2].dataId))throw new Error("dynamic pad attributes are not allowed");let K=Array.from(H[1].integerData),W=H.length>=3?H[2].floatData[0]:0;return K1({mode:j,pads:K,value:W})},S9=(Q,H,j)=>{let K=u.padShape(H.dims.slice(),j.pads),W=K.length,U=`
+      ${v9(Q,H,j)}
+      float process(int[${W}] indices) {
+          return padA(indices);
+      }`;return{name:"Pad",inputNames:["A"],inputTypes:[0],output:{dims:K,type:H.type,textureType:0},shaderSource:U}},$9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Pad requires 1 input");if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("Invalid input type.")},L9=(Q)=>{if(!Q||Q.length!==2&&Q.length!==3)throw new Error("Pad requires 2 or 3 inputs");if(Q[1].type!=="int32")throw new Error("Invalid input type.");if(Q.length>=3&&Q[2].type==="string")throw new Error("Invalid input type.")},v9=(Q,H,j)=>{let K=r(Q.session.backend.glContext.version),[W,U]=Q.calculateTextureWidthAndHeight(H.dims,0),Z=u.computeStrides(H.dims);switch(j.mode){case"constant":return w9(K,H.dims,Z,W,U,j.pads,j.value);case"reflect":return T9(K,H.dims,Z,W,U,j.pads);case"edge":return D9(K,H.dims,Z,W,U,j.pads);default:throw new Error("Invalid mode")}},w9=(Q,H,j,K,W,U,Z)=>{let q=H.length,G="";for(let J=q-1;J>=0;--J)G+=`
+        k = m[${J}] - ${U[J]};
+        if (k < 0)  return constant;
+        if (k >= ${H[J]}) return constant;
+        offset += k * ${j[J]};
+        `;return`
+      float padA(int m[${q}]) {
+        const float constant = float(${Z});
+        int offset = 0;
+        int k = 0;
+        ${G}
+        vec2 coords = offsetToCoords(offset, ${K}, ${W});
+        float value = getColorAsFloat(${Q.texture2D}(A, coords));
+        return value;
+      }
+      `},T9=(Q,H,j,K,W,U)=>{let Z=H.length,q="";for(let G=Z-1;G>=0;--G)q+=`
+        k = m[${G}] - ${U[G]};
+        if (k < 0) { k = -k; }
+        {
+          const int _2n_1 = ${2*(H[G]-1)};
+          k = int( mod( float(k), float(_2n_1) ) ) ;
+          if(k >= ${H[G]}) { k = _2n_1 - k; }
+        }
+        offset += k * ${j[G]};
+        `;return`
+      float padA(int m[${Z}]) {
+        int offset = 0;
+        int k = 0;
+        ${q}
+        vec2 coords = offsetToCoords(offset, ${K}, ${W});
+        float value = getColorAsFloat(${Q.texture2D}(A, coords));
+        return value;
+      }
+      `},D9=(Q,H,j,K,W,U)=>{let Z=H.length,q="";for(let G=Z-1;G>=0;--G)q+=`
+        k = m[${G}] - ${U[G]};
+        if (k < 0)  k = 0;
+        if (k >= ${H[G]}) k = ${H[G]-1};
+        offset += k * ${j[G]};
+      `;return`
+      float padA(int m[${Z}]) {
+        int offset = 0;
+        int k = 0;
+        ${q}
+        vec2 coords = offsetToCoords(offset, ${K}, ${W});
+        float value = getColorAsFloat(${Q.texture2D}(A, coords));
+        return value;
+      }
+      `}}),_Q,PQ,o5,EQ,IQ,xQ,OQ,a5,n5,_9,r5,gQ,L4,t5,v4,P9,yj=E(()=>{_1(),Q1(),t(),_Q=(Q,H,j)=>{L4(H);let K={name:"AveragePool",inputNames:["X"],inputTypes:[0],cacheHint:j.cacheKey};return[Q.run({...K,get:()=>o5(H,K,!1,j)},H)]},PQ=(Q)=>{let H=Q.attributes.getString("auto_pad","NOTSET"),j=Q.attributes.getInt("ceil_mode",0),K=Q.attributes.getInt("count_include_pad",0)!==0,W=Q.attributes.getInts("kernel_shape"),U=Q.attributes.getInts("strides",[]),Z=Q.attributes.getInts("pads",[]);if(j!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");return K1({autoPad:H,ceilMode:j,countIncludePad:K,kernelShape:W,strides:U,pads:Z})},o5=(Q,H,j,K)=>{let[W,U]=n5(Q,K,j),Z=u.size(W.kernelShape),q="value += _X(x);",G="";W.countIncludePad?G+=`value /= float(${Z});`:G+=`value /= float(${Z} - pad);`;let J=`
+        ${t5(Q[0].dims,W,q,G,"0.0")}
+      `;return{...H,output:{dims:U,type:Q[0].type,textureType:0},shaderSource:J}},EQ=(Q,H,j)=>{L4(H);let K={name:"GlobalAveragePool",inputNames:["X"],inputTypes:[0],cacheHint:`${j.countIncludePad}`};return[Q.run({...K,get:()=>o5(H,K,!0,j)},H)]},IQ=(Q)=>{let H=Q.attributes.getInt("count_include_pad",0)!==0;return K1({autoPad:"",ceilMode:0,countIncludePad:H,kernelShape:[],strides:[],pads:[]})},xQ=(Q,H,j)=>{L4(H);let K={name:"MaxPool",inputNames:["X"],inputTypes:[0],cacheHint:j.cacheKey};return[Q.run({...K,get:()=>a5(H,K,!1,j)},H)]},OQ=(Q)=>{let H=Q.attributes.getString("auto_pad","NOTSET"),j=Q.attributes.getInt("ceil_mode",0),K=Q.attributes.getInts("kernel_shape"),W=Q.attributes.getInts("strides",[]),U=Q.attributes.getInts("pads",[]),Z=Q.attributes.getInt("storage_order",0),q=Q.attributes.getInts("dilations",[]);if(Z!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(j!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");return K1({autoPad:H,ceilMode:j,countIncludePad:!1,kernelShape:K,strides:W,pads:U,storageOrder:Z,dilations:q})},a5=(Q,H,j,K)=>{let[W,U]=n5(Q,K,j),Z=`
+      value = max(_X(x), value);
+    `,q="",G=`
+      ${t5(Q[0].dims,W,Z,q,"-1e5")}
+    `;return{...H,output:{dims:U,type:Q[0].type,textureType:0},shaderSource:G}},n5=(Q,H,j)=>{let K=Q[0].dims.slice(),W=Object.hasOwnProperty.call(H,"dilations"),U=H.kernelShape.slice(),Z=H.strides.slice(),q=W?H.dilations.slice():[],G=H.pads.slice();R5.adjustPoolAttributes(j,K,U,Z,q,G);let J=R5.computePoolOutputShape(j,K,Z,q,U,G,H.autoPad),X=Object.assign({},H);return W?Object.assign(X,{kernelShape:U,strides:Z,pads:G,dilations:q,cacheKey:H.cacheKey}):Object.assign(X,{kernelShape:U,strides:Z,pads:G,cacheKey:H.cacheKey}),[X,J]},_9={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[],cacheKey:""},r5={name:"GlobalMaxPool",inputNames:["X"],inputTypes:[0]},gQ=(Q,H)=>(L4(H),[Q.run({...r5,get:()=>a5(H,r5,!0,_9)},H)]),L4=(Q)=>{if(!Q||Q.length!==1)throw new Error("Pool ops requires 1 input.");if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("Invalid input type.")},t5=(Q,H,j,K,W)=>{let U=Q.length;if(H.kernelShape.length<=2){let Z=H.kernelShape[H.kernelShape.length-1],q=H.strides[H.strides.length-1],G=H.pads[H.pads.length/2-1],J=H.pads[H.pads.length-1],X=Q[U-1],V="",R="",z="";if(G+J!==0?V=`
+          for (int i = 0; i < ${Z}; i++) {
+            x[${U} - 1] = indices[${U} - 1] * ${q} - ${G} + i;
+            if (x[${U} - 1] < 0 || x[${U} - 1] >= ${X}) {
+              pad++;
+              continue;
+            }
+            ${j}
+          }`:V=`
+          for (int i = 0; i < ${Z}; i++) {
+            x[${U} - 1] = indices[${U} - 1] * ${q} - ${G} + i;
+            ${j}
+          }`,H.kernelShape.length===2){let Y=H.kernelShape[H.kernelShape.length-2],B=H.strides[H.strides.length-2],k=H.pads[H.pads.length/2-2],w=H.pads[H.pads.length-2],A=Q[U-2];k+w!==0?R=`
+            for (int j = 0; j < ${Y}; j++) {
+              x[${U} - 2] = indices[${U} - 2] * ${B} - ${k} + j;
+              if (x[${U} - 2] < 0 || x[${U} - 2] >= ${A}) {
+                pad+= ${Z};
+                continue;
+              }
+          `:R=`
+            for (int j = 0; j < ${Y}; j++) {
+              x[${U} - 2] = indices[${U} - 2] * ${B} - ${k} + j;
+            `,z=`
+          }
+        `}return`
+        float process(int indices[${U}]) {
+          int x[${U}];
+          copyVec(indices, x);
+
+          float value = ${W};
+          int pad = 0;
+          ${R}
+          ${V}
+          ${z}
+          ${K}
+          return value;
+        }
+      `}else{let Z=u.size(H.kernelShape),q=u.computeStrides(H.kernelShape),G=q.length,J=H.pads.length,X=P9(G),V=v4(Q,"inputDims"),R=v4(H.pads,"pads"),z=v4(q,"kernelStrides"),Y=v4(H.strides,"strides"),B=H.pads.reduce((w,A)=>w+A),k="";return B?k=`
+            if (x[j] >= inputDims[j] || x[j] < 0) {
+              pad++;
+              isPad = true;
+              break;
+            }
+          }
+          if (!isPad) {
+            ${j}
+          }`:k=`
+          }
+          ${j}
+        `,`
+        ${X}
+        float process(int indices[${U}]) {
+          int x[${U}];
+          copyVec(indices, x);
+          int offset[${G}];
+          int pads[${J}];
+          int inputDims[${U}];
+          int kernelStrides[${G}];
+          int strides[${G}];
+          ${R}
+          ${V}
+          ${Y}
+          ${z}
+
+          float value = ${W};
+          int pad = 0;
+          bool isPad = false;
+          for (int i = 0; i < ${Z}; i++) {
+            offsetToIndices(i, kernelStrides, offset);
+            isPad = false;
+            for (int j = ${U} - ${G}; j < ${U}; j++) {
+              x[j] = indices[j] * strides[j - ${U} + ${G}]
+                + offset[j - ${U} + ${G}] - pads[j - 2];
+              ${k}
+          }
+          ${K}
+
+          return value;
+        }
+      `}},v4=(Q,H)=>{let j="";for(let K=0;K<Q.length;K++)j+=`
+      ${H}[${K}] = ${Q[K]};
+    `;return j},P9=(Q)=>`
+  void offsetToIndices(int offset, int[${Q}] strides, out int[${Q}] indices) {
+    if (${Q} == 0) {
+      return;
+    }
+    for (int i = 0; i < ${Q} - 1; ++i) {
+      indices[i] = offset / strides[i];
+      offset -= indices[i] * strides[i];
+    }
+    indices[${Q} - 1] = offset;
+  }`}),w3,D3,E9,I9,yQ,dQ,pQ,hQ,bQ,mQ,cQ,dj=E(()=>{_1(),k5(),Q1(),t(),w3=(Q,H,j,K,W)=>{I9(H);let U={name:K,inputNames:["A"],inputTypes:[0]};return[Q.run({...U,cacheHint:j.cacheKey,get:()=>E9(Q,H,j,K,W,U)},H)]},D3=(Q)=>{let H=Q.attributes.getInts("axes",[]),j=Q.attributes.getInt("keepdims",1)===1;return K1({axes:H,keepDims:j})},E9=(Q,H,j,K,W,U)=>{let Z=[],q=H[0].dims.length||1,G=[],J=u.normalizeAxes(j.axes,H[0].dims.length),X=W(H,J),V=X[1];for(let z=0;z<H[0].dims.length;z++)J.indexOf(z)>=0||J.length===0?(j.keepDims&&Z.push(1),V=`
+          for(int j${z} = 0; j${z} < ${H[0].dims[z]}; j${z}++) {
+            inputIdx[${z}] = j${z};
+            ${V}
+          }`):(G.push(`inputIdx[${z}] = outputIdx[${Z.length}];`),Z.push(H[0].dims[z]));let R=`
+      float process(int outputIdx[${Z.length||1}]) {
+        float value;                 // final result
+        int inputIdx[${q}];      // addressing input data
+        ${G.join(`
+`)}
+        ${X[0]}       // init ops for reduce max/min
+        ${V}
+        ${X[2]}       // final computation for reduce mean
+        return value;
+      }`;return{...U,output:{dims:Z,type:H[0].type,textureType:0},shaderSource:R}},I9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Reduce op requires 1 input.");if(u4.indexOf(Q[0].type)===-1)throw new Error("Invalid input type.")},yQ=(Q,H,j)=>w3(Q,H,j,"ReduceSum",()=>["value = 0.0;","value += _A(inputIdx);",""]),dQ=(Q,H,j)=>w3(Q,H,j,"ReduceMean",(K,W)=>{let U=1;for(let Z=0;Z<K[0].dims.length;Z++)(W.indexOf(Z)>=0||W.length===0)&&(U*=K[0].dims[Z]);return["value = 0.0;","value += _A(inputIdx);",`value /= ${U}.;`]}),pQ=(Q,H,j)=>w3(Q,H,j,"ReduceMax",(K,W)=>{let U=[];for(let Z=0;Z<K[0].dims.length;Z++)(W.indexOf(Z)>=0||W.length===0)&&U.push(`inputIdx[${Z}] = 0;`);return[`${U.join(`
+`)}
+value = _A(inputIdx);`,"value = max(value, _A(inputIdx));",""]}),hQ=(Q,H,j)=>w3(Q,H,j,"ReduceMin",(K,W)=>{let U=[];for(let Z=0;Z<K[0].dims.length;Z++)(W.indexOf(Z)>=0||W.length===0)&&U.push(`inputIdx[${Z}] = 0;`);return[`${U.join(`
+`)}
+value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),bQ=(Q,H,j)=>w3(Q,H,j,"ReduceProd",()=>["value = 1.0;","value *= _A(inputIdx);",""]),mQ=(Q,H,j)=>w3(Q,H,j,"ReduceLogSum",()=>["value = 0.0;","value += _A(inputIdx);","value = log(value);"]),cQ=(Q,H,j)=>w3(Q,H,j,"ReduceLogSumSquare",()=>["float t; value = 0.0;","t = _A(inputIdx); value += t * t;",""])}),fQ,pj=E(()=>{Q1(),fQ=(Q,H)=>{let j=u.calculateReshapedDims(H[0].dims,H[1].integerData);return Q.session.pack?[Q.reshapePacked(H[0],j)]:[Q.reshapeUnpacked(H[0],j)]}}),e5,y6,lQ,uQ,d4,x9,d6,N5,sQ=E(()=>{_1(),W1(),t(),e5={name:"Upsample",inputNames:["X"],inputTypes:[0]},y6=(Q,H,j)=>(d6(H,j),[Q.run({...e5,cacheHint:j.cacheKey,get:()=>x9(Q,H,j)},H)]),lQ=(Q)=>d4(Q,7),uQ=(Q)=>d4(Q,9),d4=(Q,H)=>{let j=H>=10,K=Q.attributes.getString("mode","nearest");if(K!=="nearest"&&K!=="linear"&&(H<11||K!=="cubic"))throw new Error(`unrecognized mode: ${K}`);let W=[];H<9&&(W=Q.attributes.getFloats("scales"),N5(W,K,j));let U=Q.attributes.getFloat("extrapolation_value",0),Z=H>10?Q.attributes.getString("coordinate_transformation_mode","half_pixel"):"asymmetric";if(["asymmetric","pytorch_half_pixel","tf_half_pixel_for_nn","align_corners","tf_crop_and_resize","half_pixel"].indexOf(Z)===-1)throw new Error(`coordinate_transform_mode '${Z}' is not supported`);let q=Z==="tf_crop_and_resize",G=q,J=K==="nearest"&&H>=11?Q.attributes.getString("nearest_mode","round_prefer_floor"):"";if(["round_prefer_floor","round_prefer_ceil","floor","ceil",""].indexOf(J)===-1)throw new Error(`nearest_mode '${J}' is not supported`);let X=Q.attributes.getFloat("cubic_coeff_a",-0.75),V=Q.attributes.getInt("exclude_outside",0)!==0;if(V&&K!=="cubic")throw new Error("exclude_outside can be set to 1 only when mode is CUBIC.");let R=H<11?!0:K==="nearest"&&Z==="asymmetric"&&J==="floor",z=0,Y=0,B=0;return H>10?Q.inputs.length>2?(z=1,Y=2,B=3):(Y=1,B=2):H===9&&(Y=1),K1({opset:H,isResize:j,mode:K,scales:W,extrapolationValue:U,coordinateTransformMode:Z,useExtrapolation:G,needRoiInput:q,nearestMode:J,cubicCoefficientA:X,excludeOutside:V,useNearest2xOptimization:R,roiInputIdx:z,scalesInputIdx:Y,sizesInputIdx:B})},x9=(Q,H,j)=>{let K=r(Q.session.backend.glContext.version),[W,U]=Q.calculateTextureWidthAndHeight(H[0].dims,0),Z=H[0].dims.map((B,k)=>Math.floor(B*j.scales[k])),[q,G]=Q.calculateTextureWidthAndHeight(Z,0),J=Z.length,X=new Array(J),V=new Array(J),R=`
+      int output_pitches[${J}];
+      int input_pitches[${J}];
+      `;for(let B=J-1;B>=0;B--)X[B]=B===J-1?1:X[B+1]*Z[B+1],V[B]=B===J-1?1:V[B+1]*H[0].dims[B+1],R+=`
+        output_pitches[${B}] = ${X[B]};
+        input_pitches[${B}] = ${V[B]};
+        `;let z=`
+      float getInputFloat(int index) {
+        vec2 coords = offsetToCoords(index, ${W}, ${U});
+        float value = getColorAsFloat(${K.texture2D}(X, coords));
+        return value;
+      }
+      `,Y=j.mode==="nearest"?`
+    ${z}
+    float process(int indices[${J}]) {
+      int input_index = 0;
+      int output_index = coordsToOffset(TexCoords, ${q}, ${G});
+
+      ${R}
+
+      int d, m;
+      for (int dim = 0; dim < ${J}; ++dim) {
+        d = output_index / output_pitches[dim];
+        m = output_index - d * output_pitches[dim];
+        output_index = m;
+
+        if (scales[dim] != 1 && d > 0) {
+          int d2 = d / scales[dim];
+          m = d - d2 * scales[dim];
+          d = d2;
+        }
+        input_index += input_pitches[dim] * d;
+      }
+
+      return getInputFloat(input_index);
+    }`:J===4?`
+    ${z}
+    float process(int indices[4]) {
+      int input_index = 0;
+      int output_index = coordsToOffset(TexCoords, ${q}, ${G});
+
+      ${R}
+
+      int m;
+      int index_of_dim0, index_of_dim1, index_of_dim2, index_of_dim3;
+      index_of_dim0 = output_index / output_pitches[0];
+      m = output_index - index_of_dim0 * output_pitches[0];
+      index_of_dim1 = m / output_pitches[1];
+      m = m - index_of_dim1 * output_pitches[1];
+      index_of_dim2 = m / output_pitches[2];
+      m = m - index_of_dim2 * output_pitches[2];
+      index_of_dim3 = m;
+
+      int index_of_input_dim2, index_of_input_dim3, x_offset, y_offset;
+      index_of_input_dim2 = index_of_dim2 / scales[2];
+      y_offset = index_of_dim2 - index_of_input_dim2 * scales[2];
+      index_of_input_dim3 = index_of_dim3 / scales[3];
+      x_offset = index_of_dim3 - index_of_input_dim3 * scales[3];
+
+      input_index = index_of_dim0 * input_pitches[0] +
+            index_of_dim1 * input_pitches[1] +
+            index_of_input_dim2 * input_pitches[2] +
+            index_of_input_dim3;
+
+      float x00 = getInputFloat(input_index);
+      float x10, x01, x11;
+
+      bool end_of_dim2 = false;
+      if (index_of_input_dim2 == (${H[0].dims[2]} - 1)) {
+        // It's the end in dimension 2
+        x01 = x00;
+        end_of_dim2 = true;
+      } else {
+        x01 = getInputFloat(input_index + input_pitches[2]);
+      }
+
+      if (index_of_input_dim3 == (input_pitches[2] - 1)) {
+        // It's the end in dimension 3
+        x10 = x00;
+        x11 = x01;
+      }
+      else {
+        x10 = getInputFloat(input_index + 1);
+        x11 = end_of_dim2 ? x10 : getInputFloat(input_index + input_pitches[2] + 1);
+      }
+
+      float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[2]);
+      float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[2]);
+      return y0 + float(x_offset) * (y1 - y0) / float(scales[3]);
+    }`:`
+    ${z}
+    float process(int indices[2]) {
+      int input_index = 0;
+      int output_index = coordsToOffset(TexCoords, ${q}, ${G});
+
+      ${R}
+
+      int m;
+      int index_of_dim0, index_of_dim1;
+      index_of_dim0 = output_index / output_pitches[0];
+      m = output_index - index_of_dim0 * output_pitches[0];
+      index_of_dim1 = m;
+
+      int index_of_input_dim0, index_of_input_dim1, x_offset, y_offset;
+      index_of_input_dim0 = index_of_dim0 / scales[0];
+      y_offset = index_of_dim0 - index_of_input_dim0 * scales[0];
+      index_of_input_dim1 = index_of_dim1 / scales[1];
+      x_offset = index_of_dim1 - index_of_input_dim1 * scales[1];
+
+      input_index = index_of_input_dim0 * input_pitches[0] + index_of_input_dim1;
+
+      float x00 = getInputFloat(input_index);
+      float x10, x01, x11;
+
+      bool end_of_dim0 = false;
+      if (index_of_input_dim0 == (${H[0].dims[0]} - 1)) {
+        // It's the end in dimension 0
+        x01 = x00;
+        end_of_dim0 = true;
+      } else {
+        x01 = getInputFloat(input_index + input_pitches[0]);
+      }
+
+      if (index_of_input_dim1 == (input_pitches[0] - 1)) {
+        // It's the end in dimension 1
+        x10 = x00;
+        x11 = x01;
+      }
+      else {
+        x10 = getInputFloat(input_index + 1);
+        x11 = end_of_dim0 ? x10 : getInputFloat(input_index + input_pitches[0] + 1);
+      }
+
+      float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]);
+      float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]);
+      return y0 + float(x_offset) * (y1 - y0) / float(scales[1]);
+    }`;return{...e5,output:{dims:Z,type:H[0].type,textureType:0},shaderSource:Y,variables:[{name:"scales",type:"int",arrayLength:j.scales.length,data:j.scales.map((B)=>Math.ceil(B))}]}},d6=(Q,H)=>{if(!Q||H.opset<9&&Q.length!==1||H.opset>=9&&H.opset<11&&Q.length!==2||H.opset>=11&&Q.length<2)throw new Error("invalid inputs.");if(H.scales.length>0&&Q[0].dims.length!==H.scales.length)throw new Error("Invalid input shape.");if(Q[0].type==="string")throw new Error("Invalid input tensor types.")},N5=(Q,H,j)=>{if(j){for(let K of Q)if(K<=0)throw new Error("Scale value should be greater than 0.")}else for(let K of Q)if(K<1)throw new Error("Scale value should be greater than or equal to 1.");if((H==="linear"||H==="cubic")&&Q.length!==2&&(Q.length!==4||Q[0]!==1||Q[1]!==1))throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic')         or 4-D inputs with the corresponding outermost 2 scale values being 1         in the ${j?"Resize":"Upsample"} opeartor.`)}}),V5,p6,iQ,oQ,O9,g9,y9,d9,hj=E(()=>{W1(),t(),F3(),U4(),sQ(),V5={name:"Resize",inputNames:["A"],inputTypes:[2]},p6=(Q,H,j)=>(d6(H,j),[Q.run({...V5,cacheHint:j.cacheKey,get:()=>O9(Q,H,j)},H)]),iQ=(Q)=>d4(Q,10),oQ=(Q)=>d4(Q,11),O9=(Q,H,j)=>{let K=r(Q.session.backend.glContext.version),[W,U]=g9(H,j);if(W.every((A)=>A===1)&&j.coordinateTransformMode!=="tf_crop_and_resize")return{...V5,output:{dims:U,type:H[0].type,textureType:2},hasMain:!0,shaderSource:`void main() {
+                    vec4 v = ${K.texture2D}(X, TexCoords);
+                    ${K.output} = v;
+                }`};let Z=U.length;if(Z<2)throw new Error(`output dimension should be at least 2, but got ${Z}`);let q=U[Z-2],G=U[Z-1],J=H[0].dims;if(Z!==J.length)throw new Error(`output dimension should match input ${J.length}, but got ${Z}`);let X=J[Z-2],V=J[Z-1],R=W[Z-2],z=W[Z-1],Y="";if(j.mode!=="linear")throw new Error(`resize (packed) does not support mode: '${j.mode}'`);switch(j.coordinateTransformMode){case"asymmetric":Y=`
+                    vec4 getSourceFracIndex(ivec4 coords) {
+                        return vec4(coords) / scaleWHWH;
+                    }
+                `;break;case"half_pixel":Y=`
+                    vec4 getSourceFracIndex(ivec4 coords) {
+                        return (vec4(coords) + 0.5) / scaleWHWH - 0.5;
+                    }
+                `;break;case"pytorch_half_pixel":Y=`
+                    vec4 getSourceFracIndex(ivec4 coords) {
+                        vec4 fcoords = vec4(coords);
+                        return vec4(
+                            ${G}.0 > 1.0 ? (fcoords.x + 0.5) / scaleWHWH.x - 0.5 : 0.0,
+                            ${q}.0 > 1.0 ? (fcoords.y + 0.5) / scaleWHWH.y - 0.5 : 0.0,
+                            ${G}.0 > 1.0 ? (fcoords.z + 0.5) / scaleWHWH.z - 0.5 : 0.0,
+                            ${q}.0 > 1.0 ? (fcoords.w + 0.5) / scaleWHWH.w - 0.5 : 0.0
+                          );
+                    }
+                `;break;case"align_corners":Y=`
+                    vec4 getSourceFracIndex(ivec4 coords) {
+                        vec4 resized = vec4(${G}.0 - 1.0, ${q}.0 - 1.0, ${G}.0 - 1.0,
+                            ${q}.0 - 1.0);
+                        vec4 original = vec4(${V}.0 - 1.0, ${X}.0 - 1.0, ${V}.0 - 1.0,
+                            ${X}.0 - 1.0);
+                        vec4 new_scale = original / resized;
+                        return vec4(coords) * new_scale;
+                    }
+                `;break;default:throw new Error(`resize (packed) does not support coordinateTransformMode:                                 '${j.coordinateTransformMode}'`)}let B=P3(Z),k=c4(),w=`
+            const vec2 inputWH = vec2(${X}.0, ${V}.0);
+            const vec4 scaleWHWH = vec4(float(${R}), float(${z}), float(${R}), float(${z}));
+            ${k}
+            ${Y}
+            float getAValue(int x10, int r, int c, int d) {
+                return getChannel(getA(x10, r, c, d), vec2(c, d));
+            }
+            void main() {
+                ${B} rc = getOutputCoords();
+
+                int batch = rc[0];
+                int depth = rc[1];
+
+                // retrieve the 4 coordinates that is used in the 4 packed output values.
+                ivec4 coords = ivec4(rc.wz, rc.w + 1, rc.z + 1);
+
+                // calculate the source index in fraction
+                vec4 sourceFrac = getSourceFracIndex(coords);
+
+                // get the lower and upper bound of the 4 values that will be packed into one texel.
+                ivec4 x00 = ivec4(max(sourceFrac.xy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xy)));
+                ivec4 x01 = ivec4(max(sourceFrac.xw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xw)));
+                ivec4 x10 = ivec4(max(sourceFrac.zy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zy)));
+                ivec4 x11 = ivec4(max(sourceFrac.zw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zw)));
+
+                bool hasNextRow = rc.w < ${q-1};
+                bool hasNextCol = rc.z < ${G-1};
+
+                // pack x00, x01, x10, x11's top-left corner into one vec4 structure
+                vec4 topLeft = vec4(
+                    getAValue(batch, depth, x00.x, x00.y),
+                    hasNextCol ? getAValue(batch, depth, x01.x, x01.y) : 0.0,
+                    hasNextRow ? getAValue(batch, depth, x10.x, x10.y) : 0.0,
+                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.y) : 0.0);
+
+                // pack x00, x01, x10, x11's top-right corner into one vec4 structure
+                vec4 topRight = vec4(
+                    getAValue(batch, depth, x00.x, x00.w),
+                    hasNextCol ? getAValue(batch, depth, x01.x, x01.w) : 0.0,
+                    hasNextRow ? getAValue(batch, depth, x10.x, x10.w) : 0.0,
+                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.w) : 0.0);
+
+                // pack x00, x01, x10, x11's bottom-left corner into one vec4 structure
+                vec4 bottomLeft = vec4(
+                    getAValue(batch, depth, x00.z, x00.y),
+                    hasNextCol ? getAValue(batch, depth, x01.z, x01.y) : 0.0,
+                    hasNextRow ? getAValue(batch, depth, x10.z, x10.y) : 0.0,
+                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.y) : 0.0);
+
+                // pack x00, x01, x10, x11's bottom-right corner into one vec4 structure
+                vec4 bottomRight = vec4(
+                    getAValue(batch, depth, x00.z, x00.w),
+                    hasNextCol ? getAValue(batch, depth, x01.z, x01.w) : 0.0,
+                    hasNextRow ? getAValue(batch, depth, x10.z, x10.w) : 0.0,
+                    (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.w) : 0.0);
+
+                // calculate the interpolation fraction on u and v direction
+                vec4 frac = vec4(sourceFrac) - floor(sourceFrac);
+                vec4 clampFrac = clamp(frac, vec4(0.0), vec4(1.0));
+
+                vec4 top = mix(topLeft, topRight, clampFrac.ywyw);
+                vec4 bottom = mix(bottomLeft, bottomRight, clampFrac.ywyw);
+                vec4 newValue = mix(top, bottom, clampFrac.xxzz);
+
+                ${K.output} = vec4(newValue);
+            }
+        `;return{...V5,output:{dims:U,type:H[0].type,textureType:2},hasMain:!0,shaderSource:w}},g9=(Q,H)=>{let j=Q[0].dims,K=H.scales,W;if(K.length===0){let Z=Q[H.scalesInputIdx];if(Z&&Z.size!==0){if(Q[H.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");K=y9(Z,H.mode,H.isResize)}else{let q=Q[H.sizesInputIdx];if(!q||q.size===0)throw new Error("Either scales or sizes MUST be provided as input.");W=Array.from(q.integerData),K=d9(W,j,H.mode,H.isResize)}}else if(Q[H.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");let U=W||j.map((Z,q)=>Math.floor(Z*K[q]));return[K,U]},y9=(Q,H,j)=>{let K=Array.from(Q.floatData);return N5(K,H,j),K},d9=(Q,H,j,K)=>{let W=H.length,U=new Array(W);for(let Z=0,q=W;Z<q;Z++)if(H[Z]===0){if(Q[Z]!==0)throw new Error("Input dim is zero but required output dim is non-zero.");U[Z]=1}else U[Z]=Q[Z]/H[Z];return N5(U,j,K),U}}),aQ,p9,bj=E(()=>{K4(),aQ=(Q,H)=>(p9(H),[new o1([H[0].dims.length],"int32",void 0,void 0,new Int32Array(H[0].dims))]),p9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Shape requires 1 input.")}}),X5,nQ,rQ,Q6,h9,tQ,b9,m9,mj=E(()=>{_1(),k5(),Q1(),t(),X5={name:"Slice",inputNames:["A"],inputTypes:[0]},nQ=(Q,H,j)=>(h9(H),[Q.run({...X5,cacheHint:j.cacheKey,get:()=>Q6(Q,H[0],j)},H)]),rQ=(Q)=>{let H=Q.attributes.getInts("starts"),j=Q.attributes.getInts("ends"),K=Q.attributes.getInts("axes",[]);return K1({starts:H,ends:j,axes:K})},Q6=(Q,H,j)=>{let K=j.axes.length===0?H.dims.slice(0).map((X,V)=>V):j.axes,W=u.normalizeAxes(K,H.dims.length),U=j.starts.map((X,V)=>X>H.dims[W[V]]-1?H.dims[W[V]]:u.normalizeAxis(X,H.dims[W[V]])),Z=j.ends.map((X,V)=>X>H.dims[W[V]]-1?H.dims[W[V]]:u.normalizeAxis(X,H.dims[W[V]])),q=H.dims.slice(),G=[];for(let X=0;X<W.length;X++)q[W[X]]=Z[X]-U[X],U[X]>0&&G.push(`outputIdx[${W[X]}] += ${U[X]};`);let J=`
+      float process(int outputIdx[${q.length}]) {
+        ${G.join(`
+      `)}
+        return _A(outputIdx);
+      }`;return{...X5,output:{dims:q,type:H.type,textureType:0},shaderSource:J}},h9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Slice requires 1 input.");if(u4.indexOf(Q[0].type)===-1)throw new Error("Invalid input type.")},tQ=(Q,H)=>{m9(H);let j=b9(Q,H);return[Q.run({...X5,cacheHint:j.cacheKey,get:()=>Q6(Q,H[0],j)},[H[0]])]},b9=(Q,H)=>{if(!Q.session.isInitializer(H[1].dataId)||!Q.session.isInitializer(H[2].dataId)||H.length>=4&&!Q.session.isInitializer(H[3].dataId)||H.length>=5&&!Q.session.isInitializer(H[4].dataId))throw new Error("dynamic slice attributes are not allowed");if(H.length>=5&&H[4].integerData.some((Z)=>Z!==1))throw new Error("currently non-1 steps is not supported for Slice");let j=Array.from(H[1].integerData),K=Array.from(H[2].integerData),W=H.length>=4?Array.from(H[3].integerData):[],U=`${W};${j};${K}`;return{starts:j,ends:K,axes:W,cacheKey:U}},m9=(Q)=>{if(!Q||Q.length<3||Q.length>5)throw new Error("Invalid input number.");if(Q[1].type!=="int32"||Q[1].dims.length!==1)throw new Error("Invalid input type.");if(Q[2].type!=="int32"||Q[2].dims.length!==1)throw new Error("Invalid input type.");if(Q.length>=4&&(Q[3].type!=="int32"||Q[3].dims.length!==1))throw new Error("Invalid input type.");if(Q.length>=5&&(Q[4].type!=="int32"||Q[4].dims.length!==1))throw new Error("Invalid input type.")}}),J6,H6,Z6,eQ,QJ,JJ,HJ,j6,c9,f9,l9,V6,cj=E(()=>{_1(),Q1(),W1(),t(),X7(),J6={name:"SoftmaxComputeMax",inputNames:["A"],inputTypes:[0]},H6={name:"SoftmaxComputeScale",inputNames:["A","Max"],inputTypes:[0,0]},Z6={name:"SoftMax",inputNames:["A","Max","Norm"],inputTypes:[0,0,0]},eQ=(Q,H,j)=>{V6(H);let K=H[0].dims.slice(),W=u.normalizeAxis(j.axis,K.length),U=u.sizeToDimension(K,W),Z=u.sizeFromDimension(K,W);return j6(Q,H,j,U,Z)},QJ=(Q)=>K1({axis:Q.attributes.getInt("axis",1)}),JJ=(Q)=>K1({axis:Q.attributes.getInt("axis",-1)}),HJ=(Q,H,j)=>{V6(H);let K=H[0].dims.slice(),W=u.normalizeAxis(j.axis,K.length),U=K.length,Z=W!==U-1,q=[],G=[],J=[],X;Z&&(G=Array.from({length:U}).map((Y,B)=>B),G[W]=U-1,G[U-1]=W,G.map((Y)=>q.push(K[Y])),X=K1({perm:G}),J=m4(Q,H,X));let V=Z?u.sizeToDimension(q,U-1):u.sizeToDimension(K,U-1),R=Z?u.sizeFromDimension(q,U-1):u.sizeFromDimension(K,U-1),z=j6(Q,Z?J:H,j,V,R);return Z?m4(Q,z,X):z},j6=(Q,H,j,K,W)=>{let U=c9(Q,H[0],K,W,[K]),Z=Q.run({...J6,cacheHint:j.cacheKey,get:()=>U},H),q=f9(Q,H[0],K,W,U.output.dims,[K]),G=Q.run({...H6,cacheHint:j.cacheKey,get:()=>q},[H[0],Z]),J=l9(Q,H[0],K,W,U.output.dims,q.output.dims);return[Q.run({...Z6,cacheHint:j.cacheKey,get:()=>J},[H[0],Z,G])]},c9=(Q,H,j,K,W)=>{let[U,Z]=Q.calculateTextureWidthAndHeight(H.dims,0),q=W.length;if(j<1||K<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(W.length!==1)throw new Error("Dimensionality of the output should be 1");if(W[0]!==j)throw new Error("Shape of the output should be equal to logical row count");let G=r(Q.session.backend.glContext.version),J=`
+      float process(int[${q}] indices) {
+        int logical_row_start_offset = indices[0] * ${K};
+
+        float max = getColorAsFloat(${G.texture2D}(A, offsetToCoords(logical_row_start_offset, ${U},
+        ${Z} )));
+        for(int i=1; i<${K}; ++i)
+        {
+          float current = getColorAsFloat(${G.texture2D}(A, offsetToCoords(logical_row_start_offset + i,
+            ${U}, ${Z})));
+          if(current > max)
+          max = current;
+        }
+
+        return max;
+      }`;return{...J6,output:{dims:W,type:H.type,textureType:0},shaderSource:J}},f9=(Q,H,j,K,W,U)=>{let[Z,q]=Q.calculateTextureWidthAndHeight(H.dims,0),G=U.length;if(j<1||K<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(U.length!==1)throw new Error("Dimensionality of the output should be 1");if(U[0]!==j)throw new Error("Shape of the output should be equal to logical row count");if(W.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(W[0]!==j)throw new Error("Shape of the intermediate results should be equal to logical row count");let J=r(Q.session.backend.glContext.version),X=`
+      float process(int[${G}] indices) {
+        int logical_row_start_offset = indices[0] * ${K};
+
+        float norm_factor = 0.0;
+        float max = _Max(indices);
+        for(int i=0; i<${K}; ++i)
+        {
+          norm_factor += exp(getColorAsFloat(${J.texture2D}(A, offsetToCoords(logical_row_start_offset + i,
+            ${Z}, ${q}))) - max);
+        }
+
+        return norm_factor;
+      }`;return{...H6,output:{dims:U,type:H.type,textureType:0},shaderSource:X}},l9=(Q,H,j,K,W,U)=>{let[Z,q]=Q.calculateTextureWidthAndHeight(H.dims,0),G=H.dims.length;if(j<1||K<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(W.length!==1||U.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(W[0]!==j||U[0]!==j)throw new Error("Shape of the intermediate results should be equal to logical row count");let J=`
+      float process(int[${G}] indices) {
+
+      // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords)
+      int offset = coordsToOffset(TexCoords, ${Z}, ${q});
+
+      //determine the logical row for this index
+      int logical_row_index[1];
+      logical_row_index[0] = offset / ${K};
+
+      float norm_factor = _Norm(logical_row_index);
+
+      // avoid possible division by 0
+      // if norm_facor is 0, all elements are zero
+      // if so, return 0
+      if(norm_factor == 0.0)
+        return 0.0;
+
+      return exp(_A(indices) - _Max(logical_row_index)) / norm_factor;
+    }`;return{...Z6,output:{dims:H.dims,type:H.type,textureType:0},shaderSource:J}},V6=(Q)=>{if(!Q||Q.length!==1)throw new Error("Softmax requires 1 input.");if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("Invalid input type")}}),X6,ZJ,jJ,u9,s9,i9,fj=E(()=>{_1(),Q1(),t(),X6={name:"Split",inputNames:["A"],inputTypes:[0]},ZJ=(Q,H,j)=>{i9(H);let K=u.normalizeAxis(j.axis,H[0].dims.length),W=u9(Q,H,K,j),U=[];for(let Z=0;Z<W;++Z)U.push(Q.run({...X6,cacheHint:`${j.cacheKey};${Z}`,get:()=>s9(Q,H[0],j,K,Z)},H));return U},jJ=(Q)=>{let H=Q.attributes.getInt("axis",0),j=Q.attributes.getInts("split",[]),K=Q.outputs.length;return K1({axis:H,split:j,numOutputs:K})},u9=(Q,H,j,K)=>{let[,W]=L6.splitShape(H[0].dims,j,K.split,K.numOutputs);return W.length},s9=(Q,H,j,K,W)=>{let[U,Z]=L6.splitShape(H.dims,K,j.split,j.numOutputs),q=Z[W],G=U[W],J=`
+      float process(int indices[${G.length}]) {
+        indices[${K}] += ${q};
+        return _A(indices);
+      }
+    `;return{...X6,cacheHint:`${j.cacheKey}:${W}`,output:{dims:G,type:H.type,textureType:0},shaderSource:J}},i9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Split requires one input.");if(Q[0].type!=="int8"&&Q[0].type!=="uint8"&&Q[0].type!=="int16"&&Q[0].type!=="uint16"&&Q[0].type!=="int32"&&Q[0].type!=="uint32"&&Q[0].type!=="float32"&&Q[0].type!=="float64"&&Q[0].type!=="bool")throw new Error("Invalid input type.")}}),h6,VJ,XJ,o9,a9,lj=E(()=>{Q1(),h6=(Q,H,j)=>{o9(H);let K=u.squeezeShape(H[0].dims,j);return[Q.reshapeUnpacked(H[0],K)]},VJ=(Q,H)=>(a9(H),h6(Q,[H[0]],Array.from(H[1].integerData))),XJ=(Q)=>Q.attributes.getInts("axes"),o9=(Q)=>{if(!Q||Q.length!==1)throw new Error("Squeeze requires 1 input.");if(Q[0].type==="string")throw new Error("invalid input tensor types.")},a9=(Q)=>{if(!Q||Q.length!==2)throw new Error("Squeeze requires 2 inputs.");if(Q[1].type!=="int32")throw new Error("Invalid input type.")}}),KJ,n9,r9,uj=E(()=>{W1(),t(),KJ=(Q,H)=>{r9(H);let j={name:"Sum",inputNames:H.map((K,W)=>`X${W}`),inputTypes:new Array(H.length).fill(0)};return[Q.run({...j,get:()=>n9(Q,H,j)},H)]},n9=(Q,H,j)=>{let K=r(Q.session.backend.glContext.version),W=H[0].dims.slice(),U=`
+      void main() {
+        vec4 result = ${H.map((Z,q)=>`${K.texture2D}(X${q},TexCoords)`).join(" + ")};
+        ${K.output} = result;
+      }
+    `;return{...j,output:{dims:W,type:H[0].type,textureType:0},hasMain:!0,shaderSource:U}},r9=(Q)=>{if(!Q||Q.length===0)throw new Error("Sum requires inputs.");let H=Q[0].dims.length;for(let j=1;j<Q.length;j++){if(H!==Q[j].dims.length)throw new Error("Input shapes are mismatched.");for(let K=0;K<H;K++)if(Q[0].dims[K]!==Q[j].dims[K])throw new Error("Input shapes are not matched.")}if(Q[0].type!=="float32"&&Q[0].type!=="float64")throw new Error("Invalid input type.");for(let j=1;j<Q.length;j++)if(Q[0].type!==Q[j].type)throw new Error("Input types are not matched.")}}),UJ,t9,e9,sj=E(()=>{k5(),t(),UJ=(Q,H)=>{e9(H);let j={name:"Tile",inputNames:["A"],inputTypes:[0]};return[Q.run({...j,get:()=>t9(Q,H,j)},H)]},t9=(Q,H,j)=>{let K=H[0].dims.slice(),W=new Array(K.length),U=[];for(let G=0;G<K.length;G++)W[G]=K[G]*H[1].numberData[G],U.push(`inputIdx[${G}] = int(mod(float(outputIdx[${G}]), ${K[G]}.));`);let Z=W.length,q=`
+      float process(int outputIdx[${Z}]) {
+        int inputIdx[${Z}];
+        ${U.join(`
+`)}
+        return _A(inputIdx);
+      }
+    `;return{...j,output:{dims:W,type:H[0].type,textureType:0},shaderSource:q}},e9=(Q)=>{if(!Q||Q.length!==2)throw new Error("Tile requires 2 input.");if(Q[1].dims.length!==1)throw new Error("The second input shape must 1 dimension.");if(Q[1].dims[0]!==Q[0].dims.length)throw new Error("Invalid input shape.");if(u4.indexOf(Q[0].type)===-1)throw new Error("Invalid input type.");if(Q[1].type!=="int32"&&Q[1].type!=="int16")throw new Error("Invalid repeat type.")}}),b6,qJ,WJ,Q2,J2,ij=E(()=>{Q1(),b6=(Q,H,j)=>{Q2(H);let K=u.unsqueezeShape(H[0].dims,j);return[Q.reshapeUnpacked(H[0],K)]},qJ=(Q,H)=>(J2(H),b6(Q,[H[0]],Array.from(H[1].integerData))),WJ=(Q)=>Q.attributes.getInts("axes"),Q2=(Q)=>{if(!Q||Q.length!==1)throw new Error("Unsqueeze requires 1 input.");if(Q[0].type==="string")throw new Error("invalid input tensor types.")},J2=(Q)=>{if(!Q||Q.length!==2)throw new Error("Unsqueeze requires 2 inputs.");if(Q[1].type!=="int32")throw new Error("Invalid input type.")}}),GJ,oj=E(()=>{Bj(),Fj(),kj(),Sj(),V7(),Tj(),Dj(),_j(),Pj(),Ej(),Ij(),xj(),Oj(),Z7(),gj(),yj(),dj(),pj(),hj(),bj(),mj(),cj(),fj(),lj(),uj(),sj(),X7(),t0(),ij(),sQ(),GJ=[["Abs","","6+",_0],["Acos","","7+",P0],["Add","","7+",R0],["And","","7+",z0],["Asin","","7+",E0],["Atan","","7+",I0],["AveragePool","","7+",_Q,PQ],["BatchNormalization","","7+",U0,q0],["Cast","","6+",L0,v0],["Ceil","","6+",g0],["Clip","","6-10",_6,x0],["Clip","","11+",O0],["Concat","","4+",T0,D0],["Conv","","1+",I6,x6],["ConvTranspose","","1+",qQ,WQ],["Cos","","7+",y0],["Div","","7+",N0],["Dropout","","7+",P6],["DepthToSpace","","1+",RQ,zQ],["Equal","","7+",M0],["Elu","","6+",d0,p0],["Exp","","6+",h0],["Flatten","","1+",NQ,MQ],["Floor","","6+",b0],["FusedConv","com.microsoft","1+",I6,x6],["Gather","","1+",YQ,CQ],["Gemm","","7-10",O6,BQ],["Gemm","","11+",O6,FQ],["GlobalAveragePool","","1+",EQ,IQ],["GlobalMaxPool","","1+",gQ],["Greater","","7+",Y0],["Identity","","1+",P6],["ImageScaler","","1+",kQ,AQ],["InstanceNormalization","","6+",SQ,$Q],["LeakyRelu","","6+",m0,c0],["Less","","7+",C0],["LRN","","1+",LQ,vQ],["Log","","6+",f0],["MatMul","","1+",JQ,HQ],["MaxPool","","1+",xQ,OQ],["Mul","","7+",B0],["Neg","","6+",l0],["Not","","1+",u0],["Or","","7+",F0],["Pad","","2-10",g6,wQ],["Pad","","11+",TQ,DQ],["Pow","","7+",k0],["PRelu","","7+",A0],["ReduceLogSum","","1+",mQ,D3],["ReduceMax","","1+",pQ,D3],["ReduceMean","","1+",dQ,D3],["ReduceMin","","1+",hQ,D3],["ReduceProd","","1+",bQ,D3],["ReduceSum","","1-12",yQ,D3],["ReduceSumSquare","","1+",cQ,D3],["Relu","","6+",s0],["Reshape","","5+",fQ],["Resize","","10",p6,iQ],["Resize","","11+",p6,oQ],["Shape","","1+",aQ],["Sigmoid","","6+",i0],["Sin","","7+",o0],["Slice","","10+",tQ],["Slice","","1-9",nQ,rQ],["Softmax","","1-12",eQ,QJ],["Softmax","","13+",HJ,JJ],["Split","","2-12",ZJ,jJ],["Sqrt","","6+",a0],["Squeeze","","1-12",h6,XJ],["Squeeze","","13+",VJ],["Sub","","7+",S0],["Sum","","6+",KJ],["Tan","","7+",n0],["Tanh","","6+",r0],["Tile","","6+",UJ],["Transpose","","1+",m4,GQ],["Upsample","","7-8",y6,lQ],["Upsample","","9",y6,uQ],["Unsqueeze","","1-12",b6,WJ],["Unsqueeze","","13+",qJ],["Xor","","7+",$0]]}),m6,RJ,aj=E(()=>{m6=/@inline[\s\n\r]+(\w+)[\s\n\r]+([0-9a-zA-Z_]+)\s*\(([^)]*)\)\s*{(([^}]|[\n\r])*)}/gm,RJ="(\\w+)?\\s+([_0-9a-zA-Z]+)\\s+=\\s+__FUNC__\\((.*)\\)\\s*;"}),zJ,NJ=E(()=>{V3(),Q1(),zJ=class{constructor(Q){this.maxTextureSize=Q}computeTextureWH(Q,H){let j=this.computeTexture(Q,H);return H&&H.isPacked&&(j[0]/=2,j[1]/=2),H&&H.reverseWH?[j[1],j[0]]:j}computeTexture(Q,H){let j=H&&H.isPacked;if(Q.length===0)return j?[2,2]:[1,1];let K=this.maxTextureSize;if(H&&H.breakAxis!==void 0){let Z=H.breakAxis>=Q.length?1:Q.slice(H.breakAxis).reduce((G,J)=>G*J),q=H.breakAxis<=0?1:Q.slice(0,H.breakAxis).reduce((G,J)=>G*J);if(Z>K||q>K)C1.verbose("TextureLayout",`Given width/height preferences were unattainable: shape:${Q}, breakAxis:${H.breakAxis}`);else return[Z,q]}let W=Q.slice(0);j&&(K=K*2,W=W.map((Z,q)=>q>=W.length-2?W[q]%2===0?W[q]:W[q]+1:W[q]),W.length===1&&(W=[2,W[0]])),W.length!==2&&(W=E4(W).newShape);let U=$Z(W);return W.length<=1&&U<=K?[1,U]:W.length===2&&W[0]<=K&&W[1]<=K?W:W.length===3&&W[0]*W[1]<=K&&W[2]<=K?[W[0]*W[1],W[2]]:W.length===3&&W[0]<=K&&W[1]*W[2]<=K?[W[0],W[1]*W[2]]:W.length===4&&W[0]*W[1]*W[2]<=K&&W[3]<=K?[W[0]*W[1]*W[2],W[3]]:W.length===4&&W[0]<=K&&W[1]*W[2]*W[3]<=K?[W[0],W[1]*W[2]*W[3]]:j?i7(U/4).map((Z)=>Z*2):i7(U)}}}),MJ,nj=E(()=>{Q1(),E3(),W1(),NJ(),F3(),MJ=class extends q4{constructor(Q){super(Q)}getFunctions(){return{...this.offsetToCoords(),...this.coordsToOffset(),...this.toVec(),...this.valueFrom(),...this.getCommonUtilFuncs(),...this.getInputsSamplingSnippets(),...this.getOutputSamplingSnippet()}}getCustomTypes(){return{}}offsetToCoords(){return{offsetToCoords:new y(`
+      vec2 ${"offsetToCoords"}(int offset, int width, int height) {
+        int t = offset / width;
+        int s = offset - t*width;
+        vec2 coords = (vec2(s,t) + vec2(0.5,0.5)) / vec2(width, height);
+        return coords;
+      }
+      `)}}coordsToOffset(){return{coordsToOffset:new y(`
+      int ${"coordsToOffset"}(vec2 coords, int width, int height) {
+        float s = coords.s * float(width);
+        float t = coords.t * float(height);
+        int offset = int(t) * width + int(s);
+        return offset;
+      }
+      `)}}getOutputSamplingSnippet(){let Q=this.context.outputTextureLayout;return Q.isPacked?this.getPackedOutputSamplingSnippet(Q):this.getUnpackedOutputSamplingSnippet(Q)}getPackedOutputSamplingSnippet(Q){let H=Q.unpackedShape,j=[Q.width,Q.height],K={},W="getOutputCoords";switch(H.length){case 0:K[W]=this.getOutputScalarCoords();break;case 1:K[W]=this.getOutputPacked1DCoords(H,j);break;case 2:K[W]=this.getOutputPacked2DCoords(H,j);break;case 3:K[W]=this.getOutputPacked3DCoords(H,j);break;default:K[W]=this.getOutputPackedNDCoords(H,j)}let U=`
+      void setOutput(vec4 val) {
+        ${r(this.context.glContext.version).output} = val;
+      }
+    `,Z="floatTextureSetRGBA";return K[Z]=new y(U),K}getUnpackedOutputSamplingSnippet(Q){let H=Q.unpackedShape,j=[Q.width,Q.height],K={},W="getOutputCoords";switch(H.length){case 0:K[W]=this.getOutputScalarCoords();break;case 1:K[W]=this.getOutputUnpacked1DCoords(H,j);break;case 2:K[W]=this.getOutputUnpacked2DCoords(H,j);break;case 3:K[W]=this.getOutputUnpacked3DCoords(H,j);break;case 4:K[W]=this.getOutputUnpacked4DCoords(H,j);break;case 5:K[W]=this.getOutputUnpacked5DCoords(H,j);break;case 6:K[W]=this.getOutputUnpacked6DCoords(H,j);break;default:throw new Error(`Unsupported output dimensionality: ${H.length}`)}let U=`
+        void setOutput(float val) {
+          ${r(this.context.glContext.version).output} = vec4(val, 0, 0, 0);
+        }
+    `,Z="floatTextureSetR";return K[Z]=new y(U),K}getOutputScalarCoords(){return new y(`
+      int getOutputCoords() {
+        return 0;
+      }
+    `)}getOutputPacked1DCoords(Q,H){let j=H,K="";return j[0]===1?(K=`
+          int getOutputCoords() {
+            return 2 * int(TexCoords.y * ${j[1]}.0);
+          }
+        `,new y(K)):j[1]===1?(K=`
+          int getOutputCoords() {
+            return 2 * int(TexCoords.x * ${j[0]}.0);
+          }
+        `,new y(K)):(K=`
+        int getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                 vec2(${j[0]}, ${j[1]}));
+          return 2 * (resTexRC.y * ${j[0]} + resTexRC.x);
+        }
+      `,new y(K))}getOutputPacked2DCoords(Q,H){let j="";if(x4.arraysEqual(Q,H))return j=`
+        ivec2 getOutputCoords() {
+          return 2 * ivec2(TexCoords.xy * vec2(${H[0]}, ${H[1]}));
+        }
+      `,new y(j);let K=H,W=Math.ceil(Q[1]/2);return j=`
+        ivec2 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${K[0]}, ${K[1]}));
+
+          int index = resTexRC.y * ${K[0]} + resTexRC.x;
+
+          // reverse r and c order for packed texture
+          int r = imod(index, ${W}) * 2;
+          int c = 2 * (index / ${W});
+
+          return ivec2(r, c);
+        }
+      `,new y(j)}getOutputPacked3DCoords(Q,H){let j=[H[0],H[1]],K=Math.ceil(Q[2]/2),W=K*Math.ceil(Q[1]/2),U=`
+        ivec3 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${j[0]}, ${j[1]}));
+          int index = resTexRC.y * ${j[0]} + resTexRC.x;
+
+          int b = index / ${W};
+          index -= b * ${W};
+
+          // reverse r and c order for packed texture
+          int r = imod(index, ${K}) * 2;
+          int c = 2 * (index / ${K});
+
+          return ivec3(b, r, c);
+        }
+      `;return new y(U)}getOutputPackedNDCoords(Q,H){let j=[H[0],H[1]],K=Math.ceil(Q[Q.length-1]/2),W=K*Math.ceil(Q[Q.length-2]/2),U=W,Z="",q="b, r, c";for(let J=2;J<Q.length-1;J++)U*=Q[Q.length-J-1],Z=`
+      int b${J} = index / ${U};
+      index -= b${J} * ${U};
+    `+Z,q=`b${J}, `+q;let G=`
+      ivec${Q.length} getOutputCoords() {
+        ivec2 resTexRC = ivec2(TexCoords.xy *
+                              vec2(${j[0]}, ${j[1]}));
+        int index = resTexRC.y * ${j[0]} + resTexRC.x;
+
+        ${Z}
+
+        int b = index / ${W};
+        index -= b * ${W};
+
+        // reverse r and c order for packed texture
+        int r = imod(index, ${K}) * 2;
+        int c = 2 * (index / ${K});
+
+        return ivec${Q.length}(${q});
+      }
+    `;return new y(G)}getOutputUnpacked1DCoords(Q,H){let j=`
+        int getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${H[0]}, ${H[1]}));
+          return resTexRC.y * ${H[0]} + resTexRC.x;
+        }
+      `;return new y(j)}getOutputUnpacked2DCoords(Q,H){let j=`
+        ivec2 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${H[0]}, ${H[1]}));
+          int index = resTexRC.y * ${H[0]} + resTexRC.x;
+          int r = index / ${Q[1]};
+          int c = index - r * ${Q[1]};
+          return ivec2(r, c);
+        }
+      `;return new y(j)}getOutputUnpacked3DCoords(Q,H){let j="",K=Q.length,W=null;K<2&&(W=[]),W=new Array(K-1),W[K-2]=Q[K-1];for(let q=K-3;q>=0;--q)W[q]=W[q+1]*Q[q+1];let U=["r","c","d"],Z=W.map((q,G)=>{let J=`int ${U[G]} = index / ${q}`,X=G===W.length-1?`int ${U[G+1]} = index - ${U[G]} * ${q}`:`index -= ${U[G]} * ${q}`;return`${J}; ${X};`}).join("");return j=`
+        ivec3 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${H[0]}, ${H[1]}));
+          int index = resTexRC.y * ${H[0]} + resTexRC.x;
+          ${Z}
+          return ivec3(r, c, d);
+        }
+      `,new y(j)}getOutputUnpacked4DCoords(Q,H){let j="",K=Q.length,W=null;K<2&&(W=[]),W=new Array(K-1),W[K-2]=Q[K-1];for(let q=K-3;q>=0;--q)W[q]=W[q+1]*Q[q+1];let U=["r","c","d","d2"],Z=W.map((q,G)=>{let J=`int ${U[G]} = index / ${q}`,X=G===W.length-1?`int ${U[G+1]} = index - ${U[G]} * ${q}`:`index -= ${U[G]} * ${q}`;return`${J}; ${X};`}).join("");return j=`
+      ivec4 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${H[0]}, ${H[1]}));
+          int index = resTexRC.y * ${H[0]} + resTexRC.x;
+          ${Z}
+          return ivec4(r, c, d, d2);
+        }
+      `,new y(j)}getOutputUnpacked5DCoords(Q,H){let j="",K=Q.length,W=null;K<2&&(W=[]),W=new Array(K-1),W[K-2]=Q[K-1];for(let q=K-3;q>=0;--q)W[q]=W[q+1]*Q[q+1];let U=["r","c","d","d2","d3"],Z=W.map((q,G)=>{let J=`int ${U[G]} = index / ${q}`,X=G===W.length-1?`int ${U[G+1]} = index - ${U[G]} * ${q}`:`index -= ${U[G]} * ${q}`;return`${J}; ${X};`}).join("");return j=`
+      ivec5 getOutputCoords() {
+          ivec2 resTexRC = ivec2(TexCoords.xy *
+                                vec2(${H[0]}, ${H[1]}));
+          int index = resTexRC.y * ${H[0]} + resTexRC.x;
+          ${Z}
+          return ivec5(r, c, d, d2, d3);
+        }
+      `,new y(j)}getOutputUnpacked6DCoords(Q,H){let j="",K=Q.length,W=null;K<2&&(W=[]),W=new Array(K-1),W[K-2]=Q[K-1];for(let q=K-3;q>=0;--q)W[q]=W[q+1]*Q[q+1];let U=["r","c","d","d2","d3","d4"],Z=W.map((q,G)=>{let J=`int ${U[G]} = index / ${q}`,X=G===W.length-1?`int ${U[G+1]} = index - ${U[G]} * ${q}`:`index -= ${U[G]} * ${q}`;return`${J}; ${X};`}).join("");return j=`
+     ivec6 getOutputCoords() {
+         ivec2 resTexRC = ivec2(TexCoords.xy *
+                               vec2(${H[0]}, ${H[1]}));
+         int index = resTexRC.y * ${H[0]} + resTexRC.x;
+         ${Z}
+         return ivec6(r, c, d, d2, d3, d4);
+       }
+     `,new y(j)}getCommonUtilFuncs(){let Q={},H="uvFromFlat";Q[H]=new y(`
+    vec2 uvFromFlat(int texNumR, int texNumC, int index) {
+      int texC = index / texNumR;
+      int texR = index - texC * texNumR;
+      // TODO: swap texR, texC order in following function so row is corresponding to u and column is corresponding to
+      //       v.
+      return (vec2(texR, texC) + halfCR) / vec2(texNumR, texNumC);
+    }
+    `),H="packedUVfrom1D",Q[H]=new y(`
+      vec2 packedUVfrom1D(int texNumR, int texNumC, int index) {
+        int texelIndex = index / 2;
+        int texR = texelIndex / texNumC;
+        int texC = texelIndex - texR * texNumC;
+        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);
+      }
+      `),H="packedUVfrom2D",Q[H]=new y(`
+      vec2 packedUVfrom2D(int texNumR, int texNumC, int texelsInLogicalRow, int row, int col) {
+        int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);
+        int texR = texelIndex / texNumC;
+        int texC = texelIndex - texR * texNumC;
+        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);
+      }
+      `),H="packedUVfrom3D",Q[H]=new y(`
+      vec2 packedUVfrom3D(int texNumR, int texNumC,
+          int texelsInBatch, int texelsInLogicalRow, int b,
+          int row, int col) {
+        int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);
+        int texR = index / texNumC;
+        int texC = index - texR * texNumC;
+        return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);
+      }
+      `),H="sampleTexture";let j=r(this.context.glContext.version);return Q[H]=new y(`
+        float sampleTexture(sampler2D textureSampler, vec2 uv) {
+            return ${j.texture2D}(textureSampler, uv).r;
+        }`),Q}getInputsSamplingSnippets(){let Q={},H=this.context.outputTextureLayout;return this.context.programInfo.inputNames.forEach((j,K)=>{let W=this.context.inputTextureLayouts[K],U=P5(j);W.isPacked?Q[U]=this.getPackedSamplerFromInput(U,j,W):Q[U]=this.getUnpackedSamplerFromInput(U,j,W);let Z=DH(j);W.unpackedShape.length<=H.unpackedShape.length&&(W.isPacked?Q[Z]=this.getPackedSamplerAtOutputCoords(Z,W,H,j):Q[Z]=this.getUnpackedSamplerAtOutputCoords(Z,W,H,j))}),Q}getPackedSamplerAtOutputCoords(Q,H,j,K){let W=H.unpackedShape,U=j.unpackedShape,Z=P5(K),q=W.length,G=U.length,J=R3.getBroadcastDims(W,U),X=P3(G),V=G-q,R,z=H4();q===0?R="":G<2&&J.length>=1?R="coords = 0;":R=J.map((I)=>`coords.${z[I+V]} = 0;`).join(`
+`);let Y="";G<2&&q>0?Y="coords":Y=W.map((I,h)=>`coords.${z[h+V]}`).join(", ");let B="return outputValue;",k=u.size(W)===1,w=u.size(U)===1;if(q===1&&!k&&!w)B=`
+        return vec4(outputValue.xy, outputValue.xy);
+      `;else if(k&&!w)G===1?B=`
+          return vec4(outputValue.x, outputValue.x, 0., 0.);
+        `:B=`
+          return vec4(outputValue.x);
+        `;else if(J.length){let I=q-2,h=q-1;J.indexOf(I)>-1&&J.indexOf(h)>-1?B="return vec4(outputValue.x);":J.indexOf(I)>-1?B="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":J.indexOf(h)>-1&&(B="return vec4(outputValue.xx, outputValue.zz);")}let A=`
+        int lastDim = coords.${z[G-1]};
+        coords.${z[G-1]} = coords.${z[G-2]};
+        coords.${z[G-2]} = lastDim;
+      `,D=`
+      vec4 ${Q}() {
+        ${X} coords = getOutputCoords();
+        ${A}
+        ${R}
+        vec4 outputValue = ${Z}(${Y});
+        ${B}
+      }
+    `;return new y(D,["coordinates.getOutputCoords"])}getUnpackedSamplerAtOutputCoords(Q,H,j,K){let W=[j.width,j.height],U=[H.width,H.height],Z=H.unpackedShape.length,q=j.unpackedShape.length,G=H.unpackedShape,J=j.unpackedShape,X=P5(K);if(Z===q&&x4.arraysEqual(U,W)){let A=`
+          float ${Q}() {
+            return sampleTexture(${K}, TexCoords);
+          }
+        `;return new y(A,["coordinates.sampleTexture"])}let V=P3(q),R=R3.getBroadcastDims(G,J),z=q-Z,Y,B=H4();Z===0?Y="":q<2&&R.length>=1?Y="coords = 0;":Y=R.map((A)=>`coords.${B[A+z]} = 0;`).join(`
+`);let k="";q<2&&Z>0?k="coords":k=H.unpackedShape.map((A,D)=>`coords.${B[D+z]}`).join(", ");let w=`
+        float ${Q}() {
+          ${V} coords = getOutputCoords();
+          ${Y}
+          return ${X}(${k});
+        }
+      `;return new y(w,["coordinates.getOutputCoords"])}getPackedSamplerFromInput(Q,H,j){switch(j.unpackedShape.length){case 0:return this.getPackedSamplerScalar(Q,H);case 1:return this.getPackedSampler1D(Q,H,j);case 2:return this.getPackedSampler2D(Q,H,j);case 3:return this.getPackedSampler3D(Q,H,j);default:return this.getPackedSamplerND(Q,H,j)}}getUnpackedSamplerFromInput(Q,H,j){let K=j.unpackedShape;switch(K.length){case 0:return this.getUnpackedSamplerScalar(Q,H,j);case 1:return this.getUnpackedSampler1D(Q,H,j);case 2:return this.getUnpackedSampler2D(Q,H,j);case 3:return this.getUnpackedSampler3D(Q,H,j);case 4:return this.getUnpackedSampler4D(Q,H,j);case 5:return this.getUnpackedSampler5D(Q,H,j);case 6:return this.getUnpackedSampler6D(Q,H,j);default:throw new Error(`Unsupported dimension ${K.length}-D`)}}getPackedSamplerScalar(Q,H){let j=r(this.context.glContext.version),K=`
+          vec4 ${Q}() {
+            return ${j.texture2D}(${H}, halfCR);
+          }
+        `;return new y(K)}getPackedSampler1D(Q,H,j){let K=[j.width,j.height],W=[K[1],K[0]],U=r(this.context.glContext.version),Z=`vec4 ${Q}(int index) {
+      vec2 uv = packedUVfrom1D(
+      ${W[0]}, ${W[1]}, index);
+      return ${U.texture2D}(${H}, uv);
+    }`;return new y(Z,["coordinates.packedUVfrom1D"])}getPackedSampler2D(Q,H,j){let K=j.unpackedShape,W=[j.width,j.height],U=r(this.context.glContext.version),Z=W[0],q=W[1];if(W!=null&&x4.arraysEqual(K,W)){let V=`vec4 ${Q}(int row, int col) {
+        vec2 uv = (vec2(col, row) + halfCR) / vec2(${q}.0, ${Z}.0);
+        return ${U.texture2D}(${H}, uv);
+      }`;return new y(V)}let G=W,J=Math.ceil(K[1]/2),X=`vec4 ${Q}(int row, int col) {
+      vec2 uv = packedUVfrom2D(${G[1]}, ${G[0]}, ${J}, row, col);
+      return ${U.texture2D}(${H}, uv);
+    }`;return new y(X,["coordinates.packedUVfrom2D"])}getPackedSampler3D(Q,H,j){let K=j.unpackedShape,W=[j.width,j.height],U=[W[0],W[1]],Z=r(this.context.glContext.version);if(K[0]===1){let R=K.slice(1),z=[1,2],Y=F4(K,R),B=["b","row","col"],k=JSON.parse(JSON.stringify(j));k.unpackedShape=Y;let w=this.getPackedSamplerFromInput(Q,H,k),A=`${w.routineBody}
+      vec4 ${Q}(int b, int row, int col) {
+        return ${Q}(${k4(B,z)});
+      } `;return new y(A,w.dependencies)}let q=U[0],G=U[1],J=Math.ceil(K[2]/2),X=J*Math.ceil(K[1]/2),V=`vec4 ${Q}(int b, int row, int col) {
+      vec2 uv = packedUVfrom3D(
+        ${G}, ${q}, ${X}, ${J}, b, row, col);
+      return ${Z.texture2D}(${H}, uv);}`;return new y(V,["coordinates.packedUVfrom3D"])}getPackedSamplerND(Q,H,j){let K=j.unpackedShape,W=K.length,U=[j.width,j.height],Z=r(this.context.glContext.version),q=[U[0],U[1]],G=q[1],J=q[0],X=Math.ceil(K[W-1]/2),V=X*Math.ceil(K[W-2]/2),R="int b, int row, int col",z=`b * ${V} + (row / 2) * ${X} + (col / 2)`;for(let B=2;B<W-1;B++)R=`int b${B}, `+R,V*=K[W-B-1],z=`b${B} * ${V} + `+z;let Y=`vec4 ${Q}(${R}) {
+      int index = ${z};
+      int texR = index / ${J};
+      int texC = index - texR * ${J};
+      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${J}, ${G});
+      return ${Z.texture2D}(${H}, uv);
+    }`;return new y(Y)}getUnpackedSamplerScalar(Q,H,j){let[K,W]=[j.width,j.height];if(K===1&&W===1){let Z=`
+          float ${Q}() {
+            return sampleTexture(${H}, halfCR);
+          }
+        `;return new y(Z,["coordinates.sampleTexture"])}let U=`
+        float ${Q}() {
+          int offset_${H} = coordsToOffset(TexCoords, ${K}, ${W});
+          vec2 uv = uvFromFlat(${K}, ${W}, offset_${H});
+          return sampleTexture(${H}, uv);
+        }
+      `;return new y(U,["coordinates.uvFromFlat","coordinates.sampleTexture","coordinates.coordsToOffset"])}getUnpackedSampler1D(Q,H,j){let{width:K,height:W}=j;if(W===1&&K===1){let Z=`
+        float ${Q}(int index) {
+          return sampleTexture(${H}, halfCR);
+        }
+      `;return new y(Z,["coordinates.sampleTexture"])}if(W===1){let Z=`
+          float ${Q}(int index) {
+            vec2 uv = vec2((float(index) + 0.5) / ${K}.0, 0.5);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(Z,["coordinates.sampleTexture"])}if(K===1){let Z=`
+          float ${Q}(int index) {
+            vec2 uv = vec2(0.5, (float(index) + 0.5) / ${W}.0);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(Z,["coordinates.sampleTexture"])}let U=`
+        float ${Q}(int index) {
+          vec2 uv = uvFromFlat(${K}, ${W}, index);
+          return sampleTexture(${H}, uv);
+        }
+      `;return new y(U,["coordinates.uvFromFlat","coordinates.sampleTexture"])}getUnpackedSampler2D(Q,H,j){let K=j.unpackedShape,W=[j.height,j.width];if(W!=null&&x4.arraysEqual(K,W)){let V=W[1],R=W[0],z=`
+          float ${Q}(int row, int col) {
+            vec2 uv = (vec2(row, col) + halfCR) / vec2(${V}.0, ${R}.0);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(z,["coordinates.sampleTexture"])}let{newShape:U,keptDims:Z}=E4(K),q=U;if(q.length<K.length){let V=F4(K,q),R=JSON.parse(JSON.stringify(j));R.unpackedShape=V;let z=["col","row"],Y=`
+          ${this.getUnpackedSamplerFromInput(Q,H,R).routineBody}
+          float ${Q}(int row, int col) {
+            return ${Q}(${k4(z,Z)});
+          }
+        `;return new y(Y,["coordinates.sampleTexture"])}let G=W[1],J=W[0];if(J===1){let V=`
+          float ${Q}(int row, int col) {
+            int offset_${H} = coordsToOffset(TexCoords, ${G}, ${J});
+            float index = dot(vec3(row, col, offset_${H}), vec3(${K[1]}, 1, 1));
+            vec2 uv = vec2(0.5, (index + 0.5) / ${G}.0);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(V,["coordinates.sampleTexture","coordinates.coordsToOffset"])}if(G===1){let V=`
+          float ${Q}(int row, int col) {
+            int offset_${H} = coordsToOffset(TexCoords, ${G}, ${J});
+            float index = dot(vec3(row, col, offset_${H}), vec3(${K[1]}, 1, 1));
+            vec2 uv = vec2((index + 0.5) / ${J}.0, 0.5);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(V,["coordinates.sampleTexture","coordinates.coordsToOffset"])}let X=`
+        float ${Q}(int row, int col) {
+          int index = col * ${K[1]} + row;
+          vec2 uv = uvFromFlat(${G}, ${J}, index);
+          return sampleTexture(${H}, uv);
+        }
+      `;return new y(X,["coordinates.uvFromFlat","coordinates.sampleTexture","coordinates.coordsToOffset"])}getUnpackedSampler3D(Q,H,j){let K=j.unpackedShape,W=K[1]*K[2],U=K[2],{newShape:Z,keptDims:q}=E4(K),G=Z;if(G.length<K.length){let R=F4(K,G),z=["batch","col","row"],Y=JSON.parse(JSON.stringify(j));Y.unpackedShape=R;let B=this.getUnpackedSamplerFromInput(Q,H,Y),k=q.reverse(),w=`
+          ${B.routineBody}
+          float ${Q}(int batch, int row, int col) {
+            return ${Q}(${k4(z,k)});
+          }
+        `;return new y(w,B.dependencies)}let{width:J,height:X}=j,V=`
+          float ${Q}(int depth, int row, int col) {
+            // Explicitly use integer operations as dot() only works on floats.
+            int index = depth * ${W} + col * ${U} + row;
+            vec2 uv = uvFromFlat(${J}, ${X}, index);
+            return sampleTexture(${H}, uv);
+          }
+      `;return new y(V,["coordinates.uvFromFlat","coordinates.sampleTexture","coordinates.coordsToOffset"])}getUnpackedSampler4D(Q,H,j){let K=j.unpackedShape,W=K[3],U=K[2]*W,Z=K[1]*U,q=j.width,G=j.height,J=`
+        float ${Q}(int row, int col, int depth, int depth2) {
+          int index = row * ${Z} + col * ${U} +
+              depth2 * ${W} + depth;
+          vec2 uv = uvFromFlat(${q}, ${G}, index);
+          return sampleTexture(${H}, uv);
+        }
+      `;return new y(J,["coordinates.uvFromFlat","coordinates.sampleTexture"])}getUnpackedSampler5D(Q,H,j){let K=j.unpackedShape,W=K[4],U=K[3]*W,Z=K[2]*U,q=K[1]*Z,{newShape:G,keptDims:J}=E4(K);if(G.length<K.length){let z=F4(K,G),Y=["row","col","depth","depth2","depth3"],B=JSON.parse(JSON.stringify(j));B.unpackedShape=z;let k=`
+          ${this.getUnpackedSamplerFromInput(Q,H,B).routineBody}
+          float ${Q}(int row, int col, int depth, int depth2, int depth3) {
+            return ${Q}(${k4(Y,J)});
+          }
+        `;return new y(k,["coordinates.sampleTexture","coordinates.uvFromFlat"])}let{width:X,height:V}=j,R=`
+        float ${Q}(int row, int col, int depth, int depth2, int depth3) {
+          int index = row * ${q} + col * ${Z} + depth * ${U} +
+          depth3 * ${W} + depth2;
+          vec2 uv = uvFromFlat(${X}, ${V}, index);
+          return sampleTexture(${H}, uv);
+        }
+      `;return new y(R,["coordinates.sampleTexture","coordinates.uvFromFlat"])}getUnpackedSampler6D(Q,H,j){let K=j.unpackedShape,W=K[5],U=K[4]*W,Z=K[3]*U,q=K[2]*Z,G=K[1]*q,{newShape:J,keptDims:X}=E4(K);if(J.length<K.length){let Y=F4(K,J),B=["row","col","depth","depth2","depth3","depth4"],k=JSON.parse(JSON.stringify(j));k.unpackedShape=Y;let w=`
+            ${this.getUnpackedSamplerFromInput(Q,H,k).routineBody}
+            float ${Q}(int row, int col, int depth,
+              int depth2, int depth3, int depth4) {
+              return ${Q}(${k4(B,X)});
+            }
+          `;return new y(w,["coordinates.sampleTexture","coordinates.uvFromFlat"])}let{width:V,height:R}=j,z=`
+          float ${Q}(int row, int col, int depth,
+            int depth2, int depth3, int depth4) {
+            int index = row * ${G} + col * ${q} + depth * ${Z} +
+            depth2 * ${U} + depth3 * ${W} + depth4;
+            vec2 uv = uvFromFlat(${V}, ${R}, index);
+            return sampleTexture(${H}, uv);
+          }
+        `;return new y(z,["coordinates.uvFromFlat","coordinates.sampleTexture","coordinates.coordsToOffset"])}toVec(){let Q=this.context.outputTextureLayout,H=Q.shape.length,j=Q.strides,K=Q.width,W=Q.height,U=[];for(let q=0;q<H-1;++q)U.push(`
+        c[${q}] = offset / ${j[q]};`),U.push(`
+        offset -= c[${q}] * ${j[q]};`);U.push(`
+        c[${H-1}] = offset;`);let Z=`
+      void toVec(vec2 texCoords, out int c[${H}]) {
+        int offset = coordsToOffset(texCoords, ${K}, ${W});
+        ${U.join("")}
+      }
+      void toVec(int offset, out int c[${H}]) {
+        ${U.join("")}
+      }
+    `;return{toVec:new y(Z,["coordinates.coordsToOffset"])}}valueFrom(){let Q={};return this.context.programInfo.inputNames.forEach((H,j)=>{let K=this.context.inputTextureLayouts[j],W=(K.unpackedShape.length>0?K.unpackedShape:K.shape).length,U=`_${H}`;Q[U]=new y(this.getValueFromSingle(H,W,K.width,K.height,!1),[`shapeUtils.indicesToOffset${U}`,"coordinates.offsetToCoords","fragcolor.getColorAsFloat"]),U=U+"_T",Q[U]=new y(this.getValueFromSingle(H,W,K.width,K.height,!0),[`shapeUtils.indicesToOffset${U}`,"coordinates.offsetToCoords","fragcolor.getColorAsFloat"])}),Q}getValueFromSingle(Q,H,j,K,W){let U=`_${Q}`;W&&(U=U+"_T");let Z=r(this.context.glContext.version);return`
+        float ${U}(int m[${H}]) {
+          int offset = indicesToOffset${U}(m);
+          vec2 coords = offsetToCoords(offset, ${j}, ${K});
+          float value = getColorAsFloat(${Z.texture2D}(${Q}, coords));
+          return value;
+        }
+        `}getPackedValueFrom(Q,H,j,K,W){let U=`_${Q}_Pack`;W&&(U=U+"_T");let Z=r(this.context.glContext.version);return`
+        vec4 ${U}(int m[${H}]) {
+          int offset = indicesToOffset_${Q}(m);
+          vec2 coords = offsetToCoords(offset, ${j}, ${K});
+          return ${Z.texture2D}(${Q}, coords);
+        }
+        `}}}),YJ,rj=E(()=>{E3(),YJ=class Q extends q4{constructor(H){super(H)}getFunctions(){return{...this.encodeFloat32(),...this.decodeFloat32()}}getCustomTypes(){return{}}encodeFloat32(){return{encode:new y(`highp vec4 encode(highp float f) {
+        return vec4(f, 0.0, 0.0, 0.0);
+      }
+        `)}}decodeFloat32(){return{decode:new y(`highp float decode(highp vec4 rgba) {
+        return rgba.r;
+      }
+        `)}}encodeUint8(){let H=Q.isLittleEndian()?"rgba.rgba=rgba.abgr;":"";return{encode:new y(`
+      highp vec4 encode(highp float f) {
+        highp float F = abs(f);
+        highp float Sign = step(0.0,-f);
+        highp float Exponent = floor(log2(F));
+        highp float Mantissa = (exp2(- Exponent) * F);
+        Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa));
+        highp vec4 rgba;
+        rgba[0] = 128.0 * Sign  + floor(Exponent*exp2(-1.0));
+        rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0);
+        rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0)));
+        rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0)));
+        ${H}
+        rgba = rgba / 255.0; // values need to be normalized to [0,1]
+        return rgba;
+    }
+        `)}}decodeUint8(){let H=Q.isLittleEndian()?"rgba.rgba=rgba.abgr;":"";return{decode:new y(`
+        highp float decode(highp vec4 rgba) {
+          rgba = rgba * 255.0; // values need to be de-normalized from [0,1] to [0,255]
+          ${H}
+          highp float Sign = 1.0 - step(128.0,rgba[0])*2.0;
+          highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0;
+          highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000);
+          highp float Result =  Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 ));
+          return Result;
+      }
+        `)}}static isLittleEndian(){let H=new ArrayBuffer(4),j=new Uint32Array(H),K=new Uint8Array(H);if(j[0]=3735928559,K[0]===239)return!0;if(K[0]===222)return!1;throw new Error("unknown endianness")}}}),CJ,tj=E(()=>{E3(),W1(),CJ=class extends q4{constructor(Q){super(Q)}getFunctions(){return{...this.setFragColor(),...this.getColorAsFloat()}}getCustomTypes(){return{}}setFragColor(){let Q=r(this.context.glContext.version);return{setFragColor:new y(`
+        void setFragColor(float value) {
+            ${Q.output} = encode(value);
+        }
+        `,["encoding.encode"])}}getColorAsFloat(){return{getColorAsFloat:new y(`
+        float getColorAsFloat(vec4 color) {
+            return decode(color);
+        }
+        `,["encoding.decode"])}}}}),BJ,ej=E(()=>{E3(),BJ=class Q extends q4{constructor(H){super(H)}getFunctions(){return{...this.bcastIndex(),...this.bcastMatmulIndex(),...this.offsetToIndices(),...this.indicesToOffset(),...this.incrementIndices()}}getCustomTypes(){return{}}bcastIndex(){let H=this.context.outputTextureLayout.shape.length,j={};return this.context.programInfo.inputNames.forEach((K,W)=>{let U=this.context.inputTextureLayouts[W].unpackedShape;if(U.length<=H){let Z=U.length,q=H-Z,G=`bcastIndices_${K}`,J="";for(let V=0;V<Z;++V)J+=`
+          realIndices[${V}] = int( mod(float(bcastedIndices[${q+V}]), ${U[V]}.0) );
+          `;let X=`
+        void ${G} (int bcastedIndices[${H}], out int realIndices[${Z}]) {
+          ${J}
+        }
+        `;j[G]=new y(X)}}),j}bcastMatmulIndex(){let H=this.context.outputTextureLayout.shape.length,j={};return this.context.programInfo.inputNames.forEach((K,W)=>{let U=this.context.inputTextureLayouts[W].shape;if(!(U.length<2||U.length>H)){let Z=U.length,q=H-Z,G=`bcastMatmulIndices_${K}`,J="";for(let V=0;V<Z-2;++V)J+=`
+          realIndices[${V}] = int( mod(float(bcastedIndices[${q+V}]), ${U[V]}.0) );
+          `;let X=`
+        void ${G}(int bcastedIndices[${H}], out int realIndices[${Z}]) {
+          ${J}
+          realIndices[${Z-1}] = bcastedIndices[${H-1}];
+          realIndices[${Z-2}] = bcastedIndices[${H-2}];
+        }
+        `;j[G]=new y(X)}}),j}indicesToOffset(){let H={};return this.context.programInfo.inputNames.forEach((j,K)=>{let W=this.context.inputTextureLayouts[K].shape,U=this.context.inputTextureLayouts[K].strides,Z=W.length,q=`indicesToOffset_${j}`;H[q]=new y(Q.indexToOffsetSingle(q,Z,U)),q=`indicesToOffset_${j}_T`,H[q]=new y(Q.indexToOffsetSingle(q,Z,U.slice().reverse()))}),H}static indexToOffsetSingle(H,j,K){let W="";for(let U=j-1;U>=0;--U)W+=`
+        offset += indices[${U}] * ${K[U]};
+        `;return`
+      int ${H}(int indices[${j}]) {
+        int offset = 0;
+        ${W}
+        return offset;
+      }
+      `}offsetToIndices(){let H={};return this.context.programInfo.inputNames.forEach((j,K)=>{let W=this.context.inputTextureLayouts[K].shape,U=this.context.inputTextureLayouts[K].strides,Z=W.length,q=`offsetToIndices_${j}`;H[q]=new y(Q.offsetToIndicesSingle(q,Z,U)),q=`offsetToIndices_${j}_T`,H[q]=new y(Q.offsetToIndicesSingle(q,Z,U.slice().reverse()))}),H}static offsetToIndicesSingle(H,j,K){let W=[];for(let U=0;U<j-1;++U)W.push(`
+      indices[${U}] = offset / ${K[U]};`),W.push(`
+        offset -= indices[${U}] * ${K[U]};`);return W.push(`
+      indices[${j-1}] = offset;`),`
+      void ${H}(int offset, out int indices[${j}]) {
+        ${W.join("")}
+      }
+      `}incrementIndices(){let H={};return this.context.programInfo.inputNames.forEach((j,K)=>{let W=this.context.inputTextureLayouts[K].shape,U=W.length,Z=`incrementIndices_${j}`,q="";for(let J=0;J<U;++J)q+=`
+        shape[${J}] = ${W[J]};`;let G=`
+        void ${Z}(int axis, out int indices[${U}]) {
+          int shape[${U}];
+          ${q};
+          for(int i = ${U} -1 ; i >= 0; --i) {
+            if(i > axis) continue;
+            indices[i] += 1;
+            if(indices[i] < shape[i]) {
+              break;
+            }
+            indices[i] = 0;
+          }
+        }
+        `;H[Z]=new y(G)}),H}}}),FJ,QV=E(()=>{E3(),FJ=class extends q4{constructor(Q){super(Q)}getCustomTypes(){return{}}getFunctions(){return{...this.binaryVecFunctions(),...this.copyVec(),...this.setVecItem(),...this.getVecItem()}}binaryVecFunctions(){let Q=this.context.outputTextureLayout.shape.length,H={add:"+=",sub:"-=",mul:"*=",div:"/="},j={};for(let K in H){let W=`${K}Vec`,U="";for(let q=0;q<Q;++q)U+=`
+          dest[${q}] ${H[K]} src[${q}];
+          `;let Z=`
+        void ${W}(int src[${Q}], out int dest[${Q}]) {
+          ${U}
+        }
+        `;j[W]=new y(Z)}return j}copyVec(){let Q=this.context.outputTextureLayout.shape.length,H="";for(let K=0;K<Q;++K)H+=`
+        dest[${K}] = src[${K}];
+        `;let j=`
+      void copyVec(int src[${Q}], out int dest[${Q}]) {
+        ${H}
+      }
+      `;return{copyVec:new y(j)}}setVecItem(){let Q=this.context.outputTextureLayout.shape.length,H=`
+        if(index < 0)
+            index =${Q} + index;
+        if (index == 0)
+            m[0] = value;
+        `;for(let K=1;K<Q-1;++K)H+=`
+        else if (index == ${K})
+            m[${K}] = value;
+            `;H+=`
+        else
+            m[${Q-1}] = value;
+        `;let j=`
+      void setVecItem(out int m[${Q}], int index, int value) {
+        ${H}
+      }
+        `;return{setVecItem:new y(j)}}getVecItem(){let Q=this.context.outputTextureLayout.shape.length,H=`
+        if(index < 0)
+            index = ${Q} + index;
+        if (index == 0)
+            return m[0];
+      `;for(let K=1;K<Q-1;++K)H+=`
+        else if (index == ${K})
+            return m[${K}];
+      `;H+=`
+        else
+            return m[${Q-1}];
+        `;let j=`
+      int getVecItem(int m[${Q}], int index) {
+        ${H}
+      }
+    `;return{getVecItem:new y(j)}}}}),c6,JV=E(()=>{nj(),rj(),tj(),ej(),QV(),c6={encoding:YJ,fragcolor:CJ,vec:FJ,shapeUtils:BJ,coordinates:MJ}}),kJ,HV=E(()=>{E3(),aj(),JV(),W1(),kJ=class{constructor(Q,H,j,K){this.libs={},this.glslLibRoutineDependencyGraph={},this.context=new W0(Q,H,j,K),Object.keys(c6).forEach((U)=>{let Z=new c6[U](this.context);this.libs[U]=Z});let W=this.glslLibRoutineDependencyGraph;for(let U in this.libs){let Z=this.libs[U].getFunctions();for(let q in Z){let G=U+"."+q,J;W[G]?(J=W[G],J.routineBody=Z[q].routineBody):(J=new D6(G,Z[q].routineBody),W[G]=J);let X=Z[q].dependencies;if(X)for(let V=0;V<X.length;++V)if(W[X[V]])J.addDependency(W[X[V]]);else{let R=new D6(X[V]);W[X[V]]=R,J.addDependency(R)}}}}preprocess(){let Q=this.context.programInfo,H=Q.shaderSource;return this.context.programInfo.hasMain||(H=`${H}
+      ${TH(this.context.glContext.version,this.context.outputTextureLayout.shape.length)}`),H=kZ(H),`${wH(this.context.glContext.version)}
+    ${this.getUniforms(Q.inputNames,Q.variables)}
+    ${this.getImports(H)}
+    ${H}`}getImports(Q){let H=this.selectGlslLibRoutinesToBeIncluded(Q);if(H.length===0)return"";let j="";for(let K=0;K<H.length;++K)if(H[K].routineBody)j+=H[K].routineBody+`
+`;else throw new Error(`Missing body for the Glsl Library routine: ${H[K].name}`);return j}selectGlslLibRoutinesToBeIncluded(Q){let H=[];return Object.keys(this.glslLibRoutineDependencyGraph).forEach((j)=>{let K=j.split(".")[1];Q.indexOf(K)!==-1&&H.push(this.glslLibRoutineDependencyGraph[j])}),G0.returnOrderedNodes(H)}getUniforms(Q,H){let j=[];if(Q)for(let K of Q)j.push(`uniform sampler2D ${K};`);if(H)for(let K of H)j.push(`uniform ${K.type} ${K.name}${K.arrayLength?`[${K.arrayLength}]`:""};`);return j.join(`
+`)}}}),AJ,ZV=E(()=>{z3(),V3(),HV(),W1(),AJ=class{constructor(Q,H,j){this.profiler=Q,this.glContext=H,this.textureLayoutStrategy=j,this.repo=new Map,this.attributesBound=!1}getArtifact(Q){return this.repo.get(Q)}setArtifact(Q,H){this.repo.set(Q,H)}run(Q,H,j){this.profiler.event("op",`ProgramManager.run ${Q.programInfo.name??"unknown kernel"}`,()=>{let K=this.glContext.gl,W=Q.program;K.useProgram(W);try{this.bindOutput(j),this.attributesBound||this.bindAttributes(Q.attribLocations),this.bindUniforms(Q.uniformLocations,Q.programInfo.variables??[],H)}catch(U){throw C1.error("ProgramManager",Q.programInfo.shaderSource),U}this.profiler.event("backend","GlContext.draw()",()=>{this.glContext.draw()})},this.glContext)}dispose(){this.vertexShader&&this.glContext.deleteShader(this.vertexShader),this.repo.forEach((Q)=>this.glContext.deleteProgram(Q.program))}build(Q,H,j){return this.profiler.event("backend","ProgramManager.build",()=>{let K=new kJ(this.glContext,Q,H,j),W=K.preprocess(),U=this.compile(W);return{programInfo:Q,program:U,uniformLocations:this.getUniformLocations(U,K.context.programInfo.inputNames,K.context.programInfo.variables),attribLocations:this.getAttribLocations(U)}})}compile(Q){if(!this.vertexShader){C1.verbose("ProrgramManager","Compiling and caching Vertex shader for the first time");let K=vH(this.glContext.version);this.vertexShader=this.glContext.compileShader(K,this.glContext.gl.VERTEX_SHADER)}i.debug&&C1.verbose("ProrgramManager",`FragShader:
+${Q}
+`);let H=this.glContext.compileShader(Q,this.glContext.gl.FRAGMENT_SHADER),j=this.glContext.createProgram(this.vertexShader,H);return this.glContext.deleteShader(H),j}bindOutput(Q){let{width:H,height:j}=Q;C1.verbose("ProrgramManager",`Binding output texture to Framebuffer: w/h=${H}/${j}, shape=${Q.shape}, type=${Q.tensor.type}`),this.glContext.attachFramebuffer(Q.texture,H,j)}bindAttributes(Q){let{position:H,textureCoord:j}=Q;this.glContext.setVertexAttributes(H,j),this.attributesBound=!0}bindUniforms(Q,H,j){let K=this.glContext.gl,W=0;for(let{name:U,type:Z,location:q,arrayLength:G}of Q){let J=H.find((X)=>X.name===U)?.data;if(Z!=="sampler2D"&&!J)throw new Error(`variable '${U}' does not have data defined in program info`);switch(Z){case"sampler2D":this.bindTexture(j[W],q,W),W++;break;case"float":G?K.uniform1fv(q,J):K.uniform1f(q,J);break;case"int":G?K.uniform1iv(q,J):K.uniform1i(q,J);break;default:throw new Error(`Uniform not implemented: ${Z}`)}}}bindTexture(Q,H,j){this.glContext.bindTextureToUniform(Q.texture,j,H)}getAttribLocations(Q){return{position:this.getAttribLocation(Q,"position"),textureCoord:this.getAttribLocation(Q,"textureCoord")}}getUniformLocations(Q,H,j){let K=[];if(H)for(let W of H)K.push({name:W,type:"sampler2D",location:this.getUniformLocation(Q,W)});if(j)for(let W of j)K.push({...W,location:this.getUniformLocation(Q,W.name)});return K}getUniformLocation(Q,H){let j=this.glContext.gl.getUniformLocation(Q,H);if(j===null)throw new Error(`Uniform ${H} not found.`);return j}getAttribLocation(Q,H){return this.glContext.gl.getAttribLocation(Q,H)}}}),SJ,jV=E(()=>{V3(),z5(),SJ=class{constructor(Q,H,j,K){this.glContext=Q,this.layoutStrategy=H,this.profiler=j,this.config=K,this.pendingRead=new Map,K.reuseTextures&&(this.inUseTextures=new Map,this.idleTextures=new Map,this.textureLookup=new Map)}createTextureFromLayout(Q,H,j,K){let W=this.toEncoderType(Q),U=this.glContext.getEncoder(W,H.channels||1,K);if(H.isPacked&&K===1)throw new Error("not implemented");let{width:Z,height:q}=H,G,J;if(this.config.reuseTextures){G=`${Z}x${q}_${U.format}_${U.internalFormat}_${U.textureType}`,J=this.inUseTextures.get(G),J||(J=[],this.inUseTextures.set(G,J));let V=this.idleTextures.get(G);if(V&&V.length>0){let R=V.pop();return J.push(R),K===1&&this.glContext.updateTexture(R,Z,q,U,this.toTextureData(Q,j)),R}}C1.verbose("TextureManager",`Creating new texture of size ${H.width}x${H.height}`);let X=this.glContext.allocateTexture(Z,q,U,this.toTextureData(Q,j));return this.config.reuseTextures&&(J.push(X),this.textureLookup.set(X,G)),X}readTexture(Q,H,j){return j||(j=1),this.profiler.event("backend","TextureManager.readTexture",()=>{let K=Q.shape.reduce((U,Z)=>U*Z)*j,W=this.glContext.readTexture(Q.texture,Q.width,Q.height,K,this.toEncoderType(H),j);return this.toTensorData(H,W)})}async readTextureAsync(Q,H,j){let K=Q.tensor.dataId;if(j||(j=1),this.pendingRead.has(K)){let W=this.pendingRead.get(K);return new Promise((U)=>W?.push(U))}return this.profiler.event("backend","TextureManager.readTextureAsync",async()=>{this.pendingRead.set(K,[]);let W=Q.shape.reduce((G,J)=>G*J)*j;await this.glContext.createAndWaitForFence();let U=this.glContext.readTexture(Q.texture,Q.width,Q.height,W,this.toEncoderType(H),j),Z=this.toTensorData(H,U),q=this.pendingRead.get(K);return this.pendingRead.delete(K),q?.forEach((G)=>G(Z)),Z})}readUint8TextureAsFloat(Q){return this.profiler.event("backend","TextureManager.readUint8TextureAsFloat",()=>{let H=Q.shape.reduce((K,W)=>K*W),j=this.glContext.readTexture(Q.texture,Q.width,Q.height,H*4,"byte",4);return new Float32Array(j.buffer,j.byteOffset,H)})}releaseTexture(Q,H){let j;if(this.config.reuseTextures&&(j=this.textureLookup.get(Q.texture),j)){H&&this.textureLookup.delete(j);let K=this.inUseTextures.get(j);if(K){let W=K.indexOf(Q.texture);if(W!==-1){K.splice(W,1);let U=this.idleTextures.get(j);U||(U=[],this.idleTextures.set(j,U)),U.push(Q.texture)}}}(!j||H)&&(C1.verbose("TextureManager",`Deleting texture of size ${Q.width}x${Q.height}`),this.glContext.deleteTexture(Q.texture))}toTensorData(Q,H){switch(Q){case"int16":return H instanceof Int16Array?H:Int16Array.from(H);case"int32":return H instanceof Int32Array?H:Int32Array.from(H);case"int8":return H instanceof Int8Array?H:Int8Array.from(H);case"uint16":return H instanceof Uint16Array?H:Uint16Array.from(H);case"uint32":return H instanceof Uint32Array?H:Uint32Array.from(H);case"uint8":case"bool":return H instanceof Uint8Array?H:Uint8Array.from(H);case"float32":return H instanceof Float32Array?H:Float32Array.from(H);case"float64":return H instanceof Float64Array?H:Float64Array.from(H);default:throw new Error(`TensorData type ${Q} is not supported`)}}toTextureData(Q,H){if(H)return H instanceof Float32Array?H:new Float32Array(H)}toEncoderType(Q){return"float"}clearActiveTextures(){this.glContext.clearActiveTextures()}}}),$J,VV=E(()=>{V3(),aZ(),Cj(),oj(),ZV(),NJ(),jV(),$J=class{constructor(Q,H){this.backend=Q,this.context=H,this.layoutStrategy=new zJ(Q.glContext.maxTextureSize),this.programManager=new AJ(this.context.profiler,Q.glContext,this.layoutStrategy),this.textureManager=new SJ(Q.glContext,this.layoutStrategy,this.context.profiler,{reuseTextures:Q.textureCacheMode==="full"}),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map,this.pack=Q.pack,this.pack2unpackMap=new Map,this.unpack2packMap=new Map}createInferenceHandler(){return new K0(this)}onGraphInitialized(Q){let H=Q.getValues().filter((j)=>j.from===-1&&j.tensor).map((j)=>j.tensor.dataId);this.initializers=new Set(H)}isInitializer(Q){return this.initializers?this.initializers.has(Q):!1}addInitializer(Q){this.initializers.add(Q)}getTextureData(Q,H){return H?this.packedTextureDataCache.get(Q):this.unpackedTextureDataCache.get(Q)}setTextureData(Q,H,j=!1){C1.verbose("WebGLSessionHandler","Storing Texture data in cache"),j?this.packedTextureDataCache.set(Q,H):this.unpackedTextureDataCache.set(Q,H)}dispose(){this.programManager.dispose(),this.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach((Q)=>this.textureManager.releaseTexture(Q,!0)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach((Q)=>this.textureManager.releaseTexture(Q,!0)),this.unpackedTextureDataCache=new Map}resolve(Q,H,j){let K=AH(Q,H,GJ);return{impl:K.opImpl,context:K.opInit?K.opInit(Q,j):Q}}}}),f6,XV=E(()=>{z3(),z5(),z5(),F3(),f6=class{constructor(Q,H){this.frameBufferBound=!1,this.itemsToPoll=[],this.gl=Q,this.version=H,this.getExtensions(),this.vertexbuffer=this.createVertexbuffer(),this.framebuffer=this.createFramebuffer(),this.queryVitalParameters()}allocateTexture(Q,H,j,K){let W=this.gl,U=W.createTexture();W.bindTexture(W.TEXTURE_2D,U),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MIN_FILTER,W.NEAREST),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_MAG_FILTER,W.NEAREST),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_WRAP_S,W.CLAMP_TO_EDGE),W.texParameteri(W.TEXTURE_2D,W.TEXTURE_WRAP_T,W.CLAMP_TO_EDGE);let Z=K?j.encode(K,Q*H):null;return W.texImage2D(W.TEXTURE_2D,0,j.internalFormat,Q,H,0,j.format,j.textureType,Z),this.checkError(),U}updateTexture(Q,H,j,K,W){let U=this.gl;U.bindTexture(U.TEXTURE_2D,Q);let Z=K.encode(W,H*j);U.texSubImage2D(U.TEXTURE_2D,0,0,0,H,j,K.format,K.textureType,Z),this.checkError()}attachFramebuffer(Q,H,j){let K=this.gl;K.bindTexture(K.TEXTURE_2D,Q),K.bindFramebuffer(K.FRAMEBUFFER,this.framebuffer),K.framebufferTexture2D(K.FRAMEBUFFER,K.COLOR_ATTACHMENT0,K.TEXTURE_2D,Q,0),this.checkError(),K.viewport(0,0,H,j),K.scissor(0,0,H,j)}readTexture(Q,H,j,K,W,U){let Z=this.gl;U||(U=1),this.frameBufferBound||this.attachFramebuffer(Q,H,j);let q=this.getEncoder(W,U),G=q.allocate(H*j);return Z.bindTexture(Z.TEXTURE_2D,Q),Z.framebufferTexture2D(Z.FRAMEBUFFER,Z.COLOR_ATTACHMENT0,Z.TEXTURE_2D,Q,0),Z.readPixels(0,0,H,j,Z.RGBA,q.textureType,G),this.checkError(),q.decode(G,K)}isFramebufferReady(){return!0}getActiveTexture(){let Q=this.gl;return`TEXTURE${Q.getParameter(this.gl.ACTIVE_TEXTURE)-Q.TEXTURE0}`}getTextureBinding(){return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D)}getFramebufferBinding(){return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING)}setVertexAttributes(Q,H){let j=this.gl;j.vertexAttribPointer(Q,3,j.FLOAT,!1,20,0),j.enableVertexAttribArray(Q),H!==-1&&(j.vertexAttribPointer(H,2,j.FLOAT,!1,20,12),j.enableVertexAttribArray(H)),this.checkError()}createProgram(Q,H){let j=this.gl,K=j.createProgram();return j.attachShader(K,Q),j.attachShader(K,H),j.linkProgram(K),K}compileShader(Q,H){let j=this.gl,K=j.createShader(H);if(!K)throw new Error(`createShader() returned null with type ${H}`);if(j.shaderSource(K,Q),j.compileShader(K),j.getShaderParameter(K,j.COMPILE_STATUS)===!1)throw new Error(`Failed to compile shader: ${j.getShaderInfoLog(K)}
+Shader source:
+${Q}`);return K}deleteShader(Q){this.gl.deleteShader(Q)}bindTextureToUniform(Q,H,j){let K=this.gl;K.activeTexture(K.TEXTURE0+H),this.checkError(),K.bindTexture(K.TEXTURE_2D,Q),this.checkError(),K.uniform1i(j,H),this.checkError()}draw(){this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4),this.checkError()}checkError(){if(i.debug){let Q=this.gl,H=Q.getError(),j="";switch(H){case Q.NO_ERROR:return;case Q.INVALID_ENUM:j="INVALID_ENUM";break;case Q.INVALID_VALUE:j="INVALID_VALUE";break;case Q.INVALID_OPERATION:j="INVALID_OPERATION";break;case Q.INVALID_FRAMEBUFFER_OPERATION:j="INVALID_FRAMEBUFFER_OPERATION";break;case Q.OUT_OF_MEMORY:j="OUT_OF_MEMORY";break;case Q.CONTEXT_LOST_WEBGL:j="CONTEXT_LOST_WEBGL";break;default:j=`Unknown WebGL Error: ${H.toString(16)}`}throw new Error(j)}}deleteTexture(Q){this.gl.deleteTexture(Q)}deleteProgram(Q){this.gl.deleteProgram(Q)}getEncoder(Q,H,j=0){if(this.version===2)return new j0(this.gl,H);switch(Q){case"float":return j===1||this.isRenderFloat32Supported?new w6(this.gl,H):new w6(this.gl,H,this.textureHalfFloatExtension.HALF_FLOAT_OES);case"int":throw new Error("not implemented");case"byte":return new V0(this.gl,H);default:throw new Error(`Invalid dataType: ${Q}`)}}clearActiveTextures(){let Q=this.gl;for(let H=0;H<this.maxTextureImageUnits;++H)Q.activeTexture(Q.TEXTURE0+H),Q.bindTexture(Q.TEXTURE_2D,null)}dispose(){if(this.disposed)return;let Q=this.gl;Q.bindFramebuffer(Q.FRAMEBUFFER,null),Q.deleteFramebuffer(this.framebuffer),Q.bindBuffer(Q.ARRAY_BUFFER,null),Q.deleteBuffer(this.vertexbuffer),Q.bindBuffer(Q.ELEMENT_ARRAY_BUFFER,null),Q.finish(),this.disposed=!0}createDefaultGeometry(){return new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0])}createVertexbuffer(){let Q=this.gl,H=Q.createBuffer();if(!H)throw new Error("createBuffer() returned null");let j=this.createDefaultGeometry();return Q.bindBuffer(Q.ARRAY_BUFFER,H),Q.bufferData(Q.ARRAY_BUFFER,j,Q.STATIC_DRAW),this.checkError(),H}createFramebuffer(){let Q=this.gl.createFramebuffer();if(!Q)throw new Error("createFramebuffer returned null");return Q}queryVitalParameters(){let Q=this.gl;if(this.isFloatTextureAttachableToFrameBuffer=this.checkFloatTextureAttachableToFrameBuffer(),this.isRenderFloat32Supported=this.checkRenderFloat32(),this.isFloat32DownloadSupported=this.checkFloat32Download(),this.version===1&&!this.textureHalfFloatExtension&&!this.isRenderFloat32Supported)throw new Error("both float32 and float16 TextureType are not supported");this.isBlendSupported=!this.isRenderFloat32Supported||this.checkFloat32Blend(),this.maxTextureSize=Q.getParameter(Q.MAX_TEXTURE_SIZE),this.maxTextureImageUnits=Q.getParameter(Q.MAX_TEXTURE_IMAGE_UNITS),this.version}getExtensions(){this.version===2?(this.colorBufferFloatExtension=this.gl.getExtension("EXT_color_buffer_float"),this.disjointTimerQueryWebgl2Extension=this.gl.getExtension("EXT_disjoint_timer_query_webgl2")):(this.textureFloatExtension=this.gl.getExtension("OES_texture_float"),this.textureHalfFloatExtension=this.gl.getExtension("OES_texture_half_float"))}checkFloatTextureAttachableToFrameBuffer(){let Q=this.gl,H=Q.createTexture();Q.bindTexture(Q.TEXTURE_2D,H);let j=this.version===2?Q.RGBA32F:Q.RGBA;Q.texImage2D(Q.TEXTURE_2D,0,j,1,1,0,Q.RGBA,Q.FLOAT,null);let K=Q.createFramebuffer();Q.bindFramebuffer(Q.FRAMEBUFFER,K),Q.framebufferTexture2D(Q.FRAMEBUFFER,Q.COLOR_ATTACHMENT0,Q.TEXTURE_2D,H,0);let W=Q.checkFramebufferStatus(Q.FRAMEBUFFER)===Q.FRAMEBUFFER_COMPLETE;return Q.bindTexture(Q.TEXTURE_2D,null),Q.bindFramebuffer(Q.FRAMEBUFFER,null),Q.deleteTexture(H),Q.deleteFramebuffer(K),W}checkRenderFloat32(){if(this.version===2){if(!this.colorBufferFloatExtension)return!1}else if(!this.textureFloatExtension)return!1;return this.isFloatTextureAttachableToFrameBuffer}checkFloat32Download(){if(this.version===2){if(!this.colorBufferFloatExtension)return!1}else if(!this.textureFloatExtension||!this.gl.getExtension("WEBGL_color_buffer_float"))return!1;return this.isFloatTextureAttachableToFrameBuffer}checkFloat32Blend(){let Q=this.gl,H,j,K,W,U;try{H=Q.createTexture(),j=Q.createFramebuffer(),Q.bindTexture(Q.TEXTURE_2D,H);let Z=this.version===2?Q.RGBA32F:Q.RGBA;return Q.texImage2D(Q.TEXTURE_2D,0,Z,1,1,0,Q.RGBA,Q.FLOAT,null),Q.bindFramebuffer(Q.FRAMEBUFFER,j),Q.framebufferTexture2D(Q.FRAMEBUFFER,Q.COLOR_ATTACHMENT0,Q.TEXTURE_2D,H,0),Q.enable(Q.BLEND),K=Q.createShader(Q.VERTEX_SHADER),!K||(Q.shaderSource(K,"void main(){}"),Q.compileShader(K),W=Q.createShader(Q.FRAGMENT_SHADER),!W)||(Q.shaderSource(W,"precision highp float;void main(){gl_FragColor=vec4(0.5);}"),Q.compileShader(W),U=Q.createProgram(),!U)?!1:(Q.attachShader(U,K),Q.attachShader(U,W),Q.linkProgram(U),Q.useProgram(U),Q.drawArrays(Q.POINTS,0,1),Q.getError()===Q.NO_ERROR)}finally{Q.disable(Q.BLEND),U&&Q.deleteProgram(U),K&&Q.deleteShader(K),W&&Q.deleteShader(W),j&&(Q.bindFramebuffer(Q.FRAMEBUFFER,null),Q.deleteFramebuffer(j)),H&&(Q.bindTexture(Q.TEXTURE_2D,null),Q.deleteTexture(H))}}beginTimer(){if(this.version===2&&this.disjointTimerQueryWebgl2Extension){let Q=this.gl,H=this.disjointTimerQueryWebgl2Extension,j=Q.createQuery();return Q.beginQuery(H.TIME_ELAPSED_EXT,j),j}else throw new Error("WebGL1 profiling currently not supported.")}endTimer(){if(this.version===2&&this.disjointTimerQueryWebgl2Extension){let Q=this.gl,H=this.disjointTimerQueryWebgl2Extension;Q.endQuery(H.TIME_ELAPSED_EXT);return}else throw new Error("WebGL1 profiling currently not supported")}isTimerResultAvailable(Q){let H=!1,j=!1;if(this.version===2&&this.disjointTimerQueryWebgl2Extension){let K=this.gl,W=this.disjointTimerQueryWebgl2Extension;H=K.getQueryParameter(Q,K.QUERY_RESULT_AVAILABLE),j=K.getParameter(W.GPU_DISJOINT_EXT)}else throw new Error("WebGL1 profiling currently not supported");return H&&!j}getTimerResult(Q){let H=0;if(this.version===2){let j=this.gl;H=j.getQueryParameter(Q,j.QUERY_RESULT),j.deleteQuery(Q)}else throw new Error("WebGL1 profiling currently not supported");return H/1e6}async waitForQueryAndGetTime(Q){return await u7(()=>this.isTimerResultAvailable(Q)),this.getTimerResult(Q)}async createAndWaitForFence(){let Q=this.createFence(this.gl);return this.pollFence(Q)}createFence(Q){let H,j=Q,K=j.fenceSync(j.SYNC_GPU_COMMANDS_COMPLETE,0);return Q.flush(),K===null?H=()=>!0:H=()=>{let W=j.clientWaitSync(K,0,0);return W===j.ALREADY_SIGNALED||W===j.CONDITION_SATISFIED},{query:K,isFencePassed:H}}async pollFence(Q){return new Promise((H)=>{this.addItemToPoll(()=>Q.isFencePassed(),()=>H())})}pollItems(){let Q=LZ(this.itemsToPoll.map((H)=>H.isDoneFn));for(let H=0;H<=Q;++H){let{resolveFn:j}=this.itemsToPoll[H];j()}this.itemsToPoll=this.itemsToPoll.slice(Q+1)}async addItemToPoll(Q,H){this.itemsToPoll.push({isDoneFn:Q,resolveFn:H}),!(this.itemsToPoll.length>1)&&await u7(()=>(this.pollItems(),this.itemsToPoll.length===0))}}}),u3,KV=E(()=>{V3(),XV(),u3={}}),LJ,UV=E(()=>{z3(),V3(),VV(),KV(),LJ=class{get contextId(){return i.webgl.contextId}set contextId(Q){i.webgl.contextId=Q}get matmulMaxBatchSize(){return i.webgl.matmulMaxBatchSize}set matmulMaxBatchSize(Q){i.webgl.matmulMaxBatchSize=Q}get textureCacheMode(){return i.webgl.textureCacheMode}set textureCacheMode(Q){i.webgl.textureCacheMode=Q}get pack(){return i.webgl.pack}set pack(Q){i.webgl.pack=Q}get async(){return i.webgl.async}set async(Q){i.webgl.async=Q}initialize(){try{return this.glContext=T2(this.contextId),typeof this.matmulMaxBatchSize!="number"&&(this.matmulMaxBatchSize=16),typeof this.textureCacheMode!="string"&&(this.textureCacheMode="full"),typeof this.pack!="boolean"&&(this.pack=!1),typeof this.async!="boolean"&&(this.async=!1),C1.setWithEnv(i),i.webgl.context||Object.defineProperty(i.webgl,"context",{value:this.glContext.gl}),C1.verbose("WebGLBackend",`Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${this.async}.`),!0}catch(Q){return C1.warning("WebGLBackend",`Unable to initialize WebGLBackend. ${Q}`),!1}}createSessionHandler(Q){return new $J(this,Q)}dispose(){this.glContext.dispose()}}}),U7,vJ,qV=E(()=>{UV(),U7=new Map,vJ={webgl:new LJ}}),H2,wJ,WV=E(()=>{V3(),H2=class{constructor(Q,H){this.op=Q,this.node=H}},wJ=class{constructor(Q,H,j){this.graph=Q,this.profiler=j,this.initialize(H)}initialize(Q){this.profiler.event("session","ExecutionPlan.initialize",()=>{let H=this.graph.getNodes();if(H.length!==Q.length)throw new Error("The size of nodes and OPs do not match.");this._ops=Q.map((j,K)=>new H2(j,H[K])),this.reset(),this._starter=[],this._ops.forEach((j,K)=>{let W=!0;for(let U of j.node.inputs)if(!this._values[U]&&this.graph.getInputIndices().indexOf(U)===-1){W=!1;break}W&&this._starter.push(K)})})}reset(){this._values=this.graph.getValues().map((Q)=>Q.tensor)}async execute(Q,H){return this.profiler.event("session","ExecutionPlan.execute",async()=>{this.reset();let j=Q.createInferenceHandler(),K=this.graph.getInputIndices();if(H.length!==K.length)throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${H.length} expected: ${K.length}`);H.forEach((J,X)=>{let V=K[X];this._values[V]=J});let W=this._starter.slice(0),U=this.graph.getValues(),Z=this.graph.getNodes(),q=0;for(;q<W.length;){let J=W[q++],X=this._ops[J],V=X.node.inputs.map((B)=>this._values[B]);if(V.indexOf(void 0)!==-1)throw new Error(`unresolved input detected: op: ${X.node}`);let R=V;C1.verbose("ExecPlan",`Runing op:${X.node.name} (${R.map((B,k)=>`'${X.node.inputs[k]}': ${B.type}[${B.dims.join(",")}]`).join(", ")})`);let z=await this.profiler.event("node",X.node.name,async()=>X.op.impl(j,R,X.op.context));if(z.length!==X.node.outputs.length)throw new Error("the size of output does not match model definition.");z.forEach((B,k)=>{let w=X.node.outputs[k];if(this._values[w])throw new Error(`output [${w}] already has value: op:${X.node.name}`);this._values[w]=B});let Y=new Set;z.forEach((B,k)=>{let w=X.node.outputs[k];for(let A of U[w].to){let D=Z[A],I=!0;for(let h of D.inputs)if(!this._values[h]){I=!1;break}I&&Y.add(A)}}),W.push(...Y)}let G=[];for(let J=0;J<this.graph.getOutputIndices().length;J++){let X=this.graph.getOutputIndices()[J],V=this._values[X];if(V===void 0)throw new Error(`required output [${X}] does not have value`);X===0?await V.getData():V.data,G.push(V)}return C1.verbose("ExecPlan","disposing of inferenceHandler"),j.dispose(),G})}}}),n,s1,l6,GV=E(()=>{B5(),n=Z4(l4()),K4(),Q1(),s1=H1.experimental.fbs,l6=class Q{constructor(H){if(this._attributes=new Map,H!=null){for(let j of H)j instanceof n.onnx.AttributeProto?this._attributes.set(j.name,[Q.getValue(j),Q.getType(j)]):j instanceof s1.Attribute&&this._attributes.set(j.name(),[Q.getValue(j),Q.getType(j)]);if(this._attributes.size<H.length)throw new Error("duplicated attribute names")}}set(H,j,K){this._attributes.set(H,[K,j])}delete(H){this._attributes.delete(H)}getFloat(H,j){return this.get(H,"float",j)}getInt(H,j){return this.get(H,"int",j)}getString(H,j){return this.get(H,"string",j)}getTensor(H,j){return this.get(H,"tensor",j)}getFloats(H,j){return this.get(H,"floats",j)}getInts(H,j){return this.get(H,"ints",j)}getStrings(H,j){return this.get(H,"strings",j)}getTensors(H,j){return this.get(H,"tensors",j)}get(H,j,K){let W=this._attributes.get(H);if(W===void 0){if(K!==void 0)return K;throw new Error(`required attribute not found: ${H}`)}if(W[1]!==j)throw new Error(`type mismatch: expected ${j} but got ${W[1]}`);return W[0]}static getType(H){let j=H instanceof n.onnx.AttributeProto?H.type:H.type();switch(j){case n.onnx.AttributeProto.AttributeType.FLOAT:return"float";case n.onnx.AttributeProto.AttributeType.INT:return"int";case n.onnx.AttributeProto.AttributeType.STRING:return"string";case n.onnx.AttributeProto.AttributeType.TENSOR:return"tensor";case n.onnx.AttributeProto.AttributeType.FLOATS:return"floats";case n.onnx.AttributeProto.AttributeType.INTS:return"ints";case n.onnx.AttributeProto.AttributeType.STRINGS:return"strings";case n.onnx.AttributeProto.AttributeType.TENSORS:return"tensors";default:throw new Error(`attribute type is not supported yet: ${n.onnx.AttributeProto.AttributeType[j]}`)}}static getValue(H){let j=H instanceof n.onnx.AttributeProto?H.type:H.type();if(j===n.onnx.AttributeProto.AttributeType.GRAPH||j===n.onnx.AttributeProto.AttributeType.GRAPHS)throw new Error("graph attribute is not supported yet");let K=this.getValueNoCheck(H);if(j===n.onnx.AttributeProto.AttributeType.INT&&G3.isLong(K))return G3.longToNumber(K);if(j===n.onnx.AttributeProto.AttributeType.INTS){let W=K,U=new Array(W.length);for(let Z=0;Z<W.length;Z++){let q=W[Z];U[Z]=G3.longToNumber(q)}return U}if(j===n.onnx.AttributeProto.AttributeType.TENSOR)return H instanceof n.onnx.AttributeProto?o1.fromProto(K):o1.fromOrtTensor(K);if(j===n.onnx.AttributeProto.AttributeType.TENSORS){if(H instanceof n.onnx.AttributeProto)return K.map((W)=>o1.fromProto(W));if(H instanceof s1.Attribute)return K.map((W)=>o1.fromOrtTensor(W))}return j===n.onnx.AttributeProto.AttributeType.STRING&&H instanceof n.onnx.AttributeProto?N6(K):j===n.onnx.AttributeProto.AttributeType.STRINGS&&H instanceof n.onnx.AttributeProto?K.map(N6):K}static getValueNoCheck(H){return H instanceof n.onnx.AttributeProto?this.getValueNoCheckFromOnnxFormat(H):this.getValueNoCheckFromOrtFormat(H)}static getValueNoCheckFromOnnxFormat(H){switch(H.type){case n.onnx.AttributeProto.AttributeType.FLOAT:return H.f;case n.onnx.AttributeProto.AttributeType.INT:return H.i;case n.onnx.AttributeProto.AttributeType.STRING:return H.s;case n.onnx.AttributeProto.AttributeType.TENSOR:return H.t;case n.onnx.AttributeProto.AttributeType.GRAPH:return H.g;case n.onnx.AttributeProto.AttributeType.FLOATS:return H.floats;case n.onnx.AttributeProto.AttributeType.INTS:return H.ints;case n.onnx.AttributeProto.AttributeType.STRINGS:return H.strings;case n.onnx.AttributeProto.AttributeType.TENSORS:return H.tensors;case n.onnx.AttributeProto.AttributeType.GRAPHS:return H.graphs;default:throw new Error(`unsupported attribute type: ${n.onnx.AttributeProto.AttributeType[H.type]}`)}}static getValueNoCheckFromOrtFormat(H){switch(H.type()){case s1.AttributeType.FLOAT:return H.f();case s1.AttributeType.INT:return H.i();case s1.AttributeType.STRING:return H.s();case s1.AttributeType.TENSOR:return H.t();case s1.AttributeType.GRAPH:return H.g();case s1.AttributeType.FLOATS:return H.floatsArray();case s1.AttributeType.INTS:{let j=[];for(let K=0;K<H.intsLength();K++)j.push(H.ints(K));return j}case s1.AttributeType.STRINGS:{let j=[];for(let K=0;K<H.stringsLength();K++)j.push(H.strings(K));return j}case s1.AttributeType.TENSORS:{let j=[];for(let K=0;K<H.tensorsLength();K++)j.push(H.tensors(K));return j}default:throw new Error(`unsupported attribute type: ${s1.AttributeType[H.type()]}`)}}}}),K6,w4,u6,B3,U6,Z2,RV=E(()=>{GV(),B5(),K6=Z4(l4()),K4(),Q1(),w4=H1.experimental.fbs,u6={from:(Q,H)=>new Z2(Q,H)},B3=class{constructor(Q){this._from=void 0,this._to=[],this.tensor=void 0,this.type=void 0,Q&&(this.type=i1.tensorValueTypeFromProto(Q.type.tensorType))}get from(){return this._from}get to(){return this._to}},U6=class{constructor(Q,H){Q instanceof K6.onnx.NodeProto?(this.name=Q.name,this.opType=Q.opType,this.attributes=new l6(Q.attribute)):Q instanceof w4.Node&&(this.name=H??Q.name(),this.opType=Q.opType(),this.attributes=new l6(i1.tensorAttributesFromORTFormat(Q))),this.inputs=[],this.outputs=[],this.executeNode=!0}},Z2=class{constructor(Q,H){if(!Q)throw new TypeError("graph is empty");this.buildGraph(Q),this.transformGraph(H),this.checkIsAcyclic()}getInputIndices(){return this._allInputIndices}getInputNames(){return this._allInputNames}getOutputIndices(){return this._allOutputIndices}getOutputNames(){return this._allOutputNames}getValues(){return this._allData}getNodes(){return this._nodes}buildGraph(Q){if(Q instanceof K6.onnx.GraphProto)this.buildGraphFromOnnxFormat(Q);else if(Q instanceof w4.Graph)this.buildGraphFromOrtFormat(Q);else throw new TypeError("Graph type is not supported.")}buildGraphFromOnnxFormat(Q){let H=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let j=new Map;if(!Q.input)throw new Error("missing information in graph: input");let K=[];for(let W of Q.input){if(H.has(W.name))throw new Error(`duplicated input name: ${W.name}`);let U=this._allData.push(new B3(W))-1;H.set(W.name,U),K.push(W.name)}if(!Q.initializer)throw new Error("missing information in graph: initializer");for(let W of Q.initializer){let U=H.get(W.name);if(U===void 0){let Z=new B3;Z.type={shape:{dims:i1.tensorDimsFromProto(W.dims)},tensorType:i1.tensorDataTypeFromProto(W.dataType)},U=this._allData.push(Z)-1,H.set(W.name,U)}this._allData[U]._from=-1,this._allData[U].tensor=o1.fromProto(W)}for(let W=0;W<this._allData.length;W++)this._allData[W].tensor||(this._allInputIndices.push(W),this._allInputNames.push(K[W]));if(!Q.output)throw new Error("missing information in graph: output");for(let W of Q.output){if(H.has(W.name))throw new Error(`duplicated output name: ${W.name}`);let U=this._allData.push(new B3(W))-1;H.set(W.name,U),this._allOutputIndices.push(U),this._allOutputNames.push(W.name)}if(!Q.node)throw new Error("missing information in graph: node");for(let W of Q.node){if(!W.name)for(let Z=0;;Z++){let q=`unnamed_${W.opType}_${Z}`;if(!j.has(q)){W.name=q;break}}if(j.has(W.name))throw new Error(`duplicated node name: ${W.name}`);let U=this._nodes.push(new U6(W))-1;j.set(W.name,U)}for(let W=0;W<this._nodes.length;W++){let U=this._nodes[W],Z=Q.node[W];if(!Z.output)throw new Error(`missing output for node: ${Z.name}`);for(let q of Z.output){let G=H.get(q);if(typeof G>"u"&&(G=this._allData.push(new B3)-1,H.set(q,G)),U.outputs.push(G),this._allData[G]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${G}`);if(this._allData[G]._from=W,Z.opType==="Constant"){if(!Z.attribute||Z.attribute.length!==1||!Z.attribute[0].t)throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(!Z.output||Z.output.length!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");U.outputs.pop(),U.executeNode=!1,this._allData[G]._from=-1,this._allData[G].tensor=o1.fromProto(Z.attribute[0].t)}}}for(let W=0;W<this._nodes.length;W++){let U=this._nodes[W],Z=Q.node[W];if(!Z.input)throw new Error(`missing input for node: ${Z.name}`);for(let q of Z.input){let G=H.get(q);if(typeof G>"u"){if(q===""&&(Z.input.length===3||Z.input.length===4)&&Z.opType==="Resize")continue;throw new Error(`unrecognized input '${q}' for node: ${Z.name}`)}U.inputs.push(G),this._allData[G]._to.push(W)}}return!0}buildGraphFromOrtFormat(Q){let H=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let j=new Map,K=[];for(let W=0;W<Q.inputsLength();W++){let U=Q.inputs(W);if(H.has(U))throw new Error(`duplicated input name: ${U}`);for(let Z=0;Z<Q.nodeArgsLength();Z++)if(Q.nodeArgs(Z)?.name()===U){let q=new B3;if(Q.nodeArgs(Z)?.type()?.valueType()!==w4.TypeInfoValue.tensor_type)throw new Error("Unexpected value type for the nodeArg.");let G=Q.nodeArgs(Z).type().value(new w4.TensorTypeAndShape),J=i1.tensorDataTypeFromProto(G.elemType()),X=G.shape(),V=[];for(let z=0;z<X.dimLength();z++)V.push(G3.longToNumber(X.dim(z).value().dimValue()));q.type={shape:{dims:V},tensorType:J};let R=this._allData.push(q)-1;H.set(U,R),K.push(U)}}for(let W=0;W<Q.initializersLength();W++){let U=Q.initializers(W),Z=H.get(U.name());if(Z===void 0){let q=new B3,G=i1.tensorDimsFromORTFormat(U),J=i1.tensorDataTypeFromProto(U.dataType());q.type={shape:{dims:G},tensorType:J},Z=this._allData.push(q)-1,H.set(U.name(),Z)}this._allData[Z]._from=-1,this._allData[Z].tensor=o1.fromOrtTensor(U)}for(let W=0;W<this._allData.length;W++)this._allData[W].tensor||(this._allInputIndices.push(W),this._allInputNames.push(K[W]));for(let W=0;W<Q.outputsLength();W++){let U=Q.outputs(W);if(H.has(U))throw new Error(`duplicated output name: ${U}`);let Z=this._allData.push(new B3)-1;H.set(U,Z),this._allOutputIndices.push(Z),this._allOutputNames.push(U)}if(!Q.nodes)throw new Error("missing information in graph: node");for(let W=0;W<Q.nodesLength();W++){let U=Q.nodes(W),Z=U.name();if(!Z)for(let G=0;Z=`unnamed_${U.opType()}_${G}`,!!j.has(Z);G++);if(j.has(Z))throw new Error(`duplicated node name: ${Z}`);let q=this._nodes.push(new U6(U,Z))-1;j.set(Z,q)}for(let W=0;W<this._nodes.length;W++){let U=this._nodes[W],Z=Q.nodes(W);if(Z==null)throw new Error(`No node exists at index ${W}`);if(Z?.outputsLength()===0)throw new Error(`missing output for node: ${Z.name}`);for(let q=0;q<Z?.outputsLength();q++){let G=Z?.outputs(q),J=H.get(G);if(typeof J>"u"&&(J=this._allData.push(new B3)-1,H.set(G,J)),U.outputs.push(J),this._allData[J]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${J}`);if(this._allData[J]._from=W,Z.opType()==="Constant"){if(Z.attributesLength()!==1||!Z.attributes(0).t())throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(Z.outputsLength()!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");U.outputs.pop(),U.executeNode=!1,this._allData[J]._from=-1,this._allData[J].tensor=o1.fromOrtTensor(Z.attributes(0).t())}}}for(let W=0;W<this._nodes.length;W++){let U=this._nodes[W],Z=Q.nodes(W);if(Z.inputsLength()===0)throw new Error(`missing input for node: ${Z.name}`);for(let q=0;q<Z.inputsLength();q++){let G=Z.inputs(q),J=H.get(G);if(typeof J>"u")throw new Error(`unrecognized input '${G}' for node: ${Z.name()}`);U.inputs.push(J),this._allData[J]._to.push(W)}}}checkIsAcyclic(){let Q=new Set;this._allInputIndices.forEach((K)=>{this._allData[K]._to.forEach((W)=>{Q.add(W)})});let H=Array.from(Q),j=new Array(this._nodes.length).fill("white");for(;H.length>0;){let K=H.pop();j[K]==="gray"?j[K]="black":(H.push(K),j[K]="gray",this._nodes[K].outputs.forEach((W)=>{let U=this._allData[W];if(typeof U.tensor<"u")throw new Error("node outputs should not be initialized");if(U._from!==K)throw new Error("from property of the Value object doesn't match index of Node being processed");U._to.forEach((Z)=>{if(j[Z]==="gray")throw new Error("model graph is cyclic");j[Z]==="white"&&H.push(Z)})}))}}transformGraph(Q){this.removeAllIdentityNodes(),this.removeAllDropoutNodes(),this.fuseConvActivationNodes(),Q&&Q.transformGraph(this),this.finalizeGraph()}finalizeGraph(){let Q=0,H=new Array(this._nodes.length,0),j=0;for(let K=0;K<this._nodes.length;K++)H[K]=j,this._nodes[K].executeNode?(j!==K&&(this._nodes[j]=this._nodes[K]),j++):this._nodes[K].outputs.forEach((W)=>{this._allData[W]._from=-2});this._nodes.splice(j,this._nodes.length-j);for(let K=0;K<this._allData.length;K++){let W=this._allData[K];W._from!==void 0&&W._from!==-1&&W._from!==-2&&(W._from=H[W._from]);for(let U=0;U<W._to.length;U++)if(W._to[U]>=0)W._to[U]=H[W._to[U]];else throw new Error("Trying to update a removed node")}Q=0;for(let K=0;K<this._allData.length;K++){if(this._allData[K].from===-2&&this._allOutputIndices.indexOf(K+Q)===-1){Q++,this._allData.splice(K,1),K--;continue}if(Q>0){let W=-1;this._allData[K].from!==void 0&&this._allData[K].from!==-1?(W=this._nodes[this._allData[K].from].outputs.indexOf(K+Q),W!==-1&&(this._nodes[this._allData[K].from].outputs[W]=K)):(W=this._allInputIndices.indexOf(K+Q),W!==-1&&(this._allInputIndices[W]=K)),this._allData[K].to.forEach((U)=>{W=this._nodes[U].inputs.indexOf(K+Q),W!==-1&&(this._nodes[U].inputs[W]=K)}),this._allData[K].to.length===0&&(W=this._allOutputIndices.indexOf(K+Q),W!==-1&&(this._allOutputIndices[W]=K))}}}deleteNode(Q){let H=this._nodes[Q];if(H.outputs.length>1){for(let Z=1;Z<H.outputs.length;Z++)if(this._allData[H.outputs[Z]].to.length>0)throw new Error("Node deletion with more than one output connected to other nodes is not supported. ")}H.executeNode=!1;let j=H.inputs[0],K=H.outputs[0],W=this._allData[K].to;for(let Z=0;Z<H.inputs.length;Z++){let q=this._allData[H.inputs[Z]].to.indexOf(Q);if(q===-1)throw new Error("The Value object doesn't have the current Node in it's 'to' property ");this._allData[H.inputs[Z]].to.splice(q,1)}this._allData[K]._to=[];let U=this._allOutputIndices.indexOf(K);if(U!==-1&&(this._allOutputIndices[U]=j),W&&W.length>0)for(let Z of W){let q=this._nodes[Z].inputs.indexOf(K);if(q===-1)throw new Error("The Node object doesn't have the output Value in it's 'inputs' property ");this._nodes[Z].inputs[q]=j,this._allData[j].to.push(Z)}}removeAllDropoutNodes(){let Q=0;for(let H of this._nodes){if(H.opType==="Dropout"){if(H.inputs.length!==1)throw new Error("Dropout nodes should only contain one input. ");if(H.outputs.length!==1&&H.outputs.length!==2)throw new Error("Dropout nodes should contain either 1 or 2 output(s)");if(H.outputs.length===2&&this._allData[H.outputs[1]]._to.length!==0)throw new Error("Dropout nodes's second output should not be referenced by other nodes");this.deleteNode(Q)}Q++}}removeAllIdentityNodes(){let Q=0;for(let H of this._nodes)H.opType==="Identity"&&this.deleteNode(Q),Q++}isActivation(Q){switch(Q.opType){case"Relu":case"Sigmoid":case"Clip":return!0;default:return!1}}fuseConvActivationNodes(){for(let Q of this._nodes)if(Q.opType==="Conv"){let H=this._allData[Q.outputs[0]]._to;if(H.length===1&&this.isActivation(this._nodes[H[0]])){let j=this._nodes[H[0]];if(j.opType==="Clip")if(j.inputs.length===1)try{Q.attributes.set("activation_params","floats",[j.attributes.getFloat("min"),j.attributes.getFloat("max")])}catch{Q.attributes.set("activation_params","floats",[h4,b4])}else if(j.inputs.length>=3&&this._allData[j.inputs[1]].tensor!==void 0&&this._allData[j.inputs[2]].tensor!==void 0)Q.attributes.set("activation_params","floats",[this._allData[j.inputs[1]].tensor.floatData[0],this._allData[j.inputs[2]].tensor.floatData[0]]);else continue;Q.attributes.set("activation","string",j.opType),this.deleteNode(H[0])}}}}}),j2,V2,TJ,zV=E(()=>{H7(),RV(),B5(),j2=Z4(l4()),Q1(),V2=H1.experimental.fbs,TJ=class{constructor(){}load(Q,H,j){let K;if(!j)try{this.loadFromOnnxFormat(Q,H);return}catch(W){if(j!==void 0)throw W;K=W}try{this.loadFromOrtFormat(Q,H)}catch(W){throw j!==void 0?W:new Error(`Failed to load model as ONNX format: ${K}
+as ORT format: ${W}`)}}loadFromOnnxFormat(Q,H){let j=j2.onnx.ModelProto.decode(Q);if(G3.longToNumber(j.irVersion)<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=j.opsetImport.map((K)=>({domain:K.domain,version:G3.longToNumber(K.version)})),this._graph=u6.from(j.graph,H)}loadFromOrtFormat(Q,H){let j=new $.ByteBuffer(Q),K=V2.InferenceSession.getRootAsInferenceSession(j).model();if(G3.longToNumber(K.irVersion())<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=[];for(let W=0;W<K.opsetImportLength();W++){let U=K.opsetImport(W);this._opsets.push({domain:U?.domain(),version:G3.longToNumber(U.version())})}this._graph=u6.from(K.graph(),H)}get graph(){return this._graph}get opsets(){return this._opsets}}}),DJ,NV=E(()=>{qV(),WV(),V3(),zV(),DJ=class{constructor(Q={}){this._initialized=!1,this.backendHint=Q.backendHint,this.profiler=o2.create(Q.profiler),this.context={profiler:this.profiler,graphInputTypes:[],graphInputDims:[]}}get inputNames(){return this._model.graph.getInputNames()}get outputNames(){return this._model.graph.getOutputNames()}startProfiling(){this.profiler.start()}endProfiling(){this.profiler.stop()}async loadModel(Q,H,j){await this.profiler.event("session","Session.loadModel",async()=>{let K=await D2(this.backendHint);if(this.sessionHandler=K.createSessionHandler(this.context),this._model=new TJ,typeof Q=="string"){let W=Q.endsWith(".ort");if(typeof process<"u"&&process.versions&&process.versions.node){let U=await(void 0)(Q);this.initialize(U,W)}else{let U=await(await fetch(Q)).arrayBuffer();this.initialize(new Uint8Array(U),W)}}else if(ArrayBuffer.isView(Q))this.initialize(Q);else{let W=new Uint8Array(Q,H||0,j||Q.byteLength);this.initialize(W)}})}initialize(Q,H){if(this._initialized)throw new Error("already initialized");this.profiler.event("session","Session.initialize",()=>{let j=this.sessionHandler.transformGraph?this.sessionHandler:void 0;this._model.load(Q,j,H),this.sessionHandler.onGraphInitialized&&this.sessionHandler.onGraphInitialized(this._model.graph),this.initializeOps(this._model.graph),this._executionPlan=new wJ(this._model.graph,this._ops,this.profiler)}),this._initialized=!0}async run(Q){if(!this._initialized)throw new Error("session not initialized yet");return this.profiler.event("session","Session.run",async()=>{let H=this.normalizeAndValidateInputs(Q),j=await this._executionPlan.execute(this.sessionHandler,H);return this.createOutput(j)})}normalizeAndValidateInputs(Q){let H=this._model.graph.getInputNames();if(Array.isArray(Q)){if(Q.length!==H.length)throw new Error(`incorrect input array length: expected ${H.length} but got ${Q.length}`)}else{if(Q.size!==H.length)throw new Error(`incorrect input map size: expected ${H.length} but got ${Q.size}`);let j=new Array(Q.size),K=0;for(let W=0;W<H.length;++W){let U=Q.get(H[W]);if(!U)throw new Error(`missing input tensor for: '${name}'`);j[K++]=U}Q=j}if(!this.context.graphInputTypes||this.context.graphInputTypes.length===0||!this.context.graphInputDims||this.context.graphInputDims.length===0){let j=this._model.graph.getInputIndices(),K=this._model.graph.getValues(),W=new Array(j.length);for(let U=0;U<j.length;++U){let Z=K[j[U]];W[U]=Z.type.shape.dims,this.context.graphInputTypes.push(Z.type.tensorType),this.context.graphInputDims.push(Q[U].dims)}this.validateInputTensorDims(W,Q,!0)}else this.validateInputTensorDims(this.context.graphInputDims,Q,!1);return this.validateInputTensorTypes(this.context.graphInputTypes,Q),Q}validateInputTensorTypes(Q,H){for(let j=0;j<H.length;j++){let K=Q[j],W=H[j].type;if(K!==W)throw new Error(`input tensor[${j}] check failed: expected type '${K}' but got ${W}`)}}validateInputTensorDims(Q,H,j){for(let K=0;K<H.length;K++){let W=Q[K],U=H[K].dims;if(!this.compareTensorDims(W,U,j))throw new Error(`input tensor[${K}] check failed: expected shape '[${W.join(",")}]' but got [${U.join(",")}]`)}}compareTensorDims(Q,H,j){if(Q.length!==H.length)return!1;for(let K=0;K<Q.length;++K)if(Q[K]!==H[K]&&(!j||Q[K]!==0))return!1;return!0}createOutput(Q){let H=this._model.graph.getOutputNames();if(Q.length!==H.length)throw new Error("expected number of outputs do not match number of generated outputs");let j=new Map;for(let K=0;K<H.length;++K)j.set(H[K],Q[K]);return j}initializeOps(Q){let H=Q.getNodes();this._ops=new Array(H.length);for(let j=0;j<H.length;j++)this._ops[j]=this.sessionHandler.resolve(H[j],this._model.opsets,Q)}}}),_J,MV=E(()=>{z3(),K4(),_J=class{constructor(Q){this.session=Q,this.inputNames=this.session.inputNames,this.outputNames=this.session.outputNames}async dispose(){}async run(Q,H,j){let K=new Map;for(let Z in Q)if(Object.hasOwnProperty.call(Q,Z)){let q=Q[Z];K.set(Z,new o1(q.dims,q.type,void 0,void 0,q.data))}let W=await this.session.run(K),U={};return W.forEach((Z,q)=>{U[q]=new d1(Z.type,Z.data,Z.dims)}),U}startProfiling(){this.session.startProfiling()}endProfiling(){this.session.endProfiling()}}}),PJ={};X4(PJ,{onnxjsBackend:()=>EJ});var X2,EJ,YV=E(()=>{NV(),MV(),X2=class{async init(){}async createInferenceSessionHandler(Q,H){let j=new DJ(H);return typeof Q=="string"?await j.loadModel(Q):await j.loadModel(Q),new _J(j)}},EJ=new X2}),q7={};X4(q7,{createReadStream:()=>OJ,readFile:()=>IJ,readFileSync:()=>xJ});var IJ,xJ,OJ,gJ=E(()=>{IJ=void 0,xJ=void 0,OJ=void 0}),W7={};X4(W7,{join:()=>yJ});var yJ,dJ=E(()=>{yJ=void 0}),CV=U1((Q,H)=>{var j=(()=>{var K=typeof document<"u"?document.currentScript?.src:void 0;return typeof G5<"u"&&(K||=G5),function(W={}){var U=W,Z,q,G=new Promise((M,S)=>{Z=M,q=S}),J=Object.assign({},U),X="./this.program",V=typeof window=="object",R=typeof importScripts=="function",z=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",Y="",B,k,w;if(z){var A=(gJ(),a3(q7)),D=(dJ(),a3(W7));Y=R?D.dirname(Y)+"/":r6+"/",B=(M,S)=>(M=O1(M)?new URL(M):D.normalize(M),A.readFileSync(M,S?void 0:"utf8")),w=(M)=>(M=B(M,!0),M.buffer||(M=new Uint8Array(M)),M),k=(M,S,L,P=!0)=>{M=O1(M)?new URL(M):D.normalize(M),A.readFile(M,P?void 0:"utf8",(d,m)=>{d?L(d):S(P?m.buffer:m)})},!U.thisProgram&&1<process.argv.length&&(X=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2)}else(V||R)&&(R?Y=self.location.href:typeof document<"u"&&document.currentScript&&(Y=document.currentScript.src),K&&(Y=K),Y.startsWith("blob:")?Y="":Y=Y.substr(0,Y.replace(/[?#].*/,"").lastIndexOf("/")+1),B=(M)=>{var S=new XMLHttpRequest;return S.open("GET",M,!1),S.send(null),S.responseText},R&&(w=(M)=>{var S=new XMLHttpRequest;return S.open("GET",M,!1),S.responseType="arraybuffer",S.send(null),new Uint8Array(S.response)}),k=(M,S,L)=>{var P=new XMLHttpRequest;P.open("GET",M,!0),P.responseType="arraybuffer",P.onload=()=>{P.status==200||P.status==0&&P.response?S(P.response):L()},P.onerror=L,P.send(null)});var I=console.log.bind(console),h=console.error.bind(console);Object.assign(U,J),J=null;var $1,L1=!1,x1,G1,p,S1,I3;function x3(){var M=$1.buffer;U.HEAP8=x1=new Int8Array(M),U.HEAP16=new Int16Array(M),U.HEAPU8=G1=new Uint8Array(M),U.HEAPU16=new Uint16Array(M),U.HEAP32=p=new Int32Array(M),U.HEAPU32=S1=new Uint32Array(M),U.HEAPF32=new Float32Array(M),U.HEAPF64=I3=new Float64Array(M)}var k3=[],R1=[],l=[],h1=0,X3=null,v1=null;function b1(M){throw M="Aborted("+M+")",h(M),L1=!0,M=new WebAssembly.RuntimeError(M+". Build with -sASSERTIONS for more info."),q(M),M}var P1=(M)=>M.startsWith("data:application/octet-stream;base64,"),O1=(M)=>M.startsWith("file://"),m1;if(m1="ort-wasm.wasm",!P1(m1)){var A3=m1;m1=U.locateFile?U.locateFile(A3,Y):Y+A3}function c1(M){if(w)return w(M);throw"both async and sync fetching of the wasm failed"}function r3(M){if(V||R){if(typeof fetch=="function"&&!O1(M))return fetch(M,{credentials:"same-origin"}).then((S)=>{if(!S.ok)throw`failed to load wasm binary file at '${M}'`;return S.arrayBuffer()}).catch(()=>c1(M));if(k)return new Promise((S,L)=>{k(M,(P)=>S(new Uint8Array(P)),L)})}return Promise.resolve().then(()=>c1(M))}function a1(M,S,L){return r3(M).then((P)=>WebAssembly.instantiate(P,S)).then(L,(P)=>{h(`failed to asynchronously prepare wasm: ${P}`),b1(P)})}function J3(M,S){var L=m1;return typeof WebAssembly.instantiateStreaming!="function"||P1(L)||O1(L)||z||typeof fetch!="function"?a1(L,M,S):fetch(L,{credentials:"same-origin"}).then((P)=>WebAssembly.instantiateStreaming(P,M).then(S,function(d){return h(`wasm streaming compile failed: ${d}`),h("falling back to ArrayBuffer instantiation"),a1(L,M,S)}))}var H3,z1={798088:(M,S,L,P)=>{if(typeof U>"u"||!U.ya)return 1;if(M=N3(M>>>0),M.startsWith("./")&&(M=M.substring(2)),M=U.ya.get(M),!M)return 2;if(S>>>=0,L>>>=0,S+L>M.byteLength)return 3;try{return G1.set(M.subarray(S,S+L),P>>>0>>>0),0}catch{return 4}}};class k1{constructor(M){this.wa=M-24}}var g1=0,O3=0,g3=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,G4=(M,S,L)=>{S>>>=0;var P=S+L;for(L=S;M[L]&&!(L>=P);)++L;if(16<L-S&&M.buffer&&g3)return g3.decode(M.subarray(S,L));for(P="";S<L;){var d=M[S++];if(d&128){var m=M[S++]&63;if((d&224)==192)P+=String.fromCharCode((d&31)<<6|m);else{var a=M[S++]&63;d=(d&240)==224?(d&15)<<12|m<<6|a:(d&7)<<18|m<<12|a<<6|M[S++]&63,65536>d?P+=String.fromCharCode(d):(d-=65536,P+=String.fromCharCode(55296|d>>10,56320|d&1023))}}else P+=String.fromCharCode(d)}return P},N3=(M,S)=>(M>>>=0)?G4(G1,M,S):"",S3=(M)=>{for(var S=0,L=0;L<M.length;++L){var P=M.charCodeAt(L);127>=P?S++:2047>=P?S+=2:55296<=P&&57343>=P?(S+=4,++L):S+=3}return S},M3=(M,S,L,P)=>{if(L>>>=0,!(0<P))return 0;var d=L;P=L+P-1;for(var m=0;m<M.length;++m){var a=M.charCodeAt(m);if(55296<=a&&57343>=a){var A1=M.charCodeAt(++m);a=65536+((a&1023)<<10)|A1&1023}if(127>=a){if(L>=P)break;S[L++>>>0]=a}else{if(2047>=a){if(L+1>=P)break;S[L++>>>0]=192|a>>6}else{if(65535>=a){if(L+2>=P)break;S[L++>>>0]=224|a>>12}else{if(L+3>=P)break;S[L++>>>0]=240|a>>18,S[L++>>>0]=128|a>>12&63}S[L++>>>0]=128|a>>6&63}S[L++>>>0]=128|a&63}}return S[L>>>0]=0,L-d},$3=(M)=>M%4===0&&(M%100!==0||M%400===0),R4=[0,31,60,91,121,152,182,213,244,274,305,335],i4=[0,31,59,90,120,151,181,212,243,273,304,334],K3=[],t3={},y3=()=>{if(!d3){var M={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:X||"./this.program"},S;for(S in t3)t3[S]===void 0?delete M[S]:M[S]=t3[S];var L=[];for(S in M)L.push(`${S}=${M[S]}`);d3=L}return d3},d3,o4=[null,[],[]],Y3=[31,29,31,30,31,30,31,31,30,31,30,31],a4=[31,28,31,30,31,30,31,31,30,31,30,31];function j1(M){var S=Array(S3(M)+1);return M3(M,S,0,S.length),S}function z4(M,S,L,P){function d(T,J1,q1){for(T=typeof T=="number"?T.toString():T||"";T.length<J1;)T=q1[0]+T;return T}function m(T,J1){return d(T,J1,"0")}function a(T,J1){function q1(B4){return 0>B4?-1:0<B4?1:0}var U3;return(U3=q1(T.getFullYear()-J1.getFullYear()))===0&&(U3=q1(T.getMonth()-J1.getMonth()))===0&&(U3=q1(T.getDate()-J1.getDate())),U3}function A1(T){switch(T.getDay()){case 0:return new Date(T.getFullYear()-1,11,29);case 1:return T;case 2:return new Date(T.getFullYear(),0,3);case 3:return new Date(T.getFullYear(),0,2);case 4:return new Date(T.getFullYear(),0,1);case 5:return new Date(T.getFullYear()-1,11,31);case 6:return new Date(T.getFullYear()-1,11,30)}}function f1(T){var J1=T.sa;for(T=new Date(new Date(T.ta+1900,0,1).getTime());0<J1;){var q1=T.getMonth(),U3=($3(T.getFullYear())?Y3:a4)[q1];if(J1>U3-T.getDate())J1-=U3-T.getDate()+1,T.setDate(1),11>q1?T.setMonth(q1+1):(T.setMonth(0),T.setFullYear(T.getFullYear()+1));else{T.setDate(T.getDate()+J1);break}}return q1=new Date(T.getFullYear()+1,0,4),J1=A1(new Date(T.getFullYear(),0,4)),q1=A1(q1),0>=a(J1,T)?0>=a(q1,T)?T.getFullYear()+1:T.getFullYear():T.getFullYear()-1}M>>>=0,S>>>=0,L>>>=0,P>>>=0;var T1=S1[P+40>>>2>>>0];P={Ba:p[P>>>2>>>0],Aa:p[P+4>>>2>>>0],ua:p[P+8>>>2>>>0],xa:p[P+12>>>2>>>0],va:p[P+16>>>2>>>0],ta:p[P+20>>>2>>>0],na:p[P+24>>>2>>>0],sa:p[P+28>>>2>>>0],Da:p[P+32>>>2>>>0],za:p[P+36>>>2>>>0],Ca:T1?N3(T1):""},L=N3(L),T1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var D1 in T1)L=L.replace(new RegExp(D1,"g"),T1[D1]);var C4="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),L3="January February March April May June July August September October November December".split(" ");T1={"%a":(T)=>C4[T.na].substring(0,3),"%A":(T)=>C4[T.na],"%b":(T)=>L3[T.va].substring(0,3),"%B":(T)=>L3[T.va],"%C":(T)=>m((T.ta+1900)/100|0,2),"%d":(T)=>m(T.xa,2),"%e":(T)=>d(T.xa,2," "),"%g":(T)=>f1(T).toString().substring(2),"%G":f1,"%H":(T)=>m(T.ua,2),"%I":(T)=>(T=T.ua,T==0?T=12:12<T&&(T-=12),m(T,2)),"%j":(T)=>{for(var J1=0,q1=0;q1<=T.va-1;J1+=($3(T.ta+1900)?Y3:a4)[q1++]);return m(T.xa+J1,3)},"%m":(T)=>m(T.va+1,2),"%M":(T)=>m(T.Aa,2),"%n":()=>`
+`,"%p":(T)=>0<=T.ua&&12>T.ua?"AM":"PM","%S":(T)=>m(T.Ba,2),"%t":()=>"	","%u":(T)=>T.na||7,"%U":(T)=>m(Math.floor((T.sa+7-T.na)/7),2),"%V":(T)=>{var J1=Math.floor((T.sa+7-(T.na+6)%7)/7);if(2>=(T.na+371-T.sa-2)%7&&J1++,J1)J1==53&&(q1=(T.na+371-T.sa)%7,q1==4||q1==3&&$3(T.ta)||(J1=1));else{J1=52;var q1=(T.na+7-T.sa-1)%7;(q1==4||q1==5&&$3(T.ta%400-1))&&J1++}return m(J1,2)},"%w":(T)=>T.na,"%W":(T)=>m(Math.floor((T.sa+7-(T.na+6)%7)/7),2),"%y":(T)=>(T.ta+1900).toString().substring(2),"%Y":(T)=>T.ta+1900,"%z":(T)=>{T=T.za;var J1=0<=T;return T=Math.abs(T)/60,(J1?"+":"-")+("0000"+(T/60*100+T%60)).slice(-4)},"%Z":(T)=>T.Ca,"%%":()=>"%"},L=L.replace(/%%/g,"\0\0");for(D1 in T1)L.includes(D1)&&(L=L.replace(new RegExp(D1,"g"),T1[D1](P)));return L=L.replace(/\0\0/g,"%"),D1=j1(L),D1.length>S?0:(x1.set(D1,M>>>0),D1.length-1)}var N4={a:function(M,S,L){M>>>=0;var P=new k1(M);throw S1[P.wa+16>>>2>>>0]=0,S1[P.wa+4>>>2>>>0]=S>>>0,S1[P.wa+8>>>2>>>0]=L>>>0,g1=M,O3++,g1},e:function(){return 0},H:function(){},x:function(){},z:function(){},J:function(){return 0},F:function(){},A:function(){},E:function(){},g:function(){},y:function(){},v:function(){},G:function(){},w:function(){},k:()=>1,I:function(M,S,L){return S>>>=0,G1.copyWithin(M>>>0>>>0,S>>>0,S+(L>>>0)>>>0)},n:function(M,S,L){M=S+2097152>>>0<4194305-!!M?(M>>>0)+4294967296*S:NaN,L>>>=0,M=new Date(1000*M),p[L>>>2>>>0]=M.getUTCSeconds(),p[L+4>>>2>>>0]=M.getUTCMinutes(),p[L+8>>>2>>>0]=M.getUTCHours(),p[L+12>>>2>>>0]=M.getUTCDate(),p[L+16>>>2>>>0]=M.getUTCMonth(),p[L+20>>>2>>>0]=M.getUTCFullYear()-1900,p[L+24>>>2>>>0]=M.getUTCDay(),p[L+28>>>2>>>0]=(M.getTime()-Date.UTC(M.getUTCFullYear(),0,1,0,0,0,0))/86400000|0},o:function(M,S,L){M=S+2097152>>>0<4194305-!!M?(M>>>0)+4294967296*S:NaN,L>>>=0,M=new Date(1000*M),p[L>>>2>>>0]=M.getSeconds(),p[L+4>>>2>>>0]=M.getMinutes(),p[L+8>>>2>>>0]=M.getHours(),p[L+12>>>2>>>0]=M.getDate(),p[L+16>>>2>>>0]=M.getMonth(),p[L+20>>>2>>>0]=M.getFullYear()-1900,p[L+24>>>2>>>0]=M.getDay(),p[L+28>>>2>>>0]=($3(M.getFullYear())?R4:i4)[M.getMonth()]+M.getDate()-1|0,p[L+36>>>2>>>0]=-(60*M.getTimezoneOffset()),S=new Date(M.getFullYear(),6,1).getTimezoneOffset();var P=new Date(M.getFullYear(),0,1).getTimezoneOffset();p[L+32>>>2>>>0]=(S!=P&&M.getTimezoneOffset()==Math.min(P,S))|0},p:function(M){M>>>=0;var S=new Date(p[M+20>>>2>>>0]+1900,p[M+16>>>2>>>0],p[M+12>>>2>>>0],p[M+8>>>2>>>0],p[M+4>>>2>>>0],p[M>>>2>>>0],0),L=p[M+32>>>2>>>0],P=S.getTimezoneOffset(),d=new Date(S.getFullYear(),6,1).getTimezoneOffset(),m=new Date(S.getFullYear(),0,1).getTimezoneOffset(),a=Math.min(m,d);return 0>L?p[M+32>>>2>>>0]=+(d!=m&&a==P):0<L!=(a==P)&&(d=Math.max(m,d),S.setTime(S.getTime()+60000*((0<L?a:d)-P))),p[M+24>>>2>>>0]=S.getDay(),p[M+28>>>2>>>0]=($3(S.getFullYear())?R4:i4)[S.getMonth()]+S.getDate()-1|0,p[M>>>2>>>0]=S.getSeconds(),p[M+4>>>2>>>0]=S.getMinutes(),p[M+8>>>2>>>0]=S.getHours(),p[M+12>>>2>>>0]=S.getDate(),p[M+16>>>2>>>0]=S.getMonth(),p[M+20>>>2>>>0]=S.getYear(),M=S.getTime(),M=isNaN(M)?-1:M/1000,M4((H3=M,1<=+Math.abs(H3)?0<H3?+Math.floor(H3/4294967296)>>>0:~~+Math.ceil((H3-+(~~H3>>>0))/4294967296)>>>0:0)),M>>>0},l:function(){return-52},m:function(){},t:function(M,S,L,P){L>>>=0,P>>>=0;var d=(new Date()).getFullYear(),m=new Date(d,0,1),a=new Date(d,6,1);d=m.getTimezoneOffset();var A1=a.getTimezoneOffset();S1[M>>>0>>>2>>>0]=60*Math.max(d,A1),p[S>>>0>>>2>>>0]=+(d!=A1),M=(f1)=>f1.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1],m=M(m),a=M(a),A1<d?(M3(m,G1,L,17),M3(a,G1,P,17)):(M3(m,G1,P,17),M3(a,G1,L,17))},d:()=>{b1("")},B:function(M,S,L){M>>>=0,S>>>=0,L>>>=0,K3.length=0;for(var P;P=G1[S++>>>0];){var d=P!=105;d&=P!=112,L+=d&&L%8?4:0,K3.push(P==112?S1[L>>>2>>>0]:P==105?p[L>>>2>>>0]:I3[L>>>3>>>0]),L+=d?8:4}return z1[M](...K3)},h:()=>Date.now(),u:function(){return 4294901760},b:()=>performance.now(),s:function(M){M>>>=0;var S=G1.length;if(4294901760<M)return!1;for(var L=1;4>=L;L*=2){var P=S*(1+0.2/L);P=Math.min(P,M+100663296);var d=Math;P=Math.max(M,P);Q:{d=(d.min.call(d,4294901760,P+(65536-P%65536)%65536)-$1.buffer.byteLength+65535)/65536;try{$1.grow(d),x3();var m=1;break Q}catch{}m=void 0}if(m)return!0}return!1},C:function(M,S){M>>>=0,S>>>=0;var L=0;return y3().forEach((P,d)=>{var m=S+L;for(d=S1[M+4*d>>>2>>>0]=m,m=0;m<P.length;++m)x1[d++>>>0]=P.charCodeAt(m);x1[d>>>0]=0,L+=P.length+1}),0},D:function(M,S){M>>>=0,S>>>=0;var L=y3();S1[M>>>2>>>0]=L.length;var P=0;return L.forEach((d)=>P+=d.length+1),S1[S>>>2>>>0]=P,0},f:()=>52,j:function(){return 52},q:function(){return 70},i:function(M,S,L,P){S>>>=0,L>>>=0,P>>>=0;for(var d=0,m=0;m<L;m++){var a=S1[S>>>2>>>0],A1=S1[S+4>>>2>>>0];S+=8;for(var f1=0;f1<A1;f1++){var T1=G1[a+f1>>>0],D1=o4[M];T1===0||T1===10?((M===1?I:h)(G4(D1,0)),D1.length=0):D1.push(T1)}d+=A1}return S1[P>>>2>>>0]=d,0},r:z4,c:function(M,S,L,P){return z4(M>>>0,S>>>0,L>>>0,P>>>0)}},s=function(){function M(L){return s=L.exports,s=r4(),$1=s.K,x3(),R1.unshift(s.L),h1--,h1==0&&(X3!==null&&(clearInterval(X3),X3=null),v1&&(L=v1,v1=null,L())),s}var S={a:N4};if(h1++,U.instantiateWasm)try{return U.instantiateWasm(S,M)}catch(L){h(`Module.instantiateWasm callback failed with error: ${L}`),q(L)}return J3(S,function(L){M(L.instance)}).catch(q),{}}();U._OrtInit=(M,S)=>(U._OrtInit=s.M)(M,S),U._OrtGetLastError=(M,S)=>(U._OrtGetLastError=s.N)(M,S),U._OrtCreateSessionOptions=(M,S,L,P,d,m,a,A1,f1,T1)=>(U._OrtCreateSessionOptions=s.O)(M,S,L,P,d,m,a,A1,f1,T1),U._OrtAppendExecutionProvider=(M,S)=>(U._OrtAppendExecutionProvider=s.P)(M,S),U._OrtAddFreeDimensionOverride=(M,S,L)=>(U._OrtAddFreeDimensionOverride=s.Q)(M,S,L),U._OrtAddSessionConfigEntry=(M,S,L)=>(U._OrtAddSessionConfigEntry=s.R)(M,S,L),U._OrtReleaseSessionOptions=(M)=>(U._OrtReleaseSessionOptions=s.S)(M),U._OrtCreateSession=(M,S,L)=>(U._OrtCreateSession=s.T)(M,S,L),U._OrtReleaseSession=(M)=>(U._OrtReleaseSession=s.U)(M),U._OrtGetInputOutputCount=(M,S,L)=>(U._OrtGetInputOutputCount=s.V)(M,S,L),U._OrtGetInputName=(M,S)=>(U._OrtGetInputName=s.W)(M,S),U._OrtGetOutputName=(M,S)=>(U._OrtGetOutputName=s.X)(M,S),U._OrtFree=(M)=>(U._OrtFree=s.Y)(M),U._OrtCreateTensor=(M,S,L,P,d,m)=>(U._OrtCreateTensor=s.Z)(M,S,L,P,d,m),U._OrtGetTensorData=(M,S,L,P,d)=>(U._OrtGetTensorData=s._)(M,S,L,P,d),U._OrtReleaseTensor=(M)=>(U._OrtReleaseTensor=s.$)(M),U._OrtCreateRunOptions=(M,S,L,P)=>(U._OrtCreateRunOptions=s.aa)(M,S,L,P),U._OrtAddRunConfigEntry=(M,S,L)=>(U._OrtAddRunConfigEntry=s.ba)(M,S,L),U._OrtReleaseRunOptions=(M)=>(U._OrtReleaseRunOptions=s.ca)(M),U._OrtCreateBinding=(M)=>(U._OrtCreateBinding=s.da)(M),U._OrtBindInput=(M,S,L)=>(U._OrtBindInput=s.ea)(M,S,L),U._OrtBindOutput=(M,S,L,P)=>(U._OrtBindOutput=s.fa)(M,S,L,P),U._OrtClearBoundOutputs=(M)=>(U._OrtClearBoundOutputs=s.ga)(M),U._OrtReleaseBinding=(M)=>(U._OrtReleaseBinding=s.ha)(M),U._OrtRunWithBinding=(M,S,L,P,d)=>(U._OrtRunWithBinding=s.ia)(M,S,L,P,d),U._OrtRun=(M,S,L,P,d,m,a,A1)=>(U._OrtRun=s.ja)(M,S,L,P,d,m,a,A1),U._OrtEndProfiling=(M)=>(U._OrtEndProfiling=s.ka)(M),U._malloc=(M)=>(U._malloc=s.la)(M),U._free=(M)=>(U._free=s.ma)(M);var M4=(M)=>(M4=s.oa)(M),n4=(M)=>(n4=s.pa)(M),c=(M)=>(c=s.qa)(M),p3=()=>(p3=s.ra)();function r4(){var M=s;M=Object.assign({},M);var S=(L)=>(P)=>L(P)>>>0;return M.la=S(M.la),M.qa=S(M.qa),M.ra=((L)=>()=>L()>>>0)(M.ra),M}U.stackSave=()=>p3(),U.stackRestore=(M)=>n4(M),U.stackAlloc=(M)=>c(M),U.UTF8ToString=N3,U.stringToUTF8=(M,S,L)=>M3(M,G1,S,L),U.lengthBytesUTF8=S3;var C3;v1=function M(){C3||Y4(),C3||(v1=M)};function Y4(){if(!(0<h1)){if(U.preRun)for(typeof U.preRun=="function"&&(U.preRun=[U.preRun]);U.preRun.length;){var M=U.preRun.shift();k3.unshift(M)}for(;0<k3.length;)k3.shift()(U);if(!(0<h1||C3||(C3=!0,U.calledRun=!0,L1))){for(;0<R1.length;)R1.shift()(U);for(Z(U);0<l.length;)l.shift()(U)}}}return Y4(),G}})();typeof Q=="object"&&typeof H=="object"?H.exports=j:typeof define=="function"&&define.amd&&define([],()=>j)}),BV=U1(()=>{}),FV=U1(()=>{}),pJ={};X4(pJ,{cpus:()=>hJ});var hJ,kV=E(()=>{hJ=void 0}),AV=U1((Q,H)=>{var j=(()=>{var K=typeof document<"u"?document.currentScript?.src:void 0;return typeof G5<"u"&&(K||=G5),function(W={}){function U(){return l.buffer!=b1.buffer&&c1(),b1}function Z(){return l.buffer!=b1.buffer&&c1(),P1}function q(){return l.buffer!=b1.buffer&&c1(),O1}function G(){return l.buffer!=b1.buffer&&c1(),m1}function J(){return l.buffer!=b1.buffer&&c1(),A3}var X=W,V,R,z=new Promise((N,C)=>{V=N,R=C}),Y=Object.assign({},X),B="./this.program",k=(N,C)=>{throw C},w=typeof window=="object",A=typeof importScripts=="function",D=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",I=X.ENVIRONMENT_IS_PTHREAD||!1,h="";function $1(N){return X.locateFile?X.locateFile(N,h):h+N}var L1,x1,G1;if(D){var p=(gJ(),a3(q7)),S1=(dJ(),a3(W7));h=A?S1.dirname(h)+"/":r6+"/",L1=(N,C)=>(N=N3(N)?new URL(N):S1.normalize(N),p.readFileSync(N,C?void 0:"utf8")),G1=(N)=>(N=L1(N,!0),N.buffer||(N=new Uint8Array(N)),N),x1=(N,C,F,v=!0)=>{N=N3(N)?new URL(N):S1.normalize(N),p.readFile(N,v?void 0:"utf8",(g,x)=>{g?F(g):C(v?x.buffer:x)})},!X.thisProgram&&1<process.argv.length&&(B=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),k=(N,C)=>{throw process.exitCode=N,C},global.Worker=BV().Worker}else(w||A)&&(A?h=self.location.href:typeof document<"u"&&document.currentScript&&(h=document.currentScript.src),typeof K<"u"&&K&&(h=K),h.startsWith("blob:")?h="":h=h.substr(0,h.replace(/[?#].*/,"").lastIndexOf("/")+1),D||(L1=(N)=>{var C=new XMLHttpRequest;return C.open("GET",N,!1),C.send(null),C.responseText},A&&(G1=(N)=>{var C=new XMLHttpRequest;return C.open("GET",N,!1),C.responseType="arraybuffer",C.send(null),new Uint8Array(C.response)}),x1=(N,C,F)=>{var v=new XMLHttpRequest;v.open("GET",N,!0),v.responseType="arraybuffer",v.onload=()=>{v.status==200||v.status==0&&v.response?C(v.response):F()},v.onerror=F,v.send(null)}));D&&typeof performance>"u"&&(global.performance=FV().performance);var I3=console.log.bind(console),x3=console.error.bind(console);D&&(I3=(...N)=>p.writeSync(1,N.join(" ")+`
+`),x3=(...N)=>p.writeSync(2,N.join(" ")+`
+`));var k3=I3,R1=x3;Object.assign(X,Y),Y=null;var l,h1,X3=!1,v1,b1,P1,O1,m1,A3;function c1(){var N=l.buffer;X.HEAP8=b1=new Int8Array(N),X.HEAP16=new Int16Array(N),X.HEAPU8=P1=new Uint8Array(N),X.HEAPU16=new Uint16Array(N),X.HEAP32=O1=new Int32Array(N),X.HEAPU32=m1=new Uint32Array(N),X.HEAPF32=new Float32Array(N),X.HEAPF64=A3=new Float64Array(N)}var r3=16777216;if(I)l=X.wasmMemory;else if(X.wasmMemory)l=X.wasmMemory;else if(l=new WebAssembly.Memory({initial:r3/65536,maximum:65536,shared:!0}),!(l.buffer instanceof SharedArrayBuffer))throw R1("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),D&&R1("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and/or recent version)"),Error("bad memory");c1(),r3=l.buffer.byteLength;var a1=[],J3=[],H3=[],z1=0,k1=null,g1=null;function O3(){if(z1--,z1==0&&(k1!==null&&(clearInterval(k1),k1=null),g1)){var N=g1;g1=null,N()}}function g3(N){throw N="Aborted("+N+")",R1(N),X3=!0,v1=1,N=new WebAssembly.RuntimeError(N+". Build with -sASSERTIONS for more info."),R(N),N}var G4=(N)=>N.startsWith("data:application/octet-stream;base64,"),N3=(N)=>N.startsWith("file://"),S3;S3="ort-wasm-threaded.wasm",G4(S3)||(S3=$1(S3));function M3(N){if(G1)return G1(N);throw"both async and sync fetching of the wasm failed"}function $3(N){if(w||A){if(typeof fetch=="function"&&!N3(N))return fetch(N,{credentials:"same-origin"}).then((C)=>{if(!C.ok)throw`failed to load wasm binary file at '${N}'`;return C.arrayBuffer()}).catch(()=>M3(N));if(x1)return new Promise((C,F)=>{x1(N,(v)=>C(new Uint8Array(v)),F)})}return Promise.resolve().then(()=>M3(N))}function R4(N,C,F){return $3(N).then((v)=>WebAssembly.instantiate(v,C)).then(F,(v)=>{R1(`failed to asynchronously prepare wasm: ${v}`),g3(v)})}function i4(N,C){var F=S3;return typeof WebAssembly.instantiateStreaming!="function"||G4(F)||N3(F)||D||typeof fetch!="function"?R4(F,N,C):fetch(F,{credentials:"same-origin"}).then((v)=>WebAssembly.instantiateStreaming(v,N).then(C,function(g){return R1(`wasm streaming compile failed: ${g}`),R1("falling back to ArrayBuffer instantiation"),R4(F,N,C)}))}var K3,t3={799444:(N,C,F,v)=>{if(typeof X>"u"||!X.bb)return 1;if(N=A1(N>>>0),N.startsWith("./")&&(N=N.substring(2)),N=X.bb.get(N),!N)return 2;if(C>>>=0,F>>>=0,v>>>=0,C+F>N.byteLength)return 3;try{return Z().set(N.subarray(C,C+F),v>>>0),0}catch{return 4}}};function y3(N){this.name="ExitStatus",this.message=`Program terminated with exit(${N})`,this.status=N}var d3=(N)=>{N.terminate(),N.onmessage=()=>{}},o4=(N)=>{c.Oa.length==0&&(M4(),c.Xa(c.Oa[0]));var C=c.Oa.pop();if(!C)return 6;c.Pa.push(C),c.La[N.Na]=C,C.Na=N.Na;var F={cmd:"run",start_routine:N.gb,arg:N.cb,pthread_ptr:N.Na};return D&&C.unref(),C.postMessage(F,N.mb),0},Y3=0,a4=(N)=>{var C=_5();return N=N(),Q5(C),N},j1=(N,C,...F)=>a4(()=>{for(var v=F.length,g=D5(8*v),x=g>>>3,b=0;b<F.length;b++){var N1=F[b];J()[x+b>>>0]=N1}return O7(N,0,v,g,C)});function z4(N){if(I)return j1(0,1,N);v1=N,0<Y3||(c.hb(),X.onExit?.(N),X3=!0),k(N,new y3(N))}var N4=(N)=>{if(v1=N,I)throw r4(N),"unwind";z4(N)};function s(){for(var N=X.numThreads;N--;)M4();a1.unshift(()=>{z1++,n4(()=>O3())})}function M4(){var N=$1("ort-wasm-threaded.worker.js");N=new Worker(N),c.Oa.push(N)}function n4(N){I?N():Promise.all(c.Oa.map(c.Xa)).then(N)}var c={Oa:[],Pa:[],ab:[],La:{},Va(){I?(c.receiveObjectTransfer=c.fb,c.threadInitTLS=c.$a,c.setExitStatus=c.Za):s()},Za:(N)=>v1=N,pb:["$terminateWorker"],hb:()=>{for(var N of c.Pa)d3(N);for(N of c.Oa)d3(N);c.Oa=[],c.Pa=[],c.La=[]},Ya:(N)=>{var C=N.Na;delete c.La[C],c.Oa.push(N),c.Pa.splice(c.Pa.indexOf(N),1),N.Na=0,w5(C)},fb(){},$a(){c.ab.forEach((N)=>N())},Xa:(N)=>new Promise((C)=>{N.onmessage=(x)=>{x=x.data;var b=x.cmd;if(x.targetThread&&x.targetThread!=e4()){var N1=c.La[x.targetThread];N1?N1.postMessage(x,x.transferList):R1(`Internal error! Worker sent a message "${b}" to target pthread ${x.targetThread}, but that thread no longer exists!`)}else b==="checkMailbox"?t4():b==="spawnThread"?o4(x):b==="cleanupThread"?c.Ya(c.La[x.thread]):b==="killThread"?(x=x.thread,b=c.La[x],delete c.La[x],d3(b),w5(x),c.Pa.splice(c.Pa.indexOf(b),1),b.Na=0):b==="cancelThread"?c.La[x.thread].postMessage({cmd:"cancel"}):b==="loaded"?(N.loaded=!0,D&&!N.Na&&N.unref(),C(N)):b==="alert"?alert(`Thread ${x.threadId}: ${x.text}`):x.target==="setimmediate"?N.postMessage(x):b==="callHandler"?X[x.handler](...x.args):b&&R1(`worker sent an unknown command ${b}`)},N.onerror=(x)=>{throw R1(`worker sent an error! ${x.filename}:${x.lineno}: ${x.message}`),x},D&&(N.on("message",(x)=>N.onmessage({data:x})),N.on("error",(x)=>N.onerror(x)));var F=[],v=["onExit"],g;for(g of v)X.hasOwnProperty(g)&&F.push(g);N.postMessage({cmd:"load",handlers:F,urlOrBlob:X.mainScriptUrlOrBlob||K,wasmMemory:l,wasmModule:h1})})};X.PThread=c;var p3=(N)=>{for(;0<N.length;)N.shift()(X)};X.establishStackSpace=()=>{var N=e4(),C=G()[N+52>>>2>>>0];N=G()[N+56>>>2>>>0],d7(C,C-N),Q5(C)};function r4(N){if(I)return j1(1,0,N);N4(N)}var C3=[],Y4;X.invokeEntryPoint=(N,C)=>{Y3=0;var F=C3[N];F||(N>=C3.length&&(C3.length=N+1),C3[N]=F=Y4.get(N)),N=F(C),0<Y3?c.Za(N):T5(N)};class M{constructor(N){this.Ua=N-24}Va(N,C){G()[this.Ua+16>>>2>>>0]=0,G()[this.Ua+4>>>2>>>0]=N,G()[this.Ua+8>>>2>>>0]=C}}var S=0,L=0;function P(N,C,F,v){return I?j1(2,1,N,C,F,v):d(N,C,F,v)}function d(N,C,F,v){if(N>>>=0,C>>>=0,F>>>=0,v>>>=0,typeof SharedArrayBuffer>"u")return R1("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var g=[];return I&&g.length===0?P(N,C,F,v):(N={gb:F,Na:N,cb:v,mb:g},I?(N.ob="spawnThread",postMessage(N,g),0):o4(N))}var m=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,a=(N,C,F)=>{C>>>=0;var v=C+F;for(F=C;N[F]&&!(F>=v);)++F;if(16<F-C&&N.buffer&&m)return m.decode(N.buffer instanceof SharedArrayBuffer?N.slice(C,F):N.subarray(C,F));for(v="";C<F;){var g=N[C++];if(g&128){var x=N[C++]&63;if((g&224)==192)v+=String.fromCharCode((g&31)<<6|x);else{var b=N[C++]&63;g=(g&240)==224?(g&15)<<12|x<<6|b:(g&7)<<18|x<<12|b<<6|N[C++]&63,65536>g?v+=String.fromCharCode(g):(g-=65536,v+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else v+=String.fromCharCode(g)}return v},A1=(N,C)=>(N>>>=0)?a(Z(),N,C):"";function f1(N,C,F){return I?j1(3,1,N,C,F):0}function T1(N,C){if(I)return j1(4,1,N,C)}var D1=(N)=>{for(var C=0,F=0;F<N.length;++F){var v=N.charCodeAt(F);127>=v?C++:2047>=v?C+=2:55296<=v&&57343>=v?(C+=4,++F):C+=3}return C},C4=(N,C,F,v)=>{if(F>>>=0,!(0<v))return 0;var g=F;v=F+v-1;for(var x=0;x<N.length;++x){var b=N.charCodeAt(x);if(55296<=b&&57343>=b){var N1=N.charCodeAt(++x);b=65536+((b&1023)<<10)|N1&1023}if(127>=b){if(F>=v)break;C[F++>>>0]=b}else{if(2047>=b){if(F+1>=v)break;C[F++>>>0]=192|b>>6}else{if(65535>=b){if(F+2>=v)break;C[F++>>>0]=224|b>>12}else{if(F+3>=v)break;C[F++>>>0]=240|b>>18,C[F++>>>0]=128|b>>12&63}C[F++>>>0]=128|b>>6&63}C[F++>>>0]=128|b&63}}return C[F>>>0]=0,F-g},L3=(N,C,F)=>C4(N,Z(),C,F);function T(N,C){if(I)return j1(5,1,N,C)}function J1(N,C,F){if(I)return j1(6,1,N,C,F)}function q1(N,C,F){return I?j1(7,1,N,C,F):0}function U3(N,C){if(I)return j1(8,1,N,C)}function B4(N,C,F){if(I)return j1(9,1,N,C,F)}function z7(N,C,F,v){if(I)return j1(10,1,N,C,F,v)}function N7(N,C,F,v){if(I)return j1(11,1,N,C,F,v)}function M7(N,C,F,v){if(I)return j1(12,1,N,C,F,v)}function Y7(N){if(I)return j1(13,1,N)}function C7(N,C){if(I)return j1(14,1,N,C)}function B7(N,C,F){if(I)return j1(15,1,N,C,F)}function A5(N){N>>>=0,typeof Atomics.nb=="function"&&(Atomics.nb(q(),N>>>2,N).value.then(t4),N+=128,Atomics.store(q(),N>>>2,1))}X.__emscripten_thread_mailbox_await=A5;var t4=()=>{var N=e4();if(N&&(A5(N),N=g7,!X3))try{if(N(),!(0<Y3))try{I?T5(v1):N4(v1)}catch(C){C instanceof y3||C=="unwind"||k(1,C)}}catch(C){C instanceof y3||C=="unwind"||k(1,C)}};X.checkMailbox=t4;var S5=[],e3=(N)=>N%4===0&&(N%100!==0||N%400===0),F7=[0,31,60,91,121,152,182,213,244,274,305,335],k7=[0,31,59,90,120,151,181,212,243,273,304,334];function A7(N,C,F,v,g,x,b,N1){return I?j1(16,1,N,C,F,v,g,x,b,N1):-52}function S7(N,C,F,v,g,x,b){if(I)return j1(17,1,N,C,F,v,g,x,b)}var $5=[],L5={},$7=()=>{if(!v5){var N={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:B||"./this.program"},C;for(C in L5)L5[C]===void 0?delete N[C]:N[C]=L5[C];var F=[];for(C in N)F.push(`${C}=${N[C]}`);v5=F}return v5},v5;function L7(N,C){if(I)return j1(18,1,N,C);N>>>=0,C>>>=0;var F=0;return $7().forEach((v,g)=>{var x=C+F;for(g=G()[N+4*g>>>2>>>0]=x,x=0;x<v.length;++x)U()[g++>>>0]=v.charCodeAt(x);U()[g>>>0]=0,F+=v.length+1}),0}function v7(N,C){if(I)return j1(19,1,N,C);N>>>=0,C>>>=0;var F=$7();G()[N>>>2>>>0]=F.length;var v=0;return F.forEach((g)=>v+=g.length+1),G()[C>>>2>>>0]=v,0}function w7(N){return I?j1(20,1,N):52}function T7(N,C,F,v){return I?j1(21,1,N,C,F,v):52}function D7(N,C,F,v,g){return I?j1(22,1,N,C,F,v,g):70}var NH=[null,[],[]];function _7(N,C,F,v){if(I)return j1(23,1,N,C,F,v);C>>>=0,F>>>=0,v>>>=0;for(var g=0,x=0;x<F;x++){var b=G()[C>>>2>>>0],N1=G()[C+4>>>2>>>0];C+=8;for(var q3=0;q3<N1;q3++){var E1=Z()[b+q3>>>0],p1=NH[N];E1===0||E1===10?((N===1?k3:R1)(a(p1,0)),p1.length=0):p1.push(E1)}g+=N1}return G()[v>>>2>>>0]=g,0}var P7=[31,29,31,30,31,30,31,31,30,31,30,31],E7=[31,28,31,30,31,30,31,31,30,31,30,31];function MH(N){var C=Array(D1(N)+1);return C4(N,C,0,C.length),C}var YH=(N,C)=>{U().set(N,C>>>0)};function I7(N,C,F,v){function g(_,Z1,M1){for(_=typeof _=="number"?_.toString():_||"";_.length<Z1;)_=M1[0]+_;return _}function x(_,Z1){return g(_,Z1,"0")}function b(_,Z1){function M1(m7){return 0>m7?-1:0<m7?1:0}var h3;return(h3=M1(_.getFullYear()-Z1.getFullYear()))===0&&(h3=M1(_.getMonth()-Z1.getMonth()))===0&&(h3=M1(_.getDate()-Z1.getDate())),h3}function N1(_){switch(_.getDay()){case 0:return new Date(_.getFullYear()-1,11,29);case 1:return _;case 2:return new Date(_.getFullYear(),0,3);case 3:return new Date(_.getFullYear(),0,2);case 4:return new Date(_.getFullYear(),0,1);case 5:return new Date(_.getFullYear()-1,11,31);case 6:return new Date(_.getFullYear()-1,11,30)}}function q3(_){var Z1=_.Qa;for(_=new Date(new Date(_.Ra+1900,0,1).getTime());0<Z1;){var M1=_.getMonth(),h3=(e3(_.getFullYear())?P7:E7)[M1];if(Z1>h3-_.getDate())Z1-=h3-_.getDate()+1,_.setDate(1),11>M1?_.setMonth(M1+1):(_.setMonth(0),_.setFullYear(_.getFullYear()+1));else{_.setDate(_.getDate()+Z1);break}}return M1=new Date(_.getFullYear()+1,0,4),Z1=N1(new Date(_.getFullYear(),0,4)),M1=N1(M1),0>=b(Z1,_)?0>=b(M1,_)?_.getFullYear()+1:_.getFullYear():_.getFullYear()-1}N>>>=0,C>>>=0,F>>>=0,v>>>=0;var E1=G()[v+40>>>2>>>0];v={kb:q()[v>>>2>>>0],jb:q()[v+4>>>2>>>0],Sa:q()[v+8>>>2>>>0],Wa:q()[v+12>>>2>>>0],Ta:q()[v+16>>>2>>>0],Ra:q()[v+20>>>2>>>0],Ma:q()[v+24>>>2>>>0],Qa:q()[v+28>>>2>>>0],qb:q()[v+32>>>2>>>0],ib:q()[v+36>>>2>>>0],lb:E1?A1(E1):""},F=A1(F),E1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var p1 in E1)F=F.replace(new RegExp(p1,"g"),E1[p1]);var h7="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),b7="January February March April May June July August September October November December".split(" ");E1={"%a":(_)=>h7[_.Ma].substring(0,3),"%A":(_)=>h7[_.Ma],"%b":(_)=>b7[_.Ta].substring(0,3),"%B":(_)=>b7[_.Ta],"%C":(_)=>x((_.Ra+1900)/100|0,2),"%d":(_)=>x(_.Wa,2),"%e":(_)=>g(_.Wa,2," "),"%g":(_)=>q3(_).toString().substring(2),"%G":q3,"%H":(_)=>x(_.Sa,2),"%I":(_)=>(_=_.Sa,_==0?_=12:12<_&&(_-=12),x(_,2)),"%j":(_)=>{for(var Z1=0,M1=0;M1<=_.Ta-1;Z1+=(e3(_.Ra+1900)?P7:E7)[M1++]);return x(_.Wa+Z1,3)},"%m":(_)=>x(_.Ta+1,2),"%M":(_)=>x(_.jb,2),"%n":()=>`
+`,"%p":(_)=>0<=_.Sa&&12>_.Sa?"AM":"PM","%S":(_)=>x(_.kb,2),"%t":()=>"	","%u":(_)=>_.Ma||7,"%U":(_)=>x(Math.floor((_.Qa+7-_.Ma)/7),2),"%V":(_)=>{var Z1=Math.floor((_.Qa+7-(_.Ma+6)%7)/7);if(2>=(_.Ma+371-_.Qa-2)%7&&Z1++,Z1)Z1==53&&(M1=(_.Ma+371-_.Qa)%7,M1==4||M1==3&&e3(_.Ra)||(Z1=1));else{Z1=52;var M1=(_.Ma+7-_.Qa-1)%7;(M1==4||M1==5&&e3(_.Ra%400-1))&&Z1++}return x(Z1,2)},"%w":(_)=>_.Ma,"%W":(_)=>x(Math.floor((_.Qa+7-(_.Ma+6)%7)/7),2),"%y":(_)=>(_.Ra+1900).toString().substring(2),"%Y":(_)=>_.Ra+1900,"%z":(_)=>{_=_.ib;var Z1=0<=_;return _=Math.abs(_)/60,(Z1?"+":"-")+("0000"+(_/60*100+_%60)).slice(-4)},"%Z":(_)=>_.lb,"%%":()=>"%"},F=F.replace(/%%/g,"\0\0");for(p1 in E1)F.includes(p1)&&(F=F.replace(new RegExp(p1,"g"),E1[p1](v)));return F=F.replace(/\0\0/g,"%"),p1=MH(F),p1.length>C?0:(YH(p1,N),p1.length-1)}c.Va();var CH=[z4,r4,P,f1,T1,T,J1,q1,U3,B4,z7,N7,M7,Y7,C7,B7,A7,S7,L7,v7,w7,T7,D7,_7],BH={b:function(N,C,F){throw N>>>=0,new M(N).Va(C>>>0,F>>>0),S=N,L++,S},L:function(N){x7(N>>>0,!A,1,!w,131072,!1),c.$a()},j:function(N){N>>>=0,I?postMessage({cmd:"cleanupThread",thread:N}):c.Ya(c.La[N])},H:d,h:f1,S:T1,D:T,F:J1,T:q1,Q:U3,J:B4,P:z7,n:N7,E:M7,B:Y7,R:C7,C:B7,p:()=>1,z:function(N,C){N>>>=0,N==C>>>0?setTimeout(t4):I?postMessage({targetThread:N,cmd:"checkMailbox"}):(N=c.La[N])&&N.postMessage({cmd:"checkMailbox"})},I:function(N,C,F,v,g){C>>>=0,F>>>=0,S5.length=v,g=g>>>0>>>3;for(var x=0;x<v;x++)S5[x]=J()[g+x>>>0];return N=C?t3[C]:CH[N],c.eb=F,F=N(...S5),c.eb=0,F},K:A5,o:function(N){D&&c.La[N>>>0].ref()},s:function(N,C,F){N=C+2097152>>>0<4194305-!!N?(N>>>0)+4294967296*C:NaN,F>>>=0,N=new Date(1000*N),q()[F>>>2>>>0]=N.getUTCSeconds(),q()[F+4>>>2>>>0]=N.getUTCMinutes(),q()[F+8>>>2>>>0]=N.getUTCHours(),q()[F+12>>>2>>>0]=N.getUTCDate(),q()[F+16>>>2>>>0]=N.getUTCMonth(),q()[F+20>>>2>>>0]=N.getUTCFullYear()-1900,q()[F+24>>>2>>>0]=N.getUTCDay(),N=(N.getTime()-Date.UTC(N.getUTCFullYear(),0,1,0,0,0,0))/86400000|0,q()[F+28>>>2>>>0]=N},t:function(N,C,F){N=C+2097152>>>0<4194305-!!N?(N>>>0)+4294967296*C:NaN,F>>>=0,N=new Date(1000*N),q()[F>>>2>>>0]=N.getSeconds(),q()[F+4>>>2>>>0]=N.getMinutes(),q()[F+8>>>2>>>0]=N.getHours(),q()[F+12>>>2>>>0]=N.getDate(),q()[F+16>>>2>>>0]=N.getMonth(),q()[F+20>>>2>>>0]=N.getFullYear()-1900,q()[F+24>>>2>>>0]=N.getDay(),C=(e3(N.getFullYear())?F7:k7)[N.getMonth()]+N.getDate()-1|0,q()[F+28>>>2>>>0]=C,q()[F+36>>>2>>>0]=-(60*N.getTimezoneOffset()),C=new Date(N.getFullYear(),6,1).getTimezoneOffset();var v=new Date(N.getFullYear(),0,1).getTimezoneOffset();N=(C!=v&&N.getTimezoneOffset()==Math.min(v,C))|0,q()[F+32>>>2>>>0]=N},u:function(N){N>>>=0;var C=new Date(q()[N+20>>>2>>>0]+1900,q()[N+16>>>2>>>0],q()[N+12>>>2>>>0],q()[N+8>>>2>>>0],q()[N+4>>>2>>>0],q()[N>>>2>>>0],0),F=q()[N+32>>>2>>>0],v=C.getTimezoneOffset(),g=new Date(C.getFullYear(),6,1).getTimezoneOffset(),x=new Date(C.getFullYear(),0,1).getTimezoneOffset(),b=Math.min(x,g);return 0>F?q()[N+32>>>2>>>0]=+(g!=x&&b==v):0<F!=(b==v)&&(g=Math.max(x,g),C.setTime(C.getTime()+60000*((0<F?b:g)-v))),q()[N+24>>>2>>>0]=C.getDay(),F=(e3(C.getFullYear())?F7:k7)[C.getMonth()]+C.getDate()-1|0,q()[N+28>>>2>>>0]=F,q()[N>>>2>>>0]=C.getSeconds(),q()[N+4>>>2>>>0]=C.getMinutes(),q()[N+8>>>2>>>0]=C.getHours(),q()[N+12>>>2>>>0]=C.getDate(),q()[N+16>>>2>>>0]=C.getMonth(),q()[N+20>>>2>>>0]=C.getYear(),N=C.getTime(),N=isNaN(N)?-1:N/1000,y7((K3=N,1<=+Math.abs(K3)?0<K3?+Math.floor(K3/4294967296)>>>0:~~+Math.ceil((K3-+(~~K3>>>0))/4294967296)>>>0:0)),N>>>0},q:A7,r:S7,y:function(N,C,F,v){N>>>=0,C>>>=0,F>>>=0,v>>>=0;var g=(new Date()).getFullYear(),x=new Date(g,0,1),b=new Date(g,6,1);g=x.getTimezoneOffset();var N1=b.getTimezoneOffset(),q3=Math.max(g,N1);G()[N>>>2>>>0]=60*q3,q()[C>>>2>>>0]=+(g!=N1),N=(E1)=>E1.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1],x=N(x),b=N(b),N1<g?(L3(x,F,17),L3(b,v,17)):(L3(x,v,17),L3(b,F,17))},c:()=>{g3("")},O:function(N,C,F){N>>>=0,C>>>=0,F>>>=0,$5.length=0;for(var v;v=Z()[C++>>>0];){var g=v!=105;g&=v!=112,F+=g&&F%8?4:0,$5.push(v==112?G()[F>>>2>>>0]:v==105?q()[F>>>2>>>0]:J()[F>>>3>>>0]),F+=g?8:4}return t3[N](...$5)},k:()=>{},i:()=>Date.now(),U:()=>{throw Y3+=1,"unwind"},A:function(){return 4294901760},e:()=>performance.timeOrigin+performance.now(),f:()=>D?(kV(),a3(pJ)).cpus().length:navigator.hardwareConcurrency,x:function(N){N>>>=0;var C=Z().length;if(N<=C||4294901760<N)return!1;for(var F=1;4>=F;F*=2){var v=C*(1+0.2/F);v=Math.min(v,N+100663296);var g=Math;v=Math.max(N,v);Q:{g=(g.min.call(g,4294901760,v+(65536-v%65536)%65536)-l.buffer.byteLength+65535)/65536;try{l.grow(g),c1();var x=1;break Q}catch{}x=void 0}if(x)return!0}return!1},M:L7,N:v7,G:N4,g:w7,m:T7,v:D7,l:_7,a:l||X.wasmMemory,w:I7,d:function(N,C,F,v){return I7(N>>>0,C>>>0,F>>>0,v>>>0)}},f=function(){function N(F,v){return f=F.exports,f=FH(),c.ab.push(f.ya),Y4=f.za,J3.unshift(f.V),h1=v,O3(),f}var C={a:BH};if(z1++,X.instantiateWasm)try{return X.instantiateWasm(C,N)}catch(F){R1(`Module.instantiateWasm callback failed with error: ${F}`),R(F)}return i4(C,function(F){N(F.instance,F.module)}).catch(R),{}}();X._OrtInit=(N,C)=>(X._OrtInit=f.W)(N,C),X._OrtGetLastError=(N,C)=>(X._OrtGetLastError=f.X)(N,C),X._OrtCreateSessionOptions=(N,C,F,v,g,x,b,N1,q3,E1)=>(X._OrtCreateSessionOptions=f.Y)(N,C,F,v,g,x,b,N1,q3,E1),X._OrtAppendExecutionProvider=(N,C)=>(X._OrtAppendExecutionProvider=f.Z)(N,C),X._OrtAddFreeDimensionOverride=(N,C,F)=>(X._OrtAddFreeDimensionOverride=f._)(N,C,F),X._OrtAddSessionConfigEntry=(N,C,F)=>(X._OrtAddSessionConfigEntry=f.$)(N,C,F),X._OrtReleaseSessionOptions=(N)=>(X._OrtReleaseSessionOptions=f.aa)(N),X._OrtCreateSession=(N,C,F)=>(X._OrtCreateSession=f.ba)(N,C,F),X._OrtReleaseSession=(N)=>(X._OrtReleaseSession=f.ca)(N),X._OrtGetInputOutputCount=(N,C,F)=>(X._OrtGetInputOutputCount=f.da)(N,C,F),X._OrtGetInputName=(N,C)=>(X._OrtGetInputName=f.ea)(N,C),X._OrtGetOutputName=(N,C)=>(X._OrtGetOutputName=f.fa)(N,C),X._OrtFree=(N)=>(X._OrtFree=f.ga)(N),X._OrtCreateTensor=(N,C,F,v,g,x)=>(X._OrtCreateTensor=f.ha)(N,C,F,v,g,x),X._OrtGetTensorData=(N,C,F,v,g)=>(X._OrtGetTensorData=f.ia)(N,C,F,v,g),X._OrtReleaseTensor=(N)=>(X._OrtReleaseTensor=f.ja)(N),X._OrtCreateRunOptions=(N,C,F,v)=>(X._OrtCreateRunOptions=f.ka)(N,C,F,v),X._OrtAddRunConfigEntry=(N,C,F)=>(X._OrtAddRunConfigEntry=f.la)(N,C,F),X._OrtReleaseRunOptions=(N)=>(X._OrtReleaseRunOptions=f.ma)(N),X._OrtCreateBinding=(N)=>(X._OrtCreateBinding=f.na)(N),X._OrtBindInput=(N,C,F)=>(X._OrtBindInput=f.oa)(N,C,F),X._OrtBindOutput=(N,C,F,v)=>(X._OrtBindOutput=f.pa)(N,C,F,v),X._OrtClearBoundOutputs=(N)=>(X._OrtClearBoundOutputs=f.qa)(N),X._OrtReleaseBinding=(N)=>(X._OrtReleaseBinding=f.ra)(N),X._OrtRunWithBinding=(N,C,F,v,g)=>(X._OrtRunWithBinding=f.sa)(N,C,F,v,g),X._OrtRun=(N,C,F,v,g,x,b,N1)=>(X._OrtRun=f.ta)(N,C,F,v,g,x,b,N1),X._OrtEndProfiling=(N)=>(X._OrtEndProfiling=f.ua)(N);var e4=X._pthread_self=()=>(e4=X._pthread_self=f.va)();X._malloc=(N)=>(X._malloc=f.wa)(N),X._free=(N)=>(X._free=f.xa)(N),X.__emscripten_tls_init=()=>(X.__emscripten_tls_init=f.ya)();var x7=X.__emscripten_thread_init=(N,C,F,v,g,x)=>(x7=X.__emscripten_thread_init=f.Aa)(N,C,F,v,g,x);X.__emscripten_thread_crashed=()=>(X.__emscripten_thread_crashed=f.Ba)();var O7=(N,C,F,v,g)=>(O7=f.Ca)(N,C,F,v,g),w5=(N)=>(w5=f.Da)(N),T5=X.__emscripten_thread_exit=(N)=>(T5=X.__emscripten_thread_exit=f.Ea)(N),g7=()=>(g7=f.Fa)(),y7=(N)=>(y7=f.Ga)(N),d7=(N,C)=>(d7=f.Ha)(N,C),Q5=(N)=>(Q5=f.Ia)(N),D5=(N)=>(D5=f.Ja)(N),_5=()=>(_5=f.Ka)();function FH(){var N=f;N=Object.assign({},N);var C=(v)=>()=>v()>>>0,F=(v)=>(g)=>v(g)>>>0;return N.va=C(N.va),N.wa=F(N.wa),N.emscripten_main_runtime_thread_id=C(N.emscripten_main_runtime_thread_id),N.Ja=F(N.Ja),N.Ka=C(N.Ka),N}X.wasmMemory=l,X.stackSave=()=>_5(),X.stackRestore=(N)=>Q5(N),X.stackAlloc=(N)=>D5(N),X.keepRuntimeAlive=()=>0<Y3,X.UTF8ToString=A1,X.stringToUTF8=L3,X.lengthBytesUTF8=D1,X.ExitStatus=y3,X.PThread=c;var J5;g1=function N(){J5||p7(),J5||(g1=N)};function p7(){if(!(0<z1))if(I)V(X),I||p3(J3),startWorker(X);else{if(X.preRun)for(typeof X.preRun=="function"&&(X.preRun=[X.preRun]);X.preRun.length;)a1.unshift(X.preRun.shift());p3(a1),0<z1||J5||(J5=!0,X.calledRun=!0,X3||(I||p3(J3),V(X),I||p3(H3)))}}return p7(),z}})();typeof Q=="object"&&typeof H=="object"?H.exports=j:typeof define=="function"&&define.amd&&define([],()=>j)}),SV=U1((Q,H)=>{H.exports='"use strict";var Module={},ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads"),parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",e=>onmessage({data:e}));var fs=require("fs"),vm=require("vm");Object.assign(global,{self:global,require,Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:e=>vm.runInThisContext(fs.readFileSync(e,"utf8"),{filename:e}),postMessage:e=>parentPort.postMessage(e),performance:global.performance||{now:Date.now}})}var initializedJS=!1;function threadPrintErr(...e){var a=e.join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,a+`\n`);return}console.error(a)}function threadAlert(...e){var a=e.join(" ");postMessage({cmd:"alert",text:a,threadId:Module._pthread_self()})}var err=threadPrintErr;self.alert=threadAlert,Module.instantiateWasm=(e,a)=>{var r=Module.wasmModule;Module.wasmModule=null;var t=new WebAssembly.Instance(r,e);return a(t)},self.onunhandledrejection=e=>{throw e.reason||e};function handleMessage(e){try{if(e.data.cmd==="load"){let r=[];self.onmessage=t=>r.push(t),self.startWorker=t=>{Module=t,postMessage({cmd:"loaded"});for(let s of r)handleMessage(s);self.onmessage=handleMessage},Module.wasmModule=e.data.wasmModule;for(const t of e.data.handlers)Module[t]=(...s)=>{postMessage({cmd:"callHandler",handler:t,args:s})};if(Module.wasmMemory=e.data.wasmMemory,Module.buffer=Module.wasmMemory.buffer,Module.ENVIRONMENT_IS_PTHREAD=!0,typeof e.data.urlOrBlob=="string")importScripts(e.data.urlOrBlob);else{var a=URL.createObjectURL(e.data.urlOrBlob);importScripts(a),URL.revokeObjectURL(a)}ortWasmThreaded(Module)}else if(e.data.cmd==="run"){Module.__emscripten_thread_init(e.data.pthread_ptr,0,0,1),Module.__emscripten_thread_mailbox_await(e.data.pthread_ptr),Module.establishStackSpace(),Module.PThread.receiveObjectTransfer(e.data),Module.PThread.threadInitTLS(),initializedJS||(initializedJS=!0);try{Module.invokeEntryPoint(e.data.start_routine,e.data.arg)}catch(r){if(r!="unwind")throw r}}else e.data.cmd==="cancel"?Module._pthread_self()&&Module.__emscripten_thread_exit(-1):e.data.target==="setimmediate"||(e.data.cmd==="checkMailbox"?initializedJS&&Module.checkMailbox():e.data.cmd&&(err(`worker.js received unknown command ${e.data.cmd}`),err(e.data)))}catch(r){throw Module.__emscripten_thread_crashed?.(),r}}self.onmessage=handleMessage;\n'}),K2,U2,q6,K5,T4,W6,q2,W2,G2,bJ,w1,s4=E(()=>{K2=CV(),U2=AV(),K5=!1,T4=!1,W6=!1,q2=(Q)=>{if(Q===1)return!1;if(typeof SharedArrayBuffer>"u")return typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+Q+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),!1;typeof process<"u"&&process.versions&&process.versions.node&&console.warn("env.wasm.numThreads is set to "+Q+", however, currently onnxruntime-web does not support multi-threads in Node.js. Please consider using onnxruntime-node for performance critical scenarios.");try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},W2=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},G2=(Q,H)=>Q?H?"ort-wasm-simd-threaded.wasm":"ort-wasm-simd.wasm":H?"ort-wasm-threaded.wasm":"ort-wasm.wasm",bJ=async(Q)=>{if(K5)return Promise.resolve();if(T4)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(W6)throw new Error("previous call to 'initializeWebAssembly()' failed.");T4=!0;let{initTimeout:H,numThreads:j,simd:K}=Q,W=q2(j),U=K&&W2(),Z=Q.wasmPaths,q=typeof Z=="string"?Z:void 0,G=G2(U,W),J=typeof Z=="object"?Z[G]:void 0,X=!1,V=[];if(H>0&&V.push(new Promise((R)=>{setTimeout(()=>{X=!0,R()},H)})),V.push(new Promise((R,z)=>{let Y=W?U2:K2,B={locateFile:(k,w)=>W&&k.endsWith(".worker.js")&&typeof Blob<"u"?URL.createObjectURL(new Blob([SV()],{type:"text/javascript"})):k.endsWith(".wasm")?J||(q??w)+G:w+k};if(W)if(B.numThreads=j,typeof Blob>"u")B.mainScriptUrlOrBlob=(void 0)(r6,"ort-wasm-threaded.js");else{let k=`var ortWasmThreaded=${Y.toString()};`;B.mainScriptUrlOrBlob=new Blob([k],{type:"text/javascript"})}Y(B).then((k)=>{T4=!1,K5=!0,q6=k,R()},(k)=>{T4=!1,W6=!0,z(k)})})),await Promise.race(V),X)throw new Error(`WebAssembly backend initializing failed due to timeout: ${H}ms`)},w1=()=>{if(K5&&q6)return q6;throw new Error("WebAssembly is not initialized yet.")}}),B1,M5,F1,G7=E(()=>{s4(),B1=(Q,H)=>{let j=w1(),K=j.lengthBytesUTF8(Q)+1,W=j._malloc(K);return j.stringToUTF8(Q,W,K),H.push(W),W},M5=(Q,H,j,K)=>{if(typeof Q=="object"&&Q!==null){if(j.has(Q))throw new Error("Circular reference in options");j.add(Q)}Object.entries(Q).forEach(([W,U])=>{let Z=H?H+W:W;if(typeof U=="object")M5(U,Z+".",j,K);else if(typeof U=="string"||typeof U=="number")K(Z,U.toString());else if(typeof U=="boolean")K(Z,U?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof U}`)})},F1=(Q)=>{let H=w1(),j=H.stackSave();try{let K=H.stackAlloc(8);H._OrtGetLastError(K,K+4);let W=H.HEAP32[K/4],U=H.HEAPU32[K/4+1],Z=U?H.UTF8ToString(U):"";throw new Error(`${Q} ERROR_CODE: ${W}, ERROR_MESSAGE: ${Z}`)}finally{H.stackRestore(j)}}}),mJ,$V=E(()=>{s4(),G7(),mJ=(Q)=>{let H=w1(),j=0,K=[],W=Q||{};try{if(Q?.logSeverityLevel===void 0)W.logSeverityLevel=2;else if(typeof Q.logSeverityLevel!="number"||!Number.isInteger(Q.logSeverityLevel)||Q.logSeverityLevel<0||Q.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${Q.logSeverityLevel}`);if(Q?.logVerbosityLevel===void 0)W.logVerbosityLevel=0;else if(typeof Q.logVerbosityLevel!="number"||!Number.isInteger(Q.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${Q.logVerbosityLevel}`);Q?.terminate===void 0&&(W.terminate=!1);let U=0;return Q?.tag!==void 0&&(U=B1(Q.tag,K)),j=H._OrtCreateRunOptions(W.logSeverityLevel,W.logVerbosityLevel,!!W.terminate,U),j===0&&F1("Can't create run options."),Q?.extra!==void 0&&M5(Q.extra,"",new WeakSet,(Z,q)=>{let G=B1(Z,K),J=B1(q,K);H._OrtAddRunConfigEntry(j,G,J)!==0&&F1(`Can't set a run config entry: ${Z} - ${q}.`)}),[j,K]}catch(U){throw j!==0&&H._OrtReleaseRunOptions(j),K.forEach((Z)=>H._free(Z)),U}}}),R2,z2,N2,M2,cJ,LV=E(()=>{s4(),G7(),R2=(Q)=>{switch(Q){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${Q}`)}},z2=(Q)=>{switch(Q){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${Q}`)}},N2=(Q)=>{Q.extra||(Q.extra={}),Q.extra.session||(Q.extra.session={});let H=Q.extra.session;H.use_ort_model_bytes_directly||(H.use_ort_model_bytes_directly="1"),Q.executionProviders&&Q.executionProviders.some((j)=>(typeof j=="string"?j:j.name)==="webgpu")&&(Q.enableMemPattern=!1)},M2=(Q,H,j)=>{for(let K of H){let W=typeof K=="string"?K:K.name;switch(W){case"webnn":if(W="WEBNN",typeof K!="string"){let Z=K;if(Z?.deviceType){let q=B1("deviceType",j),G=B1(Z.deviceType,j);w1()._OrtAddSessionConfigEntry(Q,q,G)!==0&&F1(`Can't set a session config entry: 'deviceType' - ${Z.deviceType}.`)}if(Z?.numThreads){let q=Z.numThreads;(typeof q!="number"||!Number.isInteger(q)||q<0)&&(q=0);let G=B1("numThreads",j),J=B1(q.toString(),j);w1()._OrtAddSessionConfigEntry(Q,G,J)!==0&&F1(`Can't set a session config entry: 'numThreads' - ${Z.numThreads}.`)}if(Z?.powerPreference){let q=B1("powerPreference",j),G=B1(Z.powerPreference,j);w1()._OrtAddSessionConfigEntry(Q,q,G)!==0&&F1(`Can't set a session config entry: 'powerPreference' - ${Z.powerPreference}.`)}}break;case"webgpu":if(W="JS",typeof K!="string"){let Z=K;if(Z?.preferredLayout){if(Z.preferredLayout!=="NCHW"&&Z.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${Z.preferredLayout}`);let q=B1("preferredLayout",j),G=B1(Z.preferredLayout,j);w1()._OrtAddSessionConfigEntry(Q,q,G)!==0&&F1(`Can't set a session config entry: 'preferredLayout' - ${Z.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${W}`)}let U=B1(W,j);w1()._OrtAppendExecutionProvider(Q,U)!==0&&F1(`Can't append execution provider: ${W}.`)}},cJ=(Q)=>{let H=w1(),j=0,K=[],W=Q||{};N2(W);try{let U=R2(W.graphOptimizationLevel??"all"),Z=z2(W.executionMode??"sequential"),q=typeof W.logId=="string"?B1(W.logId,K):0,G=W.logSeverityLevel??2;if(!Number.isInteger(G)||G<0||G>4)throw new Error(`log serverity level is not valid: ${G}`);let J=W.logVerbosityLevel??0;if(!Number.isInteger(J)||J<0||J>4)throw new Error(`log verbosity level is not valid: ${J}`);let X=typeof W.optimizedModelFilePath=="string"?B1(W.optimizedModelFilePath,K):0;if(j=H._OrtCreateSessionOptions(U,!!W.enableCpuMemArena,!!W.enableMemPattern,Z,!!W.enableProfiling,0,q,G,J,X),j===0&&F1("Can't create session options."),W.executionProviders&&M2(j,W.executionProviders,K),W.enableGraphCapture!==void 0){if(typeof W.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${W.enableGraphCapture}`);let V=B1("enableGraphCapture",K),R=B1(W.enableGraphCapture.toString(),K);H._OrtAddSessionConfigEntry(j,V,R)!==0&&F1(`Can't set a session config entry: 'enableGraphCapture' - ${W.enableGraphCapture}.`)}if(W.freeDimensionOverrides)for(let[V,R]of Object.entries(W.freeDimensionOverrides)){if(typeof V!="string")throw new Error(`free dimension override name must be a string: ${V}`);if(typeof R!="number"||!Number.isInteger(R)||R<0)throw new Error(`free dimension override value must be a non-negative integer: ${R}`);let z=B1(V,K);H._OrtAddFreeDimensionOverride(j,z,R)!==0&&F1(`Can't set a free dimension override: ${V} - ${R}.`)}return W.extra!==void 0&&M5(W.extra,"",new WeakSet,(V,R)=>{let z=B1(V,K),Y=B1(R,K);H._OrtAddSessionConfigEntry(j,z,Y)!==0&&F1(`Can't set a session config entry: ${V} - ${R}.`)}),[j,K]}catch(U){throw j!==0&&H._OrtReleaseSessionOptions(j),K.forEach((Z)=>H._free(Z)),U}}}),s6,fJ,i6,lJ,uJ,R7,sJ,iJ=E(()=>{s6=(Q)=>{switch(Q){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${Q}`)}},fJ=(Q)=>{switch(Q){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${Q}`)}},i6=(Q)=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][Q],lJ=(Q)=>{switch(Q){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${Q}`)}},uJ=(Q)=>{switch(Q){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${Q}`)}},R7=(Q)=>Q==="float32"||Q==="float16"||Q==="int32"||Q==="int64"||Q==="uint32"||Q==="uint8"||Q==="bool",sJ=(Q)=>{switch(Q){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${Q}`)}}}),Y5,oJ=E(()=>{Y5=async(Q)=>{if(typeof Q=="string")if(typeof process<"u"&&process.versions&&process.versions.node)try{return new Uint8Array(await(void 0)(Q))}catch(H){if(H.code==="ERR_FS_FILE_TOO_LARGE"){let j=(void 0)(Q),K=[];for await(let W of j)K.push(W);return new Uint8Array(Buffer.concat(K))}throw H}else{let H=await fetch(Q);if(!H.ok)throw new Error(`failed to load external data file: ${Q}`);let j=H.headers.get("Content-Length"),K=j?parseInt(j,10):0;if(K<1073741824)return new Uint8Array(await H.arrayBuffer());{if(!H.body)throw new Error(`failed to load external data file: ${Q}, no response body.`);let W=H.body.getReader(),U;try{U=new ArrayBuffer(K)}catch(q){if(q instanceof RangeError){let G=Math.ceil(K/65536);U=new WebAssembly.Memory({initial:G,maximum:G}).buffer}else throw q}let Z=0;for(;;){let{done:q,value:G}=await W.read();if(q)break;let J=G.byteLength;new Uint8Array(U,Z,J).set(G),Z+=J}return new Uint8Array(U,0,K)}}else return Q instanceof Blob?new Uint8Array(await Q.arrayBuffer()):Q instanceof Uint8Array?Q:new Uint8Array(Q)}}),Y2,aJ,nJ,c3,C2,o6,rJ,tJ,G6,eJ,QH,JH,vV=E(()=>{$V(),LV(),iJ(),s4(),G7(),oJ(),Y2=(Q,H)=>{w1()._OrtInit(Q,H)!==0&&F1("Can't initialize onnxruntime.")},aJ=async(Q)=>{Y2(Q.wasm.numThreads,uJ(Q.logLevel))},nJ=async(Q,H)=>{},c3=new Map,C2=(Q)=>{let H=w1(),j=H.stackSave();try{let K=H.stackAlloc(8);return H._OrtGetInputOutputCount(Q,K,K+4)!==0&&F1("Can't get session input/output count."),[H.HEAP32[K/4],H.HEAP32[K/4+1]]}finally{H.stackRestore(j)}},o6=(Q)=>{let H=w1(),j=H._malloc(Q.byteLength);if(j===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${Q.byteLength}.`);return H.HEAPU8.set(Q,j),[j,Q.byteLength]},rJ=async(Q,H)=>{let j,K,W=w1();Array.isArray(Q)?[j,K]=Q:Q.buffer===W.HEAPU8.buffer?[j,K]=[Q.byteOffset,Q.byteLength]:[j,K]=o6(Q);let U=0,Z=0,q=0,G=[],J=[],X=[];try{if([Z,G]=cJ(H),H?.externalData&&W.mountExternalData){let A=[];for(let D of H.externalData){let I=typeof D=="string"?D:D.path;A.push(Y5(typeof D=="string"?D:D.data).then((h)=>{W.mountExternalData(I,h)}))}await Promise.all(A)}U=await W._OrtCreateSession(j,K,Z),U===0&&F1("Can't create a session.");let[V,R]=C2(U),z=!!H?.enableGraphCapture,Y=[],B=[],k=[];for(let A=0;A<V;A++){let D=W._OrtGetInputName(U,A);D===0&&F1("Can't get an input name."),J.push(D),Y.push(W.UTF8ToString(D))}for(let A=0;A<R;A++){let D=W._OrtGetOutputName(U,A);D===0&&F1("Can't get an output name."),X.push(D);let I=W.UTF8ToString(D);B.push(I)}let w=null;return c3.set(U,[U,J,X,w,z,!1]),[U,Y,B]}catch(V){throw J.forEach((R)=>W._OrtFree(R)),X.forEach((R)=>W._OrtFree(R)),q!==0&&W._OrtReleaseBinding(q),U!==0&&W._OrtReleaseSession(U),V}finally{W._free(j),Z!==0&&W._OrtReleaseSessionOptions(Z),G.forEach((V)=>W._free(V)),W.unmountExternalData?.()}},tJ=(Q)=>{let H=w1(),j=c3.get(Q);if(!j)throw new Error(`cannot release session. invalid session id: ${Q}`);let[K,W,U,Z,q]=j;Z&&(q&&H._OrtClearBoundOutputs(Z.handle),H._OrtReleaseBinding(Z.handle)),H.jsepOnReleaseSession?.(Q),W.forEach((G)=>H._OrtFree(G)),U.forEach((G)=>H._OrtFree(G)),H._OrtReleaseSession(K),c3.delete(Q)},G6=(Q,H,j,K,W,U=!1)=>{if(!Q){H.push(0);return}let Z=w1(),q=Q[0],G=Q[1],J=Q[3],X,V;if(q==="string"&&J==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(U&&J!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${W} when enableGraphCapture is true.`);if(J==="gpu-buffer"){let Y=Q[2].gpuBuffer,B=i6(s6(q));V=G.reduce((w,A)=>w*A,1)*B;let k=Z.jsepRegisterBuffer;if(!k)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');X=k(K,W,Y,V)}else{let Y=Q[2];if(Array.isArray(Y)){V=4*Y.length,X=Z._malloc(V),j.push(X);let B=X/4;for(let k=0;k<Y.length;k++){if(typeof Y[k]!="string")throw new TypeError(`tensor data at index ${k} is not a string`);Z.HEAPU32[B++]=B1(Y[k],j)}}else V=Y.byteLength,X=Z._malloc(V),j.push(X),Z.HEAPU8.set(new Uint8Array(Y.buffer,Y.byteOffset,V),X)}let R=Z.stackSave(),z=Z.stackAlloc(4*G.length);try{let Y=z/4;G.forEach((k)=>Z.HEAP32[Y++]=k);let B=Z._OrtCreateTensor(s6(q),X,V,z,G.length,sJ(J));B===0&&F1(`Can't create tensor for input/output. session=${K}, index=${W}.`),H.push(B)}finally{Z.stackRestore(R)}},eJ=async(Q,H,j,K,W,U)=>{let Z=w1(),q=c3.get(Q);if(!q)throw new Error(`cannot run inference. invalid session id: ${Q}`);let G=q[0],J=q[1],X=q[2],V=q[3],R=q[4],z=q[5],Y=H.length,B=K.length,k=0,w=[],A=[],D=[],I=[],h=Z.stackSave(),$1=Z.stackAlloc(Y*4),L1=Z.stackAlloc(Y*4),x1=Z.stackAlloc(B*4),G1=Z.stackAlloc(B*4);try{[k,w]=mJ(U);for(let l=0;l<Y;l++)G6(j[l],A,I,Q,H[l],R);for(let l=0;l<B;l++)G6(W[l],D,I,Q,Y+K[l],R);let p=$1/4,S1=L1/4,I3=x1/4,x3=G1/4;for(let l=0;l<Y;l++)Z.HEAPU32[p++]=A[l],Z.HEAPU32[S1++]=J[H[l]];for(let l=0;l<B;l++)Z.HEAPU32[I3++]=D[l],Z.HEAPU32[x3++]=X[K[l]];Z.jsepOnRunStart?.(G);let k3;k3=await Z._OrtRun(G,L1,$1,Y,G1,B,x1,k),k3!==0&&F1("failed to call OrtRun().");let R1=[];for(let l=0;l<B;l++){let h1=Z.HEAPU32[x1/4+l];if(h1===D[l]){R1.push(W[l]);continue}let X3=Z.stackSave(),v1=Z.stackAlloc(16),b1=!1,P1,O1=0;try{Z._OrtGetTensorData(h1,v1,v1+4,v1+8,v1+12)!==0&&F1(`Can't access output tensor data on index ${l}.`);let m1=v1/4,A3=Z.HEAPU32[m1++];O1=Z.HEAPU32[m1++];let c1=Z.HEAPU32[m1++],r3=Z.HEAPU32[m1++],a1=[];for(let z1=0;z1<r3;z1++)a1.push(Z.HEAPU32[c1/4+z1]);Z._OrtFree(c1);let J3=a1.reduce((z1,k1)=>z1*k1,1);P1=fJ(A3);let H3=V?.outputPreferredLocations[K[l]];if(P1==="string"){if(H3==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let z1=[],k1=O1/4;for(let g1=0;g1<J3;g1++){let O3=Z.HEAPU32[k1++],g3=g1===J3-1?void 0:Z.HEAPU32[k1]-O3;z1.push(Z.UTF8ToString(O3,g3))}R1.push([P1,a1,z1,"cpu"])}else if(H3==="gpu-buffer"&&J3>0){let z1=Z.jsepGetBuffer;if(!z1)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let k1=z1(O1),g1=i6(A3);if(g1===void 0||!R7(P1))throw new Error(`Unsupported data type: ${P1}`);b1=!0,R1.push([P1,a1,{gpuBuffer:k1,download:Z.jsepCreateDownloader(k1,J3*g1,P1),dispose:()=>{Z._OrtReleaseTensor(h1)}},"gpu-buffer"])}else{let z1=lJ(P1),k1=new z1(J3);new Uint8Array(k1.buffer,k1.byteOffset,k1.byteLength).set(Z.HEAPU8.subarray(O1,O1+k1.byteLength)),R1.push([P1,a1,k1,"cpu"])}}finally{Z.stackRestore(X3),P1==="string"&&O1&&Z._free(O1),b1||Z._OrtReleaseTensor(h1)}}return V&&!R&&(Z._OrtClearBoundOutputs(V.handle),c3.set(Q,[G,J,X,V,R,!1])),R1}finally{Z.stackRestore(h),A.forEach((p)=>Z._OrtReleaseTensor(p)),D.forEach((p)=>Z._OrtReleaseTensor(p)),I.forEach((p)=>Z._free(p)),k!==0&&Z._OrtReleaseRunOptions(k),w.forEach((p)=>Z._free(p))}},QH=(Q)=>{let H=w1(),j=c3.get(Q);if(!j)throw new Error("invalid session id");let K=j[0],W=H._OrtEndProfiling(K);W===0&&F1("Can't get an profile file name."),H._OrtFree(W)},JH=(Q)=>{let H=[];for(let j of Q){let K=j[2];!Array.isArray(K)&&"buffer"in K&&H.push(K.buffer)}return H}}),wV=U1((Q,H)=>{H.exports='/*!\n * ONNX Runtime Web v1.18.0\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n"use strict";(()=>{var vt=Object.defineProperty;var qr=Object.getOwnPropertyDescriptor;var Vr=Object.getOwnPropertyNames;var Jr=Object.prototype.hasOwnProperty;var _t=(i,c)=>()=>(i&&(c=i(i=0)),c);var Ke=(i,c)=>()=>(c||i((c={exports:{}}).exports,c),c.exports),Et=(i,c)=>{for(var a in c)vt(i,a,{get:c[a],enumerable:!0})},Xr=(i,c,a,h)=>{if(c&&typeof c=="object"||typeof c=="function")for(let f of Vr(c))!Jr.call(i,f)&&f!==a&&vt(i,f,{get:()=>c[f],enumerable:!(h=qr(c,f))||h.enumerable});return i};var et=i=>Xr(vt({},"__esModule",{value:!0}),i);var St={};Et(St,{createReadStream:()=>lr,readFile:()=>Qr,readFileSync:()=>Zr});var Qr,Zr,lr,At=_t(()=>{Qr=void 0,Zr=void 0,lr=void 0});var Tt={};Et(Tt,{join:()=>Kr});var Kr,Mt=_t(()=>{Kr=void 0});var pr=Ke((dr,Ct)=>{"use strict";var cr=(()=>{var i=typeof document<"u"?document.currentScript?.src:void 0;return typeof __filename<"u"&&(i||=__filename),function(c={}){var a=c,h,f,w=new Promise((t,o)=>{h=t,f=o}),g=Object.assign({},a),s="./this.program",S=typeof window=="object",x=typeof importScripts=="function",H=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",A="",I,V,R;if(H){var B=(At(),et(St)),D=(Mt(),et(Tt));A=x?D.dirname(A)+"/":__dirname+"/",I=(t,o)=>(t=ce(t)?new URL(t):D.normalize(t),B.readFileSync(t,o?void 0:"utf8")),R=t=>(t=I(t,!0),t.buffer||(t=new Uint8Array(t)),t),V=(t,o,u,m=!0)=>{t=ce(t)?new URL(t):D.normalize(t),B.readFile(t,m?void 0:"utf8",(O,E)=>{O?u(O):o(m?E.buffer:E)})},!a.thisProgram&&1<process.argv.length&&(s=process.argv[1].replace(/\\\\/g,"/")),process.argv.slice(2)}else(S||x)&&(x?A=self.location.href:typeof document<"u"&&document.currentScript&&(A=document.currentScript.src),i&&(A=i),A.startsWith("blob:")?A="":A=A.substr(0,A.replace(/[?#].*/,"").lastIndexOf("/")+1),I=t=>{var o=new XMLHttpRequest;return o.open("GET",t,!1),o.send(null),o.responseText},x&&(R=t=>{var o=new XMLHttpRequest;return o.open("GET",t,!1),o.responseType="arraybuffer",o.send(null),new Uint8Array(o.response)}),V=(t,o,u)=>{var m=new XMLHttpRequest;m.open("GET",t,!0),m.responseType="arraybuffer",m.onload=()=>{m.status==200||m.status==0&&m.response?o(m.response):u()},m.onerror=u,m.send(null)});var T=console.log.bind(console),L=console.error.bind(console);Object.assign(a,g),g=null;var W,de=!1,pe,Z,_,J,Pe;function le(){var t=W.buffer;a.HEAP8=pe=new Int8Array(t),a.HEAP16=new Int16Array(t),a.HEAPU8=Z=new Uint8Array(t),a.HEAPU16=new Uint16Array(t),a.HEAP32=_=new Int32Array(t),a.HEAPU32=J=new Uint32Array(t),a.HEAPF32=new Float32Array(t),a.HEAPF64=Pe=new Float64Array(t)}var Ie=[],ne=[],X=[],we=0,me=null,F=null;function ie(t){throw t="Aborted("+t+")",L(t),de=!0,t=new WebAssembly.RuntimeError(t+". Build with -sASSERTIONS for more info."),f(t),t}var xe=t=>t.startsWith("data:application/octet-stream;base64,"),ce=t=>t.startsWith("file://"),be;if(be="ort-wasm.wasm",!xe(be)){var ae=be;be=a.locateFile?a.locateFile(ae,A):A+ae}function K(t){if(R)return R(t);throw"both async and sync fetching of the wasm failed"}function je(t){if(S||x){if(typeof fetch=="function"&&!ce(t))return fetch(t,{credentials:"same-origin"}).then(o=>{if(!o.ok)throw`failed to load wasm binary file at \'${t}\'`;return o.arrayBuffer()}).catch(()=>K(t));if(V)return new Promise((o,u)=>{V(t,m=>o(new Uint8Array(m)),u)})}return Promise.resolve().then(()=>K(t))}function Oe(t,o,u){return je(t).then(m=>WebAssembly.instantiate(m,o)).then(u,m=>{L(`failed to asynchronously prepare wasm: ${m}`),ie(m)})}function Ue(t,o){var u=be;return typeof WebAssembly.instantiateStreaming!="function"||xe(u)||ce(u)||H||typeof fetch!="function"?Oe(u,t,o):fetch(u,{credentials:"same-origin"}).then(m=>WebAssembly.instantiateStreaming(m,t).then(o,function(O){return L(`wasm streaming compile failed: ${O}`),L("falling back to ArrayBuffer instantiation"),Oe(u,t,o)}))}var ve,Ae={798088:(t,o,u,m)=>{if(typeof a>"u"||!a.ya)return 1;if(t=ue(t>>>0),t.startsWith("./")&&(t=t.substring(2)),t=a.ya.get(t),!t)return 2;if(o>>>=0,u>>>=0,o+u>t.byteLength)return 3;try{return Z.set(t.subarray(o,o+u),m>>>0>>>0),0}catch{return 4}}};class _e{constructor(o){this.wa=o-24}}var ge=0,Be=0,te=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,re=(t,o,u)=>{o>>>=0;var m=o+u;for(u=o;t[u]&&!(u>=m);)++u;if(16<u-o&&t.buffer&&te)return te.decode(t.subarray(o,u));for(m="";o<u;){var O=t[o++];if(O&128){var E=t[o++]&63;if((O&224)==192)m+=String.fromCharCode((O&31)<<6|E);else{var U=t[o++]&63;O=(O&240)==224?(O&15)<<12|E<<6|U:(O&7)<<18|E<<12|U<<6|t[o++]&63,65536>O?m+=String.fromCharCode(O):(O-=65536,m+=String.fromCharCode(55296|O>>10,56320|O&1023))}}else m+=String.fromCharCode(O)}return m},ue=(t,o)=>(t>>>=0)?re(Z,t,o):"",Ee=t=>{for(var o=0,u=0;u<t.length;++u){var m=t.charCodeAt(u);127>=m?o++:2047>=m?o+=2:55296<=m&&57343>=m?(o+=4,++u):o+=3}return o},Se=(t,o,u,m)=>{if(u>>>=0,!(0<m))return 0;var O=u;m=u+m-1;for(var E=0;E<t.length;++E){var U=t.charCodeAt(E);if(55296<=U&&57343>=U){var ee=t.charCodeAt(++E);U=65536+((U&1023)<<10)|ee&1023}if(127>=U){if(u>=m)break;o[u++>>>0]=U}else{if(2047>=U){if(u+1>=m)break;o[u++>>>0]=192|U>>6}else{if(65535>=U){if(u+2>=m)break;o[u++>>>0]=224|U>>12}else{if(u+3>=m)break;o[u++>>>0]=240|U>>18,o[u++>>>0]=128|U>>12&63}o[u++>>>0]=128|U>>6&63}o[u++>>>0]=128|U&63}}return o[u>>>0]=0,u-O},Le=t=>t%4===0&&(t%100!==0||t%400===0),ze=[0,31,60,91,121,152,182,213,244,274,305,335],rt=[0,31,59,90,120,151,181,212,243,273,304,334],Te=[],Ge={},ke=()=>{if(!We){var t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:s||"./this.program"},o;for(o in Ge)Ge[o]===void 0?delete t[o]:t[o]=Ge[o];var u=[];for(o in t)u.push(`${o}=${t[o]}`);We=u}return We},We,nt=[null,[],[]],De=[31,29,31,30,31,30,31,31,30,31,30,31],at=[31,28,31,30,31,30,31,31,30,31,30,31];function G(t){var o=Array(Ee(t)+1);return Se(t,o,0,o.length),o}function qe(t,o,u,m){function O(d,k,$){for(d=typeof d=="number"?d.toString():d||"";d.length<k;)d=$[0]+d;return d}function E(d,k){return O(d,k,"0")}function U(d,k){function $(Ze){return 0>Ze?-1:0<Ze?1:0}var Me;return(Me=$(d.getFullYear()-k.getFullYear()))===0&&(Me=$(d.getMonth()-k.getMonth()))===0&&(Me=$(d.getDate()-k.getDate())),Me}function ee(d){switch(d.getDay()){case 0:return new Date(d.getFullYear()-1,11,29);case 1:return d;case 2:return new Date(d.getFullYear(),0,3);case 3:return new Date(d.getFullYear(),0,2);case 4:return new Date(d.getFullYear(),0,1);case 5:return new Date(d.getFullYear()-1,11,31);case 6:return new Date(d.getFullYear()-1,11,30)}}function ye(d){var k=d.sa;for(d=new Date(new Date(d.ta+1900,0,1).getTime());0<k;){var $=d.getMonth(),Me=(Le(d.getFullYear())?De:at)[$];if(k>Me-d.getDate())k-=Me-d.getDate()+1,d.setDate(1),11>$?d.setMonth($+1):(d.setMonth(0),d.setFullYear(d.getFullYear()+1));else{d.setDate(d.getDate()+k);break}}return $=new Date(d.getFullYear()+1,0,4),k=ee(new Date(d.getFullYear(),0,4)),$=ee($),0>=U(k,d)?0>=U($,d)?d.getFullYear()+1:d.getFullYear():d.getFullYear()-1}t>>>=0,o>>>=0,u>>>=0,m>>>=0;var oe=J[m+40>>>2>>>0];m={Ba:_[m>>>2>>>0],Aa:_[m+4>>>2>>>0],ua:_[m+8>>>2>>>0],xa:_[m+12>>>2>>>0],va:_[m+16>>>2>>>0],ta:_[m+20>>>2>>>0],na:_[m+24>>>2>>>0],sa:_[m+28>>>2>>>0],Da:_[m+32>>>2>>>0],za:_[m+36>>>2>>>0],Ca:oe?ue(oe):""},u=ue(u),oe={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var se in oe)u=u.replace(new RegExp(se,"g"),oe[se]);var Qe="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),Re="January February March April May June July August September October November December".split(" ");oe={"%a":d=>Qe[d.na].substring(0,3),"%A":d=>Qe[d.na],"%b":d=>Re[d.va].substring(0,3),"%B":d=>Re[d.va],"%C":d=>E((d.ta+1900)/100|0,2),"%d":d=>E(d.xa,2),"%e":d=>O(d.xa,2," "),"%g":d=>ye(d).toString().substring(2),"%G":ye,"%H":d=>E(d.ua,2),"%I":d=>(d=d.ua,d==0?d=12:12<d&&(d-=12),E(d,2)),"%j":d=>{for(var k=0,$=0;$<=d.va-1;k+=(Le(d.ta+1900)?De:at)[$++]);return E(d.xa+k,3)},"%m":d=>E(d.va+1,2),"%M":d=>E(d.Aa,2),"%n":()=>`\n`,"%p":d=>0<=d.ua&&12>d.ua?"AM":"PM","%S":d=>E(d.Ba,2),"%t":()=>"	","%u":d=>d.na||7,"%U":d=>E(Math.floor((d.sa+7-d.na)/7),2),"%V":d=>{var k=Math.floor((d.sa+7-(d.na+6)%7)/7);if(2>=(d.na+371-d.sa-2)%7&&k++,k)k==53&&($=(d.na+371-d.sa)%7,$==4||$==3&&Le(d.ta)||(k=1));else{k=52;var $=(d.na+7-d.sa-1)%7;($==4||$==5&&Le(d.ta%400-1))&&k++}return E(k,2)},"%w":d=>d.na,"%W":d=>E(Math.floor((d.sa+7-(d.na+6)%7)/7),2),"%y":d=>(d.ta+1900).toString().substring(2),"%Y":d=>d.ta+1900,"%z":d=>{d=d.za;var k=0<=d;return d=Math.abs(d)/60,(k?"+":"-")+("0000"+(d/60*100+d%60)).slice(-4)},"%Z":d=>d.Ca,"%%":()=>"%"},u=u.replace(/%%/g,"\\0\\0");for(se in oe)u.includes(se)&&(u=u.replace(new RegExp(se,"g"),oe[se](m)));return u=u.replace(/\\0\\0/g,"%"),se=G(u),se.length>o?0:(pe.set(se,t>>>0),se.length-1)}var Ve={a:function(t,o,u){t>>>=0;var m=new _e(t);throw J[m.wa+16>>>2>>>0]=0,J[m.wa+4>>>2>>>0]=o>>>0,J[m.wa+8>>>2>>>0]=u>>>0,ge=t,Be++,ge},e:function(){return 0},H:function(){},x:function(){},z:function(){},J:function(){return 0},F:function(){},A:function(){},E:function(){},g:function(){},y:function(){},v:function(){},G:function(){},w:function(){},k:()=>1,I:function(t,o,u){return o>>>=0,Z.copyWithin(t>>>0>>>0,o>>>0,o+(u>>>0)>>>0)},n:function(t,o,u){t=o+2097152>>>0<4194305-!!t?(t>>>0)+4294967296*o:NaN,u>>>=0,t=new Date(1e3*t),_[u>>>2>>>0]=t.getUTCSeconds(),_[u+4>>>2>>>0]=t.getUTCMinutes(),_[u+8>>>2>>>0]=t.getUTCHours(),_[u+12>>>2>>>0]=t.getUTCDate(),_[u+16>>>2>>>0]=t.getUTCMonth(),_[u+20>>>2>>>0]=t.getUTCFullYear()-1900,_[u+24>>>2>>>0]=t.getUTCDay(),_[u+28>>>2>>>0]=(t.getTime()-Date.UTC(t.getUTCFullYear(),0,1,0,0,0,0))/864e5|0},o:function(t,o,u){t=o+2097152>>>0<4194305-!!t?(t>>>0)+4294967296*o:NaN,u>>>=0,t=new Date(1e3*t),_[u>>>2>>>0]=t.getSeconds(),_[u+4>>>2>>>0]=t.getMinutes(),_[u+8>>>2>>>0]=t.getHours(),_[u+12>>>2>>>0]=t.getDate(),_[u+16>>>2>>>0]=t.getMonth(),_[u+20>>>2>>>0]=t.getFullYear()-1900,_[u+24>>>2>>>0]=t.getDay(),_[u+28>>>2>>>0]=(Le(t.getFullYear())?ze:rt)[t.getMonth()]+t.getDate()-1|0,_[u+36>>>2>>>0]=-(60*t.getTimezoneOffset()),o=new Date(t.getFullYear(),6,1).getTimezoneOffset();var m=new Date(t.getFullYear(),0,1).getTimezoneOffset();_[u+32>>>2>>>0]=(o!=m&&t.getTimezoneOffset()==Math.min(m,o))|0},p:function(t){t>>>=0;var o=new Date(_[t+20>>>2>>>0]+1900,_[t+16>>>2>>>0],_[t+12>>>2>>>0],_[t+8>>>2>>>0],_[t+4>>>2>>>0],_[t>>>2>>>0],0),u=_[t+32>>>2>>>0],m=o.getTimezoneOffset(),O=new Date(o.getFullYear(),6,1).getTimezoneOffset(),E=new Date(o.getFullYear(),0,1).getTimezoneOffset(),U=Math.min(E,O);return 0>u?_[t+32>>>2>>>0]=+(O!=E&&U==m):0<u!=(U==m)&&(O=Math.max(E,O),o.setTime(o.getTime()+6e4*((0<u?U:O)-m))),_[t+24>>>2>>>0]=o.getDay(),_[t+28>>>2>>>0]=(Le(o.getFullYear())?ze:rt)[o.getMonth()]+o.getDate()-1|0,_[t>>>2>>>0]=o.getSeconds(),_[t+4>>>2>>>0]=o.getMinutes(),_[t+8>>>2>>>0]=o.getHours(),_[t+12>>>2>>>0]=o.getDate(),_[t+16>>>2>>>0]=o.getMonth(),_[t+20>>>2>>>0]=o.getYear(),t=o.getTime(),t=isNaN(t)?-1:t/1e3,Je((ve=t,1<=+Math.abs(ve)?0<ve?+Math.floor(ve/4294967296)>>>0:~~+Math.ceil((ve-+(~~ve>>>0))/4294967296)>>>0:0)),t>>>0},l:function(){return-52},m:function(){},t:function(t,o,u,m){u>>>=0,m>>>=0;var O=new Date().getFullYear(),E=new Date(O,0,1),U=new Date(O,6,1);O=E.getTimezoneOffset();var ee=U.getTimezoneOffset();J[t>>>0>>>2>>>0]=60*Math.max(O,ee),_[o>>>0>>>2>>>0]=+(O!=ee),t=ye=>ye.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1],E=t(E),U=t(U),ee<O?(Se(E,Z,u,17),Se(U,Z,m,17)):(Se(E,Z,m,17),Se(U,Z,u,17))},d:()=>{ie("")},B:function(t,o,u){t>>>=0,o>>>=0,u>>>=0,Te.length=0;for(var m;m=Z[o++>>>0];){var O=m!=105;O&=m!=112,u+=O&&u%8?4:0,Te.push(m==112?J[u>>>2>>>0]:m==105?_[u>>>2>>>0]:Pe[u>>>3>>>0]),u+=O?8:4}return Ae[t](...Te)},h:()=>Date.now(),u:function(){return 4294901760},b:()=>performance.now(),s:function(t){t>>>=0;var o=Z.length;if(4294901760<t)return!1;for(var u=1;4>=u;u*=2){var m=o*(1+.2/u);m=Math.min(m,t+100663296);var O=Math;m=Math.max(t,m);e:{O=(O.min.call(O,4294901760,m+(65536-m%65536)%65536)-W.buffer.byteLength+65535)/65536;try{W.grow(O),le();var E=1;break e}catch{}E=void 0}if(E)return!0}return!1},C:function(t,o){t>>>=0,o>>>=0;var u=0;return ke().forEach((m,O)=>{var E=o+u;for(O=J[t+4*O>>>2>>>0]=E,E=0;E<m.length;++E)pe[O++>>>0]=m.charCodeAt(E);pe[O>>>0]=0,u+=m.length+1}),0},D:function(t,o){t>>>=0,o>>>=0;var u=ke();J[t>>>2>>>0]=u.length;var m=0;return u.forEach(O=>m+=O.length+1),J[o>>>2>>>0]=m,0},f:()=>52,j:function(){return 52},q:function(){return 70},i:function(t,o,u,m){o>>>=0,u>>>=0,m>>>=0;for(var O=0,E=0;E<u;E++){var U=J[o>>>2>>>0],ee=J[o+4>>>2>>>0];o+=8;for(var ye=0;ye<ee;ye++){var oe=Z[U+ye>>>0],se=nt[t];oe===0||oe===10?((t===1?T:L)(re(se,0)),se.length=0):se.push(oe)}O+=ee}return J[m>>>2>>>0]=O,0},r:qe,c:function(t,o,u,m){return qe(t>>>0,o>>>0,u>>>0,m>>>0)}},P=function(){function t(u){return P=u.exports,P=st(),W=P.K,le(),ne.unshift(P.L),we--,we==0&&(me!==null&&(clearInterval(me),me=null),F&&(u=F,F=null,u())),P}var o={a:Ve};if(we++,a.instantiateWasm)try{return a.instantiateWasm(o,t)}catch(u){L(`Module.instantiateWasm callback failed with error: ${u}`),f(u)}return Ue(o,function(u){t(u.instance)}).catch(f),{}}();a._OrtInit=(t,o)=>(a._OrtInit=P.M)(t,o),a._OrtGetLastError=(t,o)=>(a._OrtGetLastError=P.N)(t,o),a._OrtCreateSessionOptions=(t,o,u,m,O,E,U,ee,ye,oe)=>(a._OrtCreateSessionOptions=P.O)(t,o,u,m,O,E,U,ee,ye,oe),a._OrtAppendExecutionProvider=(t,o)=>(a._OrtAppendExecutionProvider=P.P)(t,o),a._OrtAddFreeDimensionOverride=(t,o,u)=>(a._OrtAddFreeDimensionOverride=P.Q)(t,o,u),a._OrtAddSessionConfigEntry=(t,o,u)=>(a._OrtAddSessionConfigEntry=P.R)(t,o,u),a._OrtReleaseSessionOptions=t=>(a._OrtReleaseSessionOptions=P.S)(t),a._OrtCreateSession=(t,o,u)=>(a._OrtCreateSession=P.T)(t,o,u),a._OrtReleaseSession=t=>(a._OrtReleaseSession=P.U)(t),a._OrtGetInputOutputCount=(t,o,u)=>(a._OrtGetInputOutputCount=P.V)(t,o,u),a._OrtGetInputName=(t,o)=>(a._OrtGetInputName=P.W)(t,o),a._OrtGetOutputName=(t,o)=>(a._OrtGetOutputName=P.X)(t,o),a._OrtFree=t=>(a._OrtFree=P.Y)(t),a._OrtCreateTensor=(t,o,u,m,O,E)=>(a._OrtCreateTensor=P.Z)(t,o,u,m,O,E),a._OrtGetTensorData=(t,o,u,m,O)=>(a._OrtGetTensorData=P._)(t,o,u,m,O),a._OrtReleaseTensor=t=>(a._OrtReleaseTensor=P.$)(t),a._OrtCreateRunOptions=(t,o,u,m)=>(a._OrtCreateRunOptions=P.aa)(t,o,u,m),a._OrtAddRunConfigEntry=(t,o,u)=>(a._OrtAddRunConfigEntry=P.ba)(t,o,u),a._OrtReleaseRunOptions=t=>(a._OrtReleaseRunOptions=P.ca)(t),a._OrtCreateBinding=t=>(a._OrtCreateBinding=P.da)(t),a._OrtBindInput=(t,o,u)=>(a._OrtBindInput=P.ea)(t,o,u),a._OrtBindOutput=(t,o,u,m)=>(a._OrtBindOutput=P.fa)(t,o,u,m),a._OrtClearBoundOutputs=t=>(a._OrtClearBoundOutputs=P.ga)(t),a._OrtReleaseBinding=t=>(a._OrtReleaseBinding=P.ha)(t),a._OrtRunWithBinding=(t,o,u,m,O)=>(a._OrtRunWithBinding=P.ia)(t,o,u,m,O),a._OrtRun=(t,o,u,m,O,E,U,ee)=>(a._OrtRun=P.ja)(t,o,u,m,O,E,U,ee),a._OrtEndProfiling=t=>(a._OrtEndProfiling=P.ka)(t),a._malloc=t=>(a._malloc=P.la)(t),a._free=t=>(a._free=P.ma)(t);var Je=t=>(Je=P.oa)(t),ot=t=>(ot=P.pa)(t),M=t=>(M=P.qa)(t),Ne=()=>(Ne=P.ra)();function st(){var t=P;t=Object.assign({},t);var o=u=>m=>u(m)>>>0;return t.la=o(t.la),t.qa=o(t.qa),t.ra=(u=>()=>u()>>>0)(t.ra),t}a.stackSave=()=>Ne(),a.stackRestore=t=>ot(t),a.stackAlloc=t=>M(t),a.UTF8ToString=ue,a.stringToUTF8=(t,o,u)=>Se(t,Z,o,u),a.lengthBytesUTF8=Ee;var Fe;F=function t(){Fe||Xe(),Fe||(F=t)};function Xe(){if(!(0<we)){if(a.preRun)for(typeof a.preRun=="function"&&(a.preRun=[a.preRun]);a.preRun.length;){var t=a.preRun.shift();Ie.unshift(t)}for(;0<Ie.length;)Ie.shift()(a);if(!(0<we||Fe||(Fe=!0,a.calledRun=!0,de))){for(;0<ne.length;)ne.shift()(a);for(h(a);0<X.length;)X.shift()(a)}}}return Xe(),w}})();typeof dr=="object"&&typeof Ct=="object"?Ct.exports=cr:typeof define=="function"&&define.amd&&define([],()=>cr)});var mr=Ke(()=>{});var gr=Ke(()=>{});var hr={};Et(hr,{cpus:()=>en});var en,br=_t(()=>{en=void 0});var Or=Ke((wr,Dt)=>{"use strict";var yr=(()=>{var i=typeof document<"u"?document.currentScript?.src:void 0;return typeof __filename<"u"&&(i||=__filename),function(c={}){function a(){return X.buffer!=ie.buffer&&K(),ie}function h(){return X.buffer!=ie.buffer&&K(),xe}function f(){return X.buffer!=ie.buffer&&K(),ce}function w(){return X.buffer!=ie.buffer&&K(),be}function g(){return X.buffer!=ie.buffer&&K(),ae}var s=c,S,x,H=new Promise((e,r)=>{S=e,x=r}),A=Object.assign({},s),I="./this.program",V=(e,r)=>{throw r},R=typeof window=="object",B=typeof importScripts=="function",D=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",T=s.ENVIRONMENT_IS_PTHREAD||!1,L="";function W(e){return s.locateFile?s.locateFile(e,L):L+e}var de,pe,Z;if(D){var _=(At(),et(St)),J=(Mt(),et(Tt));L=B?J.dirname(L)+"/":__dirname+"/",de=(e,r)=>(e=ue(e)?new URL(e):J.normalize(e),_.readFileSync(e,r?void 0:"utf8")),Z=e=>(e=de(e,!0),e.buffer||(e=new Uint8Array(e)),e),pe=(e,r,n,l=!0)=>{e=ue(e)?new URL(e):J.normalize(e),_.readFile(e,l?void 0:"utf8",(y,b)=>{y?n(y):r(l?b.buffer:b)})},!s.thisProgram&&1<process.argv.length&&(I=process.argv[1].replace(/\\\\/g,"/")),process.argv.slice(2),V=(e,r)=>{throw process.exitCode=e,r},global.Worker=mr().Worker}else(R||B)&&(B?L=self.location.href:typeof document<"u"&&document.currentScript&&(L=document.currentScript.src),typeof i<"u"&&i&&(L=i),L.startsWith("blob:")?L="":L=L.substr(0,L.replace(/[?#].*/,"").lastIndexOf("/")+1),D||(de=e=>{var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},B&&(Z=e=>{var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),pe=(e,r,n)=>{var l=new XMLHttpRequest;l.open("GET",e,!0),l.responseType="arraybuffer",l.onload=()=>{l.status==200||l.status==0&&l.response?r(l.response):n()},l.onerror=n,l.send(null)}));D&&typeof performance>"u"&&(global.performance=gr().performance);var Pe=console.log.bind(console),le=console.error.bind(console);D&&(Pe=(...e)=>_.writeSync(1,e.join(" ")+`\n`),le=(...e)=>_.writeSync(2,e.join(" ")+`\n`));var Ie=Pe,ne=le;Object.assign(s,A),A=null;var X,we,me=!1,F,ie,xe,ce,be,ae;function K(){var e=X.buffer;s.HEAP8=ie=new Int8Array(e),s.HEAP16=new Int16Array(e),s.HEAPU8=xe=new Uint8Array(e),s.HEAPU16=new Uint16Array(e),s.HEAP32=ce=new Int32Array(e),s.HEAPU32=be=new Uint32Array(e),s.HEAPF32=new Float32Array(e),s.HEAPF64=ae=new Float64Array(e)}var je=16777216;if(T)X=s.wasmMemory;else if(s.wasmMemory)X=s.wasmMemory;else if(X=new WebAssembly.Memory({initial:je/65536,maximum:65536,shared:!0}),!(X.buffer instanceof SharedArrayBuffer))throw ne("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),D&&ne("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and/or recent version)"),Error("bad memory");K(),je=X.buffer.byteLength;var Oe=[],Ue=[],ve=[],Ae=0,_e=null,ge=null;function Be(){if(Ae--,Ae==0&&(_e!==null&&(clearInterval(_e),_e=null),ge)){var e=ge;ge=null,e()}}function te(e){throw e="Aborted("+e+")",ne(e),me=!0,F=1,e=new WebAssembly.RuntimeError(e+". Build with -sASSERTIONS for more info."),x(e),e}var re=e=>e.startsWith("data:application/octet-stream;base64,"),ue=e=>e.startsWith("file://"),Ee;Ee="ort-wasm-threaded.wasm",re(Ee)||(Ee=W(Ee));function Se(e){if(Z)return Z(e);throw"both async and sync fetching of the wasm failed"}function Le(e){if(R||B){if(typeof fetch=="function"&&!ue(e))return fetch(e,{credentials:"same-origin"}).then(r=>{if(!r.ok)throw`failed to load wasm binary file at \'${e}\'`;return r.arrayBuffer()}).catch(()=>Se(e));if(pe)return new Promise((r,n)=>{pe(e,l=>r(new Uint8Array(l)),n)})}return Promise.resolve().then(()=>Se(e))}function ze(e,r,n){return Le(e).then(l=>WebAssembly.instantiate(l,r)).then(n,l=>{ne(`failed to asynchronously prepare wasm: ${l}`),te(l)})}function rt(e,r){var n=Ee;return typeof WebAssembly.instantiateStreaming!="function"||re(n)||ue(n)||D||typeof fetch!="function"?ze(n,e,r):fetch(n,{credentials:"same-origin"}).then(l=>WebAssembly.instantiateStreaming(l,e).then(r,function(y){return ne(`wasm streaming compile failed: ${y}`),ne("falling back to ArrayBuffer instantiation"),ze(n,e,r)}))}var Te,Ge={799444:(e,r,n,l)=>{if(typeof s>"u"||!s.bb)return 1;if(e=ee(e>>>0),e.startsWith("./")&&(e=e.substring(2)),e=s.bb.get(e),!e)return 2;if(r>>>=0,n>>>=0,l>>>=0,r+n>e.byteLength)return 3;try{return h().set(e.subarray(r,r+n),l>>>0),0}catch{return 4}}};function ke(e){this.name="ExitStatus",this.message=`Program terminated with exit(${e})`,this.status=e}var We=e=>{e.terminate(),e.onmessage=()=>{}},nt=e=>{M.Oa.length==0&&(Je(),M.Xa(M.Oa[0]));var r=M.Oa.pop();if(!r)return 6;M.Pa.push(r),M.La[e.Na]=r,r.Na=e.Na;var n={cmd:"run",start_routine:e.gb,arg:e.cb,pthread_ptr:e.Na};return D&&r.unref(),r.postMessage(n,e.mb),0},De=0,at=e=>{var r=Ot();return e=e(),ft(r),e},G=(e,r,...n)=>at(()=>{for(var l=n.length,y=wt(8*l),b=y>>>3,v=0;v<n.length;v++){var z=n[v];g()[b+v>>>0]=z}return rr(e,0,l,y,r)});function qe(e){if(T)return G(0,1,e);F=e,0<De||(M.hb(),s.onExit?.(e),me=!0),V(e,new ke(e))}var Ve=e=>{if(F=e,T)throw st(e),"unwind";qe(e)};function P(){for(var e=s.numThreads;e--;)Je();Oe.unshift(()=>{Ae++,ot(()=>Be())})}function Je(){var e=W("ort-wasm-threaded.worker.js");e=new Worker(e),M.Oa.push(e)}function ot(e){T?e():Promise.all(M.Oa.map(M.Xa)).then(e)}var M={Oa:[],Pa:[],ab:[],La:{},Va(){T?(M.receiveObjectTransfer=M.fb,M.threadInitTLS=M.$a,M.setExitStatus=M.Za):P()},Za:e=>F=e,pb:["$terminateWorker"],hb:()=>{for(var e of M.Pa)We(e);for(e of M.Oa)We(e);M.Oa=[],M.Pa=[],M.La=[]},Ya:e=>{var r=e.Na;delete M.La[r],M.Oa.push(e),M.Pa.splice(M.Pa.indexOf(e),1),e.Na=0,bt(r)},fb(){},$a(){M.ab.forEach(e=>e())},Xa:e=>new Promise(r=>{e.onmessage=b=>{b=b.data;var v=b.cmd;if(b.targetThread&&b.targetThread!=ut()){var z=M.La[b.targetThread];z?z.postMessage(b,b.transferList):ne(`Internal error! Worker sent a message "${v}" to target pthread ${b.targetThread}, but that thread no longer exists!`)}else v==="checkMailbox"?it():v==="spawnThread"?nt(b):v==="cleanupThread"?M.Ya(M.La[b.thread]):v==="killThread"?(b=b.thread,v=M.La[b],delete M.La[b],We(v),bt(b),M.Pa.splice(M.Pa.indexOf(v),1),v.Na=0):v==="cancelThread"?M.La[b.thread].postMessage({cmd:"cancel"}):v==="loaded"?(e.loaded=!0,D&&!e.Na&&e.unref(),r(e)):v==="alert"?alert(`Thread ${b.threadId}: ${b.text}`):b.target==="setimmediate"?e.postMessage(b):v==="callHandler"?s[b.handler](...b.args):v&&ne(`worker sent an unknown command ${v}`)},e.onerror=b=>{throw ne(`worker sent an error! ${b.filename}:${b.lineno}: ${b.message}`),b},D&&(e.on("message",b=>e.onmessage({data:b})),e.on("error",b=>e.onerror(b)));var n=[],l=["onExit"],y;for(y of l)s.hasOwnProperty(y)&&n.push(y);e.postMessage({cmd:"load",handlers:n,urlOrBlob:s.mainScriptUrlOrBlob||i,wasmMemory:X,wasmModule:we})})};s.PThread=M;var Ne=e=>{for(;0<e.length;)e.shift()(s)};s.establishStackSpace=()=>{var e=ut(),r=w()[e+52>>>2>>>0];e=w()[e+56>>>2>>>0],or(r,r-e),ft(r)};function st(e){if(T)return G(1,0,e);Ve(e)}var Fe=[],Xe;s.invokeEntryPoint=(e,r)=>{De=0;var n=Fe[e];n||(e>=Fe.length&&(Fe.length=e+1),Fe[e]=n=Xe.get(e)),e=n(r),0<De?M.Za(e):yt(e)};class t{constructor(r){this.Ua=r-24}Va(r,n){w()[this.Ua+16>>>2>>>0]=0,w()[this.Ua+4>>>2>>>0]=r,w()[this.Ua+8>>>2>>>0]=n}}var o=0,u=0;function m(e,r,n,l){return T?G(2,1,e,r,n,l):O(e,r,n,l)}function O(e,r,n,l){if(e>>>=0,r>>>=0,n>>>=0,l>>>=0,typeof SharedArrayBuffer>"u")return ne("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var y=[];return T&&y.length===0?m(e,r,n,l):(e={gb:n,Na:e,cb:l,mb:y},T?(e.ob="spawnThread",postMessage(e,y),0):nt(e))}var E=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,U=(e,r,n)=>{r>>>=0;var l=r+n;for(n=r;e[n]&&!(n>=l);)++n;if(16<n-r&&e.buffer&&E)return E.decode(e.buffer instanceof SharedArrayBuffer?e.slice(r,n):e.subarray(r,n));for(l="";r<n;){var y=e[r++];if(y&128){var b=e[r++]&63;if((y&224)==192)l+=String.fromCharCode((y&31)<<6|b);else{var v=e[r++]&63;y=(y&240)==224?(y&15)<<12|b<<6|v:(y&7)<<18|b<<12|v<<6|e[r++]&63,65536>y?l+=String.fromCharCode(y):(y-=65536,l+=String.fromCharCode(55296|y>>10,56320|y&1023))}}else l+=String.fromCharCode(y)}return l},ee=(e,r)=>(e>>>=0)?U(h(),e,r):"";function ye(e,r,n){return T?G(3,1,e,r,n):0}function oe(e,r){if(T)return G(4,1,e,r)}var se=e=>{for(var r=0,n=0;n<e.length;++n){var l=e.charCodeAt(n);127>=l?r++:2047>=l?r+=2:55296<=l&&57343>=l?(r+=4,++n):r+=3}return r},Qe=(e,r,n,l)=>{if(n>>>=0,!(0<l))return 0;var y=n;l=n+l-1;for(var b=0;b<e.length;++b){var v=e.charCodeAt(b);if(55296<=v&&57343>=v){var z=e.charCodeAt(++b);v=65536+((v&1023)<<10)|z&1023}if(127>=v){if(n>=l)break;r[n++>>>0]=v}else{if(2047>=v){if(n+1>=l)break;r[n++>>>0]=192|v>>6}else{if(65535>=v){if(n+2>=l)break;r[n++>>>0]=224|v>>12}else{if(n+3>=l)break;r[n++>>>0]=240|v>>18,r[n++>>>0]=128|v>>12&63}r[n++>>>0]=128|v>>6&63}r[n++>>>0]=128|v&63}}return r[n>>>0]=0,n-y},Re=(e,r,n)=>Qe(e,h(),r,n);function d(e,r){if(T)return G(5,1,e,r)}function k(e,r,n){if(T)return G(6,1,e,r,n)}function $(e,r,n){return T?G(7,1,e,r,n):0}function Me(e,r){if(T)return G(8,1,e,r)}function Ze(e,r,n){if(T)return G(9,1,e,r,n)}function Rt(e,r,n,l){if(T)return G(10,1,e,r,n,l)}function It(e,r,n,l){if(T)return G(11,1,e,r,n,l)}function Bt(e,r,n,l){if(T)return G(12,1,e,r,n,l)}function kt(e){if(T)return G(13,1,e)}function Wt(e,r){if(T)return G(14,1,e,r)}function Nt(e,r,n){if(T)return G(15,1,e,r,n)}function dt(e){e>>>=0,typeof Atomics.nb=="function"&&(Atomics.nb(f(),e>>>2,e).value.then(it),e+=128,Atomics.store(f(),e>>>2,1))}s.__emscripten_thread_mailbox_await=dt;var it=()=>{var e=ut();if(e&&(dt(e),e=nr,!me))try{if(e(),!(0<De))try{T?yt(F):Ve(F)}catch(r){r instanceof ke||r=="unwind"||V(1,r)}}catch(r){r instanceof ke||r=="unwind"||V(1,r)}};s.checkMailbox=it;var pt=[],$e=e=>e%4===0&&(e%100!==0||e%400===0),Ht=[0,31,60,91,121,152,182,213,244,274,305,335],Gt=[0,31,59,90,120,151,181,212,243,273,304,334];function $t(e,r,n,l,y,b,v,z){return T?G(16,1,e,r,n,l,y,b,v,z):-52}function Yt(e,r,n,l,y,b,v){if(T)return G(17,1,e,r,n,l,y,b,v)}var mt=[],gt={},jt=()=>{if(!ht){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:I||"./this.program"},r;for(r in gt)gt[r]===void 0?delete e[r]:e[r]=gt[r];var n=[];for(r in e)n.push(`${r}=${e[r]}`);ht=n}return ht},ht;function zt(e,r){if(T)return G(18,1,e,r);e>>>=0,r>>>=0;var n=0;return jt().forEach((l,y)=>{var b=r+n;for(y=w()[e+4*y>>>2>>>0]=b,b=0;b<l.length;++b)a()[y++>>>0]=l.charCodeAt(b);a()[y>>>0]=0,n+=l.length+1}),0}function qt(e,r){if(T)return G(19,1,e,r);e>>>=0,r>>>=0;var n=jt();w()[e>>>2>>>0]=n.length;var l=0;return n.forEach(y=>l+=y.length+1),w()[r>>>2>>>0]=l,0}function Vt(e){return T?G(20,1,e):52}function Jt(e,r,n,l){return T?G(21,1,e,r,n,l):52}function Xt(e,r,n,l,y){return T?G(22,1,e,r,n,l,y):70}var Hr=[null,[],[]];function Qt(e,r,n,l){if(T)return G(23,1,e,r,n,l);r>>>=0,n>>>=0,l>>>=0;for(var y=0,b=0;b<n;b++){var v=w()[r>>>2>>>0],z=w()[r+4>>>2>>>0];r+=8;for(var Ce=0;Ce<z;Ce++){var fe=h()[v+Ce>>>0],he=Hr[e];fe===0||fe===10?((e===1?Ie:ne)(U(he,0)),he.length=0):he.push(fe)}y+=z}return w()[l>>>2>>>0]=y,0}var Zt=[31,29,31,30,31,30,31,31,30,31,30,31],Kt=[31,28,31,30,31,30,31,31,30,31,30,31];function Gr(e){var r=Array(se(e)+1);return Qe(e,r,0,r.length),r}var $r=(e,r)=>{a().set(e,r>>>0)};function er(e,r,n,l){function y(p,N,q){for(p=typeof p=="number"?p.toString():p||"";p.length<N;)p=q[0]+p;return p}function b(p,N){return y(p,N,"0")}function v(p,N){function q(fr){return 0>fr?-1:0<fr?1:0}var He;return(He=q(p.getFullYear()-N.getFullYear()))===0&&(He=q(p.getMonth()-N.getMonth()))===0&&(He=q(p.getDate()-N.getDate())),He}function z(p){switch(p.getDay()){case 0:return new Date(p.getFullYear()-1,11,29);case 1:return p;case 2:return new Date(p.getFullYear(),0,3);case 3:return new Date(p.getFullYear(),0,2);case 4:return new Date(p.getFullYear(),0,1);case 5:return new Date(p.getFullYear()-1,11,31);case 6:return new Date(p.getFullYear()-1,11,30)}}function Ce(p){var N=p.Qa;for(p=new Date(new Date(p.Ra+1900,0,1).getTime());0<N;){var q=p.getMonth(),He=($e(p.getFullYear())?Zt:Kt)[q];if(N>He-p.getDate())N-=He-p.getDate()+1,p.setDate(1),11>q?p.setMonth(q+1):(p.setMonth(0),p.setFullYear(p.getFullYear()+1));else{p.setDate(p.getDate()+N);break}}return q=new Date(p.getFullYear()+1,0,4),N=z(new Date(p.getFullYear(),0,4)),q=z(q),0>=v(N,p)?0>=v(q,p)?p.getFullYear()+1:p.getFullYear():p.getFullYear()-1}e>>>=0,r>>>=0,n>>>=0,l>>>=0;var fe=w()[l+40>>>2>>>0];l={kb:f()[l>>>2>>>0],jb:f()[l+4>>>2>>>0],Sa:f()[l+8>>>2>>>0],Wa:f()[l+12>>>2>>>0],Ta:f()[l+16>>>2>>>0],Ra:f()[l+20>>>2>>>0],Ma:f()[l+24>>>2>>>0],Qa:f()[l+28>>>2>>>0],qb:f()[l+32>>>2>>>0],ib:f()[l+36>>>2>>>0],lb:fe?ee(fe):""},n=ee(n),fe={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var he in fe)n=n.replace(new RegExp(he,"g"),fe[he]);var ir="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ur="January February March April May June July August September October November December".split(" ");fe={"%a":p=>ir[p.Ma].substring(0,3),"%A":p=>ir[p.Ma],"%b":p=>ur[p.Ta].substring(0,3),"%B":p=>ur[p.Ta],"%C":p=>b((p.Ra+1900)/100|0,2),"%d":p=>b(p.Wa,2),"%e":p=>y(p.Wa,2," "),"%g":p=>Ce(p).toString().substring(2),"%G":Ce,"%H":p=>b(p.Sa,2),"%I":p=>(p=p.Sa,p==0?p=12:12<p&&(p-=12),b(p,2)),"%j":p=>{for(var N=0,q=0;q<=p.Ta-1;N+=($e(p.Ra+1900)?Zt:Kt)[q++]);return b(p.Wa+N,3)},"%m":p=>b(p.Ta+1,2),"%M":p=>b(p.jb,2),"%n":()=>`\n`,"%p":p=>0<=p.Sa&&12>p.Sa?"AM":"PM","%S":p=>b(p.kb,2),"%t":()=>"	","%u":p=>p.Ma||7,"%U":p=>b(Math.floor((p.Qa+7-p.Ma)/7),2),"%V":p=>{var N=Math.floor((p.Qa+7-(p.Ma+6)%7)/7);if(2>=(p.Ma+371-p.Qa-2)%7&&N++,N)N==53&&(q=(p.Ma+371-p.Qa)%7,q==4||q==3&&$e(p.Ra)||(N=1));else{N=52;var q=(p.Ma+7-p.Qa-1)%7;(q==4||q==5&&$e(p.Ra%400-1))&&N++}return b(N,2)},"%w":p=>p.Ma,"%W":p=>b(Math.floor((p.Qa+7-(p.Ma+6)%7)/7),2),"%y":p=>(p.Ra+1900).toString().substring(2),"%Y":p=>p.Ra+1900,"%z":p=>{p=p.ib;var N=0<=p;return p=Math.abs(p)/60,(N?"+":"-")+("0000"+(p/60*100+p%60)).slice(-4)},"%Z":p=>p.lb,"%%":()=>"%"},n=n.replace(/%%/g,"\\0\\0");for(he in fe)n.includes(he)&&(n=n.replace(new RegExp(he,"g"),fe[he](l)));return n=n.replace(/\\0\\0/g,"%"),he=Gr(n),he.length>r?0:($r(he,e),he.length-1)}M.Va();var Yr=[qe,st,m,ye,oe,d,k,$,Me,Ze,Rt,It,Bt,kt,Wt,Nt,$t,Yt,zt,qt,Vt,Jt,Xt,Qt],jr={b:function(e,r,n){throw e>>>=0,new t(e).Va(r>>>0,n>>>0),o=e,u++,o},L:function(e){tr(e>>>0,!B,1,!R,131072,!1),M.$a()},j:function(e){e>>>=0,T?postMessage({cmd:"cleanupThread",thread:e}):M.Ya(M.La[e])},H:O,h:ye,S:oe,D:d,F:k,T:$,Q:Me,J:Ze,P:Rt,n:It,E:Bt,B:kt,R:Wt,C:Nt,p:()=>1,z:function(e,r){e>>>=0,e==r>>>0?setTimeout(it):T?postMessage({targetThread:e,cmd:"checkMailbox"}):(e=M.La[e])&&e.postMessage({cmd:"checkMailbox"})},I:function(e,r,n,l,y){r>>>=0,n>>>=0,pt.length=l,y=y>>>0>>>3;for(var b=0;b<l;b++)pt[b]=g()[y+b>>>0];return e=r?Ge[r]:Yr[e],M.eb=n,n=e(...pt),M.eb=0,n},K:dt,o:function(e){D&&M.La[e>>>0].ref()},s:function(e,r,n){e=r+2097152>>>0<4194305-!!e?(e>>>0)+4294967296*r:NaN,n>>>=0,e=new Date(1e3*e),f()[n>>>2>>>0]=e.getUTCSeconds(),f()[n+4>>>2>>>0]=e.getUTCMinutes(),f()[n+8>>>2>>>0]=e.getUTCHours(),f()[n+12>>>2>>>0]=e.getUTCDate(),f()[n+16>>>2>>>0]=e.getUTCMonth(),f()[n+20>>>2>>>0]=e.getUTCFullYear()-1900,f()[n+24>>>2>>>0]=e.getUTCDay(),e=(e.getTime()-Date.UTC(e.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,f()[n+28>>>2>>>0]=e},t:function(e,r,n){e=r+2097152>>>0<4194305-!!e?(e>>>0)+4294967296*r:NaN,n>>>=0,e=new Date(1e3*e),f()[n>>>2>>>0]=e.getSeconds(),f()[n+4>>>2>>>0]=e.getMinutes(),f()[n+8>>>2>>>0]=e.getHours(),f()[n+12>>>2>>>0]=e.getDate(),f()[n+16>>>2>>>0]=e.getMonth(),f()[n+20>>>2>>>0]=e.getFullYear()-1900,f()[n+24>>>2>>>0]=e.getDay(),r=($e(e.getFullYear())?Ht:Gt)[e.getMonth()]+e.getDate()-1|0,f()[n+28>>>2>>>0]=r,f()[n+36>>>2>>>0]=-(60*e.getTimezoneOffset()),r=new Date(e.getFullYear(),6,1).getTimezoneOffset();var l=new Date(e.getFullYear(),0,1).getTimezoneOffset();e=(r!=l&&e.getTimezoneOffset()==Math.min(l,r))|0,f()[n+32>>>2>>>0]=e},u:function(e){e>>>=0;var r=new Date(f()[e+20>>>2>>>0]+1900,f()[e+16>>>2>>>0],f()[e+12>>>2>>>0],f()[e+8>>>2>>>0],f()[e+4>>>2>>>0],f()[e>>>2>>>0],0),n=f()[e+32>>>2>>>0],l=r.getTimezoneOffset(),y=new Date(r.getFullYear(),6,1).getTimezoneOffset(),b=new Date(r.getFullYear(),0,1).getTimezoneOffset(),v=Math.min(b,y);return 0>n?f()[e+32>>>2>>>0]=+(y!=b&&v==l):0<n!=(v==l)&&(y=Math.max(b,y),r.setTime(r.getTime()+6e4*((0<n?v:y)-l))),f()[e+24>>>2>>>0]=r.getDay(),n=($e(r.getFullYear())?Ht:Gt)[r.getMonth()]+r.getDate()-1|0,f()[e+28>>>2>>>0]=n,f()[e>>>2>>>0]=r.getSeconds(),f()[e+4>>>2>>>0]=r.getMinutes(),f()[e+8>>>2>>>0]=r.getHours(),f()[e+12>>>2>>>0]=r.getDate(),f()[e+16>>>2>>>0]=r.getMonth(),f()[e+20>>>2>>>0]=r.getYear(),e=r.getTime(),e=isNaN(e)?-1:e/1e3,ar((Te=e,1<=+Math.abs(Te)?0<Te?+Math.floor(Te/4294967296)>>>0:~~+Math.ceil((Te-+(~~Te>>>0))/4294967296)>>>0:0)),e>>>0},q:$t,r:Yt,y:function(e,r,n,l){e>>>=0,r>>>=0,n>>>=0,l>>>=0;var y=new Date().getFullYear(),b=new Date(y,0,1),v=new Date(y,6,1);y=b.getTimezoneOffset();var z=v.getTimezoneOffset(),Ce=Math.max(y,z);w()[e>>>2>>>0]=60*Ce,f()[r>>>2>>>0]=+(y!=z),e=fe=>fe.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1],b=e(b),v=e(v),z<y?(Re(b,n,17),Re(v,l,17)):(Re(b,l,17),Re(v,n,17))},c:()=>{te("")},O:function(e,r,n){e>>>=0,r>>>=0,n>>>=0,mt.length=0;for(var l;l=h()[r++>>>0];){var y=l!=105;y&=l!=112,n+=y&&n%8?4:0,mt.push(l==112?w()[n>>>2>>>0]:l==105?f()[n>>>2>>>0]:g()[n>>>3>>>0]),n+=y?8:4}return Ge[e](...mt)},k:()=>{},i:()=>Date.now(),U:()=>{throw De+=1,"unwind"},A:function(){return 4294901760},e:()=>performance.timeOrigin+performance.now(),f:()=>D?(br(),et(hr)).cpus().length:navigator.hardwareConcurrency,x:function(e){e>>>=0;var r=h().length;if(e<=r||4294901760<e)return!1;for(var n=1;4>=n;n*=2){var l=r*(1+.2/n);l=Math.min(l,e+100663296);var y=Math;l=Math.max(e,l);e:{y=(y.min.call(y,4294901760,l+(65536-l%65536)%65536)-X.buffer.byteLength+65535)/65536;try{X.grow(y),K();var b=1;break e}catch{}b=void 0}if(b)return!0}return!1},M:zt,N:qt,G:Ve,g:Vt,m:Jt,v:Xt,l:Qt,a:X||s.wasmMemory,w:er,d:function(e,r,n,l){return er(e>>>0,r>>>0,n>>>0,l>>>0)}},C=function(){function e(n,l){return C=n.exports,C=zr(),M.ab.push(C.ya),Xe=C.za,Ue.unshift(C.V),we=l,Be(),C}var r={a:jr};if(Ae++,s.instantiateWasm)try{return s.instantiateWasm(r,e)}catch(n){ne(`Module.instantiateWasm callback failed with error: ${n}`),x(n)}return rt(r,function(n){e(n.instance,n.module)}).catch(x),{}}();s._OrtInit=(e,r)=>(s._OrtInit=C.W)(e,r),s._OrtGetLastError=(e,r)=>(s._OrtGetLastError=C.X)(e,r),s._OrtCreateSessionOptions=(e,r,n,l,y,b,v,z,Ce,fe)=>(s._OrtCreateSessionOptions=C.Y)(e,r,n,l,y,b,v,z,Ce,fe),s._OrtAppendExecutionProvider=(e,r)=>(s._OrtAppendExecutionProvider=C.Z)(e,r),s._OrtAddFreeDimensionOverride=(e,r,n)=>(s._OrtAddFreeDimensionOverride=C._)(e,r,n),s._OrtAddSessionConfigEntry=(e,r,n)=>(s._OrtAddSessionConfigEntry=C.$)(e,r,n),s._OrtReleaseSessionOptions=e=>(s._OrtReleaseSessionOptions=C.aa)(e),s._OrtCreateSession=(e,r,n)=>(s._OrtCreateSession=C.ba)(e,r,n),s._OrtReleaseSession=e=>(s._OrtReleaseSession=C.ca)(e),s._OrtGetInputOutputCount=(e,r,n)=>(s._OrtGetInputOutputCount=C.da)(e,r,n),s._OrtGetInputName=(e,r)=>(s._OrtGetInputName=C.ea)(e,r),s._OrtGetOutputName=(e,r)=>(s._OrtGetOutputName=C.fa)(e,r),s._OrtFree=e=>(s._OrtFree=C.ga)(e),s._OrtCreateTensor=(e,r,n,l,y,b)=>(s._OrtCreateTensor=C.ha)(e,r,n,l,y,b),s._OrtGetTensorData=(e,r,n,l,y)=>(s._OrtGetTensorData=C.ia)(e,r,n,l,y),s._OrtReleaseTensor=e=>(s._OrtReleaseTensor=C.ja)(e),s._OrtCreateRunOptions=(e,r,n,l)=>(s._OrtCreateRunOptions=C.ka)(e,r,n,l),s._OrtAddRunConfigEntry=(e,r,n)=>(s._OrtAddRunConfigEntry=C.la)(e,r,n),s._OrtReleaseRunOptions=e=>(s._OrtReleaseRunOptions=C.ma)(e),s._OrtCreateBinding=e=>(s._OrtCreateBinding=C.na)(e),s._OrtBindInput=(e,r,n)=>(s._OrtBindInput=C.oa)(e,r,n),s._OrtBindOutput=(e,r,n,l)=>(s._OrtBindOutput=C.pa)(e,r,n,l),s._OrtClearBoundOutputs=e=>(s._OrtClearBoundOutputs=C.qa)(e),s._OrtReleaseBinding=e=>(s._OrtReleaseBinding=C.ra)(e),s._OrtRunWithBinding=(e,r,n,l,y)=>(s._OrtRunWithBinding=C.sa)(e,r,n,l,y),s._OrtRun=(e,r,n,l,y,b,v,z)=>(s._OrtRun=C.ta)(e,r,n,l,y,b,v,z),s._OrtEndProfiling=e=>(s._OrtEndProfiling=C.ua)(e);var ut=s._pthread_self=()=>(ut=s._pthread_self=C.va)();s._malloc=e=>(s._malloc=C.wa)(e),s._free=e=>(s._free=C.xa)(e),s.__emscripten_tls_init=()=>(s.__emscripten_tls_init=C.ya)();var tr=s.__emscripten_thread_init=(e,r,n,l,y,b)=>(tr=s.__emscripten_thread_init=C.Aa)(e,r,n,l,y,b);s.__emscripten_thread_crashed=()=>(s.__emscripten_thread_crashed=C.Ba)();var rr=(e,r,n,l,y)=>(rr=C.Ca)(e,r,n,l,y),bt=e=>(bt=C.Da)(e),yt=s.__emscripten_thread_exit=e=>(yt=s.__emscripten_thread_exit=C.Ea)(e),nr=()=>(nr=C.Fa)(),ar=e=>(ar=C.Ga)(e),or=(e,r)=>(or=C.Ha)(e,r),ft=e=>(ft=C.Ia)(e),wt=e=>(wt=C.Ja)(e),Ot=()=>(Ot=C.Ka)();function zr(){var e=C;e=Object.assign({},e);var r=l=>()=>l()>>>0,n=l=>y=>l(y)>>>0;return e.va=r(e.va),e.wa=n(e.wa),e.emscripten_main_runtime_thread_id=r(e.emscripten_main_runtime_thread_id),e.Ja=n(e.Ja),e.Ka=r(e.Ka),e}s.wasmMemory=X,s.stackSave=()=>Ot(),s.stackRestore=e=>ft(e),s.stackAlloc=e=>wt(e),s.keepRuntimeAlive=()=>0<De,s.UTF8ToString=ee,s.stringToUTF8=Re,s.lengthBytesUTF8=se,s.ExitStatus=ke,s.PThread=M;var lt;ge=function e(){lt||sr(),lt||(ge=e)};function sr(){if(!(0<Ae))if(T)S(s),T||Ne(Ue),startWorker(s);else{if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)Oe.unshift(s.preRun.shift());Ne(Oe),0<Ae||lt||(lt=!0,s.calledRun=!0,me||(T||Ne(Ue),S(s),T||Ne(ve)))}}return sr(),H}})();typeof wr=="object"&&typeof Dt=="object"?Dt.exports=yr:typeof define=="function"&&define.amd&&define([],()=>yr)});var vr=Ke((yn,tn)=>{tn.exports=\'"use strict";var Module={},ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads"),parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",e=>onmessage({data:e}));var fs=require("fs"),vm=require("vm");Object.assign(global,{self:global,require,Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:e=>vm.runInThisContext(fs.readFileSync(e,"utf8"),{filename:e}),postMessage:e=>parentPort.postMessage(e),performance:global.performance||{now:Date.now}})}var initializedJS=!1;function threadPrintErr(...e){var a=e.join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,a+`\\n`);return}console.error(a)}function threadAlert(...e){var a=e.join(" ");postMessage({cmd:"alert",text:a,threadId:Module._pthread_self()})}var err=threadPrintErr;self.alert=threadAlert,Module.instantiateWasm=(e,a)=>{var r=Module.wasmModule;Module.wasmModule=null;var t=new WebAssembly.Instance(r,e);return a(t)},self.onunhandledrejection=e=>{throw e.reason||e};function handleMessage(e){try{if(e.data.cmd==="load"){let r=[];self.onmessage=t=>r.push(t),self.startWorker=t=>{Module=t,postMessage({cmd:"loaded"});for(let s of r)handleMessage(s);self.onmessage=handleMessage},Module.wasmModule=e.data.wasmModule;for(const t of e.data.handlers)Module[t]=(...s)=>{postMessage({cmd:"callHandler",handler:t,args:s})};if(Module.wasmMemory=e.data.wasmMemory,Module.buffer=Module.wasmMemory.buffer,Module.ENVIRONMENT_IS_PTHREAD=!0,typeof e.data.urlOrBlob=="string")importScripts(e.data.urlOrBlob);else{var a=URL.createObjectURL(e.data.urlOrBlob);importScripts(a),URL.revokeObjectURL(a)}ortWasmThreaded(Module)}else if(e.data.cmd==="run"){Module.__emscripten_thread_init(e.data.pthread_ptr,0,0,1),Module.__emscripten_thread_mailbox_await(e.data.pthread_ptr),Module.establishStackSpace(),Module.PThread.receiveObjectTransfer(e.data),Module.PThread.threadInitTLS(),initializedJS||(initializedJS=!0);try{Module.invokeEntryPoint(e.data.start_routine,e.data.arg)}catch(r){if(r!="unwind")throw r}}else e.data.cmd==="cancel"?Module._pthread_self()&&Module.__emscripten_thread_exit(-1):e.data.target==="setimmediate"||(e.data.cmd==="checkMailbox"?initializedJS&&Module.checkMailbox():e.data.cmd&&(err(`worker.js received unknown command ${e.data.cmd}`),err(e.data)))}catch(r){throw Module.__emscripten_thread_crashed?.(),r}}self.onmessage=handleMessage;\\n\'});var Er;Er=pr();var rn=Or(),Ft,Pt=!1,ct=!1,_r=!1,nn=i=>{if(i===1)return!1;if(typeof SharedArrayBuffer>"u")return typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+i+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),!1;typeof process<"u"&&process.versions&&process.versions.node&&console.warn("env.wasm.numThreads is set to "+i+", however, currently onnxruntime-web does not support multi-threads in Node.js. Please consider using onnxruntime-node for performance critical scenarios.");try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},an=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},on=(i,c)=>i?c?"ort-wasm-simd-threaded.wasm":"ort-wasm-simd.wasm":c?"ort-wasm-threaded.wasm":"ort-wasm.wasm",Sr=async i=>{if(Pt)return Promise.resolve();if(ct)throw new Error("multiple calls to \'initializeWebAssembly()\' detected.");if(_r)throw new Error("previous call to \'initializeWebAssembly()\' failed.");ct=!0;let c=i.initTimeout,a=i.numThreads,h=i.simd,f=nn(a),w=h&&an(),g=i.wasmPaths,s=typeof g=="string"?g:void 0,S=on(w,f),x=typeof g=="object"?g[S]:void 0,H=!1,A=[];if(c>0&&A.push(new Promise(I=>{setTimeout(()=>{H=!0,I()},c)})),A.push(new Promise((I,V)=>{let R=f?rn:Er,B={locateFile:(D,T)=>f&&D.endsWith(".worker.js")&&typeof Blob<"u"?URL.createObjectURL(new Blob([vr()],{type:"text/javascript"})):D.endsWith(".wasm")?x||(s??T)+S:T+D};if(f)if(B.numThreads=a,typeof Blob>"u")B.mainScriptUrlOrBlob=(void 0)(__dirname,"ort-wasm-threaded.js");else{let D=`var ortWasmThreaded=${R.toString()};`;B.mainScriptUrlOrBlob=new Blob([D],{type:"text/javascript"})}R(B).then(D=>{ct=!1,Pt=!0,Ft=D,I()},D=>{ct=!1,_r=!0,V(D)})})),await Promise.race(A),H)throw new Error(`WebAssembly backend initializing failed due to timeout: ${c}ms`)},Q=()=>{if(Pt&&Ft)return Ft;throw new Error("WebAssembly is not initialized yet.")};var Y=(i,c)=>{let a=Q(),h=a.lengthBytesUTF8(i)+1,f=a._malloc(h);return a.stringToUTF8(i,f,h),c.push(f),f},tt=(i,c,a,h)=>{if(typeof i=="object"&&i!==null){if(a.has(i))throw new Error("Circular reference in options");a.add(i)}Object.entries(i).forEach(([f,w])=>{let g=c?c+f:f;if(typeof w=="object")tt(w,g+".",a,h);else if(typeof w=="string"||typeof w=="number")h(g,w.toString());else if(typeof w=="boolean")h(g,w?"1":"0");else throw new Error(`Can\'t handle extra config type: ${typeof w}`)})},j=i=>{let c=Q(),a=c.stackSave();try{let h=c.stackAlloc(8);c._OrtGetLastError(h,h+4);let f=c.HEAP32[h/4],w=c.HEAPU32[h/4+1],g=w?c.UTF8ToString(w):"";throw new Error(`${i} ERROR_CODE: ${f}, ERROR_MESSAGE: ${g}`)}finally{c.stackRestore(a)}};var Ar=i=>{let c=Q(),a=0,h=[],f=i||{};try{if(i?.logSeverityLevel===void 0)f.logSeverityLevel=2;else if(typeof i.logSeverityLevel!="number"||!Number.isInteger(i.logSeverityLevel)||i.logSeverityLevel<0||i.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${i.logSeverityLevel}`);if(i?.logVerbosityLevel===void 0)f.logVerbosityLevel=0;else if(typeof i.logVerbosityLevel!="number"||!Number.isInteger(i.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${i.logVerbosityLevel}`);i?.terminate===void 0&&(f.terminate=!1);let w=0;return i?.tag!==void 0&&(w=Y(i.tag,h)),a=c._OrtCreateRunOptions(f.logSeverityLevel,f.logVerbosityLevel,!!f.terminate,w),a===0&&j("Can\'t create run options."),i?.extra!==void 0&&tt(i.extra,"",new WeakSet,(g,s)=>{let S=Y(g,h),x=Y(s,h);c._OrtAddRunConfigEntry(a,S,x)!==0&&j(`Can\'t set a run config entry: ${g} - ${s}.`)}),[a,h]}catch(w){throw a!==0&&c._OrtReleaseRunOptions(a),h.forEach(g=>c._free(g)),w}};var sn=i=>{switch(i){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${i}`)}},un=i=>{switch(i){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${i}`)}},fn=i=>{i.extra||(i.extra={}),i.extra.session||(i.extra.session={});let c=i.extra.session;c.use_ort_model_bytes_directly||(c.use_ort_model_bytes_directly="1"),i.executionProviders&&i.executionProviders.some(a=>(typeof a=="string"?a:a.name)==="webgpu")&&(i.enableMemPattern=!1)},ln=(i,c,a)=>{for(let h of c){let f=typeof h=="string"?h:h.name;switch(f){case"webnn":if(f="WEBNN",typeof h!="string"){let g=h;if(g?.deviceType){let s=Y("deviceType",a),S=Y(g.deviceType,a);Q()._OrtAddSessionConfigEntry(i,s,S)!==0&&j(`Can\'t set a session config entry: \'deviceType\' - ${g.deviceType}.`)}if(g?.numThreads){let s=g.numThreads;(typeof s!="number"||!Number.isInteger(s)||s<0)&&(s=0);let S=Y("numThreads",a),x=Y(s.toString(),a);Q()._OrtAddSessionConfigEntry(i,S,x)!==0&&j(`Can\'t set a session config entry: \'numThreads\' - ${g.numThreads}.`)}if(g?.powerPreference){let s=Y("powerPreference",a),S=Y(g.powerPreference,a);Q()._OrtAddSessionConfigEntry(i,s,S)!==0&&j(`Can\'t set a session config entry: \'powerPreference\' - ${g.powerPreference}.`)}}break;case"webgpu":if(f="JS",typeof h!="string"){let g=h;if(g?.preferredLayout){if(g.preferredLayout!=="NCHW"&&g.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either \'NCHW\' or \'NHWC\': ${g.preferredLayout}`);let s=Y("preferredLayout",a),S=Y(g.preferredLayout,a);Q()._OrtAddSessionConfigEntry(i,s,S)!==0&&j(`Can\'t set a session config entry: \'preferredLayout\' - ${g.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${f}`)}let w=Y(f,a);Q()._OrtAppendExecutionProvider(i,w)!==0&&j(`Can\'t append execution provider: ${f}.`)}},Tr=i=>{let c=Q(),a=0,h=[],f=i||{};fn(f);try{let w=sn(f.graphOptimizationLevel??"all"),g=un(f.executionMode??"sequential"),s=typeof f.logId=="string"?Y(f.logId,h):0,S=f.logSeverityLevel??2;if(!Number.isInteger(S)||S<0||S>4)throw new Error(`log serverity level is not valid: ${S}`);let x=f.logVerbosityLevel??0;if(!Number.isInteger(x)||x<0||x>4)throw new Error(`log verbosity level is not valid: ${x}`);let H=typeof f.optimizedModelFilePath=="string"?Y(f.optimizedModelFilePath,h):0;if(a=c._OrtCreateSessionOptions(w,!!f.enableCpuMemArena,!!f.enableMemPattern,g,!!f.enableProfiling,0,s,S,x,H),a===0&&j("Can\'t create session options."),f.executionProviders&&ln(a,f.executionProviders,h),f.enableGraphCapture!==void 0){if(typeof f.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${f.enableGraphCapture}`);let A=Y("enableGraphCapture",h),I=Y(f.enableGraphCapture.toString(),h);c._OrtAddSessionConfigEntry(a,A,I)!==0&&j(`Can\'t set a session config entry: \'enableGraphCapture\' - ${f.enableGraphCapture}.`)}if(f.freeDimensionOverrides)for(let[A,I]of Object.entries(f.freeDimensionOverrides)){if(typeof A!="string")throw new Error(`free dimension override name must be a string: ${A}`);if(typeof I!="number"||!Number.isInteger(I)||I<0)throw new Error(`free dimension override value must be a non-negative integer: ${I}`);let V=Y(A,h);c._OrtAddFreeDimensionOverride(a,V,I)!==0&&j(`Can\'t set a free dimension override: ${A} - ${I}.`)}return f.extra!==void 0&&tt(f.extra,"",new WeakSet,(A,I)=>{let V=Y(A,h),R=Y(I,h);c._OrtAddSessionConfigEntry(a,V,R)!==0&&j(`Can\'t set a session config entry: ${A} - ${I}.`)}),[a,h]}catch(w){throw a!==0&&c._OrtReleaseSessionOptions(a),h.forEach(g=>c._free(g)),w}};var xt=i=>{switch(i){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${i}`)}},Mr=i=>{switch(i){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${i}`)}},Ut=i=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][i],Cr=i=>{switch(i){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${i}`)}},Dr=i=>{switch(i){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${i}`)}},Fr=i=>i==="float32"||i==="float16"||i==="int32"||i==="int64"||i==="uint32"||i==="uint8"||i==="bool",Pr=i=>{switch(i){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${i}`)}};var xr=async i=>{if(typeof i=="string")if(typeof process<"u"&&process.versions&&process.versions.node)try{return new Uint8Array(await(void 0)(i))}catch(c){if(c.code==="ERR_FS_FILE_TOO_LARGE"){let a=(void 0)(i),h=[];for await(let f of a)h.push(f);return new Uint8Array(Buffer.concat(h))}throw c}else{let c=await fetch(i);if(!c.ok)throw new Error(`failed to load external data file: ${i}`);let a=c.headers.get("Content-Length"),h=a?parseInt(a,10):0;if(h<1073741824)return new Uint8Array(await c.arrayBuffer());{if(!c.body)throw new Error(`failed to load external data file: ${i}, no response body.`);let f=c.body.getReader(),w;try{w=new ArrayBuffer(h)}catch(s){if(s instanceof RangeError){let S=Math.ceil(h/65536);w=new WebAssembly.Memory({initial:S,maximum:S}).buffer}else throw s}let g=0;for(;;){let{done:s,value:S}=await f.read();if(s)break;let x=S.byteLength;new Uint8Array(w,g,x).set(S),g+=x}return new Uint8Array(w,0,h)}}else return i instanceof Blob?new Uint8Array(await i.arrayBuffer()):i instanceof Uint8Array?i:new Uint8Array(i)};var cn=(i,c)=>{Q()._OrtInit(i,c)!==0&&j("Can\'t initialize onnxruntime.")},Lr=async i=>{cn(i.wasm.numThreads,Dr(i.logLevel))},Rr=async(i,c)=>{},Ye=new Map,dn=i=>{let c=Q(),a=c.stackSave();try{let h=c.stackAlloc(8);return c._OrtGetInputOutputCount(i,h,h+4)!==0&&j("Can\'t get session input/output count."),[c.HEAP32[h/4],c.HEAP32[h/4+1]]}finally{c.stackRestore(a)}},Lt=i=>{let c=Q(),a=c._malloc(i.byteLength);if(a===0)throw new Error(`Can\'t create a session. failed to allocate a buffer of size ${i.byteLength}.`);return c.HEAPU8.set(i,a),[a,i.byteLength]},Ir=async(i,c)=>{let a,h,f=Q();Array.isArray(i)?[a,h]=i:i.buffer===f.HEAPU8.buffer?[a,h]=[i.byteOffset,i.byteLength]:[a,h]=Lt(i);let w=0,g=0,s=0,S=[],x=[],H=[];try{if([g,S]=Tr(c),c?.externalData&&f.mountExternalData){let L=[];for(let W of c.externalData){let de=typeof W=="string"?W:W.path;L.push(xr(typeof W=="string"?W:W.data).then(pe=>{f.mountExternalData(de,pe)}))}await Promise.all(L)}w=await f._OrtCreateSession(a,h,g),w===0&&j("Can\'t create a session.");let[A,I]=dn(w),V=!!c?.enableGraphCapture,R=[],B=[],D=[];for(let L=0;L<A;L++){let W=f._OrtGetInputName(w,L);W===0&&j("Can\'t get an input name."),x.push(W),R.push(f.UTF8ToString(W))}for(let L=0;L<I;L++){let W=f._OrtGetOutputName(w,L);W===0&&j("Can\'t get an output name."),H.push(W);let de=f.UTF8ToString(W);B.push(de)}let T=null;return Ye.set(w,[w,x,H,T,V,!1]),[w,R,B]}catch(A){throw x.forEach(I=>f._OrtFree(I)),H.forEach(I=>f._OrtFree(I)),s!==0&&f._OrtReleaseBinding(s),w!==0&&f._OrtReleaseSession(w),A}finally{f._free(a),g!==0&&f._OrtReleaseSessionOptions(g),S.forEach(A=>f._free(A)),f.unmountExternalData?.()}},Br=i=>{let c=Q(),a=Ye.get(i);if(!a)throw new Error(`cannot release session. invalid session id: ${i}`);let[h,f,w,g,s]=a;g&&(s&&c._OrtClearBoundOutputs(g.handle),c._OrtReleaseBinding(g.handle)),c.jsepOnReleaseSession?.(i),f.forEach(S=>c._OrtFree(S)),w.forEach(S=>c._OrtFree(S)),c._OrtReleaseSession(h),Ye.delete(i)},Ur=(i,c,a,h,f,w=!1)=>{if(!i){c.push(0);return}let g=Q(),s=i[0],S=i[1],x=i[3],H,A;if(s==="string"&&x==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(w&&x!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${f} when enableGraphCapture is true.`);if(x==="gpu-buffer"){let R=i[2].gpuBuffer,B=Ut(xt(s));A=S.reduce((T,L)=>T*L,1)*B;let D=g.jsepRegisterBuffer;if(!D)throw new Error(\'Tensor location "gpu-buffer" is not supported without using WebGPU.\');H=D(h,f,R,A)}else{let R=i[2];if(Array.isArray(R)){A=4*R.length,H=g._malloc(A),a.push(H);let B=H/4;for(let D=0;D<R.length;D++){if(typeof R[D]!="string")throw new TypeError(`tensor data at index ${D} is not a string`);g.HEAPU32[B++]=Y(R[D],a)}}else A=R.byteLength,H=g._malloc(A),a.push(H),g.HEAPU8.set(new Uint8Array(R.buffer,R.byteOffset,A),H)}let I=g.stackSave(),V=g.stackAlloc(4*S.length);try{let R=V/4;S.forEach(D=>g.HEAP32[R++]=D);let B=g._OrtCreateTensor(xt(s),H,A,V,S.length,Pr(x));B===0&&j(`Can\'t create tensor for input/output. session=${h}, index=${f}.`),c.push(B)}finally{g.stackRestore(I)}},kr=async(i,c,a,h,f,w)=>{let g=Q(),s=Ye.get(i);if(!s)throw new Error(`cannot run inference. invalid session id: ${i}`);let S=s[0],x=s[1],H=s[2],A=s[3],I=s[4],V=s[5],R=c.length,B=h.length,D=0,T=[],L=[],W=[],de=[],pe=g.stackSave(),Z=g.stackAlloc(R*4),_=g.stackAlloc(R*4),J=g.stackAlloc(B*4),Pe=g.stackAlloc(B*4);try{[D,T]=Ar(w);for(let F=0;F<R;F++)Ur(a[F],L,de,i,c[F],I);for(let F=0;F<B;F++)Ur(f[F],W,de,i,R+h[F],I);let le=Z/4,Ie=_/4,ne=J/4,X=Pe/4;for(let F=0;F<R;F++)g.HEAPU32[le++]=L[F],g.HEAPU32[Ie++]=x[c[F]];for(let F=0;F<B;F++)g.HEAPU32[ne++]=W[F],g.HEAPU32[X++]=H[h[F]];g.jsepOnRunStart?.(S);let we;we=await g._OrtRun(S,_,Z,R,Pe,B,J,D),we!==0&&j("failed to call OrtRun().");let me=[];for(let F=0;F<B;F++){let ie=g.HEAPU32[J/4+F];if(ie===W[F]){me.push(f[F]);continue}let xe=g.stackSave(),ce=g.stackAlloc(4*4),be=!1,ae,K=0;try{g._OrtGetTensorData(ie,ce,ce+4,ce+8,ce+12)!==0&&j(`Can\'t access output tensor data on index ${F}.`);let Oe=ce/4,Ue=g.HEAPU32[Oe++];K=g.HEAPU32[Oe++];let ve=g.HEAPU32[Oe++],Ae=g.HEAPU32[Oe++],_e=[];for(let te=0;te<Ae;te++)_e.push(g.HEAPU32[ve/4+te]);g._OrtFree(ve);let ge=_e.reduce((te,re)=>te*re,1);ae=Mr(Ue);let Be=A?.outputPreferredLocations[h[F]];if(ae==="string"){if(Be==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let te=[],re=K/4;for(let ue=0;ue<ge;ue++){let Ee=g.HEAPU32[re++],Se=ue===ge-1?void 0:g.HEAPU32[re]-Ee;te.push(g.UTF8ToString(Ee,Se))}me.push([ae,_e,te,"cpu"])}else if(Be==="gpu-buffer"&&ge>0){let te=g.jsepGetBuffer;if(!te)throw new Error(\'preferredLocation "gpu-buffer" is not supported without using WebGPU.\');let re=te(K),ue=Ut(Ue);if(ue===void 0||!Fr(ae))throw new Error(`Unsupported data type: ${ae}`);be=!0,me.push([ae,_e,{gpuBuffer:re,download:g.jsepCreateDownloader(re,ge*ue,ae),dispose:()=>{g._OrtReleaseTensor(ie)}},"gpu-buffer"])}else{let te=Cr(ae),re=new te(ge);new Uint8Array(re.buffer,re.byteOffset,re.byteLength).set(g.HEAPU8.subarray(K,K+re.byteLength)),me.push([ae,_e,re,"cpu"])}}finally{g.stackRestore(xe),ae==="string"&&K&&g._free(K),be||g._OrtReleaseTensor(ie)}}return A&&!I&&(g._OrtClearBoundOutputs(A.handle),Ye.set(i,[S,x,H,A,I,!1])),me}finally{g.stackRestore(pe),L.forEach(le=>g._OrtReleaseTensor(le)),W.forEach(le=>g._OrtReleaseTensor(le)),de.forEach(le=>g._free(le)),D!==0&&g._OrtReleaseRunOptions(D),T.forEach(le=>g._free(le))}},Wr=i=>{let c=Q(),a=Ye.get(i);if(!a)throw new Error("invalid session id");let h=a[0],f=c._OrtEndProfiling(h);f===0&&j("Can\'t get an profile file name."),c._OrtFree(f)},Nr=i=>{let c=[];for(let a of i){let h=a[2];!Array.isArray(h)&&"buffer"in h&&c.push(h.buffer)}return c};self.onmessage=i=>{let{type:c,in:a}=i.data;try{switch(c){case"init-wasm":Sr(a.wasm).then(()=>{Lr(a).then(()=>{postMessage({type:c})},h=>{postMessage({type:c,err:h})})},h=>{postMessage({type:c,err:h})});break;case"init-ep":{let{epName:h,env:f}=a;Rr(f,h).then(()=>{postMessage({type:c})},w=>{postMessage({type:c,err:w})});break}case"copy-from":{let{buffer:h}=a,f=Lt(h);postMessage({type:c,out:f});break}case"create":{let{model:h,options:f}=a;Ir(h,f).then(w=>{postMessage({type:c,out:w})},w=>{postMessage({type:c,err:w})});break}case"release":Br(a),postMessage({type:c});break;case"run":{let{sessionId:h,inputIndices:f,inputs:w,outputIndices:g,options:s}=a;kr(h,f,w,g,new Array(g.length).fill(null),s).then(S=>{S.some(x=>x[3]!=="cpu")?postMessage({type:c,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:c,out:S},Nr([...w,...S]))},S=>{postMessage({type:c,err:S})});break}case"end-profiling":Wr(a),postMessage({type:c});break;default:}}catch(h){postMessage({type:c,err:h})}};})();\n'}),T3,n1,Q4,D4,_4,R6,U5,f3,l3,B2,P4,HH,ZH,jH,VH,XH,KH,UH,qH=E(()=>{z3(),vV(),s4(),T3=()=>!!i.wasm.proxy&&typeof document<"u",Q4=!1,D4=!1,_4=!1,U5=new Map,f3=(Q,H)=>{let j=U5.get(Q);j?j.push(H):U5.set(Q,[H])},l3=()=>{if(Q4||!D4||_4||!n1)throw new Error("worker not ready")},B2=(Q)=>{switch(Q.data.type){case"init-wasm":Q4=!1,Q.data.err?(_4=!0,R6[1](Q.data.err)):(D4=!0,R6[0]());break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let H=U5.get(Q.data.type);Q.data.err?H.shift()[1](Q.data.err):H.shift()[0](Q.data.out);break}default:}},P4=typeof document<"u"?document?.currentScript?.src:void 0,HH=async()=>{if(!D4){if(Q4)throw new Error("multiple calls to 'initWasm()' detected.");if(_4)throw new Error("previous call to 'initWasm()' failed.");if(Q4=!0,T3())return i.wasm.wasmPaths===void 0&&P4&&P4.indexOf("blob:")!==0&&(i.wasm.wasmPaths=P4.substr(0,+P4.lastIndexOf("/")+1)),new Promise((Q,H)=>{n1?.terminate();let j=URL.createObjectURL(new Blob([wV()],{type:"text/javascript"}));n1=new Worker(j,{name:"ort-wasm-proxy-worker"}),n1.onerror=(W)=>H(W),n1.onmessage=B2,URL.revokeObjectURL(j),R6=[Q,H];let K={type:"init-wasm",in:i};n1.postMessage(K)});try{await bJ(i.wasm),await aJ(i),D4=!0}catch(Q){throw _4=!0,Q}finally{Q4=!1}}},ZH=async(Q)=>{if(T3())return l3(),new Promise((H,j)=>{f3("init-ep",[H,j]);let K={type:"init-ep",in:{epName:Q,env:i}};n1.postMessage(K)});await nJ(i,Q)},jH=async(Q)=>T3()?(l3(),new Promise((H,j)=>{f3("copy-from",[H,j]);let K={type:"copy-from",in:{buffer:Q}};n1.postMessage(K,[Q.buffer])})):o6(Q),VH=async(Q,H)=>{if(T3()){if(H?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return l3(),new Promise((j,K)=>{f3("create",[j,K]);let W={type:"create",in:{model:Q,options:{...H}}},U=[];Q instanceof Uint8Array&&U.push(Q.buffer),n1.postMessage(W,U)})}else return rJ(Q,H)},XH=async(Q)=>{if(T3())return l3(),new Promise((H,j)=>{f3("release",[H,j]);let K={type:"release",in:Q};n1.postMessage(K)});tJ(Q)},KH=async(Q,H,j,K,W,U)=>{if(T3()){if(j.some((Z)=>Z[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(W.some((Z)=>Z))throw new Error("pre-allocated output tensor is not supported for proxy.");return l3(),new Promise((Z,q)=>{f3("run",[Z,q]);let G=j,J={type:"run",in:{sessionId:Q,inputIndices:H,inputs:G,outputIndices:K,options:U}};n1.postMessage(J,JH(G))})}else return eJ(Q,H,j,K,W,U)},UH=async(Q)=>{if(T3())return l3(),new Promise((H,j)=>{f3("end-profiling",[H,j]);let K={type:"end-profiling",in:Q};n1.postMessage(K)});QH(Q)}}),z6,F2,WH,TV=E(()=>{z3(),qH(),iJ(),oJ(),z6=(Q,H)=>{switch(Q.location){case"cpu":return[Q.type,Q.dims,Q.data,"cpu"];case"gpu-buffer":return[Q.type,Q.dims,{gpuBuffer:Q.gpuBuffer},"gpu-buffer"];default:throw new Error(`invalid data location: ${Q.location} for ${H()}`)}},F2=(Q)=>{switch(Q[3]){case"cpu":return new d1(Q[0],Q[2],Q[1]);case"gpu-buffer":{let H=Q[0];if(!R7(H))throw new Error(`not supported data type: ${H} for deserializing GPU tensor`);let{gpuBuffer:j,download:K,dispose:W}=Q[2];return d1.fromGpuBuffer(j,{dataType:H,dims:Q[1],download:K,dispose:W})}default:throw new Error(`invalid data location: ${Q[3]}`)}},WH=class{async fetchModelAndCopyToWasmMemory(Q){return jH(await Y5(Q))}async loadModel(Q,H){j4();let j;typeof Q=="string"?typeof process<"u"&&process.versions&&process.versions.node?j=await Y5(Q):j=await this.fetchModelAndCopyToWasmMemory(Q):j=Q,[this.sessionId,this.inputNames,this.outputNames]=await VH(j,H),V4()}async dispose(){return XH(this.sessionId)}async run(Q,H,j){j4();let K=[],W=[];Object.entries(Q).forEach((V)=>{let R=V[0],z=V[1],Y=this.inputNames.indexOf(R);if(Y===-1)throw new Error(`invalid input '${R}'`);K.push(z),W.push(Y)});let U=[],Z=[];Object.entries(H).forEach((V)=>{let R=V[0],z=V[1],Y=this.outputNames.indexOf(R);if(Y===-1)throw new Error(`invalid output '${R}'`);U.push(z),Z.push(Y)});let q=K.map((V,R)=>z6(V,()=>`input "${this.inputNames[W[R]]}"`)),G=U.map((V,R)=>V?z6(V,()=>`output "${this.outputNames[Z[R]]}"`):null),J=await KH(this.sessionId,W,q,Z,G,j),X={};for(let V=0;V<J.length;V++)X[this.outputNames[Z[V]]]=U[V]??F2(J[V]);return V4(),X}startProfiling(){}endProfiling(){UH(this.sessionId)}}}),k2,GH,DV=E(()=>{z3(),qH(),TV(),k2=()=>{if((typeof i.wasm.initTimeout!="number"||i.wasm.initTimeout<0)&&(i.wasm.initTimeout=0),typeof i.wasm.simd!="boolean"&&(i.wasm.simd=!0),typeof i.wasm.proxy!="boolean"&&(i.wasm.proxy=!1),typeof i.wasm.trace!="boolean"&&(i.wasm.trace=!1),typeof i.wasm.numThreads!="number"||!Number.isInteger(i.wasm.numThreads)||i.wasm.numThreads<=0){(typeof self<"u"&&!self.crossOriginIsolated||typeof process<"u"&&process.versions&&process.versions.node)&&(i.wasm.numThreads=1);let Q=typeof navigator>"u"?(void 0)().length:navigator.hardwareConcurrency;i.wasm.numThreads=Math.min(4,Math.ceil((Q||1)/2))}},GH=class{async init(Q){k2(),await HH(),await ZH(Q)}async createInferenceSessionHandler(Q,H){let j=new WH;return await j.loadModel(Q,H),Promise.resolve(j)}}}),RH={};X4(RH,{wasmBackend:()=>zH});var zH,_V=E(()=>{DV(),zH=new GH});z3();z3();z3();var PV="1.18.0",EV=s2;{let Q=(YV(),a3(PJ)).onnxjsBackend;p4("webgl",Q,-10)}{let Q=(_V(),a3(RH)).wasmBackend;p4("cpu",Q,10),p4("wasm",Q,10)}Object.defineProperty(i.versions,"web",{value:PV,enumerable:!0});/*! Bundled license information:
+
+long/index.js:
+  (**
+   * @license
+   * Copyright 2009 The Closure Library Authors
+   * Copyright 2020 Daniel Wirtz / The long.js Authors.
+   *
+   * Licensed under the Apache License, Version 2.0 (the "License");
+   * you may not use this file except in compliance with the License.
+   * You may obtain a copy of the License at
+   *
+   *     http://www.apache.org/licenses/LICENSE-2.0
+   *
+   * Unless required by applicable law or agreed to in writing, software
+   * distributed under the License is distributed on an "AS IS" BASIS,
+   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   * See the License for the specific language governing permissions and
+   * limitations under the License.
+   *
+   * SPDX-License-Identifier: Apache-2.0
+   *)
+*/export{p4 as registerBackend,i as env,EV as default,u2 as TrainingSession,d1 as Tensor,V4 as TRACE_FUNC_END,j4 as TRACE_FUNC_BEGIN,Y6 as TRACE,f2 as InferenceSession};
diff --git a/docs/piper.js b/docs/piper.js
new file mode 100644
index 0000000..d126792
--- /dev/null
+++ b/docs/piper.js
@@ -0,0 +1,11 @@
+var QV=((l)=>typeof require!=="undefined"?require:typeof Proxy!=="undefined"?new Proxy(l,{get:(g,R)=>(typeof require!=="undefined"?require:g)[R]}):l)(function(l){if(typeof require!=="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')});var{defineProperty:D6,getOwnPropertyNames:X5,getOwnPropertyDescriptor:q5}=Object,G5=Object.prototype.hasOwnProperty,C6=(l)=>{const g=C6.moduleCache??=new WeakMap;var R=g.get(l);if(R)return R;var M=D6({},"__esModule",{value:!0}),B={enumerable:!1};if(l&&typeof l==="object"||typeof l==="function"){for(let A of X5(l))if(!G5.call(M,A))D6(M,A,{get:()=>l[A],enumerable:!(B=q5(l,A))||B.enumerable})}return g.set(l,M),M},M$=(l,g)=>{for(var R in g)D6(l,R,{get:g[R],enumerable:!0,configurable:!0,set:(M)=>g[R]=()=>M})},_$=(l,g)=>()=>(l&&(g=l(l=0)),g),Y5=((l)=>typeof QV!=="undefined"?QV:typeof Proxy!=="undefined"?new Proxy(l,{get:(g,R)=>(typeof QV!=="undefined"?QV:g)[R]}):l)(function(l){if(typeof QV!=="undefined")return QV.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')}),b$={};M$(b$,{default:()=>{return k6}});var h6,yV,m6,u6,p6,i6,l6,s6,gV,d6,N0,I0,E0,k6,K5=_$(()=>{h6=Object.create,yV=Object.defineProperty,m6=Object.getOwnPropertyDescriptor,u6=Object.getOwnPropertyNames,p6=Object.getPrototypeOf,i6=Object.prototype.hasOwnProperty,l6=(l,g)=>()=>(g||l((g={exports:{}}).exports,g),g.exports),s6=(l,g)=>{for(var R in g)yV(l,R,{get:g[R],enumerable:!0})},gV=(l,g,R,M)=>{if(g&&typeof g=="object"||typeof g=="function")for(let B of u6(g))!i6.call(l,B)&&B!==R&&yV(l,B,{get:()=>g[B],enumerable:!(M=m6(g,B))||M.enumerable});return l},d6=(l,g,R)=>(gV(l,g,"default"),R&&gV(R,g,"default")),N0=(l,g,R)=>(R=l!=null?h6(p6(l)):{},gV(g||!l||!l.__esModule?yV(R,"default",{value:l,enumerable:!0}):R,l)),I0=l6((l,g)=>{function R(q){if(typeof q!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(q))}function M(q,Y){for(var E="",O=0,N=-1,W=0,I,z=0;z<=q.length;++z){if(z<q.length)I=q.charCodeAt(z);else{if(I===47)break;I=47}if(I===47){if(!(N===z-1||W===1))if(N!==z-1&&W===2){if(E.length<2||O!==2||E.charCodeAt(E.length-1)!==46||E.charCodeAt(E.length-2)!==46){if(E.length>2){var j=E.lastIndexOf("/");if(j!==E.length-1){j===-1?(E="",O=0):(E=E.slice(0,j),O=E.length-1-E.lastIndexOf("/")),N=z,W=0;continue}}else if(E.length===2||E.length===1){E="",O=0,N=z,W=0;continue}}Y&&(E.length>0?E+="/..":E="..",O=2)}else E.length>0?E+="/"+q.slice(N+1,z):E=q.slice(N+1,z),O=z-N-1;N=z,W=0}else I===46&&W!==-1?++W:W=-1}return E}function B(q,Y){var E=Y.dir||Y.root,O=Y.base||(Y.name||"")+(Y.ext||"");return E?E===Y.root?E+O:E+q+O:O}var A={resolve:function(){for(var q="",Y=!1,E,O=arguments.length-1;O>=-1&&!Y;O--){var N;O>=0?N=arguments[O]:(E===void 0&&(E=process.cwd()),N=E),R(N),N.length!==0&&(q=N+"/"+q,Y=N.charCodeAt(0)===47)}return q=M(q,!Y),Y?q.length>0?"/"+q:"/":q.length>0?q:"."},normalize:function(q){if(R(q),q.length===0)return".";var Y=q.charCodeAt(0)===47,E=q.charCodeAt(q.length-1)===47;return q=M(q,!Y),q.length===0&&!Y&&(q="."),q.length>0&&E&&(q+="/"),Y?"/"+q:q},isAbsolute:function(q){return R(q),q.length>0&&q.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var q,Y=0;Y<arguments.length;++Y){var E=arguments[Y];R(E),E.length>0&&(q===void 0?q=E:q+="/"+E)}return q===void 0?".":A.normalize(q)},relative:function(q,Y){if(R(q),R(Y),q===Y||(q=A.resolve(q),Y=A.resolve(Y),q===Y))return"";for(var E=1;E<q.length&&q.charCodeAt(E)===47;++E);for(var O=q.length,N=O-E,W=1;W<Y.length&&Y.charCodeAt(W)===47;++W);for(var I=Y.length,z=I-W,j=N<z?N:z,P=-1,F=0;F<=j;++F){if(F===j){if(z>j){if(Y.charCodeAt(W+F)===47)return Y.slice(W+F+1);if(F===0)return Y.slice(W+F)}else N>j&&(q.charCodeAt(E+F)===47?P=F:F===0&&(P=0));break}var v=q.charCodeAt(E+F),S=Y.charCodeAt(W+F);if(v!==S)break;v===47&&(P=F)}var w="";for(F=E+P+1;F<=O;++F)(F===O||q.charCodeAt(F)===47)&&(w.length===0?w+="..":w+="/..");return w.length>0?w+Y.slice(W+P):(W+=P,Y.charCodeAt(W)===47&&++W,Y.slice(W))},_makeLong:function(q){return q},dirname:function(q){if(R(q),q.length===0)return".";for(var Y=q.charCodeAt(0),E=Y===47,O=-1,N=!0,W=q.length-1;W>=1;--W)if(Y=q.charCodeAt(W),Y===47){if(!N){O=W;break}}else N=!1;return O===-1?E?"/":".":E&&O===1?"//":q.slice(0,O)},basename:function(q,Y){if(Y!==void 0&&typeof Y!="string")throw new TypeError('"ext" argument must be a string');R(q);var E=0,O=-1,N=!0,W;if(Y!==void 0&&Y.length>0&&Y.length<=q.length){if(Y.length===q.length&&Y===q)return"";var I=Y.length-1,z=-1;for(W=q.length-1;W>=0;--W){var j=q.charCodeAt(W);if(j===47){if(!N){E=W+1;break}}else z===-1&&(N=!1,z=W+1),I>=0&&(j===Y.charCodeAt(I)?--I===-1&&(O=W):(I=-1,O=z))}return E===O?O=z:O===-1&&(O=q.length),q.slice(E,O)}else{for(W=q.length-1;W>=0;--W)if(q.charCodeAt(W)===47){if(!N){E=W+1;break}}else O===-1&&(N=!1,O=W+1);return O===-1?"":q.slice(E,O)}},extname:function(q){R(q);for(var Y=-1,E=0,O=-1,N=!0,W=0,I=q.length-1;I>=0;--I){var z=q.charCodeAt(I);if(z===47){if(!N){E=I+1;break}continue}O===-1&&(N=!1,O=I+1),z===46?Y===-1?Y=I:W!==1&&(W=1):Y!==-1&&(W=-1)}return Y===-1||O===-1||W===0||W===1&&Y===O-1&&Y===E+1?"":q.slice(Y,O)},format:function(q){if(q===null||typeof q!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof q);return B("/",q)},parse:function(q){R(q);var Y={root:"",dir:"",base:"",ext:"",name:""};if(q.length===0)return Y;var E=q.charCodeAt(0),O=E===47,N;O?(Y.root="/",N=1):N=0;for(var W=-1,I=0,z=-1,j=!0,P=q.length-1,F=0;P>=N;--P){if(E=q.charCodeAt(P),E===47){if(!j){I=P+1;break}continue}z===-1&&(j=!1,z=P+1),E===46?W===-1?W=P:F!==1&&(F=1):W!==-1&&(F=-1)}return W===-1||z===-1||F===0||F===1&&W===z-1&&W===I+1?z!==-1&&(I===0&&O?Y.base=Y.name=q.slice(1,z):Y.base=Y.name=q.slice(I,z)):(I===0&&O?(Y.name=q.slice(1,W),Y.base=q.slice(1,z)):(Y.name=q.slice(I,W),Y.base=q.slice(I,z)),Y.ext=q.slice(W,z)),I>0?Y.dir=q.slice(0,I-1):O&&(Y.dir="/"),Y},sep:"/",delimiter:":",win32:null,posix:null};A.posix=A,g.exports=A}),E0={},s6(E0,{default:()=>k6}),d6(E0,N0(I0())),k6=N0(I0())}),y$={};M$(y$,{webcrypto:()=>{return j0},timingSafeEqual:()=>{return jV},scryptSync:()=>{return xV},scrypt:()=>{return wV},randomUUID:()=>{return O0},getRandomValues:()=>{return B0},getCurves:()=>{return Y0},default:()=>{return A6},DEFAULT_ENCODING:()=>{return UV}});var Y0,n6,EV,o6,r6,a6,t6,cV,OJ,RV,zV,fV,oQ,fQ,e6,J8,yQ,XQ,VV,JQ,rQ,R0,PV,Q8,z0,$V,P0,L0,F0,ZV,hV,HV,D0,LV,mV,V8,$8,C0,k0,Z8,X8,q8,A0,uV,pV,XV,G8,K8,S0,U8,x0,H8,iV,bQ,iQ,lV,gQ,FV,w0,lQ,W8,aQ,tQ,eQ,Y8,qV,sV,dV,B8,nV,v0,DV,M0,O8,sQ,_0,b0,oV,j8,y0,T8,g0,rV,N8,I8,nQ,WV,E8,c0,f0,h0,R8,m0,u0,p0,i0,z8,l0,s0,hQ,aV,d0,P8,L8,F8,D8,C8,YV,k8,A8,S8,x8,w8,n0,o0,r0,tV,CV,v8,a0,t0,kV,M8,_8,eV,b8,y8,JV,e0,g8,c8,J0,J6,Q6,f8,h8,m8,V6,u8,$6,GV,Z6,X6,KV,Q0,p8,i8,q6,G6,l8,s8,d8,V0,$0,n8,dQ,K6,mQ,AV,o8,r8,a8,U6,pQ,BV,H6,t8,W6,e8,Y6,J$,Q$,V$,$$,Z0,Z$,X0,X$,q$,G$,K$,U$,H$,W$,q0,B6,G0,K0,OV,U0,H0,O6,Y$,j6,T6,B$,N6,O$,j$,T$,I6,N$,I$,E$,R$,SV,E6,z$,P$,L$,F$,D$,R6,z6,W0,P6,C$,k$,A$,S$,L6,F6,x$,UV,B0,O0,w$,jV,xV,wV,j0,A6,U5=_$(()=>{Y0=function(){return w$},n6=Object.create,EV=Object.defineProperty,o6=Object.getOwnPropertyDescriptor,r6=Object.getOwnPropertyNames,a6=Object.getPrototypeOf,t6=Object.prototype.hasOwnProperty,cV=(l,g)=>()=>(l&&(g=l(l=0)),g),OJ=(l,g)=>()=>(g||l((g={exports:{}}).exports,g),g.exports),RV=(l,g)=>{for(var R in g)EV(l,R,{get:g[R],enumerable:!0})},zV=(l,g,R,M)=>{if(g&&typeof g=="object"||typeof g=="function")for(let B of r6(g))!t6.call(l,B)&&B!==R&&EV(l,B,{get:()=>g[B],enumerable:!(M=o6(g,B))||M.enumerable});return l},fV=(l,g,R)=>(zV(l,g,"default"),R&&zV(R,g,"default")),oQ=(l,g,R)=>(R=l!=null?n6(a6(l)):{},zV(g||!l||!l.__esModule?EV(R,"default",{value:l,enumerable:!0}):R,l)),fQ=(l)=>zV(EV({},"__esModule",{value:!0}),l),e6=OJ((l)=>{l.byteLength=E,l.toByteArray=N,l.fromByteArray=z;var g=[],R=[],M=typeof Uint8Array<"u"?Uint8Array:Array,B="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(A=0,q=B.length;A<q;++A)g[A]=B[A],R[B.charCodeAt(A)]=A;var A,q;R["-".charCodeAt(0)]=62,R["_".charCodeAt(0)]=63;function Y(j){var P=j.length;if(P%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var F=j.indexOf("=");F===-1&&(F=P);var v=F===P?0:4-F%4;return[F,v]}function E(j){var P=Y(j),F=P[0],v=P[1];return(F+v)*3/4-v}function O(j,P,F){return(P+F)*3/4-F}function N(j){var P,F=Y(j),v=F[0],S=F[1],w=new M(O(j,v,S)),y=0,m=S>0?v-4:v,i;for(i=0;i<m;i+=4)P=R[j.charCodeAt(i)]<<18|R[j.charCodeAt(i+1)]<<12|R[j.charCodeAt(i+2)]<<6|R[j.charCodeAt(i+3)],w[y++]=P>>16&255,w[y++]=P>>8&255,w[y++]=P&255;return S===2&&(P=R[j.charCodeAt(i)]<<2|R[j.charCodeAt(i+1)]>>4,w[y++]=P&255),S===1&&(P=R[j.charCodeAt(i)]<<10|R[j.charCodeAt(i+1)]<<4|R[j.charCodeAt(i+2)]>>2,w[y++]=P>>8&255,w[y++]=P&255),w}function W(j){return g[j>>18&63]+g[j>>12&63]+g[j>>6&63]+g[j&63]}function I(j,P,F){for(var v,S=[],w=P;w<F;w+=3)v=(j[w]<<16&16711680)+(j[w+1]<<8&65280)+(j[w+2]&255),S.push(W(v));return S.join("")}function z(j){for(var P,F=j.length,v=F%3,S=[],w=16383,y=0,m=F-v;y<m;y+=w)S.push(I(j,y,y+w>m?m:y+w));return v===1?(P=j[F-1],S.push(g[P>>2]+g[P<<4&63]+"==")):v===2&&(P=(j[F-2]<<8)+j[F-1],S.push(g[P>>10]+g[P>>4&63]+g[P<<2&63]+"=")),S.join("")}}),J8=OJ((l)=>{l.read=function(g,R,M,B,A){var q,Y,E=A*8-B-1,O=(1<<E)-1,N=O>>1,W=-7,I=M?A-1:0,z=M?-1:1,j=g[R+I];for(I+=z,q=j&(1<<-W)-1,j>>=-W,W+=E;W>0;q=q*256+g[R+I],I+=z,W-=8);for(Y=q&(1<<-W)-1,q>>=-W,W+=B;W>0;Y=Y*256+g[R+I],I+=z,W-=8);if(q===0)q=1-N;else{if(q===O)return Y?NaN:(j?-1:1)*(1/0);Y=Y+Math.pow(2,B),q=q-N}return(j?-1:1)*Y*Math.pow(2,q-B)},l.write=function(g,R,M,B,A,q){var Y,E,O,N=q*8-A-1,W=(1<<N)-1,I=W>>1,z=A===23?Math.pow(2,-24)-Math.pow(2,-77):0,j=B?0:q-1,P=B?1:-1,F=R<0||R===0&&1/R<0?1:0;for(R=Math.abs(R),isNaN(R)||R===1/0?(E=isNaN(R)?1:0,Y=W):(Y=Math.floor(Math.log(R)/Math.LN2),R*(O=Math.pow(2,-Y))<1&&(Y--,O*=2),Y+I>=1?R+=z/O:R+=z*Math.pow(2,1-I),R*O>=2&&(Y++,O/=2),Y+I>=W?(E=0,Y=W):Y+I>=1?(E=(R*O-1)*Math.pow(2,A),Y=Y+I):(E=R*Math.pow(2,I-1)*Math.pow(2,A),Y=0));A>=8;g[M+j]=E&255,j+=P,E/=256,A-=8);for(Y=Y<<A|E,N+=A;N>0;g[M+j]=Y&255,j+=P,Y/=256,N-=8);g[M+j-P]|=F*128}}),yQ=OJ((l)=>{var g=e6(),R=J8(),M=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;l.Buffer=Y,l.SlowBuffer=S,l.INSPECT_MAX_BYTES=50;var B=2147483647;l.kMaxLength=B,Y.TYPED_ARRAY_SUPPORT=A(),!Y.TYPED_ARRAY_SUPPORT&&typeof console<"u"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function A(){try{let T=new Uint8Array(1),D={foo:function(){return 42}};return Object.setPrototypeOf(D,Uint8Array.prototype),Object.setPrototypeOf(T,D),T.foo()===42}catch{return!1}}Object.defineProperty(Y.prototype,"parent",{enumerable:!0,get:function(){if(Y.isBuffer(this))return this.buffer}}),Object.defineProperty(Y.prototype,"offset",{enumerable:!0,get:function(){if(Y.isBuffer(this))return this.byteOffset}});function q(T){if(T>B)throw new RangeError('The value "'+T+'" is invalid for option "size"');let D=new Uint8Array(T);return Object.setPrototypeOf(D,Y.prototype),D}function Y(T,D,u){if(typeof T=="number"){if(typeof D=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return W(T)}return E(T,D,u)}Y.poolSize=8192;function E(T,D,u){if(typeof T=="string")return I(T,D);if(ArrayBuffer.isView(T))return j(T);if(T==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T);if(TJ(T,ArrayBuffer)||T&&TJ(T.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(TJ(T,SharedArrayBuffer)||T&&TJ(T.buffer,SharedArrayBuffer)))return P(T,D,u);if(typeof T=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let d=T.valueOf&&T.valueOf();if(d!=null&&d!==T)return Y.from(d,D,u);let a=F(T);if(a)return a;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof T[Symbol.toPrimitive]=="function")return Y.from(T[Symbol.toPrimitive]("string"),D,u);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T)}Y.from=function(T,D,u){return E(T,D,u)},Object.setPrototypeOf(Y.prototype,Uint8Array.prototype),Object.setPrototypeOf(Y,Uint8Array);function O(T){if(typeof T!="number")throw new TypeError('"size" argument must be of type number');if(T<0)throw new RangeError('The value "'+T+'" is invalid for option "size"')}function N(T,D,u){return O(T),T<=0?q(T):D!==void 0?typeof u=="string"?q(T).fill(D,u):q(T).fill(D):q(T)}Y.alloc=function(T,D,u){return N(T,D,u)};function W(T){return O(T),q(T<0?0:v(T)|0)}Y.allocUnsafe=function(T){return W(T)},Y.allocUnsafeSlow=function(T){return W(T)};function I(T,D){if((typeof D!="string"||D==="")&&(D="utf8"),!Y.isEncoding(D))throw new TypeError("Unknown encoding: "+D);let u=w(T,D)|0,d=q(u),a=d.write(T,D);return a!==u&&(d=d.slice(0,a)),d}function z(T){let D=T.length<0?0:v(T.length)|0,u=q(D);for(let d=0;d<D;d+=1)u[d]=T[d]&255;return u}function j(T){if(TJ(T,Uint8Array)){let D=new Uint8Array(T);return P(D.buffer,D.byteOffset,D.byteLength)}return z(T)}function P(T,D,u){if(D<0||T.byteLength<D)throw new RangeError('"offset" is outside of buffer bounds');if(T.byteLength<D+(u||0))throw new RangeError('"length" is outside of buffer bounds');let d;return D===void 0&&u===void 0?d=new Uint8Array(T):u===void 0?d=new Uint8Array(T,D):d=new Uint8Array(T,D,u),Object.setPrototypeOf(d,Y.prototype),d}function F(T){if(Y.isBuffer(T)){let D=v(T.length)|0,u=q(D);return u.length===0||T.copy(u,0,0,D),u}if(T.length!==void 0)return typeof T.length!="number"||dJ(T.length)?q(0):z(T);if(T.type==="Buffer"&&Array.isArray(T.data))return z(T.data)}function v(T){if(T>=B)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+B.toString(16)+" bytes");return T|0}function S(T){return+T!=T&&(T=0),Y.alloc(+T)}Y.isBuffer=function(T){return T!=null&&T._isBuffer===!0&&T!==Y.prototype},Y.compare=function(T,D){if(TJ(T,Uint8Array)&&(T=Y.from(T,T.offset,T.byteLength)),TJ(D,Uint8Array)&&(D=Y.from(D,D.offset,D.byteLength)),!Y.isBuffer(T)||!Y.isBuffer(D))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(T===D)return 0;let u=T.length,d=D.length;for(let a=0,CJ=Math.min(u,d);a<CJ;++a)if(T[a]!==D[a]){u=T[a],d=D[a];break}return u<d?-1:d<u?1:0},Y.isEncoding=function(T){switch(String(T).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Y.concat=function(T,D){if(!Array.isArray(T))throw new TypeError('"list" argument must be an Array of Buffers');if(T.length===0)return Y.alloc(0);let u;if(D===void 0)for(D=0,u=0;u<T.length;++u)D+=T[u].length;let d=Y.allocUnsafe(D),a=0;for(u=0;u<T.length;++u){let CJ=T[u];if(TJ(CJ,Uint8Array))a+CJ.length>d.length?(Y.isBuffer(CJ)||(CJ=Y.from(CJ)),CJ.copy(d,a)):Uint8Array.prototype.set.call(d,CJ,a);else if(Y.isBuffer(CJ))CJ.copy(d,a);else throw new TypeError('"list" argument must be an Array of Buffers');a+=CJ.length}return d};function w(T,D){if(Y.isBuffer(T))return T.length;if(ArrayBuffer.isView(T)||TJ(T,ArrayBuffer))return T.byteLength;if(typeof T!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof T);let u=T.length,d=arguments.length>2&&arguments[2]===!0;if(!d&&u===0)return 0;let a=!1;for(;;)switch(D){case"ascii":case"latin1":case"binary":return u;case"utf8":case"utf-8":return $J(T).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return u*2;case"hex":return u>>>1;case"base64":return mJ(T).length;default:if(a)return d?-1:$J(T).length;D=(""+D).toLowerCase(),a=!0}}Y.byteLength=w;function y(T,D,u){let d=!1;if((D===void 0||D<0)&&(D=0),D>this.length||((u===void 0||u>this.length)&&(u=this.length),u<=0)||(u>>>=0,D>>>=0,u<=D))return"";for(T||(T="utf8");;)switch(T){case"hex":return G(this,D,u);case"utf8":case"utf-8":return Z(this,D,u);case"ascii":return U(this,D,u);case"latin1":case"binary":return H(this,D,u);case"base64":return V(this,D,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Q(this,D,u);default:if(d)throw new TypeError("Unknown encoding: "+T);T=(T+"").toLowerCase(),d=!0}}Y.prototype._isBuffer=!0;function m(T,D,u){let d=T[D];T[D]=T[u],T[u]=d}Y.prototype.swap16=function(){let T=this.length;if(T%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let D=0;D<T;D+=2)m(this,D,D+1);return this},Y.prototype.swap32=function(){let T=this.length;if(T%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let D=0;D<T;D+=4)m(this,D,D+3),m(this,D+1,D+2);return this},Y.prototype.swap64=function(){let T=this.length;if(T%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let D=0;D<T;D+=8)m(this,D,D+7),m(this,D+1,D+6),m(this,D+2,D+5),m(this,D+3,D+4);return this},Y.prototype.toString=function(){let T=this.length;return T===0?"":arguments.length===0?Z(this,0,T):y.apply(this,arguments)},Y.prototype.toLocaleString=Y.prototype.toString,Y.prototype.equals=function(T){if(!Y.isBuffer(T))throw new TypeError("Argument must be a Buffer");return this===T?!0:Y.compare(this,T)===0},Y.prototype.inspect=function(){let T="",D=l.INSPECT_MAX_BYTES;return T=this.toString("hex",0,D).replace(/(.{2})/g,"$1 ").trim(),this.length>D&&(T+=" ... "),"<Buffer "+T+">"},M&&(Y.prototype[M]=Y.prototype.inspect),Y.prototype.compare=function(T,D,u,d,a){if(TJ(T,Uint8Array)&&(T=Y.from(T,T.offset,T.byteLength)),!Y.isBuffer(T))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof T);if(D===void 0&&(D=0),u===void 0&&(u=T?T.length:0),d===void 0&&(d=0),a===void 0&&(a=this.length),D<0||u>T.length||d<0||a>this.length)throw new RangeError("out of range index");if(d>=a&&D>=u)return 0;if(d>=a)return-1;if(D>=u)return 1;if(D>>>=0,u>>>=0,d>>>=0,a>>>=0,this===T)return 0;let CJ=a-d,UJ=u-D,EJ=Math.min(CJ,UJ),QQ=this.slice(d,a),FJ=T.slice(D,u);for(let RJ=0;RJ<EJ;++RJ)if(QQ[RJ]!==FJ[RJ]){CJ=QQ[RJ],UJ=FJ[RJ];break}return CJ<UJ?-1:UJ<CJ?1:0};function i(T,D,u,d,a){if(T.length===0)return-1;if(typeof u=="string"?(d=u,u=0):u>2147483647?u=2147483647:u<-2147483648&&(u=-2147483648),u=+u,dJ(u)&&(u=a?0:T.length-1),u<0&&(u=T.length+u),u>=T.length){if(a)return-1;u=T.length-1}else if(u<0)if(a)u=0;else return-1;if(typeof D=="string"&&(D=Y.from(D,d)),Y.isBuffer(D))return D.length===0?-1:JJ(T,D,u,d,a);if(typeof D=="number")return D=D&255,typeof Uint8Array.prototype.indexOf=="function"?a?Uint8Array.prototype.indexOf.call(T,D,u):Uint8Array.prototype.lastIndexOf.call(T,D,u):JJ(T,[D],u,d,a);throw new TypeError("val must be string, number or Buffer")}function JJ(T,D,u,d,a){let CJ=1,UJ=T.length,EJ=D.length;if(d!==void 0&&(d=String(d).toLowerCase(),d==="ucs2"||d==="ucs-2"||d==="utf16le"||d==="utf-16le")){if(T.length<2||D.length<2)return-1;CJ=2,UJ/=2,EJ/=2,u/=2}function QQ(RJ,aJ){return CJ===1?RJ[aJ]:RJ.readUInt16BE(aJ*CJ)}let FJ;if(a){let RJ=-1;for(FJ=u;FJ<UJ;FJ++)if(QQ(T,FJ)===QQ(D,RJ===-1?0:FJ-RJ)){if(RJ===-1&&(RJ=FJ),FJ-RJ+1===EJ)return RJ*CJ}else RJ!==-1&&(FJ-=FJ-RJ),RJ=-1}else for(u+EJ>UJ&&(u=UJ-EJ),FJ=u;FJ>=0;FJ--){let RJ=!0;for(let aJ=0;aJ<EJ;aJ++)if(QQ(T,FJ+aJ)!==QQ(D,aJ)){RJ=!1;break}if(RJ)return FJ}return-1}Y.prototype.includes=function(T,D,u){return this.indexOf(T,D,u)!==-1},Y.prototype.indexOf=function(T,D,u){return i(this,T,D,u,!0)},Y.prototype.lastIndexOf=function(T,D,u){return i(this,T,D,u,!1)};function VJ(T,D,u,d){u=Number(u)||0;let a=T.length-u;d?(d=Number(d),d>a&&(d=a)):d=a;let CJ=D.length;d>CJ/2&&(d=CJ/2);let UJ;for(UJ=0;UJ<d;++UJ){let EJ=parseInt(D.substr(UJ*2,2),16);if(dJ(EJ))return UJ;T[u+UJ]=EJ}return UJ}function HJ(T,D,u,d){return BJ($J(D,T.length-u),T,u,d)}function o(T,D,u,d){return BJ(qJ(D),T,u,d)}function jJ(T,D,u,d){return BJ(mJ(D),T,u,d)}function J(T,D,u,d){return BJ(ZJ(D,T.length-u),T,u,d)}Y.prototype.write=function(T,D,u,d){if(D===void 0)d="utf8",u=this.length,D=0;else if(u===void 0&&typeof D=="string")d=D,u=this.length,D=0;else if(isFinite(D))D=D>>>0,isFinite(u)?(u=u>>>0,d===void 0&&(d="utf8")):(d=u,u=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let a=this.length-D;if((u===void 0||u>a)&&(u=a),T.length>0&&(u<0||D<0)||D>this.length)throw new RangeError("Attempt to write outside buffer bounds");d||(d="utf8");let CJ=!1;for(;;)switch(d){case"hex":return VJ(this,T,D,u);case"utf8":case"utf-8":return HJ(this,T,D,u);case"ascii":case"latin1":case"binary":return o(this,T,D,u);case"base64":return jJ(this,T,D,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return J(this,T,D,u);default:if(CJ)throw new TypeError("Unknown encoding: "+d);d=(""+d).toLowerCase(),CJ=!0}},Y.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function V(T,D,u){return D===0&&u===T.length?g.fromByteArray(T):g.fromByteArray(T.slice(D,u))}function Z(T,D,u){u=Math.min(T.length,u);let d=[],a=D;for(;a<u;){let CJ=T[a],UJ=null,EJ=CJ>239?4:CJ>223?3:CJ>191?2:1;if(a+EJ<=u){let QQ,FJ,RJ,aJ;switch(EJ){case 1:CJ<128&&(UJ=CJ);break;case 2:QQ=T[a+1],(QQ&192)===128&&(aJ=(CJ&31)<<6|QQ&63,aJ>127&&(UJ=aJ));break;case 3:QQ=T[a+1],FJ=T[a+2],(QQ&192)===128&&(FJ&192)===128&&(aJ=(CJ&15)<<12|(QQ&63)<<6|FJ&63,aJ>2047&&(aJ<55296||aJ>57343)&&(UJ=aJ));break;case 4:QQ=T[a+1],FJ=T[a+2],RJ=T[a+3],(QQ&192)===128&&(FJ&192)===128&&(RJ&192)===128&&(aJ=(CJ&15)<<18|(QQ&63)<<12|(FJ&63)<<6|RJ&63,aJ>65535&&aJ<1114112&&(UJ=aJ))}}UJ===null?(UJ=65533,EJ=1):UJ>65535&&(UJ-=65536,d.push(UJ>>>10&1023|55296),UJ=56320|UJ&1023),d.push(UJ),a+=EJ}return X(d)}var $=4096;function X(T){let D=T.length;if(D<=$)return String.fromCharCode.apply(String,T);let u="",d=0;for(;d<D;)u+=String.fromCharCode.apply(String,T.slice(d,d+=$));return u}function U(T,D,u){let d="";u=Math.min(T.length,u);for(let a=D;a<u;++a)d+=String.fromCharCode(T[a]&127);return d}function H(T,D,u){let d="";u=Math.min(T.length,u);for(let a=D;a<u;++a)d+=String.fromCharCode(T[a]);return d}function G(T,D,u){let d=T.length;(!D||D<0)&&(D=0),(!u||u<0||u>d)&&(u=d);let a="";for(let CJ=D;CJ<u;++CJ)a+=LJ[T[CJ]];return a}function Q(T,D,u){let d=T.slice(D,u),a="";for(let CJ=0;CJ<d.length-1;CJ+=2)a+=String.fromCharCode(d[CJ]+d[CJ+1]*256);return a}Y.prototype.slice=function(T,D){let u=this.length;T=~~T,D=D===void 0?u:~~D,T<0?(T+=u,T<0&&(T=0)):T>u&&(T=u),D<0?(D+=u,D<0&&(D=0)):D>u&&(D=u),D<T&&(D=T);let d=this.subarray(T,D);return Object.setPrototypeOf(d,Y.prototype),d};function K(T,D,u){if(T%1!==0||T<0)throw new RangeError("offset is not uint");if(T+D>u)throw new RangeError("Trying to access beyond buffer length")}Y.prototype.readUintLE=Y.prototype.readUIntLE=function(T,D,u){T=T>>>0,D=D>>>0,u||K(T,D,this.length);let d=this[T],a=1,CJ=0;for(;++CJ<D&&(a*=256);)d+=this[T+CJ]*a;return d},Y.prototype.readUintBE=Y.prototype.readUIntBE=function(T,D,u){T=T>>>0,D=D>>>0,u||K(T,D,this.length);let d=this[T+--D],a=1;for(;D>0&&(a*=256);)d+=this[T+--D]*a;return d},Y.prototype.readUint8=Y.prototype.readUInt8=function(T,D){return T=T>>>0,D||K(T,1,this.length),this[T]},Y.prototype.readUint16LE=Y.prototype.readUInt16LE=function(T,D){return T=T>>>0,D||K(T,2,this.length),this[T]|this[T+1]<<8},Y.prototype.readUint16BE=Y.prototype.readUInt16BE=function(T,D){return T=T>>>0,D||K(T,2,this.length),this[T]<<8|this[T+1]},Y.prototype.readUint32LE=Y.prototype.readUInt32LE=function(T,D){return T=T>>>0,D||K(T,4,this.length),(this[T]|this[T+1]<<8|this[T+2]<<16)+this[T+3]*16777216},Y.prototype.readUint32BE=Y.prototype.readUInt32BE=function(T,D){return T=T>>>0,D||K(T,4,this.length),this[T]*16777216+(this[T+1]<<16|this[T+2]<<8|this[T+3])},Y.prototype.readBigUInt64LE=IJ(function(T){T=T>>>0,WJ(T,"offset");let D=this[T],u=this[T+7];(D===void 0||u===void 0)&&b(T,this.length-8);let d=D+this[++T]*256+this[++T]*65536+this[++T]*16777216,a=this[++T]+this[++T]*256+this[++T]*65536+u*16777216;return BigInt(d)+(BigInt(a)<<BigInt(32))}),Y.prototype.readBigUInt64BE=IJ(function(T){T=T>>>0,WJ(T,"offset");let D=this[T],u=this[T+7];(D===void 0||u===void 0)&&b(T,this.length-8);let d=D*16777216+this[++T]*65536+this[++T]*256+this[++T],a=this[++T]*16777216+this[++T]*65536+this[++T]*256+u;return(BigInt(d)<<BigInt(32))+BigInt(a)}),Y.prototype.readIntLE=function(T,D,u){T=T>>>0,D=D>>>0,u||K(T,D,this.length);let d=this[T],a=1,CJ=0;for(;++CJ<D&&(a*=256);)d+=this[T+CJ]*a;return a*=128,d>=a&&(d-=Math.pow(2,8*D)),d},Y.prototype.readIntBE=function(T,D,u){T=T>>>0,D=D>>>0,u||K(T,D,this.length);let d=D,a=1,CJ=this[T+--d];for(;d>0&&(a*=256);)CJ+=this[T+--d]*a;return a*=128,CJ>=a&&(CJ-=Math.pow(2,8*D)),CJ},Y.prototype.readInt8=function(T,D){return T=T>>>0,D||K(T,1,this.length),this[T]&128?(255-this[T]+1)*-1:this[T]},Y.prototype.readInt16LE=function(T,D){T=T>>>0,D||K(T,2,this.length);let u=this[T]|this[T+1]<<8;return u&32768?u|4294901760:u},Y.prototype.readInt16BE=function(T,D){T=T>>>0,D||K(T,2,this.length);let u=this[T+1]|this[T]<<8;return u&32768?u|4294901760:u},Y.prototype.readInt32LE=function(T,D){return T=T>>>0,D||K(T,4,this.length),this[T]|this[T+1]<<8|this[T+2]<<16|this[T+3]<<24},Y.prototype.readInt32BE=function(T,D){return T=T>>>0,D||K(T,4,this.length),this[T]<<24|this[T+1]<<16|this[T+2]<<8|this[T+3]},Y.prototype.readBigInt64LE=IJ(function(T){T=T>>>0,WJ(T,"offset");let D=this[T],u=this[T+7];(D===void 0||u===void 0)&&b(T,this.length-8);let d=this[T+4]+this[T+5]*256+this[T+6]*65536+(u<<24);return(BigInt(d)<<BigInt(32))+BigInt(D+this[++T]*256+this[++T]*65536+this[++T]*16777216)}),Y.prototype.readBigInt64BE=IJ(function(T){T=T>>>0,WJ(T,"offset");let D=this[T],u=this[T+7];(D===void 0||u===void 0)&&b(T,this.length-8);let d=(D<<24)+this[++T]*65536+this[++T]*256+this[++T];return(BigInt(d)<<BigInt(32))+BigInt(this[++T]*16777216+this[++T]*65536+this[++T]*256+u)}),Y.prototype.readFloatLE=function(T,D){return T=T>>>0,D||K(T,4,this.length),R.read(this,T,!0,23,4)},Y.prototype.readFloatBE=function(T,D){return T=T>>>0,D||K(T,4,this.length),R.read(this,T,!1,23,4)},Y.prototype.readDoubleLE=function(T,D){return T=T>>>0,D||K(T,8,this.length),R.read(this,T,!0,52,8)},Y.prototype.readDoubleBE=function(T,D){return T=T>>>0,D||K(T,8,this.length),R.read(this,T,!1,52,8)};function k(T,D,u,d,a,CJ){if(!Y.isBuffer(T))throw new TypeError('"buffer" argument must be a Buffer instance');if(D>a||D<CJ)throw new RangeError('"value" argument is out of bounds');if(u+d>T.length)throw new RangeError("Index out of range")}Y.prototype.writeUintLE=Y.prototype.writeUIntLE=function(T,D,u,d){if(T=+T,D=D>>>0,u=u>>>0,!d){let UJ=Math.pow(2,8*u)-1;k(this,T,D,u,UJ,0)}let a=1,CJ=0;for(this[D]=T&255;++CJ<u&&(a*=256);)this[D+CJ]=T/a&255;return D+u},Y.prototype.writeUintBE=Y.prototype.writeUIntBE=function(T,D,u,d){if(T=+T,D=D>>>0,u=u>>>0,!d){let UJ=Math.pow(2,8*u)-1;k(this,T,D,u,UJ,0)}let a=u-1,CJ=1;for(this[D+a]=T&255;--a>=0&&(CJ*=256);)this[D+a]=T/CJ&255;return D+u},Y.prototype.writeUint8=Y.prototype.writeUInt8=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,1,255,0),this[D]=T&255,D+1},Y.prototype.writeUint16LE=Y.prototype.writeUInt16LE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,2,65535,0),this[D]=T&255,this[D+1]=T>>>8,D+2},Y.prototype.writeUint16BE=Y.prototype.writeUInt16BE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,2,65535,0),this[D]=T>>>8,this[D+1]=T&255,D+2},Y.prototype.writeUint32LE=Y.prototype.writeUInt32LE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,4,4294967295,0),this[D+3]=T>>>24,this[D+2]=T>>>16,this[D+1]=T>>>8,this[D]=T&255,D+4},Y.prototype.writeUint32BE=Y.prototype.writeUInt32BE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,4,4294967295,0),this[D]=T>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=T&255,D+4};function L(T,D,u,d,a){XJ(D,d,a,T,u,7);let CJ=Number(D&BigInt(4294967295));T[u++]=CJ,CJ=CJ>>8,T[u++]=CJ,CJ=CJ>>8,T[u++]=CJ,CJ=CJ>>8,T[u++]=CJ;let UJ=Number(D>>BigInt(32)&BigInt(4294967295));return T[u++]=UJ,UJ=UJ>>8,T[u++]=UJ,UJ=UJ>>8,T[u++]=UJ,UJ=UJ>>8,T[u++]=UJ,u}function _(T,D,u,d,a){XJ(D,d,a,T,u,7);let CJ=Number(D&BigInt(4294967295));T[u+7]=CJ,CJ=CJ>>8,T[u+6]=CJ,CJ=CJ>>8,T[u+5]=CJ,CJ=CJ>>8,T[u+4]=CJ;let UJ=Number(D>>BigInt(32)&BigInt(4294967295));return T[u+3]=UJ,UJ=UJ>>8,T[u+2]=UJ,UJ=UJ>>8,T[u+1]=UJ,UJ=UJ>>8,T[u]=UJ,u+8}Y.prototype.writeBigUInt64LE=IJ(function(T,D=0){return L(this,T,D,BigInt(0),BigInt("0xffffffffffffffff"))}),Y.prototype.writeBigUInt64BE=IJ(function(T,D=0){return _(this,T,D,BigInt(0),BigInt("0xffffffffffffffff"))}),Y.prototype.writeIntLE=function(T,D,u,d){if(T=+T,D=D>>>0,!d){let EJ=Math.pow(2,8*u-1);k(this,T,D,u,EJ-1,-EJ)}let a=0,CJ=1,UJ=0;for(this[D]=T&255;++a<u&&(CJ*=256);)T<0&&UJ===0&&this[D+a-1]!==0&&(UJ=1),this[D+a]=(T/CJ>>0)-UJ&255;return D+u},Y.prototype.writeIntBE=function(T,D,u,d){if(T=+T,D=D>>>0,!d){let EJ=Math.pow(2,8*u-1);k(this,T,D,u,EJ-1,-EJ)}let a=u-1,CJ=1,UJ=0;for(this[D+a]=T&255;--a>=0&&(CJ*=256);)T<0&&UJ===0&&this[D+a+1]!==0&&(UJ=1),this[D+a]=(T/CJ>>0)-UJ&255;return D+u},Y.prototype.writeInt8=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,1,127,-128),T<0&&(T=255+T+1),this[D]=T&255,D+1},Y.prototype.writeInt16LE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,2,32767,-32768),this[D]=T&255,this[D+1]=T>>>8,D+2},Y.prototype.writeInt16BE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,2,32767,-32768),this[D]=T>>>8,this[D+1]=T&255,D+2},Y.prototype.writeInt32LE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,4,2147483647,-2147483648),this[D]=T&255,this[D+1]=T>>>8,this[D+2]=T>>>16,this[D+3]=T>>>24,D+4},Y.prototype.writeInt32BE=function(T,D,u){return T=+T,D=D>>>0,u||k(this,T,D,4,2147483647,-2147483648),T<0&&(T=4294967295+T+1),this[D]=T>>>24,this[D+1]=T>>>16,this[D+2]=T>>>8,this[D+3]=T&255,D+4},Y.prototype.writeBigInt64LE=IJ(function(T,D=0){return L(this,T,D,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),Y.prototype.writeBigInt64BE=IJ(function(T,D=0){return _(this,T,D,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function t(T,D,u,d,a,CJ){if(u+d>T.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("Index out of range")}function QJ(T,D,u,d,a){return D=+D,u=u>>>0,a||t(T,D,u,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000),R.write(T,D,u,d,23,4),u+4}Y.prototype.writeFloatLE=function(T,D,u){return QJ(this,T,D,!0,u)},Y.prototype.writeFloatBE=function(T,D,u){return QJ(this,T,D,!1,u)};function GJ(T,D,u,d,a){return D=+D,u=u>>>0,a||t(T,D,u,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000),R.write(T,D,u,d,52,8),u+8}Y.prototype.writeDoubleLE=function(T,D,u){return GJ(this,T,D,!0,u)},Y.prototype.writeDoubleBE=function(T,D,u){return GJ(this,T,D,!1,u)},Y.prototype.copy=function(T,D,u,d){if(!Y.isBuffer(T))throw new TypeError("argument should be a Buffer");if(u||(u=0),!d&&d!==0&&(d=this.length),D>=T.length&&(D=T.length),D||(D=0),d>0&&d<u&&(d=u),d===u||T.length===0||this.length===0)return 0;if(D<0)throw new RangeError("targetStart out of bounds");if(u<0||u>=this.length)throw new RangeError("Index out of range");if(d<0)throw new RangeError("sourceEnd out of bounds");d>this.length&&(d=this.length),T.length-D<d-u&&(d=T.length-D+u);let a=d-u;return this===T&&typeof Uint8Array.prototype.copyWithin=="function"?this.copyWithin(D,u,d):Uint8Array.prototype.set.call(T,this.subarray(u,d),D),a},Y.prototype.fill=function(T,D,u,d){if(typeof T=="string"){if(typeof D=="string"?(d=D,D=0,u=this.length):typeof u=="string"&&(d=u,u=this.length),d!==void 0&&typeof d!="string")throw new TypeError("encoding must be a string");if(typeof d=="string"&&!Y.isEncoding(d))throw new TypeError("Unknown encoding: "+d);if(T.length===1){let CJ=T.charCodeAt(0);(d==="utf8"&&CJ<128||d==="latin1")&&(T=CJ)}}else typeof T=="number"?T=T&255:typeof T=="boolean"&&(T=Number(T));if(D<0||this.length<D||this.length<u)throw new RangeError("Out of range index");if(u<=D)return this;D=D>>>0,u=u===void 0?this.length:u>>>0,T||(T=0);let a;if(typeof T=="number")for(a=D;a<u;++a)this[a]=T;else{let CJ=Y.isBuffer(T)?T:Y.from(T,d),UJ=CJ.length;if(UJ===0)throw new TypeError('The value "'+T+'" is invalid for argument "value"');for(a=0;a<u-D;++a)this[a+D]=CJ[a%UJ]}return this};var n={};function p(T,D,u){n[T]=class extends u{constructor(){super(),Object.defineProperty(this,"message",{value:D.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${T}]`,this.stack,delete this.name}get code(){return T}set code(d){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:d,writable:!0})}toString(){return`${this.name} [${T}]: ${this.message}`}}}p("ERR_BUFFER_OUT_OF_BOUNDS",function(T){return T?`${T} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),p("ERR_INVALID_ARG_TYPE",function(T,D){return`The "${T}" argument must be of type number. Received type ${typeof D}`},TypeError),p("ERR_OUT_OF_RANGE",function(T,D,u){let d=`The value of "${T}" is out of range.`,a=u;return Number.isInteger(u)&&Math.abs(u)>4294967296?a=e(String(u)):typeof u=="bigint"&&(a=String(u),(u>BigInt(2)**BigInt(32)||u<-(BigInt(2)**BigInt(32)))&&(a=e(a)),a+="n"),d+=` It must be ${D}. Received ${a}`,d},RangeError);function e(T){let D="",u=T.length,d=T[0]==="-"?1:0;for(;u>=d+4;u-=3)D=`_${T.slice(u-3,u)}${D}`;return`${T.slice(0,u)}${D}`}function PJ(T,D,u){WJ(D,"offset"),(T[D]===void 0||T[D+u]===void 0)&&b(D,T.length-(u+1))}function XJ(T,D,u,d,a,CJ){if(T>u||T<D){let UJ=typeof D=="bigint"?"n":"",EJ;throw CJ>3?D===0||D===BigInt(0)?EJ=`>= 0${UJ} and < 2${UJ} ** ${(CJ+1)*8}${UJ}`:EJ=`>= -(2${UJ} ** ${(CJ+1)*8-1}${UJ}) and < 2 ** ${(CJ+1)*8-1}${UJ}`:EJ=`>= ${D}${UJ} and <= ${u}${UJ}`,new n.ERR_OUT_OF_RANGE("value",EJ,T)}PJ(d,a,CJ)}function WJ(T,D){if(typeof T!="number")throw new n.ERR_INVALID_ARG_TYPE(D,"number",T)}function b(T,D,u){throw Math.floor(T)!==T?(WJ(T,u),new n.ERR_OUT_OF_RANGE(u||"offset","an integer",T)):D<0?new n.ERR_BUFFER_OUT_OF_BOUNDS:new n.ERR_OUT_OF_RANGE(u||"offset",`>= ${u?1:0} and <= ${D}`,T)}var C=/[^+/0-9A-Za-z-_]/g;function h(T){if(T=T.split("=")[0],T=T.trim().replace(C,""),T.length<2)return"";for(;T.length%4!==0;)T=T+"=";return T}function $J(T,D){D=D||1/0;let u,d=T.length,a=null,CJ=[];for(let UJ=0;UJ<d;++UJ){if(u=T.charCodeAt(UJ),u>55295&&u<57344){if(!a){if(u>56319){(D-=3)>-1&&CJ.push(239,191,189);continue}else if(UJ+1===d){(D-=3)>-1&&CJ.push(239,191,189);continue}a=u;continue}if(u<56320){(D-=3)>-1&&CJ.push(239,191,189),a=u;continue}u=(a-55296<<10|u-56320)+65536}else a&&(D-=3)>-1&&CJ.push(239,191,189);if(a=null,u<128){if((D-=1)<0)break;CJ.push(u)}else if(u<2048){if((D-=2)<0)break;CJ.push(u>>6|192,u&63|128)}else if(u<65536){if((D-=3)<0)break;CJ.push(u>>12|224,u>>6&63|128,u&63|128)}else if(u<1114112){if((D-=4)<0)break;CJ.push(u>>18|240,u>>12&63|128,u>>6&63|128,u&63|128)}else throw new Error("Invalid code point")}return CJ}function qJ(T){let D=[];for(let u=0;u<T.length;++u)D.push(T.charCodeAt(u)&255);return D}function ZJ(T,D){let u,d,a,CJ=[];for(let UJ=0;UJ<T.length&&!((D-=2)<0);++UJ)u=T.charCodeAt(UJ),d=u>>8,a=u%256,CJ.push(a),CJ.push(d);return CJ}function mJ(T){return g.toByteArray(h(T))}function BJ(T,D,u,d){let a;for(a=0;a<d&&!(a+u>=D.length||a>=T.length);++a)D[a+u]=T[a];return a}function TJ(T,D){return T instanceof D||T!=null&&T.constructor!=null&&T.constructor.name!=null&&T.constructor.name===D.name}function dJ(T){return T!==T}var LJ=function(){let T="0123456789abcdef",D=new Array(256);for(let u=0;u<16;++u){let d=u*16;for(let a=0;a<16;++a)D[d+a]=T[u]+T[a]}return D}();function IJ(T){return typeof BigInt>"u"?$Q:T}function $Q(){throw new Error("BigInt not supported")}}),XQ=OJ((l,g)=>{var R=yQ(),M=R.Buffer;function B(q,Y){for(var E in q)Y[E]=q[E]}M.from&&M.alloc&&M.allocUnsafe&&M.allocUnsafeSlow?g.exports=R:(B(R,l),l.Buffer=A);function A(q,Y,E){return M(q,Y,E)}A.prototype=Object.create(M.prototype),B(M,A),A.from=function(q,Y,E){if(typeof q=="number")throw new TypeError("Argument must not be a number");return M(q,Y,E)},A.alloc=function(q,Y,E){if(typeof q!="number")throw new TypeError("Argument must be a number");var O=M(q);return Y!==void 0?typeof E=="string"?O.fill(Y,E):O.fill(Y):O.fill(0),O},A.allocUnsafe=function(q){if(typeof q!="number")throw new TypeError("Argument must be a number");return M(q)},A.allocUnsafeSlow=function(q){if(typeof q!="number")throw new TypeError("Argument must be a number");return R.SlowBuffer(q)}}),VV=OJ((l,g)=>{var R=65536,M=4294967295;function B(){throw new Error(`Secure random number generation is not supported by this browser.
+Use Chrome, Firefox or Internet Explorer 11`)}var A=XQ().Buffer,q=global.crypto||global.msCrypto;q&&q.getRandomValues?g.exports=Y:g.exports=B;function Y(E,O){if(E>M)throw new RangeError("requested too many random bytes");var N=A.allocUnsafe(E);if(E>0)if(E>R)for(var W=0;W<E;W+=R)q.getRandomValues(N.slice(W,W+R));else q.getRandomValues(N);return typeof O=="function"?process.nextTick(function(){O(null,N)}):N}}),JQ=OJ((l,g)=>{typeof Object.create=="function"?g.exports=function(R,M){M&&(R.super_=M,R.prototype=Object.create(M.prototype,{constructor:{value:R,enumerable:!1,writable:!0,configurable:!0}}))}:g.exports=function(R,M){if(M){R.super_=M;var B=function(){};B.prototype=M.prototype,R.prototype=new B,R.prototype.constructor=R}}}),rQ=OJ((l,g)=>{var R=typeof Reflect=="object"?Reflect:null,M=R&&typeof R.apply=="function"?R.apply:function(i,JJ,VJ){return Function.prototype.apply.call(i,JJ,VJ)},B;R&&typeof R.ownKeys=="function"?B=R.ownKeys:Object.getOwnPropertySymbols?B=function(i){return Object.getOwnPropertyNames(i).concat(Object.getOwnPropertySymbols(i))}:B=function(i){return Object.getOwnPropertyNames(i)};function A(i){console&&console.warn&&console.warn(i)}var q=Number.isNaN||function(i){return i!==i};function Y(){Y.init.call(this)}g.exports=Y,g.exports.once=w,Y.EventEmitter=Y,Y.prototype._events=void 0,Y.prototype._eventsCount=0,Y.prototype._maxListeners=void 0;var E=10;function O(i){if(typeof i!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof i)}Object.defineProperty(Y,"defaultMaxListeners",{enumerable:!0,get:function(){return E},set:function(i){if(typeof i!="number"||i<0||q(i))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+i+".");E=i}}),Y.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},Y.prototype.setMaxListeners=function(i){if(typeof i!="number"||i<0||q(i))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+i+".");return this._maxListeners=i,this};function N(i){return i._maxListeners===void 0?Y.defaultMaxListeners:i._maxListeners}Y.prototype.getMaxListeners=function(){return N(this)},Y.prototype.emit=function(i){for(var JJ=[],VJ=1;VJ<arguments.length;VJ++)JJ.push(arguments[VJ]);var HJ=i==="error",o=this._events;if(o!==void 0)HJ=HJ&&o.error===void 0;else if(!HJ)return!1;if(HJ){var jJ;if(JJ.length>0&&(jJ=JJ[0]),jJ instanceof Error)throw jJ;var J=new Error("Unhandled error."+(jJ?" ("+jJ.message+")":""));throw J.context=jJ,J}var V=o[i];if(V===void 0)return!1;if(typeof V=="function")M(V,this,JJ);else for(var Z=V.length,$=F(V,Z),VJ=0;VJ<Z;++VJ)M($[VJ],this,JJ);return!0};function W(i,JJ,VJ,HJ){var o,jJ,J;if(O(VJ),jJ=i._events,jJ===void 0?(jJ=i._events=Object.create(null),i._eventsCount=0):(jJ.newListener!==void 0&&(i.emit("newListener",JJ,VJ.listener?VJ.listener:VJ),jJ=i._events),J=jJ[JJ]),J===void 0)J=jJ[JJ]=VJ,++i._eventsCount;else if(typeof J=="function"?J=jJ[JJ]=HJ?[VJ,J]:[J,VJ]:HJ?J.unshift(VJ):J.push(VJ),o=N(i),o>0&&J.length>o&&!J.warned){J.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+J.length+" "+String(JJ)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=i,V.type=JJ,V.count=J.length,A(V)}return i}Y.prototype.addListener=function(i,JJ){return W(this,i,JJ,!1)},Y.prototype.on=Y.prototype.addListener,Y.prototype.prependListener=function(i,JJ){return W(this,i,JJ,!0)};function I(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function z(i,JJ,VJ){var HJ={fired:!1,wrapFn:void 0,target:i,type:JJ,listener:VJ},o=I.bind(HJ);return o.listener=VJ,HJ.wrapFn=o,o}Y.prototype.once=function(i,JJ){return O(JJ),this.on(i,z(this,i,JJ)),this},Y.prototype.prependOnceListener=function(i,JJ){return O(JJ),this.prependListener(i,z(this,i,JJ)),this},Y.prototype.removeListener=function(i,JJ){var VJ,HJ,o,jJ,J;if(O(JJ),HJ=this._events,HJ===void 0)return this;if(VJ=HJ[i],VJ===void 0)return this;if(VJ===JJ||VJ.listener===JJ)--this._eventsCount===0?this._events=Object.create(null):(delete HJ[i],HJ.removeListener&&this.emit("removeListener",i,VJ.listener||JJ));else if(typeof VJ!="function"){for(o=-1,jJ=VJ.length-1;jJ>=0;jJ--)if(VJ[jJ]===JJ||VJ[jJ].listener===JJ){J=VJ[jJ].listener,o=jJ;break}if(o<0)return this;o===0?VJ.shift():v(VJ,o),VJ.length===1&&(HJ[i]=VJ[0]),HJ.removeListener!==void 0&&this.emit("removeListener",i,J||JJ)}return this},Y.prototype.off=Y.prototype.removeListener,Y.prototype.removeAllListeners=function(i){var JJ,VJ,HJ;if(VJ=this._events,VJ===void 0)return this;if(VJ.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):VJ[i]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete VJ[i]),this;if(arguments.length===0){var o=Object.keys(VJ),jJ;for(HJ=0;HJ<o.length;++HJ)jJ=o[HJ],jJ!=="removeListener"&&this.removeAllListeners(jJ);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(JJ=VJ[i],typeof JJ=="function")this.removeListener(i,JJ);else if(JJ!==void 0)for(HJ=JJ.length-1;HJ>=0;HJ--)this.removeListener(i,JJ[HJ]);return this};function j(i,JJ,VJ){var HJ=i._events;if(HJ===void 0)return[];var o=HJ[JJ];return o===void 0?[]:typeof o=="function"?VJ?[o.listener||o]:[o]:VJ?S(o):F(o,o.length)}Y.prototype.listeners=function(i){return j(this,i,!0)},Y.prototype.rawListeners=function(i){return j(this,i,!1)},Y.listenerCount=function(i,JJ){return typeof i.listenerCount=="function"?i.listenerCount(JJ):P.call(i,JJ)},Y.prototype.listenerCount=P;function P(i){var JJ=this._events;if(JJ!==void 0){var VJ=JJ[i];if(typeof VJ=="function")return 1;if(VJ!==void 0)return VJ.length}return 0}Y.prototype.eventNames=function(){return this._eventsCount>0?B(this._events):[]};function F(i,JJ){for(var VJ=new Array(JJ),HJ=0;HJ<JJ;++HJ)VJ[HJ]=i[HJ];return VJ}function v(i,JJ){for(;JJ+1<i.length;JJ++)i[JJ]=i[JJ+1];i.pop()}function S(i){for(var JJ=new Array(i.length),VJ=0;VJ<JJ.length;++VJ)JJ[VJ]=i[VJ].listener||i[VJ];return JJ}function w(i,JJ){return new Promise(function(VJ,HJ){function o(J){i.removeListener(JJ,jJ),HJ(J)}function jJ(){typeof i.removeListener=="function"&&i.removeListener("error",o),VJ([].slice.call(arguments))}m(i,JJ,jJ,{once:!0}),JJ!=="error"&&y(i,o,{once:!0})})}function y(i,JJ,VJ){typeof i.on=="function"&&m(i,"error",JJ,VJ)}function m(i,JJ,VJ,HJ){if(typeof i.on=="function")HJ.once?i.once(JJ,VJ):i.on(JJ,VJ);else if(typeof i.addEventListener=="function")i.addEventListener(JJ,function o(jJ){HJ.once&&i.removeEventListener(JJ,o),VJ(jJ)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof i)}}),R0=OJ((l,g)=>{g.exports=rQ().EventEmitter}),PV=OJ(()=>{}),Q8=OJ((l,g)=>{function R(j,P){var F=Object.keys(j);if(Object.getOwnPropertySymbols){var v=Object.getOwnPropertySymbols(j);P&&(v=v.filter(function(S){return Object.getOwnPropertyDescriptor(j,S).enumerable})),F.push.apply(F,v)}return F}function M(j){for(var P=1;P<arguments.length;P++){var F=arguments[P]!=null?arguments[P]:{};P%2?R(Object(F),!0).forEach(function(v){B(j,v,F[v])}):Object.getOwnPropertyDescriptors?Object.defineProperties(j,Object.getOwnPropertyDescriptors(F)):R(Object(F)).forEach(function(v){Object.defineProperty(j,v,Object.getOwnPropertyDescriptor(F,v))})}return j}function B(j,P,F){return P in j?Object.defineProperty(j,P,{value:F,enumerable:!0,configurable:!0,writable:!0}):j[P]=F,j}function A(j,P){if(!(j instanceof P))throw new TypeError("Cannot call a class as a function")}function q(j,P){for(var F=0;F<P.length;F++){var v=P[F];v.enumerable=v.enumerable||!1,v.configurable=!0,"value"in v&&(v.writable=!0),Object.defineProperty(j,v.key,v)}}function Y(j,P,F){return P&&q(j.prototype,P),F&&q(j,F),j}var E=yQ(),O=E.Buffer,N=PV(),W=N.inspect,I=W&&W.custom||"inspect";function z(j,P,F){O.prototype.copy.call(j,P,F)}g.exports=function(){function j(){A(this,j),this.head=null,this.tail=null,this.length=0}return Y(j,[{key:"push",value:function(P){var F={data:P,next:null};this.length>0?this.tail.next=F:this.head=F,this.tail=F,++this.length}},{key:"unshift",value:function(P){var F={data:P,next:this.head};this.length===0&&(this.tail=F),this.head=F,++this.length}},{key:"shift",value:function(){if(this.length!==0){var P=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,P}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(P){if(this.length===0)return"";for(var F=this.head,v=""+F.data;F=F.next;)v+=P+F.data;return v}},{key:"concat",value:function(P){if(this.length===0)return O.alloc(0);for(var F=O.allocUnsafe(P>>>0),v=this.head,S=0;v;)z(v.data,F,S),S+=v.data.length,v=v.next;return F}},{key:"consume",value:function(P,F){var v;return P<this.head.data.length?(v=this.head.data.slice(0,P),this.head.data=this.head.data.slice(P)):P===this.head.data.length?v=this.shift():v=F?this._getString(P):this._getBuffer(P),v}},{key:"first",value:function(){return this.head.data}},{key:"_getString",value:function(P){var F=this.head,v=1,S=F.data;for(P-=S.length;F=F.next;){var w=F.data,y=P>w.length?w.length:P;if(y===w.length?S+=w:S+=w.slice(0,P),P-=y,P===0){y===w.length?(++v,F.next?this.head=F.next:this.head=this.tail=null):(this.head=F,F.data=w.slice(y));break}++v}return this.length-=v,S}},{key:"_getBuffer",value:function(P){var F=O.allocUnsafe(P),v=this.head,S=1;for(v.data.copy(F),P-=v.data.length;v=v.next;){var w=v.data,y=P>w.length?w.length:P;if(w.copy(F,F.length-P,0,y),P-=y,P===0){y===w.length?(++S,v.next?this.head=v.next:this.head=this.tail=null):(this.head=v,v.data=w.slice(y));break}++S}return this.length-=S,F}},{key:I,value:function(P,F){return W(this,M({},F,{depth:0,customInspect:!1}))}}]),j}()}),z0=OJ((l,g)=>{function R(E,O){var N=this,W=this._readableState&&this._readableState.destroyed,I=this._writableState&&this._writableState.destroyed;return W||I?(O?O(E):E&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(q,this,E)):process.nextTick(q,this,E)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(E||null,function(z){!O&&z?N._writableState?N._writableState.errorEmitted?process.nextTick(B,N):(N._writableState.errorEmitted=!0,process.nextTick(M,N,z)):process.nextTick(M,N,z):O?(process.nextTick(B,N),O(z)):process.nextTick(B,N)}),this)}function M(E,O){q(E,O),B(E)}function B(E){E._writableState&&!E._writableState.emitClose||E._readableState&&!E._readableState.emitClose||E.emit("close")}function A(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function q(E,O){E.emit("error",O)}function Y(E,O){var{_readableState:N,_writableState:W}=E;N&&N.autoDestroy||W&&W.autoDestroy?E.destroy(O):E.emit("error",O)}g.exports={destroy:R,undestroy:A,errorOrDestroy:Y}}),$V=OJ((l,g)=>{function R(O,N){O.prototype=Object.create(N.prototype),O.prototype.constructor=O,O.__proto__=N}var M={};function B(O,N,W){W||(W=Error);function I(j,P,F){return typeof N=="string"?N:N(j,P,F)}var z=function(j){R(P,j);function P(F,v,S){return j.call(this,I(F,v,S))||this}return P}(W);z.prototype.name=W.name,z.prototype.code=O,M[O]=z}function A(O,N){if(Array.isArray(O)){var W=O.length;return O=O.map(function(I){return String(I)}),W>2?"one of ".concat(N," ").concat(O.slice(0,W-1).join(", "),", or ")+O[W-1]:W===2?"one of ".concat(N," ").concat(O[0]," or ").concat(O[1]):"of ".concat(N," ").concat(O[0])}else return"of ".concat(N," ").concat(String(O))}function q(O,N,W){return O.substr(!W||W<0?0:+W,N.length)===N}function Y(O,N,W){return(W===void 0||W>O.length)&&(W=O.length),O.substring(W-N.length,W)===N}function E(O,N,W){return typeof W!="number"&&(W=0),W+N.length>O.length?!1:O.indexOf(N,W)!==-1}B("ERR_INVALID_OPT_VALUE",function(O,N){return'The value "'+N+'" is invalid for option "'+O+'"'},TypeError),B("ERR_INVALID_ARG_TYPE",function(O,N,W){var I;typeof N=="string"&&q(N,"not ")?(I="must not be",N=N.replace(/^not /,"")):I="must be";var z;if(Y(O," argument"))z="The ".concat(O," ").concat(I," ").concat(A(N,"type"));else{var j=E(O,".")?"property":"argument";z='The "'.concat(O,'" ').concat(j," ").concat(I," ").concat(A(N,"type"))}return z+=". Received type ".concat(typeof W),z},TypeError),B("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),B("ERR_METHOD_NOT_IMPLEMENTED",function(O){return"The "+O+" method is not implemented"}),B("ERR_STREAM_PREMATURE_CLOSE","Premature close"),B("ERR_STREAM_DESTROYED",function(O){return"Cannot call "+O+" after a stream was destroyed"}),B("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),B("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),B("ERR_STREAM_WRITE_AFTER_END","write after end"),B("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),B("ERR_UNKNOWN_ENCODING",function(O){return"Unknown encoding: "+O},TypeError),B("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),g.exports.codes=M}),P0=OJ((l,g)=>{var R=$V().codes.ERR_INVALID_OPT_VALUE;function M(A,q,Y){return A.highWaterMark!=null?A.highWaterMark:q?A[Y]:null}function B(A,q,Y,E){var O=M(q,E,Y);if(O!=null){if(!(isFinite(O)&&Math.floor(O)===O)||O<0){var N=E?Y:"highWaterMark";throw new R(N,O)}return Math.floor(O)}return A.objectMode?16:16384}g.exports={getHighWaterMark:B}}),L0=OJ((l,g)=>{g.exports=R;function R(B,A){if(M("noDeprecation"))return B;var q=!1;function Y(){if(!q){if(M("throwDeprecation"))throw new Error(A);M("traceDeprecation")?console.trace(A):console.warn(A),q=!0}return B.apply(this,arguments)}return Y}function M(B){try{if(!global.localStorage)return!1}catch{return!1}var A=global.localStorage[B];return A==null?!1:String(A).toLowerCase()==="true"}}),F0=OJ((l,g)=>{g.exports=o;function R(n){var p=this;this.next=null,this.entry=null,this.finish=function(){GJ(p,n)}}var M;o.WritableState=VJ;var B={deprecate:L0()},A=R0(),q=yQ().Buffer,Y=global.Uint8Array||function(){};function E(n){return q.from(n)}function O(n){return q.isBuffer(n)||n instanceof Y}var N=z0(),W=P0(),I=W.getHighWaterMark,z=$V().codes,j=z.ERR_INVALID_ARG_TYPE,P=z.ERR_METHOD_NOT_IMPLEMENTED,F=z.ERR_MULTIPLE_CALLBACK,v=z.ERR_STREAM_CANNOT_PIPE,S=z.ERR_STREAM_DESTROYED,w=z.ERR_STREAM_NULL_VALUES,y=z.ERR_STREAM_WRITE_AFTER_END,m=z.ERR_UNKNOWN_ENCODING,i=N.errorOrDestroy;JQ()(o,A);function JJ(){}function VJ(n,p,e){M=M||ZV(),n=n||{},typeof e!="boolean"&&(e=p instanceof M),this.objectMode=!!n.objectMode,e&&(this.objectMode=this.objectMode||!!n.writableObjectMode),this.highWaterMark=I(this,n,"writableHighWaterMark",e),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var PJ=n.decodeStrings===!1;this.decodeStrings=!PJ,this.defaultEncoding=n.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(XJ){H(p,XJ)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=n.emitClose!==!1,this.autoDestroy=!!n.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new R(this)}VJ.prototype.getBuffer=function(){for(var n=this.bufferedRequest,p=[];n;)p.push(n),n=n.next;return p},function(){try{Object.defineProperty(VJ.prototype,"buffer",{get:B.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}}();var HJ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(HJ=Function.prototype[Symbol.hasInstance],Object.defineProperty(o,Symbol.hasInstance,{value:function(n){return HJ.call(this,n)?!0:this!==o?!1:n&&n._writableState instanceof VJ}})):HJ=function(n){return n instanceof this};function o(n){M=M||ZV();var p=this instanceof M;if(!p&&!HJ.call(o,this))return new o(n);this._writableState=new VJ(n,this,p),this.writable=!0,n&&(typeof n.write=="function"&&(this._write=n.write),typeof n.writev=="function"&&(this._writev=n.writev),typeof n.destroy=="function"&&(this._destroy=n.destroy),typeof n.final=="function"&&(this._final=n.final)),A.call(this)}o.prototype.pipe=function(){i(this,new v)};function jJ(n,p){var e=new y;i(n,e),process.nextTick(p,e)}function J(n,p,e,PJ){var XJ;return e===null?XJ=new w:typeof e!="string"&&!p.objectMode&&(XJ=new j("chunk",["string","Buffer"],e)),XJ?(i(n,XJ),process.nextTick(PJ,XJ),!1):!0}o.prototype.write=function(n,p,e){var PJ=this._writableState,XJ=!1,WJ=!PJ.objectMode&&O(n);return WJ&&!q.isBuffer(n)&&(n=E(n)),typeof p=="function"&&(e=p,p=null),WJ?p="buffer":p||(p=PJ.defaultEncoding),typeof e!="function"&&(e=JJ),PJ.ending?jJ(this,e):(WJ||J(this,PJ,n,e))&&(PJ.pendingcb++,XJ=Z(this,PJ,WJ,n,p,e)),XJ},o.prototype.cork=function(){this._writableState.corked++},o.prototype.uncork=function(){var n=this._writableState;n.corked&&(n.corked--,!n.writing&&!n.corked&&!n.bufferProcessing&&n.bufferedRequest&&K(this,n))},o.prototype.setDefaultEncoding=function(n){if(typeof n=="string"&&(n=n.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((n+"").toLowerCase())>-1))throw new m(n);return this._writableState.defaultEncoding=n,this},Object.defineProperty(o.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function V(n,p,e){return!n.objectMode&&n.decodeStrings!==!1&&typeof p=="string"&&(p=q.from(p,e)),p}Object.defineProperty(o.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Z(n,p,e,PJ,XJ,WJ){if(!e){var b=V(p,PJ,XJ);PJ!==b&&(e=!0,XJ="buffer",PJ=b)}var C=p.objectMode?1:PJ.length;p.length+=C;var h=p.length<p.highWaterMark;if(h||(p.needDrain=!0),p.writing||p.corked){var $J=p.lastBufferedRequest;p.lastBufferedRequest={chunk:PJ,encoding:XJ,isBuf:e,callback:WJ,next:null},$J?$J.next=p.lastBufferedRequest:p.bufferedRequest=p.lastBufferedRequest,p.bufferedRequestCount+=1}else $(n,p,!1,C,PJ,XJ,WJ);return h}function $(n,p,e,PJ,XJ,WJ,b){p.writelen=PJ,p.writecb=b,p.writing=!0,p.sync=!0,p.destroyed?p.onwrite(new S("write")):e?n._writev(XJ,p.onwrite):n._write(XJ,WJ,p.onwrite),p.sync=!1}function X(n,p,e,PJ,XJ){--p.pendingcb,e?(process.nextTick(XJ,PJ),process.nextTick(t,n,p),n._writableState.errorEmitted=!0,i(n,PJ)):(XJ(PJ),n._writableState.errorEmitted=!0,i(n,PJ),t(n,p))}function U(n){n.writing=!1,n.writecb=null,n.length-=n.writelen,n.writelen=0}function H(n,p){var e=n._writableState,PJ=e.sync,XJ=e.writecb;if(typeof XJ!="function")throw new F;if(U(e),p)X(n,e,PJ,p,XJ);else{var WJ=k(e)||n.destroyed;!WJ&&!e.corked&&!e.bufferProcessing&&e.bufferedRequest&&K(n,e),PJ?process.nextTick(G,n,e,WJ,XJ):G(n,e,WJ,XJ)}}function G(n,p,e,PJ){e||Q(n,p),p.pendingcb--,PJ(),t(n,p)}function Q(n,p){p.length===0&&p.needDrain&&(p.needDrain=!1,n.emit("drain"))}function K(n,p){p.bufferProcessing=!0;var e=p.bufferedRequest;if(n._writev&&e&&e.next){var PJ=p.bufferedRequestCount,XJ=new Array(PJ),WJ=p.corkedRequestsFree;WJ.entry=e;for(var b=0,C=!0;e;)XJ[b]=e,e.isBuf||(C=!1),e=e.next,b+=1;XJ.allBuffers=C,$(n,p,!0,p.length,XJ,"",WJ.finish),p.pendingcb++,p.lastBufferedRequest=null,WJ.next?(p.corkedRequestsFree=WJ.next,WJ.next=null):p.corkedRequestsFree=new R(p),p.bufferedRequestCount=0}else{for(;e;){var{chunk:h,encoding:$J,callback:qJ}=e,ZJ=p.objectMode?1:h.length;if($(n,p,!1,ZJ,h,$J,qJ),e=e.next,p.bufferedRequestCount--,p.writing)break}e===null&&(p.lastBufferedRequest=null)}p.bufferedRequest=e,p.bufferProcessing=!1}o.prototype._write=function(n,p,e){e(new P("_write()"))},o.prototype._writev=null,o.prototype.end=function(n,p,e){var PJ=this._writableState;return typeof n=="function"?(e=n,n=null,p=null):typeof p=="function"&&(e=p,p=null),n!=null&&this.write(n,p),PJ.corked&&(PJ.corked=1,this.uncork()),PJ.ending||QJ(this,PJ,e),this},Object.defineProperty(o.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function k(n){return n.ending&&n.length===0&&n.bufferedRequest===null&&!n.finished&&!n.writing}function L(n,p){n._final(function(e){p.pendingcb--,e&&i(n,e),p.prefinished=!0,n.emit("prefinish"),t(n,p)})}function _(n,p){!p.prefinished&&!p.finalCalled&&(typeof n._final=="function"&&!p.destroyed?(p.pendingcb++,p.finalCalled=!0,process.nextTick(L,n,p)):(p.prefinished=!0,n.emit("prefinish")))}function t(n,p){var e=k(p);if(e&&(_(n,p),p.pendingcb===0&&(p.finished=!0,n.emit("finish"),p.autoDestroy))){var PJ=n._readableState;(!PJ||PJ.autoDestroy&&PJ.endEmitted)&&n.destroy()}return e}function QJ(n,p,e){p.ending=!0,t(n,p),e&&(p.finished?process.nextTick(e):n.once("finish",e)),p.ended=!0,n.writable=!1}function GJ(n,p,e){var PJ=n.entry;for(n.entry=null;PJ;){var XJ=PJ.callback;p.pendingcb--,XJ(e),PJ=PJ.next}p.corkedRequestsFree.next=n}Object.defineProperty(o.prototype,"destroyed",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(n){!this._writableState||(this._writableState.destroyed=n)}}),o.prototype.destroy=N.destroy,o.prototype._undestroy=N.undestroy,o.prototype._destroy=function(n,p){p(n)}}),ZV=OJ((l,g)=>{var R=Object.keys||function(W){var I=[];for(var z in W)I.push(z);return I};g.exports=E;var M=C0(),B=F0();JQ()(E,M);for(A=R(B.prototype),Y=0;Y<A.length;Y++)q=A[Y],E.prototype[q]||(E.prototype[q]=B.prototype[q]);var A,q,Y;function E(W){if(!(this instanceof E))return new E(W);M.call(this,W),B.call(this,W),this.allowHalfOpen=!0,W&&(W.readable===!1&&(this.readable=!1),W.writable===!1&&(this.writable=!1),W.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once("end",O)))}Object.defineProperty(E.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(E.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(E.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function O(){this._writableState.ended||process.nextTick(N,this)}function N(W){W.end()}Object.defineProperty(E.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(W){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=W,this._writableState.destroyed=W)}})}),hV=OJ((l)=>{var g=XQ().Buffer,R=g.isEncoding||function(S){switch(S=""+S,S&&S.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function M(S){if(!S)return"utf8";for(var w;;)switch(S){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return S;default:if(w)return;S=(""+S).toLowerCase(),w=!0}}function B(S){var w=M(S);if(typeof w!="string"&&(g.isEncoding===R||!R(S)))throw new Error("Unknown encoding: "+S);return w||S}l.StringDecoder=A;function A(S){this.encoding=B(S);var w;switch(this.encoding){case"utf16le":this.text=I,this.end=z,w=4;break;case"utf8":this.fillLast=O,w=4;break;case"base64":this.text=j,this.end=P,w=3;break;default:this.write=F,this.end=v;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=g.allocUnsafe(w)}A.prototype.write=function(S){if(S.length===0)return"";var w,y;if(this.lastNeed){if(w=this.fillLast(S),w===void 0)return"";y=this.lastNeed,this.lastNeed=0}else y=0;return y<S.length?w?w+this.text(S,y):this.text(S,y):w||""},A.prototype.end=W,A.prototype.text=N,A.prototype.fillLast=function(S){if(this.lastNeed<=S.length)return S.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);S.copy(this.lastChar,this.lastTotal-this.lastNeed,0,S.length),this.lastNeed-=S.length};function q(S){return S<=127?0:S>>5===6?2:S>>4===14?3:S>>3===30?4:S>>6===2?-1:-2}function Y(S,w,y){var m=w.length-1;if(m<y)return 0;var i=q(w[m]);return i>=0?(i>0&&(S.lastNeed=i-1),i):--m<y||i===-2?0:(i=q(w[m]),i>=0?(i>0&&(S.lastNeed=i-2),i):--m<y||i===-2?0:(i=q(w[m]),i>=0?(i>0&&(i===2?i=0:S.lastNeed=i-3),i):0))}function E(S,w,y){if((w[0]&192)!==128)return S.lastNeed=0,"\uFFFD";if(S.lastNeed>1&&w.length>1){if((w[1]&192)!==128)return S.lastNeed=1,"\uFFFD";if(S.lastNeed>2&&w.length>2&&(w[2]&192)!==128)return S.lastNeed=2,"\uFFFD"}}function O(S){var w=this.lastTotal-this.lastNeed,y=E(this,S,w);if(y!==void 0)return y;if(this.lastNeed<=S.length)return S.copy(this.lastChar,w,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);S.copy(this.lastChar,w,0,S.length),this.lastNeed-=S.length}function N(S,w){var y=Y(this,S,w);if(!this.lastNeed)return S.toString("utf8",w);this.lastTotal=y;var m=S.length-(y-this.lastNeed);return S.copy(this.lastChar,0,m),S.toString("utf8",w,m)}function W(S){var w=S&&S.length?this.write(S):"";return this.lastNeed?w+"\uFFFD":w}function I(S,w){if((S.length-w)%2===0){var y=S.toString("utf16le",w);if(y){var m=y.charCodeAt(y.length-1);if(m>=55296&&m<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=S[S.length-2],this.lastChar[1]=S[S.length-1],y.slice(0,-1)}return y}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=S[S.length-1],S.toString("utf16le",w,S.length-1)}function z(S){var w=S&&S.length?this.write(S):"";if(this.lastNeed){var y=this.lastTotal-this.lastNeed;return w+this.lastChar.toString("utf16le",0,y)}return w}function j(S,w){var y=(S.length-w)%3;return y===0?S.toString("base64",w):(this.lastNeed=3-y,this.lastTotal=3,y===1?this.lastChar[0]=S[S.length-1]:(this.lastChar[0]=S[S.length-2],this.lastChar[1]=S[S.length-1]),S.toString("base64",w,S.length-y))}function P(S){var w=S&&S.length?this.write(S):"";return this.lastNeed?w+this.lastChar.toString("base64",0,3-this.lastNeed):w}function F(S){return S.toString(this.encoding)}function v(S){return S&&S.length?this.write(S):""}}),HV={},RV(HV,{StringDecoder:()=>D0.StringDecoder,default:()=>D0.StringDecoder}),LV=cV(()=>{D0=oQ(hV())}),mV=OJ((l,g)=>{var R=$V().codes.ERR_STREAM_PREMATURE_CLOSE;function M(Y){var E=!1;return function(){if(!E){E=!0;for(var O=arguments.length,N=new Array(O),W=0;W<O;W++)N[W]=arguments[W];Y.apply(this,N)}}}function B(){}function A(Y){return Y.setHeader&&typeof Y.abort=="function"}function q(Y,E,O){if(typeof E=="function")return q(Y,null,E);E||(E={}),O=M(O||B);var N=E.readable||E.readable!==!1&&Y.readable,W=E.writable||E.writable!==!1&&Y.writable,I=function(){Y.writable||j()},z=Y._writableState&&Y._writableState.finished,j=function(){W=!1,z=!0,N||O.call(Y)},P=Y._readableState&&Y._readableState.endEmitted,F=function(){N=!1,P=!0,W||O.call(Y)},v=function(y){O.call(Y,y)},S=function(){var y;if(N&&!P)return(!Y._readableState||!Y._readableState.ended)&&(y=new R),O.call(Y,y);if(W&&!z)return(!Y._writableState||!Y._writableState.ended)&&(y=new R),O.call(Y,y)},w=function(){Y.req.on("finish",j)};return A(Y)?(Y.on("complete",j),Y.on("abort",S),Y.req?w():Y.on("request",w)):W&&!Y._writableState&&(Y.on("end",I),Y.on("close",I)),Y.on("end",F),Y.on("finish",j),E.error!==!1&&Y.on("error",v),Y.on("close",S),function(){Y.removeListener("complete",j),Y.removeListener("abort",S),Y.removeListener("request",w),Y.req&&Y.req.removeListener("finish",j),Y.removeListener("end",I),Y.removeListener("close",I),Y.removeListener("finish",j),Y.removeListener("end",F),Y.removeListener("error",v),Y.removeListener("close",S)}}g.exports=q}),V8=OJ((l,g)=>{var R;function M(w,y,m){return y in w?Object.defineProperty(w,y,{value:m,enumerable:!0,configurable:!0,writable:!0}):w[y]=m,w}var B=mV(),A=Symbol("lastResolve"),q=Symbol("lastReject"),Y=Symbol("error"),E=Symbol("ended"),O=Symbol("lastPromise"),N=Symbol("handlePromise"),W=Symbol("stream");function I(w,y){return{value:w,done:y}}function z(w){var y=w[A];if(y!==null){var m=w[W].read();m!==null&&(w[O]=null,w[A]=null,w[q]=null,y(I(m,!1)))}}function j(w){process.nextTick(z,w)}function P(w,y){return function(m,i){w.then(function(){if(y[E]){m(I(void 0,!0));return}y[N](m,i)},i)}}var F=Object.getPrototypeOf(function(){}),v=Object.setPrototypeOf((R={get stream(){return this[W]},next:function(){var w=this,y=this[Y];if(y!==null)return Promise.reject(y);if(this[E])return Promise.resolve(I(void 0,!0));if(this[W].destroyed)return new Promise(function(VJ,HJ){process.nextTick(function(){w[Y]?HJ(w[Y]):VJ(I(void 0,!0))})});var m=this[O],i;if(m)i=new Promise(P(m,this));else{var JJ=this[W].read();if(JJ!==null)return Promise.resolve(I(JJ,!1));i=new Promise(this[N])}return this[O]=i,i}},M(R,Symbol.asyncIterator,function(){return this}),M(R,"return",function(){var w=this;return new Promise(function(y,m){w[W].destroy(null,function(i){if(i){m(i);return}y(I(void 0,!0))})})}),R),F),S=function(w){var y,m=Object.create(v,(y={},M(y,W,{value:w,writable:!0}),M(y,A,{value:null,writable:!0}),M(y,q,{value:null,writable:!0}),M(y,Y,{value:null,writable:!0}),M(y,E,{value:w._readableState.endEmitted,writable:!0}),M(y,N,{value:function(i,JJ){var VJ=m[W].read();VJ?(m[O]=null,m[A]=null,m[q]=null,i(I(VJ,!1))):(m[A]=i,m[q]=JJ)},writable:!0}),y));return m[O]=null,B(w,function(i){if(i&&i.code!=="ERR_STREAM_PREMATURE_CLOSE"){var JJ=m[q];JJ!==null&&(m[O]=null,m[A]=null,m[q]=null,JJ(i)),m[Y]=i;return}var VJ=m[A];VJ!==null&&(m[O]=null,m[A]=null,m[q]=null,VJ(I(void 0,!0))),m[E]=!0}),w.on("readable",j.bind(null,m)),m};g.exports=S}),$8=OJ((l,g)=>{g.exports=function(){throw new Error("Readable.from is not available in the browser")}}),C0=OJ((l,g)=>{g.exports=J;var R;J.ReadableState=jJ;var M=rQ().EventEmitter,B=function(b,C){return b.listeners(C).length},A=R0(),q=yQ().Buffer,Y=global.Uint8Array||function(){};function E(b){return q.from(b)}function O(b){return q.isBuffer(b)||b instanceof Y}var N=PV(),W;N&&N.debuglog?W=N.debuglog("stream"):W=function(){};var I=Q8(),z=z0(),j=P0(),P=j.getHighWaterMark,F=$V().codes,v=F.ERR_INVALID_ARG_TYPE,S=F.ERR_STREAM_PUSH_AFTER_EOF,w=F.ERR_METHOD_NOT_IMPLEMENTED,y=F.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,m,i,JJ;JQ()(J,A);var VJ=z.errorOrDestroy,HJ=["error","close","destroy","pause","resume"];function o(b,C,h){if(typeof b.prependListener=="function")return b.prependListener(C,h);!b._events||!b._events[C]?b.on(C,h):Array.isArray(b._events[C])?b._events[C].unshift(h):b._events[C]=[h,b._events[C]]}function jJ(b,C,h){R=R||ZV(),b=b||{},typeof h!="boolean"&&(h=C instanceof R),this.objectMode=!!b.objectMode,h&&(this.objectMode=this.objectMode||!!b.readableObjectMode),this.highWaterMark=P(this,b,"readableHighWaterMark",h),this.buffer=new I,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=b.emitClose!==!1,this.autoDestroy=!!b.autoDestroy,this.destroyed=!1,this.defaultEncoding=b.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,b.encoding&&(m||(m=(LV(),fQ(HV)).StringDecoder),this.decoder=new m(b.encoding),this.encoding=b.encoding)}function J(b){if(R=R||ZV(),!(this instanceof J))return new J(b);var C=this instanceof R;this._readableState=new jJ(b,this,C),this.readable=!0,b&&(typeof b.read=="function"&&(this._read=b.read),typeof b.destroy=="function"&&(this._destroy=b.destroy)),A.call(this)}Object.defineProperty(J.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(b){!this._readableState||(this._readableState.destroyed=b)}}),J.prototype.destroy=z.destroy,J.prototype._undestroy=z.undestroy,J.prototype._destroy=function(b,C){C(b)},J.prototype.push=function(b,C){var h=this._readableState,$J;return h.objectMode?$J=!0:typeof b=="string"&&(C=C||h.defaultEncoding,C!==h.encoding&&(b=q.from(b,C),C=""),$J=!0),V(this,b,C,!1,$J)},J.prototype.unshift=function(b){return V(this,b,null,!0,!1)};function V(b,C,h,$J,qJ){W("readableAddChunk",C);var ZJ=b._readableState;if(C===null)ZJ.reading=!1,G(b,ZJ);else{var mJ;if(qJ||(mJ=$(ZJ,C)),mJ)VJ(b,mJ);else if(ZJ.objectMode||C&&C.length>0)if(typeof C!="string"&&!ZJ.objectMode&&Object.getPrototypeOf(C)!==q.prototype&&(C=E(C)),$J)ZJ.endEmitted?VJ(b,new y):Z(b,ZJ,C,!0);else if(ZJ.ended)VJ(b,new S);else{if(ZJ.destroyed)return!1;ZJ.reading=!1,ZJ.decoder&&!h?(C=ZJ.decoder.write(C),ZJ.objectMode||C.length!==0?Z(b,ZJ,C,!1):k(b,ZJ)):Z(b,ZJ,C,!1)}else $J||(ZJ.reading=!1,k(b,ZJ))}return!ZJ.ended&&(ZJ.length<ZJ.highWaterMark||ZJ.length===0)}function Z(b,C,h,$J){C.flowing&&C.length===0&&!C.sync?(C.awaitDrain=0,b.emit("data",h)):(C.length+=C.objectMode?1:h.length,$J?C.buffer.unshift(h):C.buffer.push(h),C.needReadable&&Q(b)),k(b,C)}function $(b,C){var h;return!O(C)&&typeof C!="string"&&C!==void 0&&!b.objectMode&&(h=new v("chunk",["string","Buffer","Uint8Array"],C)),h}J.prototype.isPaused=function(){return this._readableState.flowing===!1},J.prototype.setEncoding=function(b){m||(m=(LV(),fQ(HV)).StringDecoder);var C=new m(b);this._readableState.decoder=C,this._readableState.encoding=this._readableState.decoder.encoding;for(var h=this._readableState.buffer.head,$J="";h!==null;)$J+=C.write(h.data),h=h.next;return this._readableState.buffer.clear(),$J!==""&&this._readableState.buffer.push($J),this._readableState.length=$J.length,this};var X=1073741824;function U(b){return b>=X?b=X:(b--,b|=b>>>1,b|=b>>>2,b|=b>>>4,b|=b>>>8,b|=b>>>16,b++),b}function H(b,C){return b<=0||C.length===0&&C.ended?0:C.objectMode?1:b!==b?C.flowing&&C.length?C.buffer.head.data.length:C.length:(b>C.highWaterMark&&(C.highWaterMark=U(b)),b<=C.length?b:C.ended?C.length:(C.needReadable=!0,0))}J.prototype.read=function(b){W("read",b),b=parseInt(b,10);var C=this._readableState,h=b;if(b!==0&&(C.emittedReadable=!1),b===0&&C.needReadable&&((C.highWaterMark!==0?C.length>=C.highWaterMark:C.length>0)||C.ended))return W("read: emitReadable",C.length,C.ended),C.length===0&&C.ended?PJ(this):Q(this),null;if(b=H(b,C),b===0&&C.ended)return C.length===0&&PJ(this),null;var $J=C.needReadable;W("need readable",$J),(C.length===0||C.length-b<C.highWaterMark)&&($J=!0,W("length less than watermark",$J)),C.ended||C.reading?($J=!1,W("reading or ended",$J)):$J&&(W("do read"),C.reading=!0,C.sync=!0,C.length===0&&(C.needReadable=!0),this._read(C.highWaterMark),C.sync=!1,C.reading||(b=H(h,C)));var qJ;return b>0?qJ=e(b,C):qJ=null,qJ===null?(C.needReadable=C.length<=C.highWaterMark,b=0):(C.length-=b,C.awaitDrain=0),C.length===0&&(C.ended||(C.needReadable=!0),h!==b&&C.ended&&PJ(this)),qJ!==null&&this.emit("data",qJ),qJ};function G(b,C){if(W("onEofChunk"),!C.ended){if(C.decoder){var h=C.decoder.end();h&&h.length&&(C.buffer.push(h),C.length+=C.objectMode?1:h.length)}C.ended=!0,C.sync?Q(b):(C.needReadable=!1,C.emittedReadable||(C.emittedReadable=!0,K(b)))}}function Q(b){var C=b._readableState;W("emitReadable",C.needReadable,C.emittedReadable),C.needReadable=!1,C.emittedReadable||(W("emitReadable",C.flowing),C.emittedReadable=!0,process.nextTick(K,b))}function K(b){var C=b._readableState;W("emitReadable_",C.destroyed,C.length,C.ended),!C.destroyed&&(C.length||C.ended)&&(b.emit("readable"),C.emittedReadable=!1),C.needReadable=!C.flowing&&!C.ended&&C.length<=C.highWaterMark,p(b)}function k(b,C){C.readingMore||(C.readingMore=!0,process.nextTick(L,b,C))}function L(b,C){for(;!C.reading&&!C.ended&&(C.length<C.highWaterMark||C.flowing&&C.length===0);){var h=C.length;if(W("maybeReadMore read 0"),b.read(0),h===C.length)break}C.readingMore=!1}J.prototype._read=function(b){VJ(this,new w("_read()"))},J.prototype.pipe=function(b,C){var h=this,$J=this._readableState;switch($J.pipesCount){case 0:$J.pipes=b;break;case 1:$J.pipes=[$J.pipes,b];break;default:$J.pipes.push(b);break}$J.pipesCount+=1,W("pipe count=%d opts=%j",$J.pipesCount,C);var qJ=(!C||C.end!==!1)&&b!==process.stdout&&b!==process.stderr,ZJ=qJ?BJ:u;$J.endEmitted?process.nextTick(ZJ):h.once("end",ZJ),b.on("unpipe",mJ);function mJ(d,a){W("onunpipe"),d===h&&a&&a.hasUnpiped===!1&&(a.hasUnpiped=!0,LJ())}function BJ(){W("onend"),b.end()}var TJ=_(h);b.on("drain",TJ);var dJ=!1;function LJ(){W("cleanup"),b.removeListener("close",T),b.removeListener("finish",D),b.removeListener("drain",TJ),b.removeListener("error",$Q),b.removeListener("unpipe",mJ),h.removeListener("end",BJ),h.removeListener("end",u),h.removeListener("data",IJ),dJ=!0,$J.awaitDrain&&(!b._writableState||b._writableState.needDrain)&&TJ()}h.on("data",IJ);function IJ(d){W("ondata");var a=b.write(d);W("dest.write",a),a===!1&&(($J.pipesCount===1&&$J.pipes===b||$J.pipesCount>1&&WJ($J.pipes,b)!==-1)&&!dJ&&(W("false write response, pause",$J.awaitDrain),$J.awaitDrain++),h.pause())}function $Q(d){W("onerror",d),u(),b.removeListener("error",$Q),B(b,"error")===0&&VJ(b,d)}o(b,"error",$Q);function T(){b.removeListener("finish",D),u()}b.once("close",T);function D(){W("onfinish"),b.removeListener("close",T),u()}b.once("finish",D);function u(){W("unpipe"),h.unpipe(b)}return b.emit("pipe",h),$J.flowing||(W("pipe resume"),h.resume()),b};function _(b){return function(){var C=b._readableState;W("pipeOnDrain",C.awaitDrain),C.awaitDrain&&C.awaitDrain--,C.awaitDrain===0&&B(b,"data")&&(C.flowing=!0,p(b))}}J.prototype.unpipe=function(b){var C=this._readableState,h={hasUnpiped:!1};if(C.pipesCount===0)return this;if(C.pipesCount===1)return b&&b!==C.pipes?this:(b||(b=C.pipes),C.pipes=null,C.pipesCount=0,C.flowing=!1,b&&b.emit("unpipe",this,h),this);if(!b){var{pipes:$J,pipesCount:qJ}=C;C.pipes=null,C.pipesCount=0,C.flowing=!1;for(var ZJ=0;ZJ<qJ;ZJ++)$J[ZJ].emit("unpipe",this,{hasUnpiped:!1});return this}var mJ=WJ(C.pipes,b);return mJ===-1?this:(C.pipes.splice(mJ,1),C.pipesCount-=1,C.pipesCount===1&&(C.pipes=C.pipes[0]),b.emit("unpipe",this,h),this)},J.prototype.on=function(b,C){var h=A.prototype.on.call(this,b,C),$J=this._readableState;return b==="data"?($J.readableListening=this.listenerCount("readable")>0,$J.flowing!==!1&&this.resume()):b==="readable"&&!$J.endEmitted&&!$J.readableListening&&($J.readableListening=$J.needReadable=!0,$J.flowing=!1,$J.emittedReadable=!1,W("on readable",$J.length,$J.reading),$J.length?Q(this):$J.reading||process.nextTick(QJ,this)),h},J.prototype.addListener=J.prototype.on,J.prototype.removeListener=function(b,C){var h=A.prototype.removeListener.call(this,b,C);return b==="readable"&&process.nextTick(t,this),h},J.prototype.removeAllListeners=function(b){var C=A.prototype.removeAllListeners.apply(this,arguments);return(b==="readable"||b===void 0)&&process.nextTick(t,this),C};function t(b){var C=b._readableState;C.readableListening=b.listenerCount("readable")>0,C.resumeScheduled&&!C.paused?C.flowing=!0:b.listenerCount("data")>0&&b.resume()}function QJ(b){W("readable nexttick read 0"),b.read(0)}J.prototype.resume=function(){var b=this._readableState;return b.flowing||(W("resume"),b.flowing=!b.readableListening,GJ(this,b)),b.paused=!1,this};function GJ(b,C){C.resumeScheduled||(C.resumeScheduled=!0,process.nextTick(n,b,C))}function n(b,C){W("resume",C.reading),C.reading||b.read(0),C.resumeScheduled=!1,b.emit("resume"),p(b),C.flowing&&!C.reading&&b.read(0)}J.prototype.pause=function(){return W("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(W("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function p(b){var C=b._readableState;for(W("flow",C.flowing);C.flowing&&b.read()!==null;);}J.prototype.wrap=function(b){var C=this,h=this._readableState,$J=!1;b.on("end",function(){if(W("wrapped end"),h.decoder&&!h.ended){var mJ=h.decoder.end();mJ&&mJ.length&&C.push(mJ)}C.push(null)}),b.on("data",function(mJ){if(W("wrapped data"),h.decoder&&(mJ=h.decoder.write(mJ)),!(h.objectMode&&mJ==null)&&!(!h.objectMode&&(!mJ||!mJ.length))){var BJ=C.push(mJ);BJ||($J=!0,b.pause())}});for(var qJ in b)this[qJ]===void 0&&typeof b[qJ]=="function"&&(this[qJ]=function(mJ){return function(){return b[mJ].apply(b,arguments)}}(qJ));for(var ZJ=0;ZJ<HJ.length;ZJ++)b.on(HJ[ZJ],this.emit.bind(this,HJ[ZJ]));return this._read=function(mJ){W("wrapped _read",mJ),$J&&($J=!1,b.resume())},this},typeof Symbol=="function"&&(J.prototype[Symbol.asyncIterator]=function(){return i===void 0&&(i=V8()),i(this)}),Object.defineProperty(J.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(J.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(J.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(b){this._readableState&&(this._readableState.flowing=b)}}),J._fromList=e,Object.defineProperty(J.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function e(b,C){if(C.length===0)return null;var h;return C.objectMode?h=C.buffer.shift():!b||b>=C.length?(C.decoder?h=C.buffer.join(""):C.buffer.length===1?h=C.buffer.first():h=C.buffer.concat(C.length),C.buffer.clear()):h=C.buffer.consume(b,C.decoder),h}function PJ(b){var C=b._readableState;W("endReadable",C.endEmitted),C.endEmitted||(C.ended=!0,process.nextTick(XJ,C,b))}function XJ(b,C){if(W("endReadableNT",b.endEmitted,b.length),!b.endEmitted&&b.length===0&&(b.endEmitted=!0,C.readable=!1,C.emit("end"),b.autoDestroy)){var h=C._writableState;(!h||h.autoDestroy&&h.finished)&&C.destroy()}}typeof Symbol=="function"&&(J.from=function(b,C){return JJ===void 0&&(JJ=$8()),JJ(J,b,C)});function WJ(b,C){for(var h=0,$J=b.length;h<$J;h++)if(b[h]===C)return h;return-1}}),k0=OJ((l,g)=>{g.exports=O;var R=$V().codes,M=R.ERR_METHOD_NOT_IMPLEMENTED,B=R.ERR_MULTIPLE_CALLBACK,A=R.ERR_TRANSFORM_ALREADY_TRANSFORMING,q=R.ERR_TRANSFORM_WITH_LENGTH_0,Y=ZV();JQ()(O,Y);function E(I,z){var j=this._transformState;j.transforming=!1;var P=j.writecb;if(P===null)return this.emit("error",new B);j.writechunk=null,j.writecb=null,z!=null&&this.push(z),P(I);var F=this._readableState;F.reading=!1,(F.needReadable||F.length<F.highWaterMark)&&this._read(F.highWaterMark)}function O(I){if(!(this instanceof O))return new O(I);Y.call(this,I),this._transformState={afterTransform:E.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,I&&(typeof I.transform=="function"&&(this._transform=I.transform),typeof I.flush=="function"&&(this._flush=I.flush)),this.on("prefinish",N)}function N(){var I=this;typeof this._flush=="function"&&!this._readableState.destroyed?this._flush(function(z,j){W(I,z,j)}):W(this,null,null)}O.prototype.push=function(I,z){return this._transformState.needTransform=!1,Y.prototype.push.call(this,I,z)},O.prototype._transform=function(I,z,j){j(new M("_transform()"))},O.prototype._write=function(I,z,j){var P=this._transformState;if(P.writecb=j,P.writechunk=I,P.writeencoding=z,!P.transforming){var F=this._readableState;(P.needTransform||F.needReadable||F.length<F.highWaterMark)&&this._read(F.highWaterMark)}},O.prototype._read=function(I){var z=this._transformState;z.writechunk!==null&&!z.transforming?(z.transforming=!0,this._transform(z.writechunk,z.writeencoding,z.afterTransform)):z.needTransform=!0},O.prototype._destroy=function(I,z){Y.prototype._destroy.call(this,I,function(j){z(j)})};function W(I,z,j){if(z)return I.emit("error",z);if(j!=null&&I.push(j),I._writableState.length)throw new q;if(I._transformState.transforming)throw new A;return I.push(null)}}),Z8=OJ((l,g)=>{g.exports=M;var R=k0();JQ()(M,R);function M(B){if(!(this instanceof M))return new M(B);R.call(this,B)}M.prototype._transform=function(B,A,q){q(null,B)}}),X8=OJ((l,g)=>{var R;function M(j){var P=!1;return function(){P||(P=!0,j.apply(void 0,arguments))}}var B=$V().codes,A=B.ERR_MISSING_ARGS,q=B.ERR_STREAM_DESTROYED;function Y(j){if(j)throw j}function E(j){return j.setHeader&&typeof j.abort=="function"}function O(j,P,F,v){v=M(v);var S=!1;j.on("close",function(){S=!0}),R===void 0&&(R=mV()),R(j,{readable:P,writable:F},function(y){if(y)return v(y);S=!0,v()});var w=!1;return function(y){if(!S&&!w){if(w=!0,E(j))return j.abort();if(typeof j.destroy=="function")return j.destroy();v(y||new q("pipe"))}}}function N(j){j()}function W(j,P){return j.pipe(P)}function I(j){return!j.length||typeof j[j.length-1]!="function"?Y:j.pop()}function z(){for(var j=arguments.length,P=new Array(j),F=0;F<j;F++)P[F]=arguments[F];var v=I(P);if(Array.isArray(P[0])&&(P=P[0]),P.length<2)throw new A("streams");var S,w=P.map(function(y,m){var i=m<P.length-1,JJ=m>0;return O(y,i,JJ,function(VJ){S||(S=VJ),VJ&&w.forEach(N),!i&&(w.forEach(N),v(S))})});return P.reduce(W)}g.exports=z}),q8=OJ((l,g)=>{l=g.exports=C0(),l.Stream=l,l.Readable=l,l.Writable=F0(),l.Duplex=ZV(),l.Transform=k0(),l.PassThrough=Z8(),l.finished=mV(),l.pipeline=X8()}),A0=OJ((l,g)=>{var R=XQ().Buffer,M=q8().Transform,B=JQ();function A(Y,E){if(!R.isBuffer(Y)&&typeof Y!="string")throw new TypeError(E+" must be a string or a buffer")}function q(Y){M.call(this),this._block=R.allocUnsafe(Y),this._blockSize=Y,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}B(q,M),q.prototype._transform=function(Y,E,O){var N=null;try{this.update(Y,E)}catch(W){N=W}O(N)},q.prototype._flush=function(Y){var E=null;try{this.push(this.digest())}catch(O){E=O}Y(E)},q.prototype.update=function(Y,E){if(A(Y,"Data"),this._finalized)throw new Error("Digest already called");R.isBuffer(Y)||(Y=R.from(Y,E));for(var O=this._block,N=0;this._blockOffset+Y.length-N>=this._blockSize;){for(var W=this._blockOffset;W<this._blockSize;)O[W++]=Y[N++];this._update(),this._blockOffset=0}for(;N<Y.length;)O[this._blockOffset++]=Y[N++];for(var I=0,z=Y.length*8;z>0;++I)this._length[I]+=z,z=this._length[I]/4294967296|0,z>0&&(this._length[I]-=4294967296*z);return this},q.prototype._update=function(){throw new Error("_update is not implemented")},q.prototype.digest=function(Y){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var E=this._digest();Y!==void 0&&(E=E.toString(Y)),this._block.fill(0),this._blockOffset=0;for(var O=0;O<4;++O)this._length[O]=0;return E},q.prototype._digest=function(){throw new Error("_digest is not implemented")},g.exports=q}),uV=OJ((l,g)=>{var R=JQ(),M=A0(),B=XQ().Buffer,A=new Array(16);function q(){M.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}R(q,M),q.prototype._update=function(){for(var I=A,z=0;z<16;++z)I[z]=this._block.readInt32LE(z*4);var j=this._a,P=this._b,F=this._c,v=this._d;j=E(j,P,F,v,I[0],3614090360,7),v=E(v,j,P,F,I[1],3905402710,12),F=E(F,v,j,P,I[2],606105819,17),P=E(P,F,v,j,I[3],3250441966,22),j=E(j,P,F,v,I[4],4118548399,7),v=E(v,j,P,F,I[5],1200080426,12),F=E(F,v,j,P,I[6],2821735955,17),P=E(P,F,v,j,I[7],4249261313,22),j=E(j,P,F,v,I[8],1770035416,7),v=E(v,j,P,F,I[9],2336552879,12),F=E(F,v,j,P,I[10],4294925233,17),P=E(P,F,v,j,I[11],2304563134,22),j=E(j,P,F,v,I[12],1804603682,7),v=E(v,j,P,F,I[13],4254626195,12),F=E(F,v,j,P,I[14],2792965006,17),P=E(P,F,v,j,I[15],1236535329,22),j=O(j,P,F,v,I[1],4129170786,5),v=O(v,j,P,F,I[6],3225465664,9),F=O(F,v,j,P,I[11],643717713,14),P=O(P,F,v,j,I[0],3921069994,20),j=O(j,P,F,v,I[5],3593408605,5),v=O(v,j,P,F,I[10],38016083,9),F=O(F,v,j,P,I[15],3634488961,14),P=O(P,F,v,j,I[4],3889429448,20),j=O(j,P,F,v,I[9],568446438,5),v=O(v,j,P,F,I[14],3275163606,9),F=O(F,v,j,P,I[3],4107603335,14),P=O(P,F,v,j,I[8],1163531501,20),j=O(j,P,F,v,I[13],2850285829,5),v=O(v,j,P,F,I[2],4243563512,9),F=O(F,v,j,P,I[7],1735328473,14),P=O(P,F,v,j,I[12],2368359562,20),j=N(j,P,F,v,I[5],4294588738,4),v=N(v,j,P,F,I[8],2272392833,11),F=N(F,v,j,P,I[11],1839030562,16),P=N(P,F,v,j,I[14],4259657740,23),j=N(j,P,F,v,I[1],2763975236,4),v=N(v,j,P,F,I[4],1272893353,11),F=N(F,v,j,P,I[7],4139469664,16),P=N(P,F,v,j,I[10],3200236656,23),j=N(j,P,F,v,I[13],681279174,4),v=N(v,j,P,F,I[0],3936430074,11),F=N(F,v,j,P,I[3],3572445317,16),P=N(P,F,v,j,I[6],76029189,23),j=N(j,P,F,v,I[9],3654602809,4),v=N(v,j,P,F,I[12],3873151461,11),F=N(F,v,j,P,I[15],530742520,16),P=N(P,F,v,j,I[2],3299628645,23),j=W(j,P,F,v,I[0],4096336452,6),v=W(v,j,P,F,I[7],1126891415,10),F=W(F,v,j,P,I[14],2878612391,15),P=W(P,F,v,j,I[5],4237533241,21),j=W(j,P,F,v,I[12],1700485571,6),v=W(v,j,P,F,I[3],2399980690,10),F=W(F,v,j,P,I[10],4293915773,15),P=W(P,F,v,j,I[1],2240044497,21),j=W(j,P,F,v,I[8],1873313359,6),v=W(v,j,P,F,I[15],4264355552,10),F=W(F,v,j,P,I[6],2734768916,15),P=W(P,F,v,j,I[13],1309151649,21),j=W(j,P,F,v,I[4],4149444226,6),v=W(v,j,P,F,I[11],3174756917,10),F=W(F,v,j,P,I[2],718787259,15),P=W(P,F,v,j,I[9],3951481745,21),this._a=this._a+j|0,this._b=this._b+P|0,this._c=this._c+F|0,this._d=this._d+v|0},q.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var I=B.allocUnsafe(16);return I.writeInt32LE(this._a,0),I.writeInt32LE(this._b,4),I.writeInt32LE(this._c,8),I.writeInt32LE(this._d,12),I};function Y(I,z){return I<<z|I>>>32-z}function E(I,z,j,P,F,v,S){return Y(I+(z&j|~z&P)+F+v|0,S)+z|0}function O(I,z,j,P,F,v,S){return Y(I+(z&P|j&~P)+F+v|0,S)+z|0}function N(I,z,j,P,F,v,S){return Y(I+(z^j^P)+F+v|0,S)+z|0}function W(I,z,j,P,F,v,S){return Y(I+(j^(z|~P))+F+v|0,S)+z|0}g.exports=q}),pV=OJ((l,g)=>{var R=yQ().Buffer,M=JQ(),B=A0(),A=new Array(16),q=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],Y=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],E=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],O=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],N=[0,1518500249,1859775393,2400959708,2840853838],W=[1352829926,1548603684,1836072691,2053994217,0];function I(){B.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}M(I,B),I.prototype._update=function(){for(var w=A,y=0;y<16;++y)w[y]=this._block.readInt32LE(y*4);for(var m=this._a|0,i=this._b|0,JJ=this._c|0,VJ=this._d|0,HJ=this._e|0,o=this._a|0,jJ=this._b|0,J=this._c|0,V=this._d|0,Z=this._e|0,$=0;$<80;$+=1){var X,U;$<16?(X=j(m,i,JJ,VJ,HJ,w[q[$]],N[0],E[$]),U=S(o,jJ,J,V,Z,w[Y[$]],W[0],O[$])):$<32?(X=P(m,i,JJ,VJ,HJ,w[q[$]],N[1],E[$]),U=v(o,jJ,J,V,Z,w[Y[$]],W[1],O[$])):$<48?(X=F(m,i,JJ,VJ,HJ,w[q[$]],N[2],E[$]),U=F(o,jJ,J,V,Z,w[Y[$]],W[2],O[$])):$<64?(X=v(m,i,JJ,VJ,HJ,w[q[$]],N[3],E[$]),U=P(o,jJ,J,V,Z,w[Y[$]],W[3],O[$])):(X=S(m,i,JJ,VJ,HJ,w[q[$]],N[4],E[$]),U=j(o,jJ,J,V,Z,w[Y[$]],W[4],O[$])),m=HJ,HJ=VJ,VJ=z(JJ,10),JJ=i,i=X,o=Z,Z=V,V=z(J,10),J=jJ,jJ=U}var H=this._b+JJ+V|0;this._b=this._c+VJ+Z|0,this._c=this._d+HJ+o|0,this._d=this._e+m+jJ|0,this._e=this._a+i+J|0,this._a=H},I.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var w=R.alloc?R.alloc(20):new R(20);return w.writeInt32LE(this._a,0),w.writeInt32LE(this._b,4),w.writeInt32LE(this._c,8),w.writeInt32LE(this._d,12),w.writeInt32LE(this._e,16),w};function z(w,y){return w<<y|w>>>32-y}function j(w,y,m,i,JJ,VJ,HJ,o){return z(w+(y^m^i)+VJ+HJ|0,o)+JJ|0}function P(w,y,m,i,JJ,VJ,HJ,o){return z(w+(y&m|~y&i)+VJ+HJ|0,o)+JJ|0}function F(w,y,m,i,JJ,VJ,HJ,o){return z(w+((y|~m)^i)+VJ+HJ|0,o)+JJ|0}function v(w,y,m,i,JJ,VJ,HJ,o){return z(w+(y&i|m&~i)+VJ+HJ|0,o)+JJ|0}function S(w,y,m,i,JJ,VJ,HJ,o){return z(w+(y^(m|~i))+VJ+HJ|0,o)+JJ|0}g.exports=I}),XV=OJ((l,g)=>{var R=XQ().Buffer;function M(B,A){this._block=R.alloc(B),this._finalSize=A,this._blockSize=B,this._len=0}M.prototype.update=function(B,A){typeof B=="string"&&(A=A||"utf8",B=R.from(B,A));for(var q=this._block,Y=this._blockSize,E=B.length,O=this._len,N=0;N<E;){for(var W=O%Y,I=Math.min(E-N,Y-W),z=0;z<I;z++)q[W+z]=B[N+z];O+=I,N+=I,O%Y===0&&this._update(q)}return this._len+=E,this},M.prototype.digest=function(B){var A=this._len%this._blockSize;this._block[A]=128,this._block.fill(0,A+1),A>=this._finalSize&&(this._update(this._block),this._block.fill(0));var q=this._len*8;if(q<=4294967295)this._block.writeUInt32BE(q,this._blockSize-4);else{var Y=(q&4294967295)>>>0,E=(q-Y)/4294967296;this._block.writeUInt32BE(E,this._blockSize-8),this._block.writeUInt32BE(Y,this._blockSize-4)}this._update(this._block);var O=this._hash();return B?O.toString(B):O},M.prototype._update=function(){throw new Error("_update must be implemented by subclass")},g.exports=M}),G8=OJ((l,g)=>{var R=JQ(),M=XV(),B=XQ().Buffer,A=[1518500249,1859775393,-1894007588,-899497514],q=new Array(80);function Y(){this.init(),this._w=q,M.call(this,64,56)}R(Y,M),Y.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this};function E(W){return W<<5|W>>>27}function O(W){return W<<30|W>>>2}function N(W,I,z,j){return W===0?I&z|~I&j:W===2?I&z|I&j|z&j:I^z^j}Y.prototype._update=function(W){for(var I=this._w,z=this._a|0,j=this._b|0,P=this._c|0,F=this._d|0,v=this._e|0,S=0;S<16;++S)I[S]=W.readInt32BE(S*4);for(;S<80;++S)I[S]=I[S-3]^I[S-8]^I[S-14]^I[S-16];for(var w=0;w<80;++w){var y=~~(w/20),m=E(z)+N(y,j,P,F)+v+I[w]+A[y]|0;v=F,F=P,P=O(j),j=z,z=m}this._a=z+this._a|0,this._b=j+this._b|0,this._c=P+this._c|0,this._d=F+this._d|0,this._e=v+this._e|0},Y.prototype._hash=function(){var W=B.allocUnsafe(20);return W.writeInt32BE(this._a|0,0),W.writeInt32BE(this._b|0,4),W.writeInt32BE(this._c|0,8),W.writeInt32BE(this._d|0,12),W.writeInt32BE(this._e|0,16),W},g.exports=Y}),K8=OJ((l,g)=>{var R=JQ(),M=XV(),B=XQ().Buffer,A=[1518500249,1859775393,-1894007588,-899497514],q=new Array(80);function Y(){this.init(),this._w=q,M.call(this,64,56)}R(Y,M),Y.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this};function E(I){return I<<1|I>>>31}function O(I){return I<<5|I>>>27}function N(I){return I<<30|I>>>2}function W(I,z,j,P){return I===0?z&j|~z&P:I===2?z&j|z&P|j&P:z^j^P}Y.prototype._update=function(I){for(var z=this._w,j=this._a|0,P=this._b|0,F=this._c|0,v=this._d|0,S=this._e|0,w=0;w<16;++w)z[w]=I.readInt32BE(w*4);for(;w<80;++w)z[w]=E(z[w-3]^z[w-8]^z[w-14]^z[w-16]);for(var y=0;y<80;++y){var m=~~(y/20),i=O(j)+W(m,P,F,v)+S+z[y]+A[m]|0;S=v,v=F,F=N(P),P=j,j=i}this._a=j+this._a|0,this._b=P+this._b|0,this._c=F+this._c|0,this._d=v+this._d|0,this._e=S+this._e|0},Y.prototype._hash=function(){var I=B.allocUnsafe(20);return I.writeInt32BE(this._a|0,0),I.writeInt32BE(this._b|0,4),I.writeInt32BE(this._c|0,8),I.writeInt32BE(this._d|0,12),I.writeInt32BE(this._e|0,16),I},g.exports=Y}),S0=OJ((l,g)=>{var R=JQ(),M=XV(),B=XQ().Buffer,A=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],q=new Array(64);function Y(){this.init(),this._w=q,M.call(this,64,56)}R(Y,M),Y.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this};function E(j,P,F){return F^j&(P^F)}function O(j,P,F){return j&P|F&(j|P)}function N(j){return(j>>>2|j<<30)^(j>>>13|j<<19)^(j>>>22|j<<10)}function W(j){return(j>>>6|j<<26)^(j>>>11|j<<21)^(j>>>25|j<<7)}function I(j){return(j>>>7|j<<25)^(j>>>18|j<<14)^j>>>3}function z(j){return(j>>>17|j<<15)^(j>>>19|j<<13)^j>>>10}Y.prototype._update=function(j){for(var P=this._w,F=this._a|0,v=this._b|0,S=this._c|0,w=this._d|0,y=this._e|0,m=this._f|0,i=this._g|0,JJ=this._h|0,VJ=0;VJ<16;++VJ)P[VJ]=j.readInt32BE(VJ*4);for(;VJ<64;++VJ)P[VJ]=z(P[VJ-2])+P[VJ-7]+I(P[VJ-15])+P[VJ-16]|0;for(var HJ=0;HJ<64;++HJ){var o=JJ+W(y)+E(y,m,i)+A[HJ]+P[HJ]|0,jJ=N(F)+O(F,v,S)|0;JJ=i,i=m,m=y,y=w+o|0,w=S,S=v,v=F,F=o+jJ|0}this._a=F+this._a|0,this._b=v+this._b|0,this._c=S+this._c|0,this._d=w+this._d|0,this._e=y+this._e|0,this._f=m+this._f|0,this._g=i+this._g|0,this._h=JJ+this._h|0},Y.prototype._hash=function(){var j=B.allocUnsafe(32);return j.writeInt32BE(this._a,0),j.writeInt32BE(this._b,4),j.writeInt32BE(this._c,8),j.writeInt32BE(this._d,12),j.writeInt32BE(this._e,16),j.writeInt32BE(this._f,20),j.writeInt32BE(this._g,24),j.writeInt32BE(this._h,28),j},g.exports=Y}),U8=OJ((l,g)=>{var R=JQ(),M=S0(),B=XV(),A=XQ().Buffer,q=new Array(64);function Y(){this.init(),this._w=q,B.call(this,64,56)}R(Y,M),Y.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},Y.prototype._hash=function(){var E=A.allocUnsafe(28);return E.writeInt32BE(this._a,0),E.writeInt32BE(this._b,4),E.writeInt32BE(this._c,8),E.writeInt32BE(this._d,12),E.writeInt32BE(this._e,16),E.writeInt32BE(this._f,20),E.writeInt32BE(this._g,24),E},g.exports=Y}),x0=OJ((l,g)=>{var R=JQ(),M=XV(),B=XQ().Buffer,A=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],q=new Array(160);function Y(){this.init(),this._w=q,M.call(this,128,112)}R(Y,M),Y.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this};function E(v,S,w){return w^v&(S^w)}function O(v,S,w){return v&S|w&(v|S)}function N(v,S){return(v>>>28|S<<4)^(S>>>2|v<<30)^(S>>>7|v<<25)}function W(v,S){return(v>>>14|S<<18)^(v>>>18|S<<14)^(S>>>9|v<<23)}function I(v,S){return(v>>>1|S<<31)^(v>>>8|S<<24)^v>>>7}function z(v,S){return(v>>>1|S<<31)^(v>>>8|S<<24)^(v>>>7|S<<25)}function j(v,S){return(v>>>19|S<<13)^(S>>>29|v<<3)^v>>>6}function P(v,S){return(v>>>19|S<<13)^(S>>>29|v<<3)^(v>>>6|S<<26)}function F(v,S){return v>>>0<S>>>0?1:0}Y.prototype._update=function(v){for(var S=this._w,w=this._ah|0,y=this._bh|0,m=this._ch|0,i=this._dh|0,JJ=this._eh|0,VJ=this._fh|0,HJ=this._gh|0,o=this._hh|0,jJ=this._al|0,J=this._bl|0,V=this._cl|0,Z=this._dl|0,$=this._el|0,X=this._fl|0,U=this._gl|0,H=this._hl|0,G=0;G<32;G+=2)S[G]=v.readInt32BE(G*4),S[G+1]=v.readInt32BE(G*4+4);for(;G<160;G+=2){var Q=S[G-30],K=S[G-30+1],k=I(Q,K),L=z(K,Q);Q=S[G-4],K=S[G-4+1];var _=j(Q,K),t=P(K,Q),QJ=S[G-14],GJ=S[G-14+1],n=S[G-32],p=S[G-32+1],e=L+GJ|0,PJ=k+QJ+F(e,L)|0;e=e+t|0,PJ=PJ+_+F(e,t)|0,e=e+p|0,PJ=PJ+n+F(e,p)|0,S[G]=PJ,S[G+1]=e}for(var XJ=0;XJ<160;XJ+=2){PJ=S[XJ],e=S[XJ+1];var WJ=O(w,y,m),b=O(jJ,J,V),C=N(w,jJ),h=N(jJ,w),$J=W(JJ,$),qJ=W($,JJ),ZJ=A[XJ],mJ=A[XJ+1],BJ=E(JJ,VJ,HJ),TJ=E($,X,U),dJ=H+qJ|0,LJ=o+$J+F(dJ,H)|0;dJ=dJ+TJ|0,LJ=LJ+BJ+F(dJ,TJ)|0,dJ=dJ+mJ|0,LJ=LJ+ZJ+F(dJ,mJ)|0,dJ=dJ+e|0,LJ=LJ+PJ+F(dJ,e)|0;var IJ=h+b|0,$Q=C+WJ+F(IJ,h)|0;o=HJ,H=U,HJ=VJ,U=X,VJ=JJ,X=$,$=Z+dJ|0,JJ=i+LJ+F($,Z)|0,i=m,Z=V,m=y,V=J,y=w,J=jJ,jJ=dJ+IJ|0,w=LJ+$Q+F(jJ,dJ)|0}this._al=this._al+jJ|0,this._bl=this._bl+J|0,this._cl=this._cl+V|0,this._dl=this._dl+Z|0,this._el=this._el+$|0,this._fl=this._fl+X|0,this._gl=this._gl+U|0,this._hl=this._hl+H|0,this._ah=this._ah+w+F(this._al,jJ)|0,this._bh=this._bh+y+F(this._bl,J)|0,this._ch=this._ch+m+F(this._cl,V)|0,this._dh=this._dh+i+F(this._dl,Z)|0,this._eh=this._eh+JJ+F(this._el,$)|0,this._fh=this._fh+VJ+F(this._fl,X)|0,this._gh=this._gh+HJ+F(this._gl,U)|0,this._hh=this._hh+o+F(this._hl,H)|0},Y.prototype._hash=function(){var v=B.allocUnsafe(64);function S(w,y,m){v.writeInt32BE(w,m),v.writeInt32BE(y,m+4)}return S(this._ah,this._al,0),S(this._bh,this._bl,8),S(this._ch,this._cl,16),S(this._dh,this._dl,24),S(this._eh,this._el,32),S(this._fh,this._fl,40),S(this._gh,this._gl,48),S(this._hh,this._hl,56),v},g.exports=Y}),H8=OJ((l,g)=>{var R=JQ(),M=x0(),B=XV(),A=XQ().Buffer,q=new Array(160);function Y(){this.init(),this._w=q,B.call(this,128,112)}R(Y,M),Y.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Y.prototype._hash=function(){var E=A.allocUnsafe(48);function O(N,W,I){E.writeInt32BE(N,I),E.writeInt32BE(W,I+4)}return O(this._ah,this._al,0),O(this._bh,this._bl,8),O(this._ch,this._cl,16),O(this._dh,this._dl,24),O(this._eh,this._el,32),O(this._fh,this._fl,40),E},g.exports=Y}),iV=OJ((R,g)=>{var R=g.exports=function(M){M=M.toLowerCase();var B=R[M];if(!B)throw new Error(M+" is not supported (we accept pull requests)");return new B};R.sha=G8(),R.sha1=K8(),R.sha224=U8(),R.sha256=S0(),R.sha384=H8(),R.sha512=x0()}),bQ=OJ((l,g)=>{g.exports={ArrayIsArray(R){return Array.isArray(R)},ArrayPrototypeIncludes(R,M){return R.includes(M)},ArrayPrototypeIndexOf(R,M){return R.indexOf(M)},ArrayPrototypeJoin(R,M){return R.join(M)},ArrayPrototypeMap(R,M){return R.map(M)},ArrayPrototypePop(R,M){return R.pop(M)},ArrayPrototypePush(R,M){return R.push(M)},ArrayPrototypeSlice(R,M,B){return R.slice(M,B)},Error,FunctionPrototypeCall(R,M,...B){return R.call(M,...B)},FunctionPrototypeSymbolHasInstance(R,M){return Function.prototype[Symbol.hasInstance].call(R,M)},MathFloor:Math.floor,Number,NumberIsInteger:Number.isInteger,NumberIsNaN:Number.isNaN,NumberMAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER,NumberMIN_SAFE_INTEGER:Number.MIN_SAFE_INTEGER,NumberParseInt:Number.parseInt,ObjectDefineProperties(R,M){return Object.defineProperties(R,M)},ObjectDefineProperty(R,M,B){return Object.defineProperty(R,M,B)},ObjectGetOwnPropertyDescriptor(R,M){return Object.getOwnPropertyDescriptor(R,M)},ObjectKeys(R){return Object.keys(R)},ObjectSetPrototypeOf(R,M){return Object.setPrototypeOf(R,M)},Promise,PromisePrototypeCatch(R,M){return R.catch(M)},PromisePrototypeThen(R,M,B){return R.then(M,B)},PromiseReject(R){return Promise.reject(R)},ReflectApply:Reflect.apply,RegExpPrototypeTest(R,M){return R.test(M)},SafeSet:Set,String,StringPrototypeSlice(R,M,B){return R.slice(M,B)},StringPrototypeToLowerCase(R){return R.toLowerCase()},StringPrototypeToUpperCase(R){return R.toUpperCase()},StringPrototypeTrim(R){return R.trim()},Symbol,SymbolAsyncIterator:Symbol.asyncIterator,SymbolHasInstance:Symbol.hasInstance,SymbolIterator:Symbol.iterator,TypedArrayPrototypeSet(R,M,B){return R.set(M,B)},Uint8Array}}),iQ=OJ((l,g)=>{var R=yQ(),M=Object.getPrototypeOf(async function(){}).constructor,B=globalThis.Blob||R.Blob,A=typeof B<"u"?function(Y){return Y instanceof B}:function(Y){return!1},q=class extends Error{constructor(Y){if(!Array.isArray(Y))throw new TypeError(`Expected input to be an Array, got ${typeof Y}`);let E="";for(let O=0;O<Y.length;O++)E+=`    ${Y[O].stack}
+`;super(E),this.name="AggregateError",this.errors=Y}};g.exports={AggregateError:q,kEmptyObject:Object.freeze({}),once(Y){let E=!1;return function(...O){E||(E=!0,Y.apply(this,O))}},createDeferredPromise:function(){let Y,E;return{promise:new Promise((O,N)=>{Y=O,E=N}),resolve:Y,reject:E}},promisify(Y){return new Promise((E,O)=>{Y((N,...W)=>N?O(N):E(...W))})},debuglog(){return function(){}},format(Y,...E){return Y.replace(/%([sdifj])/g,function(...[O,N]){let W=E.shift();return N==="f"?W.toFixed(6):N==="j"?JSON.stringify(W):N==="s"&&typeof W=="object"?`${W.constructor!==Object?W.constructor.name:""} {}`.trim():W.toString()})},inspect(Y){switch(typeof Y){case"string":if(Y.includes("'"))if(Y.includes('"')){if(!Y.includes("`")&&!Y.includes("${"))return`\`${Y}\``}else return`"${Y}"`;return`'${Y}'`;case"number":return isNaN(Y)?"NaN":Object.is(Y,-0)?String(Y):Y;case"bigint":return`${String(Y)}n`;case"boolean":case"undefined":return String(Y);case"object":return"{}"}},types:{isAsyncFunction(Y){return Y instanceof M},isArrayBufferView(Y){return ArrayBuffer.isView(Y)}},isBlob:A},g.exports.promisify.custom=Symbol.for("nodejs.util.promisify.custom")}),lV=OJ((l,g)=>{var{AbortController:R,AbortSignal:M}=typeof self<"u"?self:typeof window<"u"?window:void 0;g.exports=R,g.exports.AbortSignal=M,g.exports.default=R}),gQ=OJ((l,g)=>{var{format:R,inspect:M,AggregateError:B}=iQ(),A=globalThis.AggregateError||B,q=Symbol("kIsNodeError"),Y=["string","function","number","object","Function","Object","boolean","bigint","symbol"],E=/^([A-Z][a-z0-9]*)+$/,O="__node_internal_",N={};function W(S,w){if(!S)throw new N.ERR_INTERNAL_ASSERTION(w)}function I(S){let w="",y=S.length,m=S[0]==="-"?1:0;for(;y>=m+4;y-=3)w=`_${S.slice(y-3,y)}${w}`;return`${S.slice(0,y)}${w}`}function z(S,w,y){if(typeof w=="function")return W(w.length<=y.length,`Code: ${S}; The provided arguments length (${y.length}) does not match the required ones (${w.length}).`),w(...y);let m=(w.match(/%[dfijoOs]/g)||[]).length;return W(m===y.length,`Code: ${S}; The provided arguments length (${y.length}) does not match the required ones (${m}).`),y.length===0?w:R(w,...y)}function j(S,w,y){y||(y=Error);class m extends y{constructor(...i){super(z(S,w,i))}toString(){return`${this.name} [${S}]: ${this.message}`}}Object.defineProperties(m.prototype,{name:{value:y.name,writable:!0,enumerable:!1,configurable:!0},toString:{value(){return`${this.name} [${S}]: ${this.message}`},writable:!0,enumerable:!1,configurable:!0}}),m.prototype.code=S,m.prototype[q]=!0,N[S]=m}function P(S){let w=O+S.name;return Object.defineProperty(S,"name",{value:w}),S}function F(S,w){if(S&&w&&S!==w){if(Array.isArray(w.errors))return w.errors.push(S),w;let y=new A([w,S],w.message);return y.code=w.code,y}return S||w}var v=class extends Error{constructor(S="The operation was aborted",w=void 0){if(w!==void 0&&typeof w!="object")throw new N.ERR_INVALID_ARG_TYPE("options","Object",w);super(S,w),this.code="ABORT_ERR",this.name="AbortError"}};j("ERR_ASSERTION","%s",Error),j("ERR_INVALID_ARG_TYPE",(S,w,y)=>{W(typeof S=="string","'name' must be a string"),Array.isArray(w)||(w=[w]);let m="The ";S.endsWith(" argument")?m+=`${S} `:m+=`"${S}" ${S.includes(".")?"property":"argument"} `,m+="must be ";let i=[],JJ=[],VJ=[];for(let o of w)W(typeof o=="string","All expected entries have to be of type string"),Y.includes(o)?i.push(o.toLowerCase()):E.test(o)?JJ.push(o):(W(o!=="object",'The value "object" should be written as "Object"'),VJ.push(o));if(JJ.length>0){let o=i.indexOf("object");o!==-1&&(i.splice(i,o,1),JJ.push("Object"))}if(i.length>0){switch(i.length){case 1:m+=`of type ${i[0]}`;break;case 2:m+=`one of type ${i[0]} or ${i[1]}`;break;default:{let o=i.pop();m+=`one of type ${i.join(", ")}, or ${o}`}}(JJ.length>0||VJ.length>0)&&(m+=" or ")}if(JJ.length>0){switch(JJ.length){case 1:m+=`an instance of ${JJ[0]}`;break;case 2:m+=`an instance of ${JJ[0]} or ${JJ[1]}`;break;default:{let o=JJ.pop();m+=`an instance of ${JJ.join(", ")}, or ${o}`}}VJ.length>0&&(m+=" or ")}switch(VJ.length){case 0:break;case 1:VJ[0].toLowerCase()!==VJ[0]&&(m+="an "),m+=`${VJ[0]}`;break;case 2:m+=`one of ${VJ[0]} or ${VJ[1]}`;break;default:{let o=VJ.pop();m+=`one of ${VJ.join(", ")}, or ${o}`}}if(y==null)m+=`. Received ${y}`;else if(typeof y=="function"&&y.name)m+=`. Received function ${y.name}`;else if(typeof y=="object"){var HJ;(HJ=y.constructor)!==null&&HJ!==void 0&&HJ.name?m+=`. Received an instance of ${y.constructor.name}`:m+=`. Received ${M(y,{depth:-1})}`}else{let o=M(y,{colors:!1});o.length>25&&(o=`${o.slice(0,25)}...`),m+=`. Received type ${typeof y} (${o})`}return m},TypeError),j("ERR_INVALID_ARG_VALUE",(S,w,y="is invalid")=>{let m=M(w);return m.length>128&&(m=m.slice(0,128)+"..."),`The ${S.includes(".")?"property":"argument"} '${S}' ${y}. Received ${m}`},TypeError),j("ERR_INVALID_RETURN_VALUE",(S,w,y)=>{var m;let i=y!=null&&(m=y.constructor)!==null&&m!==void 0&&m.name?`instance of ${y.constructor.name}`:`type ${typeof y}`;return`Expected ${S} to be returned from the "${w}" function but got ${i}.`},TypeError),j("ERR_MISSING_ARGS",(...S)=>{W(S.length>0,"At least one arg needs to be specified");let w,y=S.length;switch(S=(Array.isArray(S)?S:[S]).map((m)=>`"${m}"`).join(" or "),y){case 1:w+=`The ${S[0]} argument`;break;case 2:w+=`The ${S[0]} and ${S[1]} arguments`;break;default:{let m=S.pop();w+=`The ${S.join(", ")}, and ${m} arguments`}break}return`${w} must be specified`},TypeError),j("ERR_OUT_OF_RANGE",(S,w,y)=>{W(w,'Missing "range" argument');let m;return Number.isInteger(y)&&Math.abs(y)>4294967296?m=I(String(y)):typeof y=="bigint"?(m=String(y),(y>2n**32n||y<-(2n**32n))&&(m=I(m)),m+="n"):m=M(y),`The value of "${S}" is out of range. It must be ${w}. Received ${m}`},RangeError),j("ERR_MULTIPLE_CALLBACK","Callback called multiple times",Error),j("ERR_METHOD_NOT_IMPLEMENTED","The %s method is not implemented",Error),j("ERR_STREAM_ALREADY_FINISHED","Cannot call %s after a stream was finished",Error),j("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable",Error),j("ERR_STREAM_DESTROYED","Cannot call %s after a stream was destroyed",Error),j("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),j("ERR_STREAM_PREMATURE_CLOSE","Premature close",Error),j("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF",Error),j("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event",Error),j("ERR_STREAM_WRITE_AFTER_END","write after end",Error),j("ERR_UNKNOWN_ENCODING","Unknown encoding: %s",TypeError),g.exports={AbortError:v,aggregateTwoErrors:P(F),hideStackFrames:P,codes:N}}),FV=OJ((l,g)=>{var{ArrayIsArray:R,ArrayPrototypeIncludes:M,ArrayPrototypeJoin:B,ArrayPrototypeMap:A,NumberIsInteger:q,NumberIsNaN:Y,NumberMAX_SAFE_INTEGER:E,NumberMIN_SAFE_INTEGER:O,NumberParseInt:N,ObjectPrototypeHasOwnProperty:W,RegExpPrototypeExec:I,String:z,StringPrototypeToUpperCase:j,StringPrototypeTrim:P}=bQ(),{hideStackFrames:F,codes:{ERR_SOCKET_BAD_PORT:v,ERR_INVALID_ARG_TYPE:S,ERR_INVALID_ARG_VALUE:w,ERR_OUT_OF_RANGE:y,ERR_UNKNOWN_SIGNAL:m}}=gQ(),{normalizeEncoding:i}=iQ(),{isAsyncFunction:JJ,isArrayBufferView:VJ}=iQ().types,HJ={};function o(b){return b===(b|0)}function jJ(b){return b===b>>>0}var J=/^[0-7]+$/,V="must be a 32-bit unsigned integer or an octal string";function Z(b,C,h){if(typeof b>"u"&&(b=h),typeof b=="string"){if(I(J,b)===null)throw new w(C,b,V);b=N(b,8)}return U(b,C),b}var $=F((b,C,h=O,$J=E)=>{if(typeof b!="number")throw new S(C,"number",b);if(!q(b))throw new y(C,"an integer",b);if(b<h||b>$J)throw new y(C,`>= ${h} && <= ${$J}`,b)}),X=F((b,C,h=-2147483648,$J=2147483647)=>{if(typeof b!="number")throw new S(C,"number",b);if(!q(b))throw new y(C,"an integer",b);if(b<h||b>$J)throw new y(C,`>= ${h} && <= ${$J}`,b)}),U=F((b,C,h=!1)=>{if(typeof b!="number")throw new S(C,"number",b);if(!q(b))throw new y(C,"an integer",b);let $J=h?1:0,qJ=4294967295;if(b<$J||b>qJ)throw new y(C,`>= ${$J} && <= ${qJ}`,b)});function H(b,C){if(typeof b!="string")throw new S(C,"string",b)}function G(b,C,h=void 0,$J){if(typeof b!="number")throw new S(C,"number",b);if(h!=null&&b<h||$J!=null&&b>$J||(h!=null||$J!=null)&&Y(b))throw new y(C,`${h!=null?`>= ${h}`:""}${h!=null&&$J!=null?" && ":""}${$J!=null?`<= ${$J}`:""}`,b)}var Q=F((b,C,h)=>{if(!M(h,b)){let $J=B(A(h,(ZJ)=>typeof ZJ=="string"?`'${ZJ}'`:z(ZJ)),", "),qJ="must be one of: "+$J;throw new w(C,b,qJ)}});function K(b,C){if(typeof b!="boolean")throw new S(C,"boolean",b)}function k(b,C,h){return b==null||!W(b,C)?h:b[C]}var L=F((b,C,h=null)=>{let $J=k(h,"allowArray",!1),qJ=k(h,"allowFunction",!1);if(!k(h,"nullable",!1)&&b===null||!$J&&R(b)||typeof b!="object"&&(!qJ||typeof b!="function"))throw new S(C,"Object",b)}),_=F((b,C,h=0)=>{if(!R(b))throw new S(C,"Array",b);if(b.length<h){let $J=`must be longer than ${h}`;throw new w(C,b,$J)}});function t(b,C="signal"){if(H(b,C),HJ[b]===void 0)throw HJ[j(b)]!==void 0?new m(b+" (signals must use all capital letters)"):new m(b)}var QJ=F((b,C="buffer")=>{if(!VJ(b))throw new S(C,["Buffer","TypedArray","DataView"],b)});function GJ(b,C){let h=i(C),$J=b.length;if(h==="hex"&&$J%2!==0)throw new w("encoding",C,`is invalid for data of length ${$J}`)}function n(b,C="Port",h=!0){if(typeof b!="number"&&typeof b!="string"||typeof b=="string"&&P(b).length===0||+b!==+b>>>0||b>65535||b===0&&!h)throw new v(C,b,h);return b|0}var p=F((b,C)=>{if(b!==void 0&&(b===null||typeof b!="object"||!("aborted"in b)))throw new S(C,"AbortSignal",b)}),e=F((b,C)=>{if(typeof b!="function")throw new S(C,"Function",b)}),PJ=F((b,C)=>{if(typeof b!="function"||JJ(b))throw new S(C,"Function",b)}),XJ=F((b,C)=>{if(b!==void 0)throw new S(C,"undefined",b)});function WJ(b,C,h){if(!M(h,b))throw new S(C,`('${B(h,"|")}')`,b)}g.exports={isInt32:o,isUint32:jJ,parseFileMode:Z,validateArray:_,validateBoolean:K,validateBuffer:QJ,validateEncoding:GJ,validateFunction:e,validateInt32:X,validateInteger:$,validateNumber:G,validateObject:L,validateOneOf:Q,validatePlainFunction:PJ,validatePort:n,validateSignalName:t,validateString:H,validateUint32:U,validateUndefined:XJ,validateUnion:WJ,validateAbortSignal:p}}),w0=OJ((l,g)=>{var R=g.exports={},M,B;function A(){throw new Error("setTimeout has not been defined")}function q(){throw new Error("clearTimeout has not been defined")}(function(){try{typeof setTimeout=="function"?M=setTimeout:M=A}catch{M=A}try{typeof clearTimeout=="function"?B=clearTimeout:B=q}catch{B=q}})();function Y(v){if(M===setTimeout)return setTimeout(v,0);if((M===A||!M)&&setTimeout)return M=setTimeout,setTimeout(v,0);try{return M(v,0)}catch{try{return M.call(null,v,0)}catch{return M.call(this,v,0)}}}function E(v){if(B===clearTimeout)return clearTimeout(v);if((B===q||!B)&&clearTimeout)return B=clearTimeout,clearTimeout(v);try{return B(v)}catch{try{return B.call(null,v)}catch{return B.call(this,v)}}}var O=[],N=!1,W,I=-1;function z(){!N||!W||(N=!1,W.length?O=W.concat(O):I=-1,O.length&&j())}function j(){if(!N){var v=Y(z);N=!0;for(var S=O.length;S;){for(W=O,O=[];++I<S;)W&&W[I].run();I=-1,S=O.length}W=null,N=!1,E(v)}}R.nextTick=function(v){var S=new Array(arguments.length-1);if(arguments.length>1)for(var w=1;w<arguments.length;w++)S[w-1]=arguments[w];O.push(new P(v,S)),O.length===1&&!N&&Y(j)};function P(v,S){this.fun=v,this.array=S}P.prototype.run=function(){this.fun.apply(null,this.array)},R.title="browser",R.browser=!0,R.env={},R.argv=[],R.version="",R.versions={};function F(){}R.on=F,R.addListener=F,R.once=F,R.off=F,R.removeListener=F,R.removeAllListeners=F,R.emit=F,R.prependListener=F,R.prependOnceListener=F,R.listeners=function(v){return[]},R.binding=function(v){throw new Error("process.binding is not supported")},R.cwd=function(){return"/"},R.chdir=function(v){throw new Error("process.chdir is not supported")},R.umask=function(){return 0}}),lQ={},RV(lQ,{default:()=>W8}),aQ=cV(()=>{fV(lQ,oQ(w0())),W8=oQ(w0())}),tQ=OJ((l,g)=>{var{Symbol:R,SymbolAsyncIterator:M,SymbolIterator:B}=bQ(),A=R("kDestroyed"),q=R("kIsErrored"),Y=R("kIsReadable"),E=R("kIsDisturbed");function O($,X=!1){var U;return!!($&&typeof $.pipe=="function"&&typeof $.on=="function"&&(!X||typeof $.pause=="function"&&typeof $.resume=="function")&&(!$._writableState||((U=$._readableState)===null||U===void 0?void 0:U.readable)!==!1)&&(!$._writableState||$._readableState))}function N($){var X;return!!($&&typeof $.write=="function"&&typeof $.on=="function"&&(!$._readableState||((X=$._writableState)===null||X===void 0?void 0:X.writable)!==!1))}function W($){return!!($&&typeof $.pipe=="function"&&$._readableState&&typeof $.on=="function"&&typeof $.write=="function")}function I($){return $&&($._readableState||$._writableState||typeof $.write=="function"&&typeof $.on=="function"||typeof $.pipe=="function"&&typeof $.on=="function")}function z($,X){return $==null?!1:X===!0?typeof $[M]=="function":X===!1?typeof $[B]=="function":typeof $[M]=="function"||typeof $[B]=="function"}function j($){if(!I($))return null;let{_writableState:X,_readableState:U}=$,H=X||U;return!!($.destroyed||$[A]||H!=null&&H.destroyed)}function P($){if(!N($))return null;if($.writableEnded===!0)return!0;let X=$._writableState;return X!=null&&X.errored?!1:typeof X?.ended!="boolean"?null:X.ended}function F($,X){if(!N($))return null;if($.writableFinished===!0)return!0;let U=$._writableState;return U!=null&&U.errored?!1:typeof U?.finished!="boolean"?null:!!(U.finished||X===!1&&U.ended===!0&&U.length===0)}function v($){if(!O($))return null;if($.readableEnded===!0)return!0;let X=$._readableState;return!X||X.errored?!1:typeof X?.ended!="boolean"?null:X.ended}function S($,X){if(!O($))return null;let U=$._readableState;return U!=null&&U.errored?!1:typeof U?.endEmitted!="boolean"?null:!!(U.endEmitted||X===!1&&U.ended===!0&&U.length===0)}function w($){return $&&$[Y]!=null?$[Y]:typeof $?.readable!="boolean"?null:j($)?!1:O($)&&$.readable&&!S($)}function y($){return typeof $?.writable!="boolean"?null:j($)?!1:N($)&&$.writable&&!P($)}function m($,X){return I($)?j($)?!0:!(X?.readable!==!1&&w($)||X?.writable!==!1&&y($)):null}function i($){var X,U;return I($)?$.writableErrored?$.writableErrored:(X=(U=$._writableState)===null||U===void 0?void 0:U.errored)!==null&&X!==void 0?X:null:null}function JJ($){var X,U;return I($)?$.readableErrored?$.readableErrored:(X=(U=$._readableState)===null||U===void 0?void 0:U.errored)!==null&&X!==void 0?X:null:null}function VJ($){if(!I($))return null;if(typeof $.closed=="boolean")return $.closed;let{_writableState:X,_readableState:U}=$;return typeof X?.closed=="boolean"||typeof U?.closed=="boolean"?X?.closed||U?.closed:typeof $._closed=="boolean"&&HJ($)?$._closed:null}function HJ($){return typeof $._closed=="boolean"&&typeof $._defaultKeepAlive=="boolean"&&typeof $._removedConnection=="boolean"&&typeof $._removedContLen=="boolean"}function o($){return typeof $._sent100=="boolean"&&HJ($)}function jJ($){var X;return typeof $._consuming=="boolean"&&typeof $._dumped=="boolean"&&((X=$.req)===null||X===void 0?void 0:X.upgradeOrConnect)===void 0}function J($){if(!I($))return null;let{_writableState:X,_readableState:U}=$,H=X||U;return!H&&o($)||!!(H&&H.autoDestroy&&H.emitClose&&H.closed===!1)}function V($){var X;return!!($&&((X=$[E])!==null&&X!==void 0?X:$.readableDidRead||$.readableAborted))}function Z($){var X,U,H,G,Q,K,k,L,_,t;return!!($&&((X=(U=(H=(G=(Q=(K=$[q])!==null&&K!==void 0?K:$.readableErrored)!==null&&Q!==void 0?Q:$.writableErrored)!==null&&G!==void 0?G:(k=$._readableState)===null||k===void 0?void 0:k.errorEmitted)!==null&&H!==void 0?H:(L=$._writableState)===null||L===void 0?void 0:L.errorEmitted)!==null&&U!==void 0?U:(_=$._readableState)===null||_===void 0?void 0:_.errored)!==null&&X!==void 0?X:(t=$._writableState)===null||t===void 0?void 0:t.errored))}g.exports={kDestroyed:A,isDisturbed:V,kIsDisturbed:E,isErrored:Z,kIsErrored:q,isReadable:w,kIsReadable:Y,isClosed:VJ,isDestroyed:j,isDuplexNodeStream:W,isFinished:m,isIterable:z,isReadableNodeStream:O,isReadableEnded:v,isReadableFinished:S,isReadableErrored:JJ,isNodeStream:I,isWritable:y,isWritableNodeStream:N,isWritableEnded:P,isWritableFinished:F,isWritableErrored:i,isServerRequest:jJ,isServerResponse:o,willEmitClose:J}}),eQ=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{AbortError:M,codes:B}=gQ(),{ERR_INVALID_ARG_TYPE:A,ERR_STREAM_PREMATURE_CLOSE:q}=B,{kEmptyObject:Y,once:E}=iQ(),{validateAbortSignal:O,validateFunction:N,validateObject:W}=FV(),{Promise:I}=bQ(),{isClosed:z,isReadable:j,isReadableNodeStream:P,isReadableFinished:F,isReadableErrored:v,isWritable:S,isWritableNodeStream:w,isWritableFinished:y,isWritableErrored:m,isNodeStream:i,willEmitClose:JJ}=tQ();function VJ(J){return J.setHeader&&typeof J.abort=="function"}var HJ=()=>{};function o(J,V,Z){var $,X;arguments.length===2?(Z=V,V=Y):V==null?V=Y:W(V,"options"),N(Z,"callback"),O(V.signal,"options.signal"),Z=E(Z);let U=($=V.readable)!==null&&$!==void 0?$:P(J),H=(X=V.writable)!==null&&X!==void 0?X:w(J);if(!i(J))throw new A("stream","Stream",J);let{_writableState:G,_readableState:Q}=J,K=()=>{J.writable||_()},k=JJ(J)&&P(J)===U&&w(J)===H,L=y(J,!1),_=()=>{L=!0,J.destroyed&&(k=!1),!(k&&(!J.readable||U))&&(!U||t)&&Z.call(J)},t=F(J,!1),QJ=()=>{t=!0,J.destroyed&&(k=!1),!(k&&(!J.writable||H))&&(!H||L)&&Z.call(J)},GJ=(XJ)=>{Z.call(J,XJ)},n=z(J),p=()=>{n=!0;let XJ=m(J)||v(J);if(XJ&&typeof XJ!="boolean")return Z.call(J,XJ);if(U&&!t&&P(J,!0)&&!F(J,!1))return Z.call(J,new q);if(H&&!L&&!y(J,!1))return Z.call(J,new q);Z.call(J)},e=()=>{J.req.on("finish",_)};VJ(J)?(J.on("complete",_),k||J.on("abort",p),J.req?e():J.on("request",e)):H&&!G&&(J.on("end",K),J.on("close",K)),!k&&typeof J.aborted=="boolean"&&J.on("aborted",p),J.on("end",QJ),J.on("finish",_),V.error!==!1&&J.on("error",GJ),J.on("close",p),n?R.nextTick(p):G!=null&&G.errorEmitted||Q!=null&&Q.errorEmitted?k||R.nextTick(p):(!U&&(!k||j(J))&&(L||S(J)===!1)||!H&&(!k||S(J))&&(t||j(J)===!1)||Q&&J.req&&J.aborted)&&R.nextTick(p);let PJ=()=>{Z=HJ,J.removeListener("aborted",p),J.removeListener("complete",_),J.removeListener("abort",p),J.removeListener("request",e),J.req&&J.req.removeListener("finish",_),J.removeListener("end",K),J.removeListener("close",K),J.removeListener("finish",_),J.removeListener("end",QJ),J.removeListener("error",GJ),J.removeListener("close",p)};if(V.signal&&!n){let XJ=()=>{let WJ=Z;PJ(),WJ.call(J,new M(void 0,{cause:V.signal.reason}))};if(V.signal.aborted)R.nextTick(XJ);else{let WJ=Z;Z=E((...b)=>{V.signal.removeEventListener("abort",XJ),WJ.apply(J,b)}),V.signal.addEventListener("abort",XJ)}}return PJ}function jJ(J,V){return new I((Z,$)=>{o(J,V,(X)=>{X?$(X):Z()})})}g.exports=o,g.exports.finished=jJ}),Y8=OJ((l,g)=>{var R=globalThis.AbortController||lV().AbortController,{codes:{ERR_INVALID_ARG_TYPE:M,ERR_MISSING_ARGS:B,ERR_OUT_OF_RANGE:A},AbortError:q}=gQ(),{validateAbortSignal:Y,validateInteger:E,validateObject:O}=FV(),N=bQ().Symbol("kWeak"),{finished:W}=eQ(),{ArrayPrototypePush:I,MathFloor:z,Number:j,NumberIsNaN:P,Promise:F,PromiseReject:v,PromisePrototypeThen:S,Symbol:w}=bQ(),y=w("kEmpty"),m=w("kEof");function i(Q,K){if(typeof Q!="function")throw new M("fn",["Function","AsyncFunction"],Q);K!=null&&O(K,"options"),K?.signal!=null&&Y(K.signal,"options.signal");let k=1;return K?.concurrency!=null&&(k=z(K.concurrency)),E(k,"concurrency",1),async function*(){var L,_;let t=new R,QJ=this,GJ=[],n=t.signal,p={signal:n},e=()=>t.abort();K!=null&&(L=K.signal)!==null&&L!==void 0&&L.aborted&&e(),K==null||(_=K.signal)===null||_===void 0||_.addEventListener("abort",e);let PJ,XJ,WJ=!1;function b(){WJ=!0}async function C(){try{for await(let qJ of QJ){var h;if(WJ)return;if(n.aborted)throw new q;try{qJ=Q(qJ,p)}catch(ZJ){qJ=v(ZJ)}qJ!==y&&(typeof((h=qJ)===null||h===void 0?void 0:h.catch)=="function"&&qJ.catch(b),GJ.push(qJ),PJ&&(PJ(),PJ=null),!WJ&&GJ.length&&GJ.length>=k&&await new F((ZJ)=>{XJ=ZJ}))}GJ.push(m)}catch(qJ){let ZJ=v(qJ);S(ZJ,void 0,b),GJ.push(ZJ)}finally{var $J;WJ=!0,PJ&&(PJ(),PJ=null),K==null||($J=K.signal)===null||$J===void 0||$J.removeEventListener("abort",e)}}C();try{for(;;){for(;GJ.length>0;){let h=await GJ[0];if(h===m)return;if(n.aborted)throw new q;h!==y&&(yield h),GJ.shift(),XJ&&(XJ(),XJ=null)}await new F((h)=>{PJ=h})}}finally{t.abort(),WJ=!0,XJ&&(XJ(),XJ=null)}}.call(this)}function JJ(Q=void 0){return Q!=null&&O(Q,"options"),Q?.signal!=null&&Y(Q.signal,"options.signal"),async function*(){let K=0;for await(let L of this){var k;if(Q!=null&&(k=Q.signal)!==null&&k!==void 0&&k.aborted)throw new q({cause:Q.signal.reason});yield[K++,L]}}.call(this)}async function VJ(Q,K=void 0){for await(let k of J.call(this,Q,K))return!0;return!1}async function HJ(Q,K=void 0){if(typeof Q!="function")throw new M("fn",["Function","AsyncFunction"],Q);return!await VJ.call(this,async(...k)=>!await Q(...k),K)}async function o(Q,K){for await(let k of J.call(this,Q,K))return k}async function jJ(Q,K){if(typeof Q!="function")throw new M("fn",["Function","AsyncFunction"],Q);async function k(L,_){return await Q(L,_),y}for await(let L of i.call(this,k,K));}function J(Q,K){if(typeof Q!="function")throw new M("fn",["Function","AsyncFunction"],Q);async function k(L,_){return await Q(L,_)?L:y}return i.call(this,k,K)}var V=class extends B{constructor(){super("reduce"),this.message="Reduce of an empty stream requires an initial value"}};async function Z(Q,K,k){var L;if(typeof Q!="function")throw new M("reducer",["Function","AsyncFunction"],Q);k!=null&&O(k,"options"),k?.signal!=null&&Y(k.signal,"options.signal");let _=arguments.length>1;if(k!=null&&(L=k.signal)!==null&&L!==void 0&&L.aborted){let p=new q(void 0,{cause:k.signal.reason});throw this.once("error",()=>{}),await W(this.destroy(p)),p}let t=new R,QJ=t.signal;if(k!=null&&k.signal){let p={once:!0,[N]:this};k.signal.addEventListener("abort",()=>t.abort(),p)}let GJ=!1;try{for await(let p of this){var n;if(GJ=!0,k!=null&&(n=k.signal)!==null&&n!==void 0&&n.aborted)throw new q;_?K=await Q(K,p,{signal:QJ}):(K=p,_=!0)}if(!GJ&&!_)throw new V}finally{t.abort()}return K}async function $(Q){Q!=null&&O(Q,"options"),Q?.signal!=null&&Y(Q.signal,"options.signal");let K=[];for await(let L of this){var k;if(Q!=null&&(k=Q.signal)!==null&&k!==void 0&&k.aborted)throw new q(void 0,{cause:Q.signal.reason});I(K,L)}return K}function X(Q,K){let k=i.call(this,Q,K);return async function*(){for await(let L of k)yield*L}.call(this)}function U(Q){if(Q=j(Q),P(Q))return 0;if(Q<0)throw new A("number",">= 0",Q);return Q}function H(Q,K=void 0){return K!=null&&O(K,"options"),K?.signal!=null&&Y(K.signal,"options.signal"),Q=U(Q),async function*(){var k;if(K!=null&&(k=K.signal)!==null&&k!==void 0&&k.aborted)throw new q;for await(let _ of this){var L;if(K!=null&&(L=K.signal)!==null&&L!==void 0&&L.aborted)throw new q;Q--<=0&&(yield _)}}.call(this)}function G(Q,K=void 0){return K!=null&&O(K,"options"),K?.signal!=null&&Y(K.signal,"options.signal"),Q=U(Q),async function*(){var k;if(K!=null&&(k=K.signal)!==null&&k!==void 0&&k.aborted)throw new q;for await(let _ of this){var L;if(K!=null&&(L=K.signal)!==null&&L!==void 0&&L.aborted)throw new q;if(Q-- >0)yield _;else return}}.call(this)}g.exports.streamReturningOperators={asIndexedPairs:JJ,drop:H,filter:J,flatMap:X,map:i,take:G},g.exports.promiseReturningOperators={every:HJ,forEach:jJ,reduce:Z,toArray:$,some:VJ,find:o}}),qV=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{aggregateTwoErrors:M,codes:{ERR_MULTIPLE_CALLBACK:B},AbortError:A}=gQ(),{Symbol:q}=bQ(),{kDestroyed:Y,isDestroyed:E,isFinished:O,isServerRequest:N}=tQ(),W=q("kDestroy"),I=q("kConstruct");function z(J,V,Z){J&&(J.stack,V&&!V.errored&&(V.errored=J),Z&&!Z.errored&&(Z.errored=J))}function j(J,V){let Z=this._readableState,$=this._writableState,X=$||Z;return $&&$.destroyed||Z&&Z.destroyed?(typeof V=="function"&&V(),this):(z(J,$,Z),$&&($.destroyed=!0),Z&&(Z.destroyed=!0),X.constructed?P(this,J,V):this.once(W,function(U){P(this,M(U,J),V)}),this)}function P(J,V,Z){let $=!1;function X(U){if($)return;$=!0;let{_readableState:H,_writableState:G}=J;z(U,G,H),G&&(G.closed=!0),H&&(H.closed=!0),typeof Z=="function"&&Z(U),U?R.nextTick(F,J,U):R.nextTick(v,J)}try{J._destroy(V||null,X)}catch(U){X(U)}}function F(J,V){S(J,V),v(J)}function v(J){let{_readableState:V,_writableState:Z}=J;Z&&(Z.closeEmitted=!0),V&&(V.closeEmitted=!0),(Z&&Z.emitClose||V&&V.emitClose)&&J.emit("close")}function S(J,V){let{_readableState:Z,_writableState:$}=J;$&&$.errorEmitted||Z&&Z.errorEmitted||($&&($.errorEmitted=!0),Z&&(Z.errorEmitted=!0),J.emit("error",V))}function w(){let J=this._readableState,V=this._writableState;J&&(J.constructed=!0,J.closed=!1,J.closeEmitted=!1,J.destroyed=!1,J.errored=null,J.errorEmitted=!1,J.reading=!1,J.ended=J.readable===!1,J.endEmitted=J.readable===!1),V&&(V.constructed=!0,V.destroyed=!1,V.closed=!1,V.closeEmitted=!1,V.errored=null,V.errorEmitted=!1,V.finalCalled=!1,V.prefinished=!1,V.ended=V.writable===!1,V.ending=V.writable===!1,V.finished=V.writable===!1)}function y(J,V,Z){let{_readableState:$,_writableState:X}=J;if(X&&X.destroyed||$&&$.destroyed)return this;$&&$.autoDestroy||X&&X.autoDestroy?J.destroy(V):V&&(V.stack,X&&!X.errored&&(X.errored=V),$&&!$.errored&&($.errored=V),Z?R.nextTick(S,J,V):S(J,V))}function m(J,V){if(typeof J._construct!="function")return;let{_readableState:Z,_writableState:$}=J;Z&&(Z.constructed=!1),$&&($.constructed=!1),J.once(I,V),!(J.listenerCount(I)>1)&&R.nextTick(i,J)}function i(J){let V=!1;function Z($){if(V){y(J,$??new B);return}V=!0;let{_readableState:X,_writableState:U}=J,H=U||X;X&&(X.constructed=!0),U&&(U.constructed=!0),H.destroyed?J.emit(W,$):$?y(J,$,!0):R.nextTick(JJ,J)}try{J._construct(Z)}catch($){Z($)}}function JJ(J){J.emit(I)}function VJ(J){return J&&J.setHeader&&typeof J.abort=="function"}function HJ(J){J.emit("close")}function o(J,V){J.emit("error",V),R.nextTick(HJ,J)}function jJ(J,V){!J||E(J)||(!V&&!O(J)&&(V=new A),N(J)?(J.socket=null,J.destroy(V)):VJ(J)?J.abort():VJ(J.req)?J.req.abort():typeof J.destroy=="function"?J.destroy(V):typeof J.close=="function"?J.close():V?R.nextTick(o,J,V):R.nextTick(HJ,J),J.destroyed||(J[Y]=!0))}g.exports={construct:m,destroyer:jJ,destroy:j,undestroy:w,errorOrDestroy:y}}),sV=OJ((l,g)=>{var{ArrayIsArray:R,ObjectSetPrototypeOf:M}=bQ(),{EventEmitter:B}=rQ();function A(Y){B.call(this,Y)}M(A.prototype,B.prototype),M(A,B),A.prototype.pipe=function(Y,E){let O=this;function N(v){Y.writable&&Y.write(v)===!1&&O.pause&&O.pause()}O.on("data",N);function W(){O.readable&&O.resume&&O.resume()}Y.on("drain",W),!Y._isStdio&&(!E||E.end!==!1)&&(O.on("end",z),O.on("close",j));let I=!1;function z(){I||(I=!0,Y.end())}function j(){I||(I=!0,typeof Y.destroy=="function"&&Y.destroy())}function P(v){F(),B.listenerCount(this,"error")===0&&this.emit("error",v)}q(O,"error",P),q(Y,"error",P);function F(){O.removeListener("data",N),Y.removeListener("drain",W),O.removeListener("end",z),O.removeListener("close",j),O.removeListener("error",P),Y.removeListener("error",P),O.removeListener("end",F),O.removeListener("close",F),Y.removeListener("close",F)}return O.on("end",F),O.on("close",F),Y.on("close",F),Y.emit("pipe",O),Y};function q(Y,E,O){if(typeof Y.prependListener=="function")return Y.prependListener(E,O);!Y._events||!Y._events[E]?Y.on(E,O):R(Y._events[E])?Y._events[E].unshift(O):Y._events[E]=[O,Y._events[E]]}g.exports={Stream:A,prependListener:q}}),dV=OJ((l,g)=>{var{AbortError:R,codes:M}=gQ(),B=eQ(),{ERR_INVALID_ARG_TYPE:A}=M,q=(E,O)=>{if(typeof E!="object"||!("aborted"in E))throw new A(O,"AbortSignal",E)};function Y(E){return!!(E&&typeof E.pipe=="function")}g.exports.addAbortSignal=function(E,O){if(q(E,"signal"),!Y(O))throw new A("stream","stream.Stream",O);return g.exports.addAbortSignalNoValidate(E,O)},g.exports.addAbortSignalNoValidate=function(E,O){if(typeof E!="object"||!("aborted"in E))return O;let N=()=>{O.destroy(new R(void 0,{cause:E.reason}))};return E.aborted?N():(E.addEventListener("abort",N),B(O,()=>E.removeEventListener("abort",N))),O}}),B8=OJ((l,g)=>{var{StringPrototypeSlice:R,SymbolIterator:M,TypedArrayPrototypeSet:B,Uint8Array:A}=bQ(),{Buffer:q}=yQ(),{inspect:Y}=iQ();g.exports=class{constructor(){this.head=null,this.tail=null,this.length=0}push(E){let O={data:E,next:null};this.length>0?this.tail.next=O:this.head=O,this.tail=O,++this.length}unshift(E){let O={data:E,next:this.head};this.length===0&&(this.tail=O),this.head=O,++this.length}shift(){if(this.length===0)return;let E=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,E}clear(){this.head=this.tail=null,this.length=0}join(E){if(this.length===0)return"";let O=this.head,N=""+O.data;for(;(O=O.next)!==null;)N+=E+O.data;return N}concat(E){if(this.length===0)return q.alloc(0);let O=q.allocUnsafe(E>>>0),N=this.head,W=0;for(;N;)B(O,N.data,W),W+=N.data.length,N=N.next;return O}consume(E,O){let N=this.head.data;if(E<N.length){let W=N.slice(0,E);return this.head.data=N.slice(E),W}return E===N.length?this.shift():O?this._getString(E):this._getBuffer(E)}first(){return this.head.data}*[M](){for(let E=this.head;E;E=E.next)yield E.data}_getString(E){let O="",N=this.head,W=0;do{let I=N.data;if(E>I.length)O+=I,E-=I.length;else{E===I.length?(O+=I,++W,N.next?this.head=N.next:this.head=this.tail=null):(O+=R(I,0,E),this.head=N,N.data=R(I,E));break}++W}while((N=N.next)!==null);return this.length-=W,O}_getBuffer(E){let O=q.allocUnsafe(E),N=E,W=this.head,I=0;do{let z=W.data;if(E>z.length)B(O,z,N-E),E-=z.length;else{E===z.length?(B(O,z,N-E),++I,W.next?this.head=W.next:this.head=this.tail=null):(B(O,new A(z.buffer,z.byteOffset,E),N-E),this.head=W,W.data=z.slice(E));break}++I}while((W=W.next)!==null);return this.length-=I,O}[Symbol.for("nodejs.util.inspect.custom")](E,O){return Y(this,{...O,depth:0,customInspect:!1})}}}),nV=OJ((l,g)=>{var{MathFloor:R,NumberIsInteger:M}=bQ(),{ERR_INVALID_ARG_VALUE:B}=gQ().codes;function A(E,O,N){return E.highWaterMark!=null?E.highWaterMark:O?E[N]:null}function q(E){return E?16:16384}function Y(E,O,N,W){let I=A(O,W,N);if(I!=null){if(!M(I)||I<0){let z=W?`options.${N}`:"options.highWaterMark";throw new B(z,I)}return R(I)}return q(E.objectMode)}g.exports={getHighWaterMark:Y,getDefaultHighWaterMark:q}}),v0=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{PromisePrototypeThen:M,SymbolAsyncIterator:B,SymbolIterator:A}=bQ(),{Buffer:q}=yQ(),{ERR_INVALID_ARG_TYPE:Y,ERR_STREAM_NULL_VALUES:E}=gQ().codes;function O(N,W,I){let z;if(typeof W=="string"||W instanceof q)return new N({objectMode:!0,...I,read(){this.push(W),this.push(null)}});let j;if(W&&W[B])j=!0,z=W[B]();else if(W&&W[A])j=!1,z=W[A]();else throw new Y("iterable",["Iterable"],W);let P=new N({objectMode:!0,highWaterMark:1,...I}),F=!1;P._read=function(){F||(F=!0,S())},P._destroy=function(w,y){M(v(w),()=>R.nextTick(y,w),(m)=>R.nextTick(y,m||w))};async function v(w){let y=w!=null,m=typeof z.throw=="function";if(y&&m){let{value:i,done:JJ}=await z.throw(w);if(await i,JJ)return}if(typeof z.return=="function"){let{value:i}=await z.return();await i}}async function S(){for(;;){try{let{value:w,done:y}=j?await z.next():z.next();if(y)P.push(null);else{let m=w&&typeof w.then=="function"?await w:w;if(m===null)throw F=!1,new E;if(P.push(m))continue;F=!1}}catch(w){P.destroy(w)}break}}return P}g.exports=O}),DV=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{ArrayPrototypeIndexOf:M,NumberIsInteger:B,NumberIsNaN:A,NumberParseInt:q,ObjectDefineProperties:Y,ObjectKeys:E,ObjectSetPrototypeOf:O,Promise:N,SafeSet:W,SymbolAsyncIterator:I,Symbol:z}=bQ();g.exports=k,k.ReadableState=K;var{EventEmitter:j}=rQ(),{Stream:P,prependListener:F}=sV(),{Buffer:v}=yQ(),{addAbortSignal:S}=dV(),w=eQ(),y=iQ().debuglog("stream",(T)=>{y=T}),m=B8(),i=qV(),{getHighWaterMark:JJ,getDefaultHighWaterMark:VJ}=nV(),{aggregateTwoErrors:HJ,codes:{ERR_INVALID_ARG_TYPE:o,ERR_METHOD_NOT_IMPLEMENTED:jJ,ERR_OUT_OF_RANGE:J,ERR_STREAM_PUSH_AFTER_EOF:V,ERR_STREAM_UNSHIFT_AFTER_END_EVENT:Z}}=gQ(),{validateObject:$}=FV(),X=z("kPaused"),{StringDecoder:U}=hV(),H=v0();O(k.prototype,P.prototype),O(k,P);var G=()=>{},{errorOrDestroy:Q}=i;function K(T,D,u){typeof u!="boolean"&&(u=D instanceof sQ()),this.objectMode=!!(T&&T.objectMode),u&&(this.objectMode=this.objectMode||!!(T&&T.readableObjectMode)),this.highWaterMark=T?JJ(this,T,"readableHighWaterMark",u):VJ(!1),this.buffer=new m,this.length=0,this.pipes=[],this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.constructed=!0,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this[X]=null,this.errorEmitted=!1,this.emitClose=!T||T.emitClose!==!1,this.autoDestroy=!T||T.autoDestroy!==!1,this.destroyed=!1,this.errored=null,this.closed=!1,this.closeEmitted=!1,this.defaultEncoding=T&&T.defaultEncoding||"utf8",this.awaitDrainWriters=null,this.multiAwaitDrain=!1,this.readingMore=!1,this.dataEmitted=!1,this.decoder=null,this.encoding=null,T&&T.encoding&&(this.decoder=new U(T.encoding),this.encoding=T.encoding)}function k(T){if(!(this instanceof k))return new k(T);let D=this instanceof sQ();this._readableState=new K(T,this,D),T&&(typeof T.read=="function"&&(this._read=T.read),typeof T.destroy=="function"&&(this._destroy=T.destroy),typeof T.construct=="function"&&(this._construct=T.construct),T.signal&&!D&&S(T.signal,this)),P.call(this,T),i.construct(this,()=>{this._readableState.needReadable&&PJ(this,this._readableState)})}k.prototype.destroy=i.destroy,k.prototype._undestroy=i.undestroy,k.prototype._destroy=function(T,D){D(T)},k.prototype[j.captureRejectionSymbol]=function(T){this.destroy(T)},k.prototype.push=function(T,D){return L(this,T,D,!1)},k.prototype.unshift=function(T,D){return L(this,T,D,!0)};function L(T,D,u,d){y("readableAddChunk",D);let a=T._readableState,CJ;if(a.objectMode||(typeof D=="string"?(u=u||a.defaultEncoding,a.encoding!==u&&(d&&a.encoding?D=v.from(D,u).toString(a.encoding):(D=v.from(D,u),u=""))):D instanceof v?u="":P._isUint8Array(D)?(D=P._uint8ArrayToBuffer(D),u=""):D!=null&&(CJ=new o("chunk",["string","Buffer","Uint8Array"],D))),CJ)Q(T,CJ);else if(D===null)a.reading=!1,n(T,a);else if(a.objectMode||D&&D.length>0)if(d)if(a.endEmitted)Q(T,new Z);else{if(a.destroyed||a.errored)return!1;_(T,a,D,!0)}else if(a.ended)Q(T,new V);else{if(a.destroyed||a.errored)return!1;a.reading=!1,a.decoder&&!u?(D=a.decoder.write(D),a.objectMode||D.length!==0?_(T,a,D,!1):PJ(T,a)):_(T,a,D,!1)}else d||(a.reading=!1,PJ(T,a));return!a.ended&&(a.length<a.highWaterMark||a.length===0)}function _(T,D,u,d){D.flowing&&D.length===0&&!D.sync&&T.listenerCount("data")>0?(D.multiAwaitDrain?D.awaitDrainWriters.clear():D.awaitDrainWriters=null,D.dataEmitted=!0,T.emit("data",u)):(D.length+=D.objectMode?1:u.length,d?D.buffer.unshift(u):D.buffer.push(u),D.needReadable&&p(T)),PJ(T,D)}k.prototype.isPaused=function(){let T=this._readableState;return T[X]===!0||T.flowing===!1},k.prototype.setEncoding=function(T){let D=new U(T);this._readableState.decoder=D,this._readableState.encoding=this._readableState.decoder.encoding;let u=this._readableState.buffer,d="";for(let a of u)d+=D.write(a);return u.clear(),d!==""&&u.push(d),this._readableState.length=d.length,this};var t=1073741824;function QJ(T){if(T>t)throw new J("size","<= 1GiB",T);return T--,T|=T>>>1,T|=T>>>2,T|=T>>>4,T|=T>>>8,T|=T>>>16,T++,T}function GJ(T,D){return T<=0||D.length===0&&D.ended?0:D.objectMode?1:A(T)?D.flowing&&D.length?D.buffer.first().length:D.length:T<=D.length?T:D.ended?D.length:0}k.prototype.read=function(T){y("read",T),T===void 0?T=NaN:B(T)||(T=q(T,10));let D=this._readableState,u=T;if(T>D.highWaterMark&&(D.highWaterMark=QJ(T)),T!==0&&(D.emittedReadable=!1),T===0&&D.needReadable&&((D.highWaterMark!==0?D.length>=D.highWaterMark:D.length>0)||D.ended))return y("read: emitReadable",D.length,D.ended),D.length===0&&D.ended?TJ(this):p(this),null;if(T=GJ(T,D),T===0&&D.ended)return D.length===0&&TJ(this),null;let d=D.needReadable;if(y("need readable",d),(D.length===0||D.length-T<D.highWaterMark)&&(d=!0,y("length less than watermark",d)),D.ended||D.reading||D.destroyed||D.errored||!D.constructed)d=!1,y("reading, ended or constructing",d);else if(d){y("do read"),D.reading=!0,D.sync=!0,D.length===0&&(D.needReadable=!0);try{this._read(D.highWaterMark)}catch(CJ){Q(this,CJ)}D.sync=!1,D.reading||(T=GJ(u,D))}let a;return T>0?a=BJ(T,D):a=null,a===null?(D.needReadable=D.length<=D.highWaterMark,T=0):(D.length-=T,D.multiAwaitDrain?D.awaitDrainWriters.clear():D.awaitDrainWriters=null),D.length===0&&(D.ended||(D.needReadable=!0),u!==T&&D.ended&&TJ(this)),a!==null&&!D.errorEmitted&&!D.closeEmitted&&(D.dataEmitted=!0,this.emit("data",a)),a};function n(T,D){if(y("onEofChunk"),!D.ended){if(D.decoder){let u=D.decoder.end();u&&u.length&&(D.buffer.push(u),D.length+=D.objectMode?1:u.length)}D.ended=!0,D.sync?p(T):(D.needReadable=!1,D.emittedReadable=!0,e(T))}}function p(T){let D=T._readableState;y("emitReadable",D.needReadable,D.emittedReadable),D.needReadable=!1,D.emittedReadable||(y("emitReadable",D.flowing),D.emittedReadable=!0,R.nextTick(e,T))}function e(T){let D=T._readableState;y("emitReadable_",D.destroyed,D.length,D.ended),!D.destroyed&&!D.errored&&(D.length||D.ended)&&(T.emit("readable"),D.emittedReadable=!1),D.needReadable=!D.flowing&&!D.ended&&D.length<=D.highWaterMark,qJ(T)}function PJ(T,D){!D.readingMore&&D.constructed&&(D.readingMore=!0,R.nextTick(XJ,T,D))}function XJ(T,D){for(;!D.reading&&!D.ended&&(D.length<D.highWaterMark||D.flowing&&D.length===0);){let u=D.length;if(y("maybeReadMore read 0"),T.read(0),u===D.length)break}D.readingMore=!1}k.prototype._read=function(T){throw new jJ("_read()")},k.prototype.pipe=function(T,D){let u=this,d=this._readableState;d.pipes.length===1&&(d.multiAwaitDrain||(d.multiAwaitDrain=!0,d.awaitDrainWriters=new W(d.awaitDrainWriters?[d.awaitDrainWriters]:[]))),d.pipes.push(T),y("pipe count=%d opts=%j",d.pipes.length,D);let a=(!D||D.end!==!1)&&T!==R.stdout&&T!==R.stderr?UJ:AJ;d.endEmitted?R.nextTick(a):u.once("end",a),T.on("unpipe",CJ);function CJ(kJ,ZQ){y("onunpipe"),kJ===u&&ZQ&&ZQ.hasUnpiped===!1&&(ZQ.hasUnpiped=!0,FJ())}function UJ(){y("onend"),T.end()}let EJ,QQ=!1;function FJ(){y("cleanup"),T.removeListener("close",xJ),T.removeListener("finish",nJ),EJ&&T.removeListener("drain",EJ),T.removeListener("error",SJ),T.removeListener("unpipe",CJ),u.removeListener("end",UJ),u.removeListener("end",AJ),u.removeListener("data",aJ),QQ=!0,EJ&&d.awaitDrainWriters&&(!T._writableState||T._writableState.needDrain)&&EJ()}function RJ(){QQ||(d.pipes.length===1&&d.pipes[0]===T?(y("false write response, pause",0),d.awaitDrainWriters=T,d.multiAwaitDrain=!1):d.pipes.length>1&&d.pipes.includes(T)&&(y("false write response, pause",d.awaitDrainWriters.size),d.awaitDrainWriters.add(T)),u.pause()),EJ||(EJ=WJ(u,T),T.on("drain",EJ))}u.on("data",aJ);function aJ(kJ){y("ondata");let ZQ=T.write(kJ);y("dest.write",ZQ),ZQ===!1&&RJ()}function SJ(kJ){if(y("onerror",kJ),AJ(),T.removeListener("error",SJ),T.listenerCount("error")===0){let ZQ=T._writableState||T._readableState;ZQ&&!ZQ.errorEmitted?Q(T,kJ):T.emit("error",kJ)}}F(T,"error",SJ);function xJ(){T.removeListener("finish",nJ),AJ()}T.once("close",xJ);function nJ(){y("onfinish"),T.removeListener("close",xJ),AJ()}T.once("finish",nJ);function AJ(){y("unpipe"),u.unpipe(T)}return T.emit("pipe",u),T.writableNeedDrain===!0?d.flowing&&RJ():d.flowing||(y("pipe resume"),u.resume()),T};function WJ(T,D){return function(){let u=T._readableState;u.awaitDrainWriters===D?(y("pipeOnDrain",1),u.awaitDrainWriters=null):u.multiAwaitDrain&&(y("pipeOnDrain",u.awaitDrainWriters.size),u.awaitDrainWriters.delete(D)),(!u.awaitDrainWriters||u.awaitDrainWriters.size===0)&&T.listenerCount("data")&&T.resume()}}k.prototype.unpipe=function(T){let D=this._readableState,u={hasUnpiped:!1};if(D.pipes.length===0)return this;if(!T){let a=D.pipes;D.pipes=[],this.pause();for(let CJ=0;CJ<a.length;CJ++)a[CJ].emit("unpipe",this,{hasUnpiped:!1});return this}let d=M(D.pipes,T);return d===-1?this:(D.pipes.splice(d,1),D.pipes.length===0&&this.pause(),T.emit("unpipe",this,u),this)},k.prototype.on=function(T,D){let u=P.prototype.on.call(this,T,D),d=this._readableState;return T==="data"?(d.readableListening=this.listenerCount("readable")>0,d.flowing!==!1&&this.resume()):T==="readable"&&!d.endEmitted&&!d.readableListening&&(d.readableListening=d.needReadable=!0,d.flowing=!1,d.emittedReadable=!1,y("on readable",d.length,d.reading),d.length?p(this):d.reading||R.nextTick(C,this)),u},k.prototype.addListener=k.prototype.on,k.prototype.removeListener=function(T,D){let u=P.prototype.removeListener.call(this,T,D);return T==="readable"&&R.nextTick(b,this),u},k.prototype.off=k.prototype.removeListener,k.prototype.removeAllListeners=function(T){let D=P.prototype.removeAllListeners.apply(this,arguments);return(T==="readable"||T===void 0)&&R.nextTick(b,this),D};function b(T){let D=T._readableState;D.readableListening=T.listenerCount("readable")>0,D.resumeScheduled&&D[X]===!1?D.flowing=!0:T.listenerCount("data")>0?T.resume():D.readableListening||(D.flowing=null)}function C(T){y("readable nexttick read 0"),T.read(0)}k.prototype.resume=function(){let T=this._readableState;return T.flowing||(y("resume"),T.flowing=!T.readableListening,h(this,T)),T[X]=!1,this};function h(T,D){D.resumeScheduled||(D.resumeScheduled=!0,R.nextTick($J,T,D))}function $J(T,D){y("resume",D.reading),D.reading||T.read(0),D.resumeScheduled=!1,T.emit("resume"),qJ(T),D.flowing&&!D.reading&&T.read(0)}k.prototype.pause=function(){return y("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(y("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState[X]=!0,this};function qJ(T){let D=T._readableState;for(y("flow",D.flowing);D.flowing&&T.read()!==null;);}k.prototype.wrap=function(T){let D=!1;T.on("data",(d)=>{!this.push(d)&&T.pause&&(D=!0,T.pause())}),T.on("end",()=>{this.push(null)}),T.on("error",(d)=>{Q(this,d)}),T.on("close",()=>{this.destroy()}),T.on("destroy",()=>{this.destroy()}),this._read=()=>{D&&T.resume&&(D=!1,T.resume())};let u=E(T);for(let d=1;d<u.length;d++){let a=u[d];this[a]===void 0&&typeof T[a]=="function"&&(this[a]=T[a].bind(T))}return this},k.prototype[I]=function(){return ZJ(this)},k.prototype.iterator=function(T){return T!==void 0&&$(T,"options"),ZJ(this,T)};function ZJ(T,D){typeof T.read!="function"&&(T=k.wrap(T,{objectMode:!0}));let u=mJ(T,D);return u.stream=T,u}async function*mJ(T,D){let u=G;function d(UJ){this===T?(u(),u=G):u=UJ}T.on("readable",d);let a,CJ=w(T,{writable:!1},(UJ)=>{a=UJ?HJ(a,UJ):null,u(),u=G});try{for(;;){let UJ=T.destroyed?null:T.read();if(UJ!==null)yield UJ;else{if(a)throw a;if(a===null)return;await new N(d)}}}catch(UJ){throw a=HJ(a,UJ),a}finally{(a||D?.destroyOnReturn!==!1)&&(a===void 0||T._readableState.autoDestroy)?i.destroyer(T,null):(T.off("readable",d),CJ())}}Y(k.prototype,{readable:{__proto__:null,get(){let T=this._readableState;return!!T&&T.readable!==!1&&!T.destroyed&&!T.errorEmitted&&!T.endEmitted},set(T){this._readableState&&(this._readableState.readable=!!T)}},readableDidRead:{__proto__:null,enumerable:!1,get:function(){return this._readableState.dataEmitted}},readableAborted:{__proto__:null,enumerable:!1,get:function(){return!!(this._readableState.readable!==!1&&(this._readableState.destroyed||this._readableState.errored)&&!this._readableState.endEmitted)}},readableHighWaterMark:{__proto__:null,enumerable:!1,get:function(){return this._readableState.highWaterMark}},readableBuffer:{__proto__:null,enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}},readableFlowing:{__proto__:null,enumerable:!1,get:function(){return this._readableState.flowing},set:function(T){this._readableState&&(this._readableState.flowing=T)}},readableLength:{__proto__:null,enumerable:!1,get(){return this._readableState.length}},readableObjectMode:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.objectMode:!1}},readableEncoding:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.encoding:null}},errored:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.errored:null}},closed:{__proto__:null,get(){return this._readableState?this._readableState.closed:!1}},destroyed:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.destroyed:!1},set(T){!this._readableState||(this._readableState.destroyed=T)}},readableEnded:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.endEmitted:!1}}}),Y(K.prototype,{pipesCount:{__proto__:null,get(){return this.pipes.length}},paused:{__proto__:null,get(){return this[X]!==!1},set(T){this[X]=!!T}}}),k._fromList=BJ;function BJ(T,D){if(D.length===0)return null;let u;return D.objectMode?u=D.buffer.shift():!T||T>=D.length?(D.decoder?u=D.buffer.join(""):D.buffer.length===1?u=D.buffer.first():u=D.buffer.concat(D.length),D.buffer.clear()):u=D.buffer.consume(T,D.decoder),u}function TJ(T){let D=T._readableState;y("endReadable",D.endEmitted),D.endEmitted||(D.ended=!0,R.nextTick(dJ,D,T))}function dJ(T,D){if(y("endReadableNT",T.endEmitted,T.length),!T.errored&&!T.closeEmitted&&!T.endEmitted&&T.length===0){if(T.endEmitted=!0,D.emit("end"),D.writable&&D.allowHalfOpen===!1)R.nextTick(LJ,D);else if(T.autoDestroy){let u=D._writableState;(!u||u.autoDestroy&&(u.finished||u.writable===!1))&&D.destroy()}}}function LJ(T){T.writable&&!T.writableEnded&&!T.destroyed&&T.end()}k.from=function(T,D){return H(k,T,D)};var IJ;function $Q(){return IJ===void 0&&(IJ={}),IJ}k.fromWeb=function(T,D){return $Q().newStreamReadableFromReadableStream(T,D)},k.toWeb=function(T,D){return $Q().newReadableStreamFromStreamReadable(T,D)},k.wrap=function(T,D){var u,d;return new k({objectMode:(u=(d=T.readableObjectMode)!==null&&d!==void 0?d:T.objectMode)!==null&&u!==void 0?u:!0,...D,destroy(a,CJ){i.destroyer(T,a),CJ(a)}}).wrap(T)}}),M0=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{ArrayPrototypeSlice:M,Error:B,FunctionPrototypeSymbolHasInstance:A,ObjectDefineProperty:q,ObjectDefineProperties:Y,ObjectSetPrototypeOf:E,StringPrototypeToLowerCase:O,Symbol:N,SymbolHasInstance:W}=bQ();g.exports=U,U.WritableState=$;var{EventEmitter:I}=rQ(),z=sV().Stream,{Buffer:j}=yQ(),P=qV(),{addAbortSignal:F}=dV(),{getHighWaterMark:v,getDefaultHighWaterMark:S}=nV(),{ERR_INVALID_ARG_TYPE:w,ERR_METHOD_NOT_IMPLEMENTED:y,ERR_MULTIPLE_CALLBACK:m,ERR_STREAM_CANNOT_PIPE:i,ERR_STREAM_DESTROYED:JJ,ERR_STREAM_ALREADY_FINISHED:VJ,ERR_STREAM_NULL_VALUES:HJ,ERR_STREAM_WRITE_AFTER_END:o,ERR_UNKNOWN_ENCODING:jJ}=gQ().codes,{errorOrDestroy:J}=P;E(U.prototype,z.prototype),E(U,z);function V(){}var Z=N("kOnFinished");function $(C,h,$J){typeof $J!="boolean"&&($J=h instanceof sQ()),this.objectMode=!!(C&&C.objectMode),$J&&(this.objectMode=this.objectMode||!!(C&&C.writableObjectMode)),this.highWaterMark=C?v(this,C,"writableHighWaterMark",$J):S(!1),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;let qJ=!!(C&&C.decodeStrings===!1);this.decodeStrings=!qJ,this.defaultEncoding=C&&C.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=k.bind(void 0,h),this.writecb=null,this.writelen=0,this.afterWriteTickInfo=null,X(this),this.pendingcb=0,this.constructed=!0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!C||C.emitClose!==!1,this.autoDestroy=!C||C.autoDestroy!==!1,this.errored=null,this.closed=!1,this.closeEmitted=!1,this[Z]=[]}function X(C){C.buffered=[],C.bufferedIndex=0,C.allBuffers=!0,C.allNoop=!0}$.prototype.getBuffer=function(){return M(this.buffered,this.bufferedIndex)},q($.prototype,"bufferedRequestCount",{__proto__:null,get(){return this.buffered.length-this.bufferedIndex}});function U(C){let h=this instanceof sQ();if(!h&&!A(U,this))return new U(C);this._writableState=new $(C,this,h),C&&(typeof C.write=="function"&&(this._write=C.write),typeof C.writev=="function"&&(this._writev=C.writev),typeof C.destroy=="function"&&(this._destroy=C.destroy),typeof C.final=="function"&&(this._final=C.final),typeof C.construct=="function"&&(this._construct=C.construct),C.signal&&F(C.signal,this)),z.call(this,C),P.construct(this,()=>{let $J=this._writableState;$J.writing||QJ(this,$J),e(this,$J)})}q(U,W,{__proto__:null,value:function(C){return A(this,C)?!0:this!==U?!1:C&&C._writableState instanceof $}}),U.prototype.pipe=function(){J(this,new i)};function H(C,h,$J,qJ){let ZJ=C._writableState;if(typeof $J=="function")qJ=$J,$J=ZJ.defaultEncoding;else{if(!$J)$J=ZJ.defaultEncoding;else if($J!=="buffer"&&!j.isEncoding($J))throw new jJ($J);typeof qJ!="function"&&(qJ=V)}if(h===null)throw new HJ;if(!ZJ.objectMode)if(typeof h=="string")ZJ.decodeStrings!==!1&&(h=j.from(h,$J),$J="buffer");else if(h instanceof j)$J="buffer";else if(z._isUint8Array(h))h=z._uint8ArrayToBuffer(h),$J="buffer";else throw new w("chunk",["string","Buffer","Uint8Array"],h);let mJ;return ZJ.ending?mJ=new o:ZJ.destroyed&&(mJ=new JJ("write")),mJ?(R.nextTick(qJ,mJ),J(C,mJ,!0),mJ):(ZJ.pendingcb++,G(C,ZJ,h,$J,qJ))}U.prototype.write=function(C,h,$J){return H(this,C,h,$J)===!0},U.prototype.cork=function(){this._writableState.corked++},U.prototype.uncork=function(){let C=this._writableState;C.corked&&(C.corked--,C.writing||QJ(this,C))},U.prototype.setDefaultEncoding=function(C){if(typeof C=="string"&&(C=O(C)),!j.isEncoding(C))throw new jJ(C);return this._writableState.defaultEncoding=C,this};function G(C,h,$J,qJ,ZJ){let mJ=h.objectMode?1:$J.length;h.length+=mJ;let BJ=h.length<h.highWaterMark;return BJ||(h.needDrain=!0),h.writing||h.corked||h.errored||!h.constructed?(h.buffered.push({chunk:$J,encoding:qJ,callback:ZJ}),h.allBuffers&&qJ!=="buffer"&&(h.allBuffers=!1),h.allNoop&&ZJ!==V&&(h.allNoop=!1)):(h.writelen=mJ,h.writecb=ZJ,h.writing=!0,h.sync=!0,C._write($J,qJ,h.onwrite),h.sync=!1),BJ&&!h.errored&&!h.destroyed}function Q(C,h,$J,qJ,ZJ,mJ,BJ){h.writelen=qJ,h.writecb=BJ,h.writing=!0,h.sync=!0,h.destroyed?h.onwrite(new JJ("write")):$J?C._writev(ZJ,h.onwrite):C._write(ZJ,mJ,h.onwrite),h.sync=!1}function K(C,h,$J,qJ){--h.pendingcb,qJ($J),t(h),J(C,$J)}function k(C,h){let $J=C._writableState,qJ=$J.sync,ZJ=$J.writecb;if(typeof ZJ!="function"){J(C,new m);return}$J.writing=!1,$J.writecb=null,$J.length-=$J.writelen,$J.writelen=0,h?(h.stack,$J.errored||($J.errored=h),C._readableState&&!C._readableState.errored&&(C._readableState.errored=h),qJ?R.nextTick(K,C,$J,h,ZJ):K(C,$J,h,ZJ)):($J.buffered.length>$J.bufferedIndex&&QJ(C,$J),qJ?$J.afterWriteTickInfo!==null&&$J.afterWriteTickInfo.cb===ZJ?$J.afterWriteTickInfo.count++:($J.afterWriteTickInfo={count:1,cb:ZJ,stream:C,state:$J},R.nextTick(L,$J.afterWriteTickInfo)):_(C,$J,1,ZJ))}function L({stream:C,state:h,count:$J,cb:qJ}){return h.afterWriteTickInfo=null,_(C,h,$J,qJ)}function _(C,h,$J,qJ){for(!h.ending&&!C.destroyed&&h.length===0&&h.needDrain&&(h.needDrain=!1,C.emit("drain"));$J-- >0;)h.pendingcb--,qJ();h.destroyed&&t(h),e(C,h)}function t(C){if(C.writing)return;for(let ZJ=C.bufferedIndex;ZJ<C.buffered.length;++ZJ){var h;let{chunk:mJ,callback:BJ}=C.buffered[ZJ],TJ=C.objectMode?1:mJ.length;C.length-=TJ,BJ((h=C.errored)!==null&&h!==void 0?h:new JJ("write"))}let $J=C[Z].splice(0);for(let ZJ=0;ZJ<$J.length;ZJ++){var qJ;$J[ZJ]((qJ=C.errored)!==null&&qJ!==void 0?qJ:new JJ("end"))}X(C)}function QJ(C,h){if(h.corked||h.bufferProcessing||h.destroyed||!h.constructed)return;let{buffered:$J,bufferedIndex:qJ,objectMode:ZJ}=h,mJ=$J.length-qJ;if(!mJ)return;let BJ=qJ;if(h.bufferProcessing=!0,mJ>1&&C._writev){h.pendingcb-=mJ-1;let TJ=h.allNoop?V:(LJ)=>{for(let IJ=BJ;IJ<$J.length;++IJ)$J[IJ].callback(LJ)},dJ=h.allNoop&&BJ===0?$J:M($J,BJ);dJ.allBuffers=h.allBuffers,Q(C,h,!0,h.length,dJ,"",TJ),X(h)}else{do{let{chunk:TJ,encoding:dJ,callback:LJ}=$J[BJ];$J[BJ++]=null;let IJ=ZJ?1:TJ.length;Q(C,h,!1,IJ,TJ,dJ,LJ)}while(BJ<$J.length&&!h.writing);BJ===$J.length?X(h):BJ>256?($J.splice(0,BJ),h.bufferedIndex=0):h.bufferedIndex=BJ}h.bufferProcessing=!1}U.prototype._write=function(C,h,$J){if(this._writev)this._writev([{chunk:C,encoding:h}],$J);else throw new y("_write()")},U.prototype._writev=null,U.prototype.end=function(C,h,$J){let qJ=this._writableState;typeof C=="function"?($J=C,C=null,h=null):typeof h=="function"&&($J=h,h=null);let ZJ;if(C!=null){let mJ=H(this,C,h);mJ instanceof B&&(ZJ=mJ)}return qJ.corked&&(qJ.corked=1,this.uncork()),ZJ||(!qJ.errored&&!qJ.ending?(qJ.ending=!0,e(this,qJ,!0),qJ.ended=!0):qJ.finished?ZJ=new VJ("end"):qJ.destroyed&&(ZJ=new JJ("end"))),typeof $J=="function"&&(ZJ||qJ.finished?R.nextTick($J,ZJ):qJ[Z].push($J)),this};function GJ(C){return C.ending&&!C.destroyed&&C.constructed&&C.length===0&&!C.errored&&C.buffered.length===0&&!C.finished&&!C.writing&&!C.errorEmitted&&!C.closeEmitted}function n(C,h){let $J=!1;function qJ(ZJ){if($J){J(C,ZJ??m());return}if($J=!0,h.pendingcb--,ZJ){let mJ=h[Z].splice(0);for(let BJ=0;BJ<mJ.length;BJ++)mJ[BJ](ZJ);J(C,ZJ,h.sync)}else GJ(h)&&(h.prefinished=!0,C.emit("prefinish"),h.pendingcb++,R.nextTick(PJ,C,h))}h.sync=!0,h.pendingcb++;try{C._final(qJ)}catch(ZJ){qJ(ZJ)}h.sync=!1}function p(C,h){!h.prefinished&&!h.finalCalled&&(typeof C._final=="function"&&!h.destroyed?(h.finalCalled=!0,n(C,h)):(h.prefinished=!0,C.emit("prefinish")))}function e(C,h,$J){GJ(h)&&(p(C,h),h.pendingcb===0&&($J?(h.pendingcb++,R.nextTick((qJ,ZJ)=>{GJ(ZJ)?PJ(qJ,ZJ):ZJ.pendingcb--},C,h)):GJ(h)&&(h.pendingcb++,PJ(C,h))))}function PJ(C,h){h.pendingcb--,h.finished=!0;let $J=h[Z].splice(0);for(let qJ=0;qJ<$J.length;qJ++)$J[qJ]();if(C.emit("finish"),h.autoDestroy){let qJ=C._readableState;(!qJ||qJ.autoDestroy&&(qJ.endEmitted||qJ.readable===!1))&&C.destroy()}}Y(U.prototype,{closed:{__proto__:null,get(){return this._writableState?this._writableState.closed:!1}},destroyed:{__proto__:null,get(){return this._writableState?this._writableState.destroyed:!1},set(C){this._writableState&&(this._writableState.destroyed=C)}},writable:{__proto__:null,get(){let C=this._writableState;return!!C&&C.writable!==!1&&!C.destroyed&&!C.errored&&!C.ending&&!C.ended},set(C){this._writableState&&(this._writableState.writable=!!C)}},writableFinished:{__proto__:null,get(){return this._writableState?this._writableState.finished:!1}},writableObjectMode:{__proto__:null,get(){return this._writableState?this._writableState.objectMode:!1}},writableBuffer:{__proto__:null,get(){return this._writableState&&this._writableState.getBuffer()}},writableEnded:{__proto__:null,get(){return this._writableState?this._writableState.ending:!1}},writableNeedDrain:{__proto__:null,get(){let C=this._writableState;return C?!C.destroyed&&!C.ending&&C.needDrain:!1}},writableHighWaterMark:{__proto__:null,get(){return this._writableState&&this._writableState.highWaterMark}},writableCorked:{__proto__:null,get(){return this._writableState?this._writableState.corked:0}},writableLength:{__proto__:null,get(){return this._writableState&&this._writableState.length}},errored:{__proto__:null,enumerable:!1,get(){return this._writableState?this._writableState.errored:null}},writableAborted:{__proto__:null,enumerable:!1,get:function(){return!!(this._writableState.writable!==!1&&(this._writableState.destroyed||this._writableState.errored)&&!this._writableState.finished)}}});var XJ=P.destroy;U.prototype.destroy=function(C,h){let $J=this._writableState;return!$J.destroyed&&($J.bufferedIndex<$J.buffered.length||$J[Z].length)&&R.nextTick(t,$J),XJ.call(this,C,h),this},U.prototype._undestroy=P.undestroy,U.prototype._destroy=function(C,h){h(C)},U.prototype[I.captureRejectionSymbol]=function(C){this.destroy(C)};var WJ;function b(){return WJ===void 0&&(WJ={}),WJ}U.fromWeb=function(C,h){return b().newStreamWritableFromWritableStream(C,h)},U.toWeb=function(C){return b().newWritableStreamFromStreamWritable(C)}}),O8=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),M=yQ(),{isReadable:B,isWritable:A,isIterable:q,isNodeStream:Y,isReadableNodeStream:E,isWritableNodeStream:O,isDuplexNodeStream:N}=tQ(),W=eQ(),{AbortError:I,codes:{ERR_INVALID_ARG_TYPE:z,ERR_INVALID_RETURN_VALUE:j}}=gQ(),{destroyer:P}=qV(),F=sQ(),v=DV(),{createDeferredPromise:S}=iQ(),w=v0(),y=globalThis.Blob||M.Blob,m=typeof y<"u"?function(jJ){return jJ instanceof y}:function(jJ){return!1},i=globalThis.AbortController||lV().AbortController,{FunctionPrototypeCall:JJ}=bQ(),VJ=class extends F{constructor(jJ){super(jJ),jJ?.readable===!1&&(this._readableState.readable=!1,this._readableState.ended=!0,this._readableState.endEmitted=!0),jJ?.writable===!1&&(this._writableState.writable=!1,this._writableState.ending=!0,this._writableState.ended=!0,this._writableState.finished=!0)}};g.exports=function jJ(J,V){if(N(J))return J;if(E(J))return o({readable:J});if(O(J))return o({writable:J});if(Y(J))return o({writable:!1,readable:!1});if(typeof J=="function"){let{value:$,write:X,final:U,destroy:H}=HJ(J);if(q($))return w(VJ,$,{objectMode:!0,write:X,final:U,destroy:H});let G=$?.then;if(typeof G=="function"){let Q,K=JJ(G,$,(k)=>{if(k!=null)throw new j("nully","body",k)},(k)=>{P(Q,k)});return Q=new VJ({objectMode:!0,readable:!1,write:X,final(k){U(async()=>{try{await K,R.nextTick(k,null)}catch(L){R.nextTick(k,L)}})},destroy:H})}throw new j("Iterable, AsyncIterable or AsyncFunction",V,$)}if(m(J))return jJ(J.arrayBuffer());if(q(J))return w(VJ,J,{objectMode:!0,writable:!1});if(typeof J?.writable=="object"||typeof J?.readable=="object"){let $=J!=null&&J.readable?E(J?.readable)?J?.readable:jJ(J.readable):void 0,X=J!=null&&J.writable?O(J?.writable)?J?.writable:jJ(J.writable):void 0;return o({readable:$,writable:X})}let Z=J?.then;if(typeof Z=="function"){let $;return JJ(Z,J,(X)=>{X!=null&&$.push(X),$.push(null)},(X)=>{P($,X)}),$=new VJ({objectMode:!0,writable:!1,read(){}})}throw new z(V,["Blob","ReadableStream","WritableStream","Stream","Iterable","AsyncIterable","Function","{ readable, writable } pair","Promise"],J)};function HJ(jJ){let{promise:J,resolve:V}=S(),Z=new i,$=Z.signal;return{value:jJ(async function*(){for(;;){let X=J;J=null;let{chunk:U,done:H,cb:G}=await X;if(R.nextTick(G),H)return;if($.aborted)throw new I(void 0,{cause:$.reason});({promise:J,resolve:V}=S()),yield U}}(),{signal:$}),write(X,U,H){let G=V;V=null,G({chunk:X,done:!1,cb:H})},final(X){let U=V;V=null,U({done:!0,cb:X})},destroy(X,U){Z.abort(),U(X)}}}function o(jJ){let J=jJ.readable&&typeof jJ.readable.read!="function"?v.wrap(jJ.readable):jJ.readable,V=jJ.writable,Z=!!B(J),$=!!A(V),X,U,H,G,Q;function K(k){let L=G;G=null,L?L(k):k?Q.destroy(k):!Z&&!$&&Q.destroy()}return Q=new VJ({readableObjectMode:!!(J!=null&&J.readableObjectMode),writableObjectMode:!!(V!=null&&V.writableObjectMode),readable:Z,writable:$}),$&&(W(V,(k)=>{$=!1,k&&P(J,k),K(k)}),Q._write=function(k,L,_){V.write(k,L)?_():X=_},Q._final=function(k){V.end(),U=k},V.on("drain",function(){if(X){let k=X;X=null,k()}}),V.on("finish",function(){if(U){let k=U;U=null,k()}})),Z&&(W(J,(k)=>{Z=!1,k&&P(J,k),K(k)}),J.on("readable",function(){if(H){let k=H;H=null,k()}}),J.on("end",function(){Q.push(null)}),Q._read=function(){for(;;){let k=J.read();if(k===null){H=Q._read;return}if(!Q.push(k))return}}),Q._destroy=function(k,L){!k&&G!==null&&(k=new I),H=null,X=null,U=null,G===null?L(k):(G=L,P(V,k),P(J,k))},Q}}),sQ=OJ((l,g)=>{var{ObjectDefineProperties:R,ObjectGetOwnPropertyDescriptor:M,ObjectKeys:B,ObjectSetPrototypeOf:A}=bQ();g.exports=E;var q=DV(),Y=M0();A(E.prototype,q.prototype),A(E,q);{let I=B(Y.prototype);for(let z=0;z<I.length;z++){let j=I[z];E.prototype[j]||(E.prototype[j]=Y.prototype[j])}}function E(I){if(!(this instanceof E))return new E(I);q.call(this,I),Y.call(this,I),I?(this.allowHalfOpen=I.allowHalfOpen!==!1,I.readable===!1&&(this._readableState.readable=!1,this._readableState.ended=!0,this._readableState.endEmitted=!0),I.writable===!1&&(this._writableState.writable=!1,this._writableState.ending=!0,this._writableState.ended=!0,this._writableState.finished=!0)):this.allowHalfOpen=!0}R(E.prototype,{writable:{__proto__:null,...M(Y.prototype,"writable")},writableHighWaterMark:{__proto__:null,...M(Y.prototype,"writableHighWaterMark")},writableObjectMode:{__proto__:null,...M(Y.prototype,"writableObjectMode")},writableBuffer:{__proto__:null,...M(Y.prototype,"writableBuffer")},writableLength:{__proto__:null,...M(Y.prototype,"writableLength")},writableFinished:{__proto__:null,...M(Y.prototype,"writableFinished")},writableCorked:{__proto__:null,...M(Y.prototype,"writableCorked")},writableEnded:{__proto__:null,...M(Y.prototype,"writableEnded")},writableNeedDrain:{__proto__:null,...M(Y.prototype,"writableNeedDrain")},destroyed:{__proto__:null,get(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set(I){this._readableState&&this._writableState&&(this._readableState.destroyed=I,this._writableState.destroyed=I)}}});var O;function N(){return O===void 0&&(O={}),O}E.fromWeb=function(I,z){return N().newStreamDuplexFromReadableWritablePair(I,z)},E.toWeb=function(I){return N().newReadableWritablePairFromDuplex(I)};var W;E.from=function(I){return W||(W=O8()),W(I,"body")}}),_0=OJ((l,g)=>{var{ObjectSetPrototypeOf:R,Symbol:M}=bQ();g.exports=E;var{ERR_METHOD_NOT_IMPLEMENTED:B}=gQ().codes,A=sQ(),{getHighWaterMark:q}=nV();R(E.prototype,A.prototype),R(E,A);var Y=M("kCallback");function E(W){if(!(this instanceof E))return new E(W);let I=W?q(this,W,"readableHighWaterMark",!0):null;I===0&&(W={...W,highWaterMark:null,readableHighWaterMark:I,writableHighWaterMark:W.writableHighWaterMark||0}),A.call(this,W),this._readableState.sync=!1,this[Y]=null,W&&(typeof W.transform=="function"&&(this._transform=W.transform),typeof W.flush=="function"&&(this._flush=W.flush)),this.on("prefinish",N)}function O(W){typeof this._flush=="function"&&!this.destroyed?this._flush((I,z)=>{if(I){W?W(I):this.destroy(I);return}z!=null&&this.push(z),this.push(null),W&&W()}):(this.push(null),W&&W())}function N(){this._final!==O&&O.call(this)}E.prototype._final=O,E.prototype._transform=function(W,I,z){throw new B("_transform()")},E.prototype._write=function(W,I,z){let j=this._readableState,P=this._writableState,F=j.length;this._transform(W,I,(v,S)=>{if(v){z(v);return}S!=null&&this.push(S),P.ended||F===j.length||j.length<j.highWaterMark?z():this[Y]=z})},E.prototype._read=function(){if(this[Y]){let W=this[Y];this[Y]=null,W()}}}),b0=OJ((l,g)=>{var{ObjectSetPrototypeOf:R}=bQ();g.exports=B;var M=_0();R(B.prototype,M.prototype),R(B,M);function B(A){if(!(this instanceof B))return new B(A);M.call(this,A)}B.prototype._transform=function(A,q,Y){Y(null,A)}}),oV=OJ((l,g)=>{var R=(aQ(),fQ(lQ)),{ArrayIsArray:M,Promise:B,SymbolAsyncIterator:A}=bQ(),q=eQ(),{once:Y}=iQ(),E=qV(),O=sQ(),{aggregateTwoErrors:N,codes:{ERR_INVALID_ARG_TYPE:W,ERR_INVALID_RETURN_VALUE:I,ERR_MISSING_ARGS:z,ERR_STREAM_DESTROYED:j,ERR_STREAM_PREMATURE_CLOSE:P},AbortError:F}=gQ(),{validateFunction:v,validateAbortSignal:S}=FV(),{isIterable:w,isReadable:y,isReadableNodeStream:m,isNodeStream:i}=tQ(),JJ=globalThis.AbortController||lV().AbortController,VJ,HJ;function o(H,G,Q){let K=!1;H.on("close",()=>{K=!0});let k=q(H,{readable:G,writable:Q},(L)=>{K=!L});return{destroy:(L)=>{K||(K=!0,E.destroyer(H,L||new j("pipe")))},cleanup:k}}function jJ(H){return v(H[H.length-1],"streams[stream.length - 1]"),H.pop()}function J(H){if(w(H))return H;if(m(H))return V(H);throw new W("val",["Readable","Iterable","AsyncIterable"],H)}async function*V(H){HJ||(HJ=DV()),yield*HJ.prototype[A].call(H)}async function Z(H,G,Q,{end:K}){let k,L=null,_=(GJ)=>{if(GJ&&(k=GJ),L){let n=L;L=null,n()}},t=()=>new B((GJ,n)=>{k?n(k):L=()=>{k?n(k):GJ()}});G.on("drain",_);let QJ=q(G,{readable:!1},_);try{G.writableNeedDrain&&await t();for await(let GJ of H)G.write(GJ)||await t();K&&G.end(),await t(),Q()}catch(GJ){Q(k!==GJ?N(k,GJ):GJ)}finally{QJ(),G.off("drain",_)}}function $(...H){return X(H,Y(jJ(H)))}function X(H,G,Q){if(H.length===1&&M(H[0])&&(H=H[0]),H.length<2)throw new z("streams");let K=new JJ,k=K.signal,L=Q?.signal,_=[];S(L,"options.signal");function t(){PJ(new F)}L?.addEventListener("abort",t);let QJ,GJ,n=[],p=0;function e(C){PJ(C,--p===0)}function PJ(C,h){if(C&&(!QJ||QJ.code==="ERR_STREAM_PREMATURE_CLOSE")&&(QJ=C),!(!QJ&&!h)){for(;n.length;)n.shift()(QJ);L?.removeEventListener("abort",t),K.abort(),h&&(QJ||_.forEach(($J)=>$J()),R.nextTick(G,QJ,GJ))}}let XJ;for(let C=0;C<H.length;C++){let h=H[C],$J=C<H.length-1,qJ=C>0,ZJ=$J||Q?.end!==!1,mJ=C===H.length-1;if(i(h)){let BJ=function(TJ){TJ&&TJ.name!=="AbortError"&&TJ.code!=="ERR_STREAM_PREMATURE_CLOSE"&&e(TJ)};var WJ=BJ;if(ZJ){let{destroy:TJ,cleanup:dJ}=o(h,$J,qJ);n.push(TJ),y(h)&&mJ&&_.push(dJ)}h.on("error",BJ),y(h)&&mJ&&_.push(()=>{h.removeListener("error",BJ)})}if(C===0)if(typeof h=="function"){if(XJ=h({signal:k}),!w(XJ))throw new I("Iterable, AsyncIterable or Stream","source",XJ)}else w(h)||m(h)?XJ=h:XJ=O.from(h);else if(typeof h=="function")if(XJ=J(XJ),XJ=h(XJ,{signal:k}),$J){if(!w(XJ,!0))throw new I("AsyncIterable",`transform[${C-1}]`,XJ)}else{var b;VJ||(VJ=b0());let BJ=new VJ({objectMode:!0}),TJ=(b=XJ)===null||b===void 0?void 0:b.then;if(typeof TJ=="function")p++,TJ.call(XJ,(IJ)=>{GJ=IJ,IJ!=null&&BJ.write(IJ),ZJ&&BJ.end(),R.nextTick(e)},(IJ)=>{BJ.destroy(IJ),R.nextTick(e,IJ)});else if(w(XJ,!0))p++,Z(XJ,BJ,e,{end:ZJ});else throw new I("AsyncIterable or Promise","destination",XJ);XJ=BJ;let{destroy:dJ,cleanup:LJ}=o(XJ,!1,!0);n.push(dJ),mJ&&_.push(LJ)}else if(i(h)){if(m(XJ)){p+=2;let BJ=U(XJ,h,e,{end:ZJ});y(h)&&mJ&&_.push(BJ)}else if(w(XJ))p++,Z(XJ,h,e,{end:ZJ});else throw new W("val",["Readable","Iterable","AsyncIterable"],XJ);XJ=h}else XJ=O.from(h)}return(k!=null&&k.aborted||L!=null&&L.aborted)&&R.nextTick(t),XJ}function U(H,G,Q,{end:K}){let k=!1;return G.on("close",()=>{k||Q(new P)}),H.pipe(G,{end:K}),K?H.once("end",()=>{k=!0,G.end()}):Q(),q(H,{readable:!0,writable:!1},(L)=>{let _=H._readableState;L&&L.code==="ERR_STREAM_PREMATURE_CLOSE"&&_&&_.ended&&!_.errored&&!_.errorEmitted?H.once("end",Q).once("error",Q):Q(L)}),q(G,{readable:!1,writable:!0},Q)}g.exports={pipelineImpl:X,pipeline:$}}),j8=OJ((l,g)=>{var{pipeline:R}=oV(),M=sQ(),{destroyer:B}=qV(),{isNodeStream:A,isReadable:q,isWritable:Y}=tQ(),{AbortError:E,codes:{ERR_INVALID_ARG_VALUE:O,ERR_MISSING_ARGS:N}}=gQ();g.exports=function(...W){if(W.length===0)throw new N("streams");if(W.length===1)return M.from(W[0]);let I=[...W];if(typeof W[0]=="function"&&(W[0]=M.from(W[0])),typeof W[W.length-1]=="function"){let JJ=W.length-1;W[JJ]=M.from(W[JJ])}for(let JJ=0;JJ<W.length;++JJ)if(A(W[JJ])){if(JJ<W.length-1&&!q(W[JJ]))throw new O(`streams[${JJ}]`,I[JJ],"must be readable");if(JJ>0&&!Y(W[JJ]))throw new O(`streams[${JJ}]`,I[JJ],"must be writable")}let z,j,P,F,v;function S(JJ){let VJ=F;F=null,VJ?VJ(JJ):JJ?v.destroy(JJ):!i&&!m&&v.destroy()}let w=W[0],y=R(W,S),m=!!Y(w),i=!!q(y);return v=new M({writableObjectMode:!!(w!=null&&w.writableObjectMode),readableObjectMode:!!(y!=null&&y.writableObjectMode),writable:m,readable:i}),m&&(v._write=function(JJ,VJ,HJ){w.write(JJ,VJ)?HJ():z=HJ},v._final=function(JJ){w.end(),j=JJ},w.on("drain",function(){if(z){let JJ=z;z=null,JJ()}}),y.on("finish",function(){if(j){let JJ=j;j=null,JJ()}})),i&&(y.on("readable",function(){if(P){let JJ=P;P=null,JJ()}}),y.on("end",function(){v.push(null)}),v._read=function(){for(;;){let JJ=y.read();if(JJ===null){P=v._read;return}if(!v.push(JJ))return}}),v._destroy=function(JJ,VJ){!JJ&&F!==null&&(JJ=new E),P=null,z=null,j=null,F===null?VJ(JJ):(F=VJ,B(y,JJ))},v}}),y0=OJ((l,g)=>{var{ArrayPrototypePop:R,Promise:M}=bQ(),{isIterable:B,isNodeStream:A}=tQ(),{pipelineImpl:q}=oV(),{finished:Y}=eQ();function E(...O){return new M((N,W)=>{let I,z,j=O[O.length-1];if(j&&typeof j=="object"&&!A(j)&&!B(j)){let P=R(O);I=P.signal,z=P.end}q(O,(P,F)=>{P?W(P):N(F)},{signal:I,end:z})})}g.exports={finished:Y,pipeline:E}}),T8=OJ((l,g)=>{var{Buffer:R}=yQ(),{ObjectDefineProperty:M,ObjectKeys:B,ReflectApply:A}=bQ(),{promisify:{custom:q}}=iQ(),{streamReturningOperators:Y,promiseReturningOperators:E}=Y8(),{codes:{ERR_ILLEGAL_CONSTRUCTOR:O}}=gQ(),N=j8(),{pipeline:W}=oV(),{destroyer:I}=qV(),z=eQ(),j=y0(),P=tQ(),F=g.exports=sV().Stream;F.isDisturbed=P.isDisturbed,F.isErrored=P.isErrored,F.isReadable=P.isReadable,F.Readable=DV();for(let w of B(Y)){let y=function(...i){if(new.target)throw O();return F.Readable.from(A(m,this,i))};v=y;let m=Y[w];M(y,"name",{__proto__:null,value:m.name}),M(y,"length",{__proto__:null,value:m.length}),M(F.Readable.prototype,w,{__proto__:null,value:y,enumerable:!1,configurable:!0,writable:!0})}var v;for(let w of B(E)){let y=function(...i){if(new.target)throw O();return A(m,this,i)};v=y;let m=E[w];M(y,"name",{__proto__:null,value:m.name}),M(y,"length",{__proto__:null,value:m.length}),M(F.Readable.prototype,w,{__proto__:null,value:y,enumerable:!1,configurable:!0,writable:!0})}var v;F.Writable=M0(),F.Duplex=sQ(),F.Transform=_0(),F.PassThrough=b0(),F.pipeline=W;var{addAbortSignal:S}=dV();F.addAbortSignal=S,F.finished=z,F.destroy=I,F.compose=N,M(F,"promises",{__proto__:null,configurable:!0,enumerable:!0,get(){return j}}),M(W,q,{__proto__:null,enumerable:!0,get(){return j.pipeline}}),M(z,q,{__proto__:null,enumerable:!0,get(){return j.finished}}),F.Stream=F,F._isUint8Array=function(w){return w instanceof Uint8Array},F._uint8ArrayToBuffer=function(w){return R.from(w.buffer,w.byteOffset,w.byteLength)}}),g0=OJ((l,g)=>{var R=T8(),M=y0(),B=R.Readable.destroy;g.exports=R.Readable,g.exports._uint8ArrayToBuffer=R._uint8ArrayToBuffer,g.exports._isUint8Array=R._isUint8Array,g.exports.isDisturbed=R.isDisturbed,g.exports.isErrored=R.isErrored,g.exports.isReadable=R.isReadable,g.exports.Readable=R.Readable,g.exports.Writable=R.Writable,g.exports.Duplex=R.Duplex,g.exports.Transform=R.Transform,g.exports.PassThrough=R.PassThrough,g.exports.addAbortSignal=R.addAbortSignal,g.exports.finished=R.finished,g.exports.destroy=R.destroy,g.exports.destroy=B,g.exports.pipeline=R.pipeline,g.exports.compose=R.compose,Object.defineProperty(R,"promises",{configurable:!0,enumerable:!0,get(){return M}}),g.exports.Stream=R.Stream,g.exports.default=g.exports}),rV={},RV(rV,{default:()=>N8}),I8=cV(()=>{fV(rV,oQ(g0())),N8=oQ(g0())}),nQ=OJ((l,g)=>{var R=XQ().Buffer,M=(I8(),fQ(rV)).Transform,B=hV().StringDecoder,A=JQ();function q(Y){M.call(this),this.hashMode=typeof Y=="string",this.hashMode?this[Y]=this._finalOrDigest:this.final=this._finalOrDigest,this._final&&(this.__final=this._final,this._final=null),this._decoder=null,this._encoding=null}A(q,M),q.prototype.update=function(Y,E,O){typeof Y=="string"&&(Y=R.from(Y,E));var N=this._update(Y);return this.hashMode?this:(O&&(N=this._toString(N,O)),N)},q.prototype.setAutoPadding=function(){},q.prototype.getAuthTag=function(){throw new Error("trying to get auth tag in unsupported state")},q.prototype.setAuthTag=function(){throw new Error("trying to set auth tag in unsupported state")},q.prototype.setAAD=function(){throw new Error("trying to set aad in unsupported state")},q.prototype._transform=function(Y,E,O){var N;try{this.hashMode?this._update(Y):this.push(this._update(Y))}catch(W){N=W}finally{O(N)}},q.prototype._flush=function(Y){var E;try{this.push(this.__final())}catch(O){E=O}Y(E)},q.prototype._finalOrDigest=function(Y){var E=this.__final()||R.alloc(0);return Y&&(E=this._toString(E,Y,!0)),E},q.prototype._toString=function(Y,E,O){if(this._decoder||(this._decoder=new B(E),this._encoding=E),this._encoding!==E)throw new Error("can't switch encodings");var N=this._decoder.write(Y);return O&&(N+=this._decoder.end()),N},g.exports=q}),WV=OJ((l,g)=>{var R=JQ(),M=uV(),B=pV(),A=iV(),q=nQ();function Y(E){q.call(this,"digest"),this._hash=E}R(Y,q),Y.prototype._update=function(E){this._hash.update(E)},Y.prototype._final=function(){return this._hash.digest()},g.exports=function(E){return E=E.toLowerCase(),E==="md5"?new M:E==="rmd160"||E==="ripemd160"?new B:new Y(A(E))}}),E8=OJ((l,g)=>{var R=JQ(),M=XQ().Buffer,B=nQ(),A=M.alloc(128),q=64;function Y(E,O){B.call(this,"digest"),typeof O=="string"&&(O=M.from(O)),this._alg=E,this._key=O,O.length>q?O=E(O):O.length<q&&(O=M.concat([O,A],q));for(var N=this._ipad=M.allocUnsafe(q),W=this._opad=M.allocUnsafe(q),I=0;I<q;I++)N[I]=O[I]^54,W[I]=O[I]^92;this._hash=[N]}R(Y,B),Y.prototype._update=function(E){this._hash.push(E)},Y.prototype._final=function(){var E=this._alg(M.concat(this._hash));return this._alg(M.concat([this._opad,E]))},g.exports=Y}),c0=OJ((l,g)=>{var R=uV();g.exports=function(M){return new R().update(M).digest()}}),f0=OJ((l,g)=>{var R=JQ(),M=E8(),B=nQ(),A=XQ().Buffer,q=c0(),Y=pV(),E=iV(),O=A.alloc(128);function N(W,I){B.call(this,"digest"),typeof I=="string"&&(I=A.from(I));var z=W==="sha512"||W==="sha384"?128:64;if(this._alg=W,this._key=I,I.length>z){var j=W==="rmd160"?new Y:E(W);I=j.update(I).digest()}else I.length<z&&(I=A.concat([I,O],z));for(var P=this._ipad=A.allocUnsafe(z),F=this._opad=A.allocUnsafe(z),v=0;v<z;v++)P[v]=I[v]^54,F[v]=I[v]^92;this._hash=W==="rmd160"?new Y:E(W),this._hash.update(P)}R(N,B),N.prototype._update=function(W){this._hash.update(W)},N.prototype._final=function(){var W=this._hash.digest(),I=this._alg==="rmd160"?new Y:E(this._alg);return I.update(this._opad).update(W).digest()},g.exports=function(W,I){return W=W.toLowerCase(),W==="rmd160"||W==="ripemd160"?new N("rmd160",I):W==="md5"?new M(q,I):new N(W,I)}}),h0=OJ((l,g)=>{g.exports={sha224WithRSAEncryption:{sign:"rsa",hash:"sha224",id:"302d300d06096086480165030402040500041c"},"RSA-SHA224":{sign:"ecdsa/rsa",hash:"sha224",id:"302d300d06096086480165030402040500041c"},sha256WithRSAEncryption:{sign:"rsa",hash:"sha256",id:"3031300d060960864801650304020105000420"},"RSA-SHA256":{sign:"ecdsa/rsa",hash:"sha256",id:"3031300d060960864801650304020105000420"},sha384WithRSAEncryption:{sign:"rsa",hash:"sha384",id:"3041300d060960864801650304020205000430"},"RSA-SHA384":{sign:"ecdsa/rsa",hash:"sha384",id:"3041300d060960864801650304020205000430"},sha512WithRSAEncryption:{sign:"rsa",hash:"sha512",id:"3051300d060960864801650304020305000440"},"RSA-SHA512":{sign:"ecdsa/rsa",hash:"sha512",id:"3051300d060960864801650304020305000440"},"RSA-SHA1":{sign:"rsa",hash:"sha1",id:"3021300906052b0e03021a05000414"},"ecdsa-with-SHA1":{sign:"ecdsa",hash:"sha1",id:""},sha256:{sign:"ecdsa",hash:"sha256",id:""},sha224:{sign:"ecdsa",hash:"sha224",id:""},sha384:{sign:"ecdsa",hash:"sha384",id:""},sha512:{sign:"ecdsa",hash:"sha512",id:""},"DSA-SHA":{sign:"dsa",hash:"sha1",id:""},"DSA-SHA1":{sign:"dsa",hash:"sha1",id:""},DSA:{sign:"dsa",hash:"sha1",id:""},"DSA-WITH-SHA224":{sign:"dsa",hash:"sha224",id:""},"DSA-SHA224":{sign:"dsa",hash:"sha224",id:""},"DSA-WITH-SHA256":{sign:"dsa",hash:"sha256",id:""},"DSA-SHA256":{sign:"dsa",hash:"sha256",id:""},"DSA-WITH-SHA384":{sign:"dsa",hash:"sha384",id:""},"DSA-SHA384":{sign:"dsa",hash:"sha384",id:""},"DSA-WITH-SHA512":{sign:"dsa",hash:"sha512",id:""},"DSA-SHA512":{sign:"dsa",hash:"sha512",id:""},"DSA-RIPEMD160":{sign:"dsa",hash:"rmd160",id:""},ripemd160WithRSA:{sign:"rsa",hash:"rmd160",id:"3021300906052b2403020105000414"},"RSA-RIPEMD160":{sign:"rsa",hash:"rmd160",id:"3021300906052b2403020105000414"},md5WithRSAEncryption:{sign:"rsa",hash:"md5",id:"3020300c06082a864886f70d020505000410"},"RSA-MD5":{sign:"rsa",hash:"md5",id:"3020300c06082a864886f70d020505000410"}}}),R8=OJ((l,g)=>{g.exports=h0()}),m0=OJ((l,g)=>{var R=Math.pow(2,30)-1;g.exports=function(M,B){if(typeof M!="number")throw new TypeError("Iterations not a number");if(M<0)throw new TypeError("Bad iterations");if(typeof B!="number")throw new TypeError("Key length not a number");if(B<0||B>R||B!==B)throw new TypeError("Bad key length")}}),u0=OJ((l,g)=>{var R;global.process&&global.process.browser?R="utf-8":global.process&&global.process.version?(M=parseInt(process.version.split(".")[0].slice(1),10),R=M>=6?"utf-8":"binary"):R="utf-8";var M;g.exports=R}),p0=OJ((l,g)=>{var R=XQ().Buffer;g.exports=function(M,B,A){if(R.isBuffer(M))return M;if(typeof M=="string")return R.from(M,B);if(ArrayBuffer.isView(M))return R.from(M.buffer);throw new TypeError(A+" must be a string, a Buffer, a typed array or a DataView")}}),i0=OJ((l,g)=>{var R=c0(),M=pV(),B=iV(),A=XQ().Buffer,q=m0(),Y=u0(),E=p0(),O=A.alloc(128),N={md5:16,sha1:20,sha224:28,sha256:32,sha384:48,sha512:64,rmd160:20,ripemd160:20};function W(j,P,F){var v=I(j),S=j==="sha512"||j==="sha384"?128:64;P.length>S?P=v(P):P.length<S&&(P=A.concat([P,O],S));for(var w=A.allocUnsafe(S+N[j]),y=A.allocUnsafe(S+N[j]),m=0;m<S;m++)w[m]=P[m]^54,y[m]=P[m]^92;var i=A.allocUnsafe(S+F+4);w.copy(i,0,0,S),this.ipad1=i,this.ipad2=w,this.opad=y,this.alg=j,this.blocksize=S,this.hash=v,this.size=N[j]}W.prototype.run=function(j,P){j.copy(P,this.blocksize);var F=this.hash(P);return F.copy(this.opad,this.blocksize),this.hash(this.opad)};function I(j){function P(v){return B(j).update(v).digest()}function F(v){return new M().update(v).digest()}return j==="rmd160"||j==="ripemd160"?F:j==="md5"?R:P}function z(j,P,F,v,S){q(F,v),j=E(j,Y,"Password"),P=E(P,Y,"Salt"),S=S||"sha1";var w=new W(S,j,P.length),y=A.allocUnsafe(v),m=A.allocUnsafe(P.length+4);P.copy(m,0,0,P.length);for(var i=0,JJ=N[S],VJ=Math.ceil(v/JJ),HJ=1;HJ<=VJ;HJ++){m.writeUInt32BE(HJ,P.length);for(var o=w.run(m,w.ipad1),jJ=o,J=1;J<F;J++){jJ=w.run(jJ,w.ipad2);for(var V=0;V<JJ;V++)o[V]^=jJ[V]}o.copy(y,i),i+=JJ}return y}g.exports=z}),z8=OJ((l,g)=>{var R=XQ().Buffer,M=m0(),B=u0(),A=i0(),q=p0(),Y,E=global.crypto&&global.crypto.subtle,O={sha:"SHA-1","sha-1":"SHA-1",sha1:"SHA-1",sha256:"SHA-256","sha-256":"SHA-256",sha384:"SHA-384","sha-384":"SHA-384","sha-512":"SHA-512",sha512:"SHA-512"},N=[];function W(F){if(global.process&&!global.process.browser||!E||!E.importKey||!E.deriveBits)return Promise.resolve(!1);if(N[F]!==void 0)return N[F];Y=Y||R.alloc(8);var v=j(Y,Y,10,128,F).then(function(){return!0}).catch(function(){return!1});return N[F]=v,v}var I;function z(){return I||(global.process&&global.process.nextTick?I=global.process.nextTick:global.queueMicrotask?I=global.queueMicrotask:global.setImmediate?I=global.setImmediate:I=global.setTimeout,I)}function j(F,v,S,w,y){return E.importKey("raw",F,{name:"PBKDF2"},!1,["deriveBits"]).then(function(m){return E.deriveBits({name:"PBKDF2",salt:v,iterations:S,hash:{name:y}},m,w<<3)}).then(function(m){return R.from(m)})}function P(F,v){F.then(function(S){z()(function(){v(null,S)})},function(S){z()(function(){v(S)})})}g.exports=function(F,v,S,w,y,m){typeof y=="function"&&(m=y,y=void 0),y=y||"sha1";var i=O[y.toLowerCase()];if(!i||typeof global.Promise!="function"){z()(function(){var JJ;try{JJ=A(F,v,S,w,y)}catch(VJ){return m(VJ)}m(null,JJ)});return}if(M(S,w),F=q(F,B,"Password"),v=q(v,B,"Salt"),typeof m!="function")throw new Error("No callback provided to pbkdf2");P(W(i).then(function(JJ){return JJ?j(F,v,S,w,i):A(F,v,S,w,y)}),m)}}),l0=OJ((l)=>{l.pbkdf2=z8(),l.pbkdf2Sync=i0()}),s0=OJ((l)=>{l.readUInt32BE=function(B,A){var q=B[0+A]<<24|B[1+A]<<16|B[2+A]<<8|B[3+A];return q>>>0},l.writeUInt32BE=function(B,A,q){B[0+q]=A>>>24,B[1+q]=A>>>16&255,B[2+q]=A>>>8&255,B[3+q]=A&255},l.ip=function(B,A,q,Y){for(var E=0,O=0,N=6;N>=0;N-=2){for(var W=0;W<=24;W+=8)E<<=1,E|=A>>>W+N&1;for(var W=0;W<=24;W+=8)E<<=1,E|=B>>>W+N&1}for(var N=6;N>=0;N-=2){for(var W=1;W<=25;W+=8)O<<=1,O|=A>>>W+N&1;for(var W=1;W<=25;W+=8)O<<=1,O|=B>>>W+N&1}q[Y+0]=E>>>0,q[Y+1]=O>>>0},l.rip=function(B,A,q,Y){for(var E=0,O=0,N=0;N<4;N++)for(var W=24;W>=0;W-=8)E<<=1,E|=A>>>W+N&1,E<<=1,E|=B>>>W+N&1;for(var N=4;N<8;N++)for(var W=24;W>=0;W-=8)O<<=1,O|=A>>>W+N&1,O<<=1,O|=B>>>W+N&1;q[Y+0]=E>>>0,q[Y+1]=O>>>0},l.pc1=function(B,A,q,Y){for(var E=0,O=0,N=7;N>=5;N--){for(var W=0;W<=24;W+=8)E<<=1,E|=A>>W+N&1;for(var W=0;W<=24;W+=8)E<<=1,E|=B>>W+N&1}for(var W=0;W<=24;W+=8)E<<=1,E|=A>>W+N&1;for(var N=1;N<=3;N++){for(var W=0;W<=24;W+=8)O<<=1,O|=A>>W+N&1;for(var W=0;W<=24;W+=8)O<<=1,O|=B>>W+N&1}for(var W=0;W<=24;W+=8)O<<=1,O|=B>>W+N&1;q[Y+0]=E>>>0,q[Y+1]=O>>>0},l.r28shl=function(B,A){return B<<A&268435455|B>>>28-A};var g=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];l.pc2=function(B,A,q,Y){for(var E=0,O=0,N=g.length>>>1,W=0;W<N;W++)E<<=1,E|=B>>>g[W]&1;for(var W=N;W<g.length;W++)O<<=1,O|=A>>>g[W]&1;q[Y+0]=E>>>0,q[Y+1]=O>>>0},l.expand=function(B,A,q){var Y=0,E=0;Y=(B&1)<<5|B>>>27;for(var O=23;O>=15;O-=4)Y<<=6,Y|=B>>>O&63;for(var O=11;O>=3;O-=4)E|=B>>>O&63,E<<=6;E|=(B&31)<<1|B>>>31,A[q+0]=Y>>>0,A[q+1]=E>>>0};var R=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];l.substitute=function(B,A){for(var q=0,Y=0;Y<4;Y++){var E=B>>>18-Y*6&63,O=R[Y*64+E];q<<=4,q|=O}for(var Y=0;Y<4;Y++){var E=A>>>18-Y*6&63,O=R[256+Y*64+E];q<<=4,q|=O}return q>>>0};var M=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];l.permute=function(B){for(var A=0,q=0;q<M.length;q++)A<<=1,A|=B>>>M[q]&1;return A>>>0},l.padSplit=function(B,A,q){for(var Y=B.toString(2);Y.length<A;)Y="0"+Y;for(var E=[],O=0;O<A;O+=q)E.push(Y.slice(O,O+q));return E.join(" ")}}),hQ=OJ((l,g)=>{g.exports=R;function R(M,B){if(!M)throw new Error(B||"Assertion failed")}R.equal=function(M,B,A){if(M!=B)throw new Error(A||"Assertion failed: "+M+" != "+B)}}),aV=OJ((l,g)=>{var R=hQ();function M(B){this.options=B,this.type=this.options.type,this.blockSize=8,this._init(),this.buffer=new Array(this.blockSize),this.bufferOff=0}g.exports=M,M.prototype._init=function(){},M.prototype.update=function(B){return B.length===0?[]:this.type==="decrypt"?this._updateDecrypt(B):this._updateEncrypt(B)},M.prototype._buffer=function(B,A){for(var q=Math.min(this.buffer.length-this.bufferOff,B.length-A),Y=0;Y<q;Y++)this.buffer[this.bufferOff+Y]=B[A+Y];return this.bufferOff+=q,q},M.prototype._flushBuffer=function(B,A){return this._update(this.buffer,0,B,A),this.bufferOff=0,this.blockSize},M.prototype._updateEncrypt=function(B){var A=0,q=0,Y=(this.bufferOff+B.length)/this.blockSize|0,E=new Array(Y*this.blockSize);this.bufferOff!==0&&(A+=this._buffer(B,A),this.bufferOff===this.buffer.length&&(q+=this._flushBuffer(E,q)));for(var O=B.length-(B.length-A)%this.blockSize;A<O;A+=this.blockSize)this._update(B,A,E,q),q+=this.blockSize;for(;A<B.length;A++,this.bufferOff++)this.buffer[this.bufferOff]=B[A];return E},M.prototype._updateDecrypt=function(B){for(var A=0,q=0,Y=Math.ceil((this.bufferOff+B.length)/this.blockSize)-1,E=new Array(Y*this.blockSize);Y>0;Y--)A+=this._buffer(B,A),q+=this._flushBuffer(E,q);return A+=this._buffer(B,A),E},M.prototype.final=function(B){var A;B&&(A=this.update(B));var q;return this.type==="encrypt"?q=this._finalEncrypt():q=this._finalDecrypt(),A?A.concat(q):q},M.prototype._pad=function(B,A){if(A===0)return!1;for(;A<B.length;)B[A++]=0;return!0},M.prototype._finalEncrypt=function(){if(!this._pad(this.buffer,this.bufferOff))return[];var B=new Array(this.blockSize);return this._update(this.buffer,0,B,0),B},M.prototype._unpad=function(B){return B},M.prototype._finalDecrypt=function(){R.equal(this.bufferOff,this.blockSize,"Not enough data to decrypt");var B=new Array(this.blockSize);return this._flushBuffer(B,0),this._unpad(B)}}),d0=OJ((l,g)=>{var R=hQ(),M=JQ(),B=s0(),A=aV();function q(){this.tmp=new Array(2),this.keys=null}function Y(O){A.call(this,O);var N=new q;this._desState=N,this.deriveKeys(N,O.key)}M(Y,A),g.exports=Y,Y.create=function(O){return new Y(O)};var E=[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1];Y.prototype.deriveKeys=function(O,N){O.keys=new Array(32),R.equal(N.length,this.blockSize,"Invalid key length");var W=B.readUInt32BE(N,0),I=B.readUInt32BE(N,4);B.pc1(W,I,O.tmp,0),W=O.tmp[0],I=O.tmp[1];for(var z=0;z<O.keys.length;z+=2){var j=E[z>>>1];W=B.r28shl(W,j),I=B.r28shl(I,j),B.pc2(W,I,O.keys,z)}},Y.prototype._update=function(O,N,W,I){var z=this._desState,j=B.readUInt32BE(O,N),P=B.readUInt32BE(O,N+4);B.ip(j,P,z.tmp,0),j=z.tmp[0],P=z.tmp[1],this.type==="encrypt"?this._encrypt(z,j,P,z.tmp,0):this._decrypt(z,j,P,z.tmp,0),j=z.tmp[0],P=z.tmp[1],B.writeUInt32BE(W,j,I),B.writeUInt32BE(W,P,I+4)},Y.prototype._pad=function(O,N){for(var W=O.length-N,I=N;I<O.length;I++)O[I]=W;return!0},Y.prototype._unpad=function(O){for(var N=O[O.length-1],W=O.length-N;W<O.length;W++)R.equal(O[W],N);return O.slice(0,O.length-N)},Y.prototype._encrypt=function(O,N,W,I,z){for(var j=N,P=W,F=0;F<O.keys.length;F+=2){var v=O.keys[F],S=O.keys[F+1];B.expand(P,O.tmp,0),v^=O.tmp[0],S^=O.tmp[1];var w=B.substitute(v,S),y=B.permute(w),m=P;P=(j^y)>>>0,j=m}B.rip(P,j,I,z)},Y.prototype._decrypt=function(O,N,W,I,z){for(var j=W,P=N,F=O.keys.length-2;F>=0;F-=2){var v=O.keys[F],S=O.keys[F+1];B.expand(j,O.tmp,0),v^=O.tmp[0],S^=O.tmp[1];var w=B.substitute(v,S),y=B.permute(w),m=j;j=(P^y)>>>0,P=m}B.rip(j,P,I,z)}}),P8=OJ((l)=>{var g=hQ(),R=JQ(),M={};function B(q){g.equal(q.length,8,"Invalid IV length"),this.iv=new Array(8);for(var Y=0;Y<this.iv.length;Y++)this.iv[Y]=q[Y]}function A(q){function Y(W){q.call(this,W),this._cbcInit()}R(Y,q);for(var E=Object.keys(M),O=0;O<E.length;O++){var N=E[O];Y.prototype[N]=M[N]}return Y.create=function(W){return new Y(W)},Y}l.instantiate=A,M._cbcInit=function(){var q=new B(this.options.iv);this._cbcState=q},M._update=function(q,Y,E,O){var N=this._cbcState,W=this.constructor.super_.prototype,I=N.iv;if(this.type==="encrypt"){for(var z=0;z<this.blockSize;z++)I[z]^=q[Y+z];W._update.call(this,I,0,E,O);for(var z=0;z<this.blockSize;z++)I[z]=E[O+z]}else{W._update.call(this,q,Y,E,O);for(var z=0;z<this.blockSize;z++)E[O+z]^=I[z];for(var z=0;z<this.blockSize;z++)I[z]=q[Y+z]}}}),L8=OJ((l,g)=>{var R=hQ(),M=JQ(),B=aV(),A=d0();function q(E,O){R.equal(O.length,24,"Invalid key length");var N=O.slice(0,8),W=O.slice(8,16),I=O.slice(16,24);E==="encrypt"?this.ciphers=[A.create({type:"encrypt",key:N}),A.create({type:"decrypt",key:W}),A.create({type:"encrypt",key:I})]:this.ciphers=[A.create({type:"decrypt",key:I}),A.create({type:"encrypt",key:W}),A.create({type:"decrypt",key:N})]}function Y(E){B.call(this,E);var O=new q(this.type,this.options.key);this._edeState=O}M(Y,B),g.exports=Y,Y.create=function(E){return new Y(E)},Y.prototype._update=function(E,O,N,W){var I=this._edeState;I.ciphers[0]._update(E,O,N,W),I.ciphers[1]._update(N,W,N,W),I.ciphers[2]._update(N,W,N,W)},Y.prototype._pad=A.prototype._pad,Y.prototype._unpad=A.prototype._unpad}),F8=OJ((l)=>{l.utils=s0(),l.Cipher=aV(),l.DES=d0(),l.CBC=P8(),l.EDE=L8()}),D8=OJ((l,g)=>{var R=nQ(),M=F8(),B=JQ(),A=XQ().Buffer,q={"des-ede3-cbc":M.CBC.instantiate(M.EDE),"des-ede3":M.EDE,"des-ede-cbc":M.CBC.instantiate(M.EDE),"des-ede":M.EDE,"des-cbc":M.CBC.instantiate(M.DES),"des-ecb":M.DES};q.des=q["des-cbc"],q.des3=q["des-ede3-cbc"],g.exports=Y,B(Y,R);function Y(E){R.call(this);var O=E.mode.toLowerCase(),N=q[O],W;E.decrypt?W="decrypt":W="encrypt";var I=E.key;A.isBuffer(I)||(I=A.from(I)),(O==="des-ede"||O==="des-ede-cbc")&&(I=A.concat([I,I.slice(0,8)]));var z=E.iv;A.isBuffer(z)||(z=A.from(z)),this._des=N.create({key:I,iv:z,type:W})}Y.prototype._update=function(E){return A.from(this._des.update(E))},Y.prototype._final=function(){return A.from(this._des.final())}}),C8=OJ((l)=>{l.encrypt=function(g,R){return g._cipher.encryptBlock(R)},l.decrypt=function(g,R){return g._cipher.decryptBlock(R)}}),YV=OJ((l,g)=>{g.exports=function(R,M){for(var B=Math.min(R.length,M.length),A=new Buffer(B),q=0;q<B;++q)A[q]=R[q]^M[q];return A}}),k8=OJ((l)=>{var g=YV();l.encrypt=function(R,M){var B=g(M,R._prev);return R._prev=R._cipher.encryptBlock(B),R._prev},l.decrypt=function(R,M){var B=R._prev;R._prev=M;var A=R._cipher.decryptBlock(M);return g(A,B)}}),A8=OJ((l)=>{var g=XQ().Buffer,R=YV();function M(B,A,q){var Y=A.length,E=R(A,B._cache);return B._cache=B._cache.slice(Y),B._prev=g.concat([B._prev,q?A:E]),E}l.encrypt=function(B,A,q){for(var Y=g.allocUnsafe(0),E;A.length;)if(B._cache.length===0&&(B._cache=B._cipher.encryptBlock(B._prev),B._prev=g.allocUnsafe(0)),B._cache.length<=A.length)E=B._cache.length,Y=g.concat([Y,M(B,A.slice(0,E),q)]),A=A.slice(E);else{Y=g.concat([Y,M(B,A,q)]);break}return Y}}),S8=OJ((l)=>{var g=XQ().Buffer;function R(M,B,A){var q=M._cipher.encryptBlock(M._prev),Y=q[0]^B;return M._prev=g.concat([M._prev.slice(1),g.from([A?B:Y])]),Y}l.encrypt=function(M,B,A){for(var q=B.length,Y=g.allocUnsafe(q),E=-1;++E<q;)Y[E]=R(M,B[E],A);return Y}}),x8=OJ((l)=>{var g=XQ().Buffer;function R(B,A,q){for(var Y,E=-1,O=8,N=0,W,I;++E<O;)Y=B._cipher.encryptBlock(B._prev),W=A&1<<7-E?128:0,I=Y[0]^W,N+=(I&128)>>E%8,B._prev=M(B._prev,q?W:I);return N}function M(B,A){var q=B.length,Y=-1,E=g.allocUnsafe(B.length);for(B=g.concat([B,g.from([A])]);++Y<q;)E[Y]=B[Y]<<1|B[Y+1]>>7;return E}l.encrypt=function(B,A,q){for(var Y=A.length,E=g.allocUnsafe(Y),O=-1;++O<Y;)E[O]=R(B,A[O],q);return E}}),w8=OJ((l)=>{var g=YV();function R(M){return M._prev=M._cipher.encryptBlock(M._prev),M._prev}l.encrypt=function(M,B){for(;M._cache.length<B.length;)M._cache=Buffer.concat([M._cache,R(M)]);var A=M._cache.slice(0,B.length);return M._cache=M._cache.slice(B.length),g(B,A)}}),n0=OJ((l,g)=>{function R(M){for(var B=M.length,A;B--;)if(A=M.readUInt8(B),A===255)M.writeUInt8(0,B);else{A++,M.writeUInt8(A,B);break}}g.exports=R}),o0=OJ((l)=>{var g=YV(),R=XQ().Buffer,M=n0();function B(q){var Y=q._cipher.encryptBlockRaw(q._prev);return M(q._prev),Y}var A=16;l.encrypt=function(q,Y){var E=Math.ceil(Y.length/A),O=q._cache.length;q._cache=R.concat([q._cache,R.allocUnsafe(E*A)]);for(var N=0;N<E;N++){var W=B(q),I=O+N*A;q._cache.writeUInt32BE(W[0],I+0),q._cache.writeUInt32BE(W[1],I+4),q._cache.writeUInt32BE(W[2],I+8),q._cache.writeUInt32BE(W[3],I+12)}var z=q._cache.slice(0,Y.length);return q._cache=q._cache.slice(Y.length),g(Y,z)}}),r0=OJ((l,g)=>{g.exports={"aes-128-ecb":{cipher:"AES",key:128,iv:0,mode:"ECB",type:"block"},"aes-192-ecb":{cipher:"AES",key:192,iv:0,mode:"ECB",type:"block"},"aes-256-ecb":{cipher:"AES",key:256,iv:0,mode:"ECB",type:"block"},"aes-128-cbc":{cipher:"AES",key:128,iv:16,mode:"CBC",type:"block"},"aes-192-cbc":{cipher:"AES",key:192,iv:16,mode:"CBC",type:"block"},"aes-256-cbc":{cipher:"AES",key:256,iv:16,mode:"CBC",type:"block"},aes128:{cipher:"AES",key:128,iv:16,mode:"CBC",type:"block"},aes192:{cipher:"AES",key:192,iv:16,mode:"CBC",type:"block"},aes256:{cipher:"AES",key:256,iv:16,mode:"CBC",type:"block"},"aes-128-cfb":{cipher:"AES",key:128,iv:16,mode:"CFB",type:"stream"},"aes-192-cfb":{cipher:"AES",key:192,iv:16,mode:"CFB",type:"stream"},"aes-256-cfb":{cipher:"AES",key:256,iv:16,mode:"CFB",type:"stream"},"aes-128-cfb8":{cipher:"AES",key:128,iv:16,mode:"CFB8",type:"stream"},"aes-192-cfb8":{cipher:"AES",key:192,iv:16,mode:"CFB8",type:"stream"},"aes-256-cfb8":{cipher:"AES",key:256,iv:16,mode:"CFB8",type:"stream"},"aes-128-cfb1":{cipher:"AES",key:128,iv:16,mode:"CFB1",type:"stream"},"aes-192-cfb1":{cipher:"AES",key:192,iv:16,mode:"CFB1",type:"stream"},"aes-256-cfb1":{cipher:"AES",key:256,iv:16,mode:"CFB1",type:"stream"},"aes-128-ofb":{cipher:"AES",key:128,iv:16,mode:"OFB",type:"stream"},"aes-192-ofb":{cipher:"AES",key:192,iv:16,mode:"OFB",type:"stream"},"aes-256-ofb":{cipher:"AES",key:256,iv:16,mode:"OFB",type:"stream"},"aes-128-ctr":{cipher:"AES",key:128,iv:16,mode:"CTR",type:"stream"},"aes-192-ctr":{cipher:"AES",key:192,iv:16,mode:"CTR",type:"stream"},"aes-256-ctr":{cipher:"AES",key:256,iv:16,mode:"CTR",type:"stream"},"aes-128-gcm":{cipher:"AES",key:128,iv:12,mode:"GCM",type:"auth"},"aes-192-gcm":{cipher:"AES",key:192,iv:12,mode:"GCM",type:"auth"},"aes-256-gcm":{cipher:"AES",key:256,iv:12,mode:"GCM",type:"auth"}}}),tV=OJ((l,g)=>{var R={ECB:C8(),CBC:k8(),CFB:A8(),CFB8:S8(),CFB1:x8(),OFB:w8(),CTR:o0(),GCM:o0()},M=r0();for(B in M)M[B].module=R[M[B].mode];var B;g.exports=M}),CV=OJ((l,g)=>{var R=XQ().Buffer;function M(O){R.isBuffer(O)||(O=R.from(O));for(var N=O.length/4|0,W=new Array(N),I=0;I<N;I++)W[I]=O.readUInt32BE(I*4);return W}function B(O){for(var N=0;N<O.length;O++)O[N]=0}function A(O,N,W,I,z){for(var j=W[0],P=W[1],F=W[2],v=W[3],S=O[0]^N[0],w=O[1]^N[1],y=O[2]^N[2],m=O[3]^N[3],i,JJ,VJ,HJ,o=4,jJ=1;jJ<z;jJ++)i=j[S>>>24]^P[w>>>16&255]^F[y>>>8&255]^v[m&255]^N[o++],JJ=j[w>>>24]^P[y>>>16&255]^F[m>>>8&255]^v[S&255]^N[o++],VJ=j[y>>>24]^P[m>>>16&255]^F[S>>>8&255]^v[w&255]^N[o++],HJ=j[m>>>24]^P[S>>>16&255]^F[w>>>8&255]^v[y&255]^N[o++],S=i,w=JJ,y=VJ,m=HJ;return i=(I[S>>>24]<<24|I[w>>>16&255]<<16|I[y>>>8&255]<<8|I[m&255])^N[o++],JJ=(I[w>>>24]<<24|I[y>>>16&255]<<16|I[m>>>8&255]<<8|I[S&255])^N[o++],VJ=(I[y>>>24]<<24|I[m>>>16&255]<<16|I[S>>>8&255]<<8|I[w&255])^N[o++],HJ=(I[m>>>24]<<24|I[S>>>16&255]<<16|I[w>>>8&255]<<8|I[y&255])^N[o++],i=i>>>0,JJ=JJ>>>0,VJ=VJ>>>0,HJ=HJ>>>0,[i,JJ,VJ,HJ]}var q=[0,1,2,4,8,16,32,64,128,27,54],Y=function(){for(var O=new Array(256),N=0;N<256;N++)N<128?O[N]=N<<1:O[N]=N<<1^283;for(var W=[],I=[],z=[[],[],[],[]],j=[[],[],[],[]],P=0,F=0,v=0;v<256;++v){var S=F^F<<1^F<<2^F<<3^F<<4;S=S>>>8^S&255^99,W[P]=S,I[S]=P;var w=O[P],y=O[w],m=O[y],i=O[S]*257^S*16843008;z[0][P]=i<<24|i>>>8,z[1][P]=i<<16|i>>>16,z[2][P]=i<<8|i>>>24,z[3][P]=i,i=m*16843009^y*65537^w*257^P*16843008,j[0][S]=i<<24|i>>>8,j[1][S]=i<<16|i>>>16,j[2][S]=i<<8|i>>>24,j[3][S]=i,P===0?P=F=1:(P=w^O[O[O[m^w]]],F^=O[O[F]])}return{SBOX:W,INV_SBOX:I,SUB_MIX:z,INV_SUB_MIX:j}}();function E(O){this._key=M(O),this._reset()}E.blockSize=16,E.keySize=32,E.prototype.blockSize=E.blockSize,E.prototype.keySize=E.keySize,E.prototype._reset=function(){for(var O=this._key,N=O.length,W=N+6,I=(W+1)*4,z=[],j=0;j<N;j++)z[j]=O[j];for(j=N;j<I;j++){var P=z[j-1];j%N===0?(P=P<<8|P>>>24,P=Y.SBOX[P>>>24]<<24|Y.SBOX[P>>>16&255]<<16|Y.SBOX[P>>>8&255]<<8|Y.SBOX[P&255],P^=q[j/N|0]<<24):N>6&&j%N===4&&(P=Y.SBOX[P>>>24]<<24|Y.SBOX[P>>>16&255]<<16|Y.SBOX[P>>>8&255]<<8|Y.SBOX[P&255]),z[j]=z[j-N]^P}for(var F=[],v=0;v<I;v++){var S=I-v,w=z[S-(v%4?0:4)];v<4||S<=4?F[v]=w:F[v]=Y.INV_SUB_MIX[0][Y.SBOX[w>>>24]]^Y.INV_SUB_MIX[1][Y.SBOX[w>>>16&255]]^Y.INV_SUB_MIX[2][Y.SBOX[w>>>8&255]]^Y.INV_SUB_MIX[3][Y.SBOX[w&255]]}this._nRounds=W,this._keySchedule=z,this._invKeySchedule=F},E.prototype.encryptBlockRaw=function(O){return O=M(O),A(O,this._keySchedule,Y.SUB_MIX,Y.SBOX,this._nRounds)},E.prototype.encryptBlock=function(O){var N=this.encryptBlockRaw(O),W=R.allocUnsafe(16);return W.writeUInt32BE(N[0],0),W.writeUInt32BE(N[1],4),W.writeUInt32BE(N[2],8),W.writeUInt32BE(N[3],12),W},E.prototype.decryptBlock=function(O){O=M(O);var N=O[1];O[1]=O[3],O[3]=N;var W=A(O,this._invKeySchedule,Y.INV_SUB_MIX,Y.INV_SBOX,this._nRounds),I=R.allocUnsafe(16);return I.writeUInt32BE(W[0],0),I.writeUInt32BE(W[3],4),I.writeUInt32BE(W[2],8),I.writeUInt32BE(W[1],12),I},E.prototype.scrub=function(){B(this._keySchedule),B(this._invKeySchedule),B(this._key)},g.exports.AES=E}),v8=OJ((l,g)=>{var R=XQ().Buffer,M=R.alloc(16,0);function B(Y){return[Y.readUInt32BE(0),Y.readUInt32BE(4),Y.readUInt32BE(8),Y.readUInt32BE(12)]}function A(Y){var E=R.allocUnsafe(16);return E.writeUInt32BE(Y[0]>>>0,0),E.writeUInt32BE(Y[1]>>>0,4),E.writeUInt32BE(Y[2]>>>0,8),E.writeUInt32BE(Y[3]>>>0,12),E}function q(Y){this.h=Y,this.state=R.alloc(16,0),this.cache=R.allocUnsafe(0)}q.prototype.ghash=function(Y){for(var E=-1;++E<Y.length;)this.state[E]^=Y[E];this._multiply()},q.prototype._multiply=function(){for(var Y=B(this.h),E=[0,0,0,0],O,N,W,I=-1;++I<128;){for(N=(this.state[~~(I/8)]&1<<7-I%8)!==0,N&&(E[0]^=Y[0],E[1]^=Y[1],E[2]^=Y[2],E[3]^=Y[3]),W=(Y[3]&1)!==0,O=3;O>0;O--)Y[O]=Y[O]>>>1|(Y[O-1]&1)<<31;Y[0]=Y[0]>>>1,W&&(Y[0]=Y[0]^225<<24)}this.state=A(E)},q.prototype.update=function(Y){this.cache=R.concat([this.cache,Y]);for(var E;this.cache.length>=16;)E=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(E)},q.prototype.final=function(Y,E){return this.cache.length&&this.ghash(R.concat([this.cache,M],16)),this.ghash(A([0,Y,0,E])),this.state},g.exports=q}),a0=OJ((l,g)=>{var R=CV(),M=XQ().Buffer,B=nQ(),A=JQ(),q=v8(),Y=YV(),E=n0();function O(I,z){var j=0;I.length!==z.length&&j++;for(var P=Math.min(I.length,z.length),F=0;F<P;++F)j+=I[F]^z[F];return j}function N(I,z,j){if(z.length===12)return I._finID=M.concat([z,M.from([0,0,0,1])]),M.concat([z,M.from([0,0,0,2])]);var P=new q(j),F=z.length,v=F%16;P.update(z),v&&(v=16-v,P.update(M.alloc(v,0))),P.update(M.alloc(8,0));var S=F*8,w=M.alloc(8);w.writeUIntBE(S,0,8),P.update(w),I._finID=P.state;var y=M.from(I._finID);return E(y),y}function W(I,z,j,P){B.call(this);var F=M.alloc(4,0);this._cipher=new R.AES(z);var v=this._cipher.encryptBlock(F);this._ghash=new q(v),j=N(this,j,v),this._prev=M.from(j),this._cache=M.allocUnsafe(0),this._secCache=M.allocUnsafe(0),this._decrypt=P,this._alen=0,this._len=0,this._mode=I,this._authTag=null,this._called=!1}A(W,B),W.prototype._update=function(I){if(!this._called&&this._alen){var z=16-this._alen%16;z<16&&(z=M.alloc(z,0),this._ghash.update(z))}this._called=!0;var j=this._mode.encrypt(this,I);return this._decrypt?this._ghash.update(I):this._ghash.update(j),this._len+=I.length,j},W.prototype._final=function(){if(this._decrypt&&!this._authTag)throw new Error("Unsupported state or unable to authenticate data");var I=Y(this._ghash.final(this._alen*8,this._len*8),this._cipher.encryptBlock(this._finID));if(this._decrypt&&O(I,this._authTag))throw new Error("Unsupported state or unable to authenticate data");this._authTag=I,this._cipher.scrub()},W.prototype.getAuthTag=function(){if(this._decrypt||!M.isBuffer(this._authTag))throw new Error("Attempting to get auth tag in unsupported state");return this._authTag},W.prototype.setAuthTag=function(I){if(!this._decrypt)throw new Error("Attempting to set auth tag in unsupported state");this._authTag=I},W.prototype.setAAD=function(I){if(this._called)throw new Error("Attempting to set AAD in unsupported state");this._ghash.update(I),this._alen+=I.length},g.exports=W}),t0=OJ((l,g)=>{var R=CV(),M=XQ().Buffer,B=nQ(),A=JQ();function q(Y,E,O,N){B.call(this),this._cipher=new R.AES(E),this._prev=M.from(O),this._cache=M.allocUnsafe(0),this._secCache=M.allocUnsafe(0),this._decrypt=N,this._mode=Y}A(q,B),q.prototype._update=function(Y){return this._mode.encrypt(this,Y,this._decrypt)},q.prototype._final=function(){this._cipher.scrub()},g.exports=q}),kV=OJ((l,g)=>{var R=XQ().Buffer,M=uV();function B(A,q,Y,E){if(R.isBuffer(A)||(A=R.from(A,"binary")),q&&(R.isBuffer(q)||(q=R.from(q,"binary")),q.length!==8))throw new RangeError("salt should be Buffer with 8 byte length");for(var O=Y/8,N=R.alloc(O),W=R.alloc(E||0),I=R.alloc(0);O>0||E>0;){var z=new M;z.update(I),z.update(A),q&&z.update(q),I=z.digest();var j=0;if(O>0){var P=N.length-O;j=Math.min(O,I.length),I.copy(N,P,0,j),O-=j}if(j<I.length&&E>0){var F=W.length-E,v=Math.min(E,I.length-j);I.copy(W,F,j,j+v),E-=v}}return I.fill(0),{key:N,iv:W}}g.exports=B}),M8=OJ((l)=>{var g=tV(),R=a0(),M=XQ().Buffer,B=t0(),A=nQ(),q=CV(),Y=kV(),E=JQ();function O(j,P,F){A.call(this),this._cache=new W,this._cipher=new q.AES(P),this._prev=M.from(F),this._mode=j,this._autopadding=!0}E(O,A),O.prototype._update=function(j){this._cache.add(j);for(var P,F,v=[];P=this._cache.get();)F=this._mode.encrypt(this,P),v.push(F);return M.concat(v)};var N=M.alloc(16,16);O.prototype._final=function(){var j=this._cache.flush();if(this._autopadding)return j=this._mode.encrypt(this,j),this._cipher.scrub(),j;if(!j.equals(N))throw this._cipher.scrub(),new Error("data not multiple of block length")},O.prototype.setAutoPadding=function(j){return this._autopadding=!!j,this};function W(){this.cache=M.allocUnsafe(0)}W.prototype.add=function(j){this.cache=M.concat([this.cache,j])},W.prototype.get=function(){if(this.cache.length>15){var j=this.cache.slice(0,16);return this.cache=this.cache.slice(16),j}return null},W.prototype.flush=function(){for(var j=16-this.cache.length,P=M.allocUnsafe(j),F=-1;++F<j;)P.writeUInt8(j,F);return M.concat([this.cache,P])};function I(j,P,F){var v=g[j.toLowerCase()];if(!v)throw new TypeError("invalid suite type");if(typeof P=="string"&&(P=M.from(P)),P.length!==v.key/8)throw new TypeError("invalid key length "+P.length);if(typeof F=="string"&&(F=M.from(F)),v.mode!=="GCM"&&F.length!==v.iv)throw new TypeError("invalid iv length "+F.length);return v.type==="stream"?new B(v.module,P,F):v.type==="auth"?new R(v.module,P,F):new O(v.module,P,F)}function z(j,P){var F=g[j.toLowerCase()];if(!F)throw new TypeError("invalid suite type");var v=Y(P,!1,F.key,F.iv);return I(j,v.key,v.iv)}l.createCipheriv=I,l.createCipher=z}),_8=OJ((l)=>{var g=a0(),R=XQ().Buffer,M=tV(),B=t0(),A=nQ(),q=CV(),Y=kV(),E=JQ();function O(j,P,F){A.call(this),this._cache=new N,this._last=void 0,this._cipher=new q.AES(P),this._prev=R.from(F),this._mode=j,this._autopadding=!0}E(O,A),O.prototype._update=function(j){this._cache.add(j);for(var P,F,v=[];P=this._cache.get(this._autopadding);)F=this._mode.decrypt(this,P),v.push(F);return R.concat(v)},O.prototype._final=function(){var j=this._cache.flush();if(this._autopadding)return W(this._mode.decrypt(this,j));if(j)throw new Error("data not multiple of block length")},O.prototype.setAutoPadding=function(j){return this._autopadding=!!j,this};function N(){this.cache=R.allocUnsafe(0)}N.prototype.add=function(j){this.cache=R.concat([this.cache,j])},N.prototype.get=function(j){var P;if(j){if(this.cache.length>16)return P=this.cache.slice(0,16),this.cache=this.cache.slice(16),P}else if(this.cache.length>=16)return P=this.cache.slice(0,16),this.cache=this.cache.slice(16),P;return null},N.prototype.flush=function(){if(this.cache.length)return this.cache};function W(j){var P=j[15];if(P<1||P>16)throw new Error("unable to decrypt data");for(var F=-1;++F<P;)if(j[F+(16-P)]!==P)throw new Error("unable to decrypt data");if(P!==16)return j.slice(0,16-P)}function I(j,P,F){var v=M[j.toLowerCase()];if(!v)throw new TypeError("invalid suite type");if(typeof F=="string"&&(F=R.from(F)),v.mode!=="GCM"&&F.length!==v.iv)throw new TypeError("invalid iv length "+F.length);if(typeof P=="string"&&(P=R.from(P)),P.length!==v.key/8)throw new TypeError("invalid key length "+P.length);return v.type==="stream"?new B(v.module,P,F,!0):v.type==="auth"?new g(v.module,P,F,!0):new O(v.module,P,F)}function z(j,P){var F=M[j.toLowerCase()];if(!F)throw new TypeError("invalid suite type");var v=Y(P,!1,F.key,F.iv);return I(j,v.key,v.iv)}l.createDecipher=z,l.createDecipheriv=I}),eV=OJ((l)=>{var g=M8(),R=_8(),M=r0();function B(){return Object.keys(M)}l.createCipher=l.Cipher=g.createCipher,l.createCipheriv=l.Cipheriv=g.createCipheriv,l.createDecipher=l.Decipher=R.createDecipher,l.createDecipheriv=l.Decipheriv=R.createDecipheriv,l.listCiphers=l.getCiphers=B}),b8=OJ((l)=>{l["des-ecb"]={key:8,iv:0},l["des-cbc"]=l.des={key:8,iv:8},l["des-ede3-cbc"]=l.des3={key:24,iv:8},l["des-ede3"]={key:24,iv:0},l["des-ede-cbc"]={key:16,iv:8},l["des-ede"]={key:16,iv:0}}),y8=OJ((l)=>{var g=D8(),R=eV(),M=tV(),B=b8(),A=kV();function q(W,I){W=W.toLowerCase();var z,j;if(M[W])z=M[W].key,j=M[W].iv;else if(B[W])z=B[W].key*8,j=B[W].iv;else throw new TypeError("invalid suite type");var P=A(I,!1,z,j);return E(W,P.key,P.iv)}function Y(W,I){W=W.toLowerCase();var z,j;if(M[W])z=M[W].key,j=M[W].iv;else if(B[W])z=B[W].key*8,j=B[W].iv;else throw new TypeError("invalid suite type");var P=A(I,!1,z,j);return O(W,P.key,P.iv)}function E(W,I,z){if(W=W.toLowerCase(),M[W])return R.createCipheriv(W,I,z);if(B[W])return new g({key:I,iv:z,mode:W});throw new TypeError("invalid suite type")}function O(W,I,z){if(W=W.toLowerCase(),M[W])return R.createDecipheriv(W,I,z);if(B[W])return new g({key:I,iv:z,mode:W,decrypt:!0});throw new TypeError("invalid suite type")}function N(){return Object.keys(B).concat(R.getCiphers())}l.createCipher=l.Cipher=q,l.createCipheriv=l.Cipheriv=E,l.createDecipher=l.Decipher=Y,l.createDecipheriv=l.Decipheriv=O,l.listCiphers=l.getCiphers=N}),JV=OJ(()=>{}),e0=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),g8=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),c8=OJ(()=>{}),J0=OJ((l,g)=>{var R;g.exports=function(A){return R||(R=new M(null)),R.generate(A)};function M(A){this.rand=A}if(g.exports.Rand=M,M.prototype.generate=function(A){return this._rand(A)},M.prototype._rand=function(A){if(this.rand.getBytes)return this.rand.getBytes(A);for(var q=new Uint8Array(A),Y=0;Y<q.length;Y++)q[Y]=this.rand.getByte();return q},typeof self=="object")self.crypto&&self.crypto.getRandomValues?M.prototype._rand=function(A){var q=new Uint8Array(A);return self.crypto.getRandomValues(q),q}:self.msCrypto&&self.msCrypto.getRandomValues?M.prototype._rand=function(A){var q=new Uint8Array(A);return self.msCrypto.getRandomValues(q),q}:typeof window=="object"&&(M.prototype._rand=function(){throw new Error("Not implemented yet")});else try{if(B=c8(),typeof B.randomBytes!="function")throw new Error("Not supported");M.prototype._rand=function(A){return B.randomBytes(A)}}catch{}var B}),J6=OJ((l,g)=>{var R=g8(),M=J0();function B(A){this.rand=A||new M.Rand}g.exports=B,B.create=function(A){return new B(A)},B.prototype._randbelow=function(A){var q=A.bitLength(),Y=Math.ceil(q/8);do var E=new R(this.rand.generate(Y));while(E.cmp(A)>=0);return E},B.prototype._randrange=function(A,q){var Y=q.sub(A);return A.add(this._randbelow(Y))},B.prototype.test=function(A,q,Y){var E=A.bitLength(),O=R.mont(A),N=new R(1).toRed(O);q||(q=Math.max(1,E/48|0));for(var W=A.subn(1),I=0;!W.testn(I);I++);for(var z=A.shrn(I),j=W.toRed(O),P=!0;q>0;q--){var F=this._randrange(new R(2),W);Y&&Y(F);var v=F.toRed(O).redPow(z);if(!(v.cmp(N)===0||v.cmp(j)===0)){for(var S=1;S<I;S++){if(v=v.redSqr(),v.cmp(N)===0)return!1;if(v.cmp(j)===0)break}if(S===I)return!1}}return P},B.prototype.getDivisor=function(A,q){var Y=A.bitLength(),E=R.mont(A),O=new R(1).toRed(E);q||(q=Math.max(1,Y/48|0));for(var N=A.subn(1),W=0;!N.testn(W);W++);for(var I=A.shrn(W),z=N.toRed(E);q>0;q--){var j=this._randrange(new R(2),N),P=A.gcd(j);if(P.cmpn(1)!==0)return P;var F=j.toRed(E).redPow(I);if(!(F.cmp(O)===0||F.cmp(z)===0)){for(var v=1;v<W;v++){if(F=F.redSqr(),F.cmp(O)===0)return F.fromRed().subn(1).gcd(A);if(F.cmp(z)===0)break}if(v===W)return F=F.redSqr(),F.fromRed().subn(1).gcd(A)}}return!1}}),Q6=OJ((l,g)=>{var R=VV();g.exports=i,i.simpleSieve=y,i.fermatTest=m;var M=e0(),B=new M(24),A=J6(),q=new A,Y=new M(1),E=new M(2),O=new M(5),N=new M(16),W=new M(8),I=new M(10),z=new M(3),j=new M(7),P=new M(11),F=new M(4),v=new M(12),S=null;function w(){if(S!==null)return S;var JJ=1048576,VJ=[];VJ[0]=2;for(var HJ=1,o=3;o<JJ;o+=2){for(var jJ=Math.ceil(Math.sqrt(o)),J=0;J<HJ&&VJ[J]<=jJ&&o%VJ[J]!==0;J++);HJ!==J&&VJ[J]<=jJ||(VJ[HJ++]=o)}return S=VJ,VJ}function y(JJ){for(var VJ=w(),HJ=0;HJ<VJ.length;HJ++)if(JJ.modn(VJ[HJ])===0)return JJ.cmpn(VJ[HJ])===0;return!0}function m(JJ){var VJ=M.mont(JJ);return E.toRed(VJ).redPow(JJ.subn(1)).fromRed().cmpn(1)===0}function i(JJ,VJ){if(JJ<16)return VJ===2||VJ===5?new M([140,123]):new M([140,39]);VJ=new M(VJ);for(var HJ,o;;){for(HJ=new M(R(Math.ceil(JJ/8)));HJ.bitLength()>JJ;)HJ.ishrn(1);if(HJ.isEven()&&HJ.iadd(Y),HJ.testn(1)||HJ.iadd(E),VJ.cmp(E)){if(!VJ.cmp(O))for(;HJ.mod(I).cmp(z);)HJ.iadd(F)}else for(;HJ.mod(B).cmp(P);)HJ.iadd(F);if(o=HJ.shrn(1),y(o)&&y(HJ)&&m(o)&&m(HJ)&&q.test(o)&&q.test(HJ))return HJ}}}),f8=OJ((l,g)=>{g.exports={modp1:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},modp2:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},modp5:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},modp14:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},modp15:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},modp16:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},modp17:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},modp18:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}}),h8=OJ((l,g)=>{var R=e0(),M=J6(),B=new M,A=new R(24),q=new R(11),Y=new R(10),E=new R(3),O=new R(7),N=Q6(),W=VV();g.exports=F;function I(S,w){return w=w||"utf8",Buffer.isBuffer(S)||(S=new Buffer(S,w)),this._pub=new R(S),this}function z(S,w){return w=w||"utf8",Buffer.isBuffer(S)||(S=new Buffer(S,w)),this._priv=new R(S),this}var j={};function P(S,w){var y=w.toString("hex"),m=[y,S.toString(16)].join("_");if(m in j)return j[m];var i=0;if(S.isEven()||!N.simpleSieve||!N.fermatTest(S)||!B.test(S))return i+=1,y==="02"||y==="05"?i+=8:i+=4,j[m]=i,i;B.test(S.shrn(1))||(i+=2);var JJ;switch(y){case"02":S.mod(A).cmp(q)&&(i+=8);break;case"05":JJ=S.mod(Y),JJ.cmp(E)&&JJ.cmp(O)&&(i+=8);break;default:i+=4}return j[m]=i,i}function F(S,w,y){this.setGenerator(w),this.__prime=new R(S),this._prime=R.mont(this.__prime),this._primeLen=S.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,y?(this.setPublicKey=I,this.setPrivateKey=z):this._primeCode=8}Object.defineProperty(F.prototype,"verifyError",{enumerable:!0,get:function(){return typeof this._primeCode!="number"&&(this._primeCode=P(this.__prime,this.__gen)),this._primeCode}}),F.prototype.generateKeys=function(){return this._priv||(this._priv=new R(W(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},F.prototype.computeSecret=function(S){S=new R(S),S=S.toRed(this._prime);var w=S.redPow(this._priv).fromRed(),y=new Buffer(w.toArray()),m=this.getPrime();if(y.length<m.length){var i=new Buffer(m.length-y.length);i.fill(0),y=Buffer.concat([i,y])}return y},F.prototype.getPublicKey=function(S){return v(this._pub,S)},F.prototype.getPrivateKey=function(S){return v(this._priv,S)},F.prototype.getPrime=function(S){return v(this.__prime,S)},F.prototype.getGenerator=function(S){return v(this._gen,S)},F.prototype.setGenerator=function(S,w){return w=w||"utf8",Buffer.isBuffer(S)||(S=new Buffer(S,w)),this.__gen=S,this._gen=new R(S),this};function v(S,w){var y=new Buffer(S.toArray());return w?y.toString(w):y}}),m8=OJ((l)=>{var g=Q6(),R=f8(),M=h8();function B(Y){var E=new Buffer(R[Y].prime,"hex"),O=new Buffer(R[Y].gen,"hex");return new M(E,O)}var A={binary:!0,hex:!0,base64:!0};function q(Y,E,O,N){return Buffer.isBuffer(E)||A[E]===void 0?q(Y,"binary",E,O):(E=E||"binary",N=N||"binary",O=O||new Buffer([2]),Buffer.isBuffer(O)||(O=new Buffer(O,N)),typeof Y=="number"?new M(g(Y,O),O,!0):(Buffer.isBuffer(Y)||(Y=new Buffer(Y,E)),new M(Y,O,!0)))}l.DiffieHellmanGroup=l.createDiffieHellmanGroup=l.getDiffieHellman=B,l.createDiffieHellman=l.DiffieHellman=q}),V6=OJ((l,g)=>{g.exports=rQ().EventEmitter}),u8=OJ((l,g)=>{function R(j,P){var F=Object.keys(j);if(Object.getOwnPropertySymbols){var v=Object.getOwnPropertySymbols(j);P&&(v=v.filter(function(S){return Object.getOwnPropertyDescriptor(j,S).enumerable})),F.push.apply(F,v)}return F}function M(j){for(var P=1;P<arguments.length;P++){var F=arguments[P]!=null?arguments[P]:{};P%2?R(Object(F),!0).forEach(function(v){B(j,v,F[v])}):Object.getOwnPropertyDescriptors?Object.defineProperties(j,Object.getOwnPropertyDescriptors(F)):R(Object(F)).forEach(function(v){Object.defineProperty(j,v,Object.getOwnPropertyDescriptor(F,v))})}return j}function B(j,P,F){return P in j?Object.defineProperty(j,P,{value:F,enumerable:!0,configurable:!0,writable:!0}):j[P]=F,j}function A(j,P){if(!(j instanceof P))throw new TypeError("Cannot call a class as a function")}function q(j,P){for(var F=0;F<P.length;F++){var v=P[F];v.enumerable=v.enumerable||!1,v.configurable=!0,"value"in v&&(v.writable=!0),Object.defineProperty(j,v.key,v)}}function Y(j,P,F){return P&&q(j.prototype,P),F&&q(j,F),j}var E=yQ(),O=E.Buffer,N=PV(),W=N.inspect,I=W&&W.custom||"inspect";function z(j,P,F){O.prototype.copy.call(j,P,F)}g.exports=function(){function j(){A(this,j),this.head=null,this.tail=null,this.length=0}return Y(j,[{key:"push",value:function(P){var F={data:P,next:null};this.length>0?this.tail.next=F:this.head=F,this.tail=F,++this.length}},{key:"unshift",value:function(P){var F={data:P,next:this.head};this.length===0&&(this.tail=F),this.head=F,++this.length}},{key:"shift",value:function(){if(this.length!==0){var P=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,P}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(P){if(this.length===0)return"";for(var F=this.head,v=""+F.data;F=F.next;)v+=P+F.data;return v}},{key:"concat",value:function(P){if(this.length===0)return O.alloc(0);for(var F=O.allocUnsafe(P>>>0),v=this.head,S=0;v;)z(v.data,F,S),S+=v.data.length,v=v.next;return F}},{key:"consume",value:function(P,F){var v;return P<this.head.data.length?(v=this.head.data.slice(0,P),this.head.data=this.head.data.slice(P)):P===this.head.data.length?v=this.shift():v=F?this._getString(P):this._getBuffer(P),v}},{key:"first",value:function(){return this.head.data}},{key:"_getString",value:function(P){var F=this.head,v=1,S=F.data;for(P-=S.length;F=F.next;){var w=F.data,y=P>w.length?w.length:P;if(y===w.length?S+=w:S+=w.slice(0,P),P-=y,P===0){y===w.length?(++v,F.next?this.head=F.next:this.head=this.tail=null):(this.head=F,F.data=w.slice(y));break}++v}return this.length-=v,S}},{key:"_getBuffer",value:function(P){var F=O.allocUnsafe(P),v=this.head,S=1;for(v.data.copy(F),P-=v.data.length;v=v.next;){var w=v.data,y=P>w.length?w.length:P;if(w.copy(F,F.length-P,0,y),P-=y,P===0){y===w.length?(++S,v.next?this.head=v.next:this.head=this.tail=null):(this.head=v,v.data=w.slice(y));break}++S}return this.length-=S,F}},{key:I,value:function(P,F){return W(this,M({},F,{depth:0,customInspect:!1}))}}]),j}()}),$6=OJ((l,g)=>{function R(E,O){var N=this,W=this._readableState&&this._readableState.destroyed,I=this._writableState&&this._writableState.destroyed;return W||I?(O?O(E):E&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(q,this,E)):process.nextTick(q,this,E)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(E||null,function(z){!O&&z?N._writableState?N._writableState.errorEmitted?process.nextTick(B,N):(N._writableState.errorEmitted=!0,process.nextTick(M,N,z)):process.nextTick(M,N,z):O?(process.nextTick(B,N),O(z)):process.nextTick(B,N)}),this)}function M(E,O){q(E,O),B(E)}function B(E){E._writableState&&!E._writableState.emitClose||E._readableState&&!E._readableState.emitClose||E.emit("close")}function A(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function q(E,O){E.emit("error",O)}function Y(E,O){var{_readableState:N,_writableState:W}=E;N&&N.autoDestroy||W&&W.autoDestroy?E.destroy(O):E.emit("error",O)}g.exports={destroy:R,undestroy:A,errorOrDestroy:Y}}),GV=OJ((l,g)=>{function R(O,N){O.prototype=Object.create(N.prototype),O.prototype.constructor=O,O.__proto__=N}var M={};function B(O,N,W){W||(W=Error);function I(j,P,F){return typeof N=="string"?N:N(j,P,F)}var z=function(j){R(P,j);function P(F,v,S){return j.call(this,I(F,v,S))||this}return P}(W);z.prototype.name=W.name,z.prototype.code=O,M[O]=z}function A(O,N){if(Array.isArray(O)){var W=O.length;return O=O.map(function(I){return String(I)}),W>2?"one of ".concat(N," ").concat(O.slice(0,W-1).join(", "),", or ")+O[W-1]:W===2?"one of ".concat(N," ").concat(O[0]," or ").concat(O[1]):"of ".concat(N," ").concat(O[0])}else return"of ".concat(N," ").concat(String(O))}function q(O,N,W){return O.substr(!W||W<0?0:+W,N.length)===N}function Y(O,N,W){return(W===void 0||W>O.length)&&(W=O.length),O.substring(W-N.length,W)===N}function E(O,N,W){return typeof W!="number"&&(W=0),W+N.length>O.length?!1:O.indexOf(N,W)!==-1}B("ERR_INVALID_OPT_VALUE",function(O,N){return'The value "'+N+'" is invalid for option "'+O+'"'},TypeError),B("ERR_INVALID_ARG_TYPE",function(O,N,W){var I;typeof N=="string"&&q(N,"not ")?(I="must not be",N=N.replace(/^not /,"")):I="must be";var z;if(Y(O," argument"))z="The ".concat(O," ").concat(I," ").concat(A(N,"type"));else{var j=E(O,".")?"property":"argument";z='The "'.concat(O,'" ').concat(j," ").concat(I," ").concat(A(N,"type"))}return z+=". Received type ".concat(typeof W),z},TypeError),B("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),B("ERR_METHOD_NOT_IMPLEMENTED",function(O){return"The "+O+" method is not implemented"}),B("ERR_STREAM_PREMATURE_CLOSE","Premature close"),B("ERR_STREAM_DESTROYED",function(O){return"Cannot call "+O+" after a stream was destroyed"}),B("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),B("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),B("ERR_STREAM_WRITE_AFTER_END","write after end"),B("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),B("ERR_UNKNOWN_ENCODING",function(O){return"Unknown encoding: "+O},TypeError),B("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),g.exports.codes=M}),Z6=OJ((l,g)=>{var R=GV().codes.ERR_INVALID_OPT_VALUE;function M(A,q,Y){return A.highWaterMark!=null?A.highWaterMark:q?A[Y]:null}function B(A,q,Y,E){var O=M(q,E,Y);if(O!=null){if(!(isFinite(O)&&Math.floor(O)===O)||O<0){var N=E?Y:"highWaterMark";throw new R(N,O)}return Math.floor(O)}return A.objectMode?16:16384}g.exports={getHighWaterMark:B}}),X6=OJ((l,g)=>{g.exports=o;function R(n){var p=this;this.next=null,this.entry=null,this.finish=function(){GJ(p,n)}}var M;o.WritableState=VJ;var B={deprecate:L0()},A=V6(),q=yQ().Buffer,Y=global.Uint8Array||function(){};function E(n){return q.from(n)}function O(n){return q.isBuffer(n)||n instanceof Y}var N=$6(),W=Z6(),I=W.getHighWaterMark,z=GV().codes,j=z.ERR_INVALID_ARG_TYPE,P=z.ERR_METHOD_NOT_IMPLEMENTED,F=z.ERR_MULTIPLE_CALLBACK,v=z.ERR_STREAM_CANNOT_PIPE,S=z.ERR_STREAM_DESTROYED,w=z.ERR_STREAM_NULL_VALUES,y=z.ERR_STREAM_WRITE_AFTER_END,m=z.ERR_UNKNOWN_ENCODING,i=N.errorOrDestroy;JQ()(o,A);function JJ(){}function VJ(n,p,e){M=M||KV(),n=n||{},typeof e!="boolean"&&(e=p instanceof M),this.objectMode=!!n.objectMode,e&&(this.objectMode=this.objectMode||!!n.writableObjectMode),this.highWaterMark=I(this,n,"writableHighWaterMark",e),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var PJ=n.decodeStrings===!1;this.decodeStrings=!PJ,this.defaultEncoding=n.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(XJ){H(p,XJ)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=n.emitClose!==!1,this.autoDestroy=!!n.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new R(this)}VJ.prototype.getBuffer=function(){for(var n=this.bufferedRequest,p=[];n;)p.push(n),n=n.next;return p},function(){try{Object.defineProperty(VJ.prototype,"buffer",{get:B.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}}();var HJ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(HJ=Function.prototype[Symbol.hasInstance],Object.defineProperty(o,Symbol.hasInstance,{value:function(n){return HJ.call(this,n)?!0:this!==o?!1:n&&n._writableState instanceof VJ}})):HJ=function(n){return n instanceof this};function o(n){M=M||KV();var p=this instanceof M;if(!p&&!HJ.call(o,this))return new o(n);this._writableState=new VJ(n,this,p),this.writable=!0,n&&(typeof n.write=="function"&&(this._write=n.write),typeof n.writev=="function"&&(this._writev=n.writev),typeof n.destroy=="function"&&(this._destroy=n.destroy),typeof n.final=="function"&&(this._final=n.final)),A.call(this)}o.prototype.pipe=function(){i(this,new v)};function jJ(n,p){var e=new y;i(n,e),process.nextTick(p,e)}function J(n,p,e,PJ){var XJ;return e===null?XJ=new w:typeof e!="string"&&!p.objectMode&&(XJ=new j("chunk",["string","Buffer"],e)),XJ?(i(n,XJ),process.nextTick(PJ,XJ),!1):!0}o.prototype.write=function(n,p,e){var PJ=this._writableState,XJ=!1,WJ=!PJ.objectMode&&O(n);return WJ&&!q.isBuffer(n)&&(n=E(n)),typeof p=="function"&&(e=p,p=null),WJ?p="buffer":p||(p=PJ.defaultEncoding),typeof e!="function"&&(e=JJ),PJ.ending?jJ(this,e):(WJ||J(this,PJ,n,e))&&(PJ.pendingcb++,XJ=Z(this,PJ,WJ,n,p,e)),XJ},o.prototype.cork=function(){this._writableState.corked++},o.prototype.uncork=function(){var n=this._writableState;n.corked&&(n.corked--,!n.writing&&!n.corked&&!n.bufferProcessing&&n.bufferedRequest&&K(this,n))},o.prototype.setDefaultEncoding=function(n){if(typeof n=="string"&&(n=n.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((n+"").toLowerCase())>-1))throw new m(n);return this._writableState.defaultEncoding=n,this},Object.defineProperty(o.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function V(n,p,e){return!n.objectMode&&n.decodeStrings!==!1&&typeof p=="string"&&(p=q.from(p,e)),p}Object.defineProperty(o.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Z(n,p,e,PJ,XJ,WJ){if(!e){var b=V(p,PJ,XJ);PJ!==b&&(e=!0,XJ="buffer",PJ=b)}var C=p.objectMode?1:PJ.length;p.length+=C;var h=p.length<p.highWaterMark;if(h||(p.needDrain=!0),p.writing||p.corked){var $J=p.lastBufferedRequest;p.lastBufferedRequest={chunk:PJ,encoding:XJ,isBuf:e,callback:WJ,next:null},$J?$J.next=p.lastBufferedRequest:p.bufferedRequest=p.lastBufferedRequest,p.bufferedRequestCount+=1}else $(n,p,!1,C,PJ,XJ,WJ);return h}function $(n,p,e,PJ,XJ,WJ,b){p.writelen=PJ,p.writecb=b,p.writing=!0,p.sync=!0,p.destroyed?p.onwrite(new S("write")):e?n._writev(XJ,p.onwrite):n._write(XJ,WJ,p.onwrite),p.sync=!1}function X(n,p,e,PJ,XJ){--p.pendingcb,e?(process.nextTick(XJ,PJ),process.nextTick(t,n,p),n._writableState.errorEmitted=!0,i(n,PJ)):(XJ(PJ),n._writableState.errorEmitted=!0,i(n,PJ),t(n,p))}function U(n){n.writing=!1,n.writecb=null,n.length-=n.writelen,n.writelen=0}function H(n,p){var e=n._writableState,PJ=e.sync,XJ=e.writecb;if(typeof XJ!="function")throw new F;if(U(e),p)X(n,e,PJ,p,XJ);else{var WJ=k(e)||n.destroyed;!WJ&&!e.corked&&!e.bufferProcessing&&e.bufferedRequest&&K(n,e),PJ?process.nextTick(G,n,e,WJ,XJ):G(n,e,WJ,XJ)}}function G(n,p,e,PJ){e||Q(n,p),p.pendingcb--,PJ(),t(n,p)}function Q(n,p){p.length===0&&p.needDrain&&(p.needDrain=!1,n.emit("drain"))}function K(n,p){p.bufferProcessing=!0;var e=p.bufferedRequest;if(n._writev&&e&&e.next){var PJ=p.bufferedRequestCount,XJ=new Array(PJ),WJ=p.corkedRequestsFree;WJ.entry=e;for(var b=0,C=!0;e;)XJ[b]=e,e.isBuf||(C=!1),e=e.next,b+=1;XJ.allBuffers=C,$(n,p,!0,p.length,XJ,"",WJ.finish),p.pendingcb++,p.lastBufferedRequest=null,WJ.next?(p.corkedRequestsFree=WJ.next,WJ.next=null):p.corkedRequestsFree=new R(p),p.bufferedRequestCount=0}else{for(;e;){var{chunk:h,encoding:$J,callback:qJ}=e,ZJ=p.objectMode?1:h.length;if($(n,p,!1,ZJ,h,$J,qJ),e=e.next,p.bufferedRequestCount--,p.writing)break}e===null&&(p.lastBufferedRequest=null)}p.bufferedRequest=e,p.bufferProcessing=!1}o.prototype._write=function(n,p,e){e(new P("_write()"))},o.prototype._writev=null,o.prototype.end=function(n,p,e){var PJ=this._writableState;return typeof n=="function"?(e=n,n=null,p=null):typeof p=="function"&&(e=p,p=null),n!=null&&this.write(n,p),PJ.corked&&(PJ.corked=1,this.uncork()),PJ.ending||QJ(this,PJ,e),this},Object.defineProperty(o.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function k(n){return n.ending&&n.length===0&&n.bufferedRequest===null&&!n.finished&&!n.writing}function L(n,p){n._final(function(e){p.pendingcb--,e&&i(n,e),p.prefinished=!0,n.emit("prefinish"),t(n,p)})}function _(n,p){!p.prefinished&&!p.finalCalled&&(typeof n._final=="function"&&!p.destroyed?(p.pendingcb++,p.finalCalled=!0,process.nextTick(L,n,p)):(p.prefinished=!0,n.emit("prefinish")))}function t(n,p){var e=k(p);if(e&&(_(n,p),p.pendingcb===0&&(p.finished=!0,n.emit("finish"),p.autoDestroy))){var PJ=n._readableState;(!PJ||PJ.autoDestroy&&PJ.endEmitted)&&n.destroy()}return e}function QJ(n,p,e){p.ending=!0,t(n,p),e&&(p.finished?process.nextTick(e):n.once("finish",e)),p.ended=!0,n.writable=!1}function GJ(n,p,e){var PJ=n.entry;for(n.entry=null;PJ;){var XJ=PJ.callback;p.pendingcb--,XJ(e),PJ=PJ.next}p.corkedRequestsFree.next=n}Object.defineProperty(o.prototype,"destroyed",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(n){!this._writableState||(this._writableState.destroyed=n)}}),o.prototype.destroy=N.destroy,o.prototype._undestroy=N.undestroy,o.prototype._destroy=function(n,p){p(n)}}),KV=OJ((l,g)=>{var R=Object.keys||function(W){var I=[];for(var z in W)I.push(z);return I};g.exports=E;var M=q6(),B=X6();JQ()(E,M);for(A=R(B.prototype),Y=0;Y<A.length;Y++)q=A[Y],E.prototype[q]||(E.prototype[q]=B.prototype[q]);var A,q,Y;function E(W){if(!(this instanceof E))return new E(W);M.call(this,W),B.call(this,W),this.allowHalfOpen=!0,W&&(W.readable===!1&&(this.readable=!1),W.writable===!1&&(this.writable=!1),W.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once("end",O)))}Object.defineProperty(E.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Object.defineProperty(E.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(E.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function O(){this._writableState.ended||process.nextTick(N,this)}function N(W){W.end()}Object.defineProperty(E.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(W){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=W,this._writableState.destroyed=W)}})}),Q0=OJ((l,g)=>{var R=GV().codes.ERR_STREAM_PREMATURE_CLOSE;function M(Y){var E=!1;return function(){if(!E){E=!0;for(var O=arguments.length,N=new Array(O),W=0;W<O;W++)N[W]=arguments[W];Y.apply(this,N)}}}function B(){}function A(Y){return Y.setHeader&&typeof Y.abort=="function"}function q(Y,E,O){if(typeof E=="function")return q(Y,null,E);E||(E={}),O=M(O||B);var N=E.readable||E.readable!==!1&&Y.readable,W=E.writable||E.writable!==!1&&Y.writable,I=function(){Y.writable||j()},z=Y._writableState&&Y._writableState.finished,j=function(){W=!1,z=!0,N||O.call(Y)},P=Y._readableState&&Y._readableState.endEmitted,F=function(){N=!1,P=!0,W||O.call(Y)},v=function(y){O.call(Y,y)},S=function(){var y;if(N&&!P)return(!Y._readableState||!Y._readableState.ended)&&(y=new R),O.call(Y,y);if(W&&!z)return(!Y._writableState||!Y._writableState.ended)&&(y=new R),O.call(Y,y)},w=function(){Y.req.on("finish",j)};return A(Y)?(Y.on("complete",j),Y.on("abort",S),Y.req?w():Y.on("request",w)):W&&!Y._writableState&&(Y.on("end",I),Y.on("close",I)),Y.on("end",F),Y.on("finish",j),E.error!==!1&&Y.on("error",v),Y.on("close",S),function(){Y.removeListener("complete",j),Y.removeListener("abort",S),Y.removeListener("request",w),Y.req&&Y.req.removeListener("finish",j),Y.removeListener("end",I),Y.removeListener("close",I),Y.removeListener("finish",j),Y.removeListener("end",F),Y.removeListener("error",v),Y.removeListener("close",S)}}g.exports=q}),p8=OJ((l,g)=>{var R;function M(w,y,m){return y in w?Object.defineProperty(w,y,{value:m,enumerable:!0,configurable:!0,writable:!0}):w[y]=m,w}var B=Q0(),A=Symbol("lastResolve"),q=Symbol("lastReject"),Y=Symbol("error"),E=Symbol("ended"),O=Symbol("lastPromise"),N=Symbol("handlePromise"),W=Symbol("stream");function I(w,y){return{value:w,done:y}}function z(w){var y=w[A];if(y!==null){var m=w[W].read();m!==null&&(w[O]=null,w[A]=null,w[q]=null,y(I(m,!1)))}}function j(w){process.nextTick(z,w)}function P(w,y){return function(m,i){w.then(function(){if(y[E]){m(I(void 0,!0));return}y[N](m,i)},i)}}var F=Object.getPrototypeOf(function(){}),v=Object.setPrototypeOf((R={get stream(){return this[W]},next:function(){var w=this,y=this[Y];if(y!==null)return Promise.reject(y);if(this[E])return Promise.resolve(I(void 0,!0));if(this[W].destroyed)return new Promise(function(VJ,HJ){process.nextTick(function(){w[Y]?HJ(w[Y]):VJ(I(void 0,!0))})});var m=this[O],i;if(m)i=new Promise(P(m,this));else{var JJ=this[W].read();if(JJ!==null)return Promise.resolve(I(JJ,!1));i=new Promise(this[N])}return this[O]=i,i}},M(R,Symbol.asyncIterator,function(){return this}),M(R,"return",function(){var w=this;return new Promise(function(y,m){w[W].destroy(null,function(i){if(i){m(i);return}y(I(void 0,!0))})})}),R),F),S=function(w){var y,m=Object.create(v,(y={},M(y,W,{value:w,writable:!0}),M(y,A,{value:null,writable:!0}),M(y,q,{value:null,writable:!0}),M(y,Y,{value:null,writable:!0}),M(y,E,{value:w._readableState.endEmitted,writable:!0}),M(y,N,{value:function(i,JJ){var VJ=m[W].read();VJ?(m[O]=null,m[A]=null,m[q]=null,i(I(VJ,!1))):(m[A]=i,m[q]=JJ)},writable:!0}),y));return m[O]=null,B(w,function(i){if(i&&i.code!=="ERR_STREAM_PREMATURE_CLOSE"){var JJ=m[q];JJ!==null&&(m[O]=null,m[A]=null,m[q]=null,JJ(i)),m[Y]=i;return}var VJ=m[A];VJ!==null&&(m[O]=null,m[A]=null,m[q]=null,VJ(I(void 0,!0))),m[E]=!0}),w.on("readable",j.bind(null,m)),m};g.exports=S}),i8=OJ((l,g)=>{g.exports=function(){throw new Error("Readable.from is not available in the browser")}}),q6=OJ((l,g)=>{g.exports=J;var R;J.ReadableState=jJ;var M=rQ().EventEmitter,B=function(b,C){return b.listeners(C).length},A=V6(),q=yQ().Buffer,Y=global.Uint8Array||function(){};function E(b){return q.from(b)}function O(b){return q.isBuffer(b)||b instanceof Y}var N=PV(),W;N&&N.debuglog?W=N.debuglog("stream"):W=function(){};var I=u8(),z=$6(),j=Z6(),P=j.getHighWaterMark,F=GV().codes,v=F.ERR_INVALID_ARG_TYPE,S=F.ERR_STREAM_PUSH_AFTER_EOF,w=F.ERR_METHOD_NOT_IMPLEMENTED,y=F.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,m,i,JJ;JQ()(J,A);var VJ=z.errorOrDestroy,HJ=["error","close","destroy","pause","resume"];function o(b,C,h){if(typeof b.prependListener=="function")return b.prependListener(C,h);!b._events||!b._events[C]?b.on(C,h):Array.isArray(b._events[C])?b._events[C].unshift(h):b._events[C]=[h,b._events[C]]}function jJ(b,C,h){R=R||KV(),b=b||{},typeof h!="boolean"&&(h=C instanceof R),this.objectMode=!!b.objectMode,h&&(this.objectMode=this.objectMode||!!b.readableObjectMode),this.highWaterMark=P(this,b,"readableHighWaterMark",h),this.buffer=new I,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=b.emitClose!==!1,this.autoDestroy=!!b.autoDestroy,this.destroyed=!1,this.defaultEncoding=b.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,b.encoding&&(m||(m=(LV(),fQ(HV)).StringDecoder),this.decoder=new m(b.encoding),this.encoding=b.encoding)}function J(b){if(R=R||KV(),!(this instanceof J))return new J(b);var C=this instanceof R;this._readableState=new jJ(b,this,C),this.readable=!0,b&&(typeof b.read=="function"&&(this._read=b.read),typeof b.destroy=="function"&&(this._destroy=b.destroy)),A.call(this)}Object.defineProperty(J.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(b){!this._readableState||(this._readableState.destroyed=b)}}),J.prototype.destroy=z.destroy,J.prototype._undestroy=z.undestroy,J.prototype._destroy=function(b,C){C(b)},J.prototype.push=function(b,C){var h=this._readableState,$J;return h.objectMode?$J=!0:typeof b=="string"&&(C=C||h.defaultEncoding,C!==h.encoding&&(b=q.from(b,C),C=""),$J=!0),V(this,b,C,!1,$J)},J.prototype.unshift=function(b){return V(this,b,null,!0,!1)};function V(b,C,h,$J,qJ){W("readableAddChunk",C);var ZJ=b._readableState;if(C===null)ZJ.reading=!1,G(b,ZJ);else{var mJ;if(qJ||(mJ=$(ZJ,C)),mJ)VJ(b,mJ);else if(ZJ.objectMode||C&&C.length>0)if(typeof C!="string"&&!ZJ.objectMode&&Object.getPrototypeOf(C)!==q.prototype&&(C=E(C)),$J)ZJ.endEmitted?VJ(b,new y):Z(b,ZJ,C,!0);else if(ZJ.ended)VJ(b,new S);else{if(ZJ.destroyed)return!1;ZJ.reading=!1,ZJ.decoder&&!h?(C=ZJ.decoder.write(C),ZJ.objectMode||C.length!==0?Z(b,ZJ,C,!1):k(b,ZJ)):Z(b,ZJ,C,!1)}else $J||(ZJ.reading=!1,k(b,ZJ))}return!ZJ.ended&&(ZJ.length<ZJ.highWaterMark||ZJ.length===0)}function Z(b,C,h,$J){C.flowing&&C.length===0&&!C.sync?(C.awaitDrain=0,b.emit("data",h)):(C.length+=C.objectMode?1:h.length,$J?C.buffer.unshift(h):C.buffer.push(h),C.needReadable&&Q(b)),k(b,C)}function $(b,C){var h;return!O(C)&&typeof C!="string"&&C!==void 0&&!b.objectMode&&(h=new v("chunk",["string","Buffer","Uint8Array"],C)),h}J.prototype.isPaused=function(){return this._readableState.flowing===!1},J.prototype.setEncoding=function(b){m||(m=(LV(),fQ(HV)).StringDecoder);var C=new m(b);this._readableState.decoder=C,this._readableState.encoding=this._readableState.decoder.encoding;for(var h=this._readableState.buffer.head,$J="";h!==null;)$J+=C.write(h.data),h=h.next;return this._readableState.buffer.clear(),$J!==""&&this._readableState.buffer.push($J),this._readableState.length=$J.length,this};var X=1073741824;function U(b){return b>=X?b=X:(b--,b|=b>>>1,b|=b>>>2,b|=b>>>4,b|=b>>>8,b|=b>>>16,b++),b}function H(b,C){return b<=0||C.length===0&&C.ended?0:C.objectMode?1:b!==b?C.flowing&&C.length?C.buffer.head.data.length:C.length:(b>C.highWaterMark&&(C.highWaterMark=U(b)),b<=C.length?b:C.ended?C.length:(C.needReadable=!0,0))}J.prototype.read=function(b){W("read",b),b=parseInt(b,10);var C=this._readableState,h=b;if(b!==0&&(C.emittedReadable=!1),b===0&&C.needReadable&&((C.highWaterMark!==0?C.length>=C.highWaterMark:C.length>0)||C.ended))return W("read: emitReadable",C.length,C.ended),C.length===0&&C.ended?PJ(this):Q(this),null;if(b=H(b,C),b===0&&C.ended)return C.length===0&&PJ(this),null;var $J=C.needReadable;W("need readable",$J),(C.length===0||C.length-b<C.highWaterMark)&&($J=!0,W("length less than watermark",$J)),C.ended||C.reading?($J=!1,W("reading or ended",$J)):$J&&(W("do read"),C.reading=!0,C.sync=!0,C.length===0&&(C.needReadable=!0),this._read(C.highWaterMark),C.sync=!1,C.reading||(b=H(h,C)));var qJ;return b>0?qJ=e(b,C):qJ=null,qJ===null?(C.needReadable=C.length<=C.highWaterMark,b=0):(C.length-=b,C.awaitDrain=0),C.length===0&&(C.ended||(C.needReadable=!0),h!==b&&C.ended&&PJ(this)),qJ!==null&&this.emit("data",qJ),qJ};function G(b,C){if(W("onEofChunk"),!C.ended){if(C.decoder){var h=C.decoder.end();h&&h.length&&(C.buffer.push(h),C.length+=C.objectMode?1:h.length)}C.ended=!0,C.sync?Q(b):(C.needReadable=!1,C.emittedReadable||(C.emittedReadable=!0,K(b)))}}function Q(b){var C=b._readableState;W("emitReadable",C.needReadable,C.emittedReadable),C.needReadable=!1,C.emittedReadable||(W("emitReadable",C.flowing),C.emittedReadable=!0,process.nextTick(K,b))}function K(b){var C=b._readableState;W("emitReadable_",C.destroyed,C.length,C.ended),!C.destroyed&&(C.length||C.ended)&&(b.emit("readable"),C.emittedReadable=!1),C.needReadable=!C.flowing&&!C.ended&&C.length<=C.highWaterMark,p(b)}function k(b,C){C.readingMore||(C.readingMore=!0,process.nextTick(L,b,C))}function L(b,C){for(;!C.reading&&!C.ended&&(C.length<C.highWaterMark||C.flowing&&C.length===0);){var h=C.length;if(W("maybeReadMore read 0"),b.read(0),h===C.length)break}C.readingMore=!1}J.prototype._read=function(b){VJ(this,new w("_read()"))},J.prototype.pipe=function(b,C){var h=this,$J=this._readableState;switch($J.pipesCount){case 0:$J.pipes=b;break;case 1:$J.pipes=[$J.pipes,b];break;default:$J.pipes.push(b);break}$J.pipesCount+=1,W("pipe count=%d opts=%j",$J.pipesCount,C);var qJ=(!C||C.end!==!1)&&b!==process.stdout&&b!==process.stderr,ZJ=qJ?BJ:u;$J.endEmitted?process.nextTick(ZJ):h.once("end",ZJ),b.on("unpipe",mJ);function mJ(d,a){W("onunpipe"),d===h&&a&&a.hasUnpiped===!1&&(a.hasUnpiped=!0,LJ())}function BJ(){W("onend"),b.end()}var TJ=_(h);b.on("drain",TJ);var dJ=!1;function LJ(){W("cleanup"),b.removeListener("close",T),b.removeListener("finish",D),b.removeListener("drain",TJ),b.removeListener("error",$Q),b.removeListener("unpipe",mJ),h.removeListener("end",BJ),h.removeListener("end",u),h.removeListener("data",IJ),dJ=!0,$J.awaitDrain&&(!b._writableState||b._writableState.needDrain)&&TJ()}h.on("data",IJ);function IJ(d){W("ondata");var a=b.write(d);W("dest.write",a),a===!1&&(($J.pipesCount===1&&$J.pipes===b||$J.pipesCount>1&&WJ($J.pipes,b)!==-1)&&!dJ&&(W("false write response, pause",$J.awaitDrain),$J.awaitDrain++),h.pause())}function $Q(d){W("onerror",d),u(),b.removeListener("error",$Q),B(b,"error")===0&&VJ(b,d)}o(b,"error",$Q);function T(){b.removeListener("finish",D),u()}b.once("close",T);function D(){W("onfinish"),b.removeListener("close",T),u()}b.once("finish",D);function u(){W("unpipe"),h.unpipe(b)}return b.emit("pipe",h),$J.flowing||(W("pipe resume"),h.resume()),b};function _(b){return function(){var C=b._readableState;W("pipeOnDrain",C.awaitDrain),C.awaitDrain&&C.awaitDrain--,C.awaitDrain===0&&B(b,"data")&&(C.flowing=!0,p(b))}}J.prototype.unpipe=function(b){var C=this._readableState,h={hasUnpiped:!1};if(C.pipesCount===0)return this;if(C.pipesCount===1)return b&&b!==C.pipes?this:(b||(b=C.pipes),C.pipes=null,C.pipesCount=0,C.flowing=!1,b&&b.emit("unpipe",this,h),this);if(!b){var{pipes:$J,pipesCount:qJ}=C;C.pipes=null,C.pipesCount=0,C.flowing=!1;for(var ZJ=0;ZJ<qJ;ZJ++)$J[ZJ].emit("unpipe",this,{hasUnpiped:!1});return this}var mJ=WJ(C.pipes,b);return mJ===-1?this:(C.pipes.splice(mJ,1),C.pipesCount-=1,C.pipesCount===1&&(C.pipes=C.pipes[0]),b.emit("unpipe",this,h),this)},J.prototype.on=function(b,C){var h=A.prototype.on.call(this,b,C),$J=this._readableState;return b==="data"?($J.readableListening=this.listenerCount("readable")>0,$J.flowing!==!1&&this.resume()):b==="readable"&&!$J.endEmitted&&!$J.readableListening&&($J.readableListening=$J.needReadable=!0,$J.flowing=!1,$J.emittedReadable=!1,W("on readable",$J.length,$J.reading),$J.length?Q(this):$J.reading||process.nextTick(QJ,this)),h},J.prototype.addListener=J.prototype.on,J.prototype.removeListener=function(b,C){var h=A.prototype.removeListener.call(this,b,C);return b==="readable"&&process.nextTick(t,this),h},J.prototype.removeAllListeners=function(b){var C=A.prototype.removeAllListeners.apply(this,arguments);return(b==="readable"||b===void 0)&&process.nextTick(t,this),C};function t(b){var C=b._readableState;C.readableListening=b.listenerCount("readable")>0,C.resumeScheduled&&!C.paused?C.flowing=!0:b.listenerCount("data")>0&&b.resume()}function QJ(b){W("readable nexttick read 0"),b.read(0)}J.prototype.resume=function(){var b=this._readableState;return b.flowing||(W("resume"),b.flowing=!b.readableListening,GJ(this,b)),b.paused=!1,this};function GJ(b,C){C.resumeScheduled||(C.resumeScheduled=!0,process.nextTick(n,b,C))}function n(b,C){W("resume",C.reading),C.reading||b.read(0),C.resumeScheduled=!1,b.emit("resume"),p(b),C.flowing&&!C.reading&&b.read(0)}J.prototype.pause=function(){return W("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(W("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function p(b){var C=b._readableState;for(W("flow",C.flowing);C.flowing&&b.read()!==null;);}J.prototype.wrap=function(b){var C=this,h=this._readableState,$J=!1;b.on("end",function(){if(W("wrapped end"),h.decoder&&!h.ended){var mJ=h.decoder.end();mJ&&mJ.length&&C.push(mJ)}C.push(null)}),b.on("data",function(mJ){if(W("wrapped data"),h.decoder&&(mJ=h.decoder.write(mJ)),!(h.objectMode&&mJ==null)&&!(!h.objectMode&&(!mJ||!mJ.length))){var BJ=C.push(mJ);BJ||($J=!0,b.pause())}});for(var qJ in b)this[qJ]===void 0&&typeof b[qJ]=="function"&&(this[qJ]=function(mJ){return function(){return b[mJ].apply(b,arguments)}}(qJ));for(var ZJ=0;ZJ<HJ.length;ZJ++)b.on(HJ[ZJ],this.emit.bind(this,HJ[ZJ]));return this._read=function(mJ){W("wrapped _read",mJ),$J&&($J=!1,b.resume())},this},typeof Symbol=="function"&&(J.prototype[Symbol.asyncIterator]=function(){return i===void 0&&(i=p8()),i(this)}),Object.defineProperty(J.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(J.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(J.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(b){this._readableState&&(this._readableState.flowing=b)}}),J._fromList=e,Object.defineProperty(J.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function e(b,C){if(C.length===0)return null;var h;return C.objectMode?h=C.buffer.shift():!b||b>=C.length?(C.decoder?h=C.buffer.join(""):C.buffer.length===1?h=C.buffer.first():h=C.buffer.concat(C.length),C.buffer.clear()):h=C.buffer.consume(b,C.decoder),h}function PJ(b){var C=b._readableState;W("endReadable",C.endEmitted),C.endEmitted||(C.ended=!0,process.nextTick(XJ,C,b))}function XJ(b,C){if(W("endReadableNT",b.endEmitted,b.length),!b.endEmitted&&b.length===0&&(b.endEmitted=!0,C.readable=!1,C.emit("end"),b.autoDestroy)){var h=C._writableState;(!h||h.autoDestroy&&h.finished)&&C.destroy()}}typeof Symbol=="function"&&(J.from=function(b,C){return JJ===void 0&&(JJ=i8()),JJ(J,b,C)});function WJ(b,C){for(var h=0,$J=b.length;h<$J;h++)if(b[h]===C)return h;return-1}}),G6=OJ((l,g)=>{g.exports=O;var R=GV().codes,M=R.ERR_METHOD_NOT_IMPLEMENTED,B=R.ERR_MULTIPLE_CALLBACK,A=R.ERR_TRANSFORM_ALREADY_TRANSFORMING,q=R.ERR_TRANSFORM_WITH_LENGTH_0,Y=KV();JQ()(O,Y);function E(I,z){var j=this._transformState;j.transforming=!1;var P=j.writecb;if(P===null)return this.emit("error",new B);j.writechunk=null,j.writecb=null,z!=null&&this.push(z),P(I);var F=this._readableState;F.reading=!1,(F.needReadable||F.length<F.highWaterMark)&&this._read(F.highWaterMark)}function O(I){if(!(this instanceof O))return new O(I);Y.call(this,I),this._transformState={afterTransform:E.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,I&&(typeof I.transform=="function"&&(this._transform=I.transform),typeof I.flush=="function"&&(this._flush=I.flush)),this.on("prefinish",N)}function N(){var I=this;typeof this._flush=="function"&&!this._readableState.destroyed?this._flush(function(z,j){W(I,z,j)}):W(this,null,null)}O.prototype.push=function(I,z){return this._transformState.needTransform=!1,Y.prototype.push.call(this,I,z)},O.prototype._transform=function(I,z,j){j(new M("_transform()"))},O.prototype._write=function(I,z,j){var P=this._transformState;if(P.writecb=j,P.writechunk=I,P.writeencoding=z,!P.transforming){var F=this._readableState;(P.needTransform||F.needReadable||F.length<F.highWaterMark)&&this._read(F.highWaterMark)}},O.prototype._read=function(I){var z=this._transformState;z.writechunk!==null&&!z.transforming?(z.transforming=!0,this._transform(z.writechunk,z.writeencoding,z.afterTransform)):z.needTransform=!0},O.prototype._destroy=function(I,z){Y.prototype._destroy.call(this,I,function(j){z(j)})};function W(I,z,j){if(z)return I.emit("error",z);if(j!=null&&I.push(j),I._writableState.length)throw new q;if(I._transformState.transforming)throw new A;return I.push(null)}}),l8=OJ((l,g)=>{g.exports=M;var R=G6();JQ()(M,R);function M(B){if(!(this instanceof M))return new M(B);R.call(this,B)}M.prototype._transform=function(B,A,q){q(null,B)}}),s8=OJ((l,g)=>{var R;function M(j){var P=!1;return function(){P||(P=!0,j.apply(void 0,arguments))}}var B=GV().codes,A=B.ERR_MISSING_ARGS,q=B.ERR_STREAM_DESTROYED;function Y(j){if(j)throw j}function E(j){return j.setHeader&&typeof j.abort=="function"}function O(j,P,F,v){v=M(v);var S=!1;j.on("close",function(){S=!0}),R===void 0&&(R=Q0()),R(j,{readable:P,writable:F},function(y){if(y)return v(y);S=!0,v()});var w=!1;return function(y){if(!S&&!w){if(w=!0,E(j))return j.abort();if(typeof j.destroy=="function")return j.destroy();v(y||new q("pipe"))}}}function N(j){j()}function W(j,P){return j.pipe(P)}function I(j){return!j.length||typeof j[j.length-1]!="function"?Y:j.pop()}function z(){for(var j=arguments.length,P=new Array(j),F=0;F<j;F++)P[F]=arguments[F];var v=I(P);if(Array.isArray(P[0])&&(P=P[0]),P.length<2)throw new A("streams");var S,w=P.map(function(y,m){var i=m<P.length-1,JJ=m>0;return O(y,i,JJ,function(VJ){S||(S=VJ),VJ&&w.forEach(N),!i&&(w.forEach(N),v(S))})});return P.reduce(W)}g.exports=z}),d8=OJ((l,g)=>{l=g.exports=q6(),l.Stream=l,l.Readable=l,l.Writable=X6(),l.Duplex=KV(),l.Transform=G6(),l.PassThrough=l8(),l.finished=Q0(),l.pipeline=s8()}),V0=OJ((l,g)=>{(function(R,M){function B($,X){if(!$)throw new Error(X||"Assertion failed")}function A($,X){$.super_=X;var U=function(){};U.prototype=X.prototype,$.prototype=new U,$.prototype.constructor=$}function q($,X,U){if(q.isBN($))return $;this.negative=0,this.words=null,this.length=0,this.red=null,$!==null&&((X==="le"||X==="be")&&(U=X,X=10),this._init($||0,X||10,U||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function($){return $ instanceof q?!0:$!==null&&typeof $=="object"&&$.constructor.wordSize===q.wordSize&&Array.isArray($.words)},q.max=function($,X){return $.cmp(X)>0?$:X},q.min=function($,X){return $.cmp(X)<0?$:X},q.prototype._init=function($,X,U){if(typeof $=="number")return this._initNumber($,X,U);if(typeof $=="object")return this._initArray($,X,U);X==="hex"&&(X=16),B(X===(X|0)&&X>=2&&X<=36),$=$.toString().replace(/\s+/g,"");var H=0;$[0]==="-"&&(H++,this.negative=1),H<$.length&&(X===16?this._parseHex($,H,U):(this._parseBase($,X,H),U==="le"&&this._initArray(this.toArray(),X,U)))},q.prototype._initNumber=function($,X,U){$<0&&(this.negative=1,$=-$),$<67108864?(this.words=[$&67108863],this.length=1):$<4503599627370496?(this.words=[$&67108863,$/67108864&67108863],this.length=2):(B($<9007199254740992),this.words=[$&67108863,$/67108864&67108863,1],this.length=3),U==="le"&&this._initArray(this.toArray(),X,U)},q.prototype._initArray=function($,X,U){if(B(typeof $.length=="number"),$.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil($.length/3),this.words=new Array(this.length);for(var H=0;H<this.length;H++)this.words[H]=0;var G,Q,K=0;if(U==="be")for(H=$.length-1,G=0;H>=0;H-=3)Q=$[H]|$[H-1]<<8|$[H-2]<<16,this.words[G]|=Q<<K&67108863,this.words[G+1]=Q>>>26-K&67108863,K+=24,K>=26&&(K-=26,G++);else if(U==="le")for(H=0,G=0;H<$.length;H+=3)Q=$[H]|$[H+1]<<8|$[H+2]<<16,this.words[G]|=Q<<K&67108863,this.words[G+1]=Q>>>26-K&67108863,K+=24,K>=26&&(K-=26,G++);return this._strip()};function E($,X){var U=$.charCodeAt(X);if(U>=48&&U<=57)return U-48;if(U>=65&&U<=70)return U-55;if(U>=97&&U<=102)return U-87;B(!1,"Invalid character in "+$)}function O($,X,U){var H=E($,U);return U-1>=X&&(H|=E($,U-1)<<4),H}q.prototype._parseHex=function($,X,U){this.length=Math.ceil(($.length-X)/6),this.words=new Array(this.length);for(var H=0;H<this.length;H++)this.words[H]=0;var G=0,Q=0,K;if(U==="be")for(H=$.length-1;H>=X;H-=2)K=O($,X,H)<<G,this.words[Q]|=K&67108863,G>=18?(G-=18,Q+=1,this.words[Q]|=K>>>26):G+=8;else{var k=$.length-X;for(H=k%2===0?X+1:X;H<$.length;H+=2)K=O($,X,H)<<G,this.words[Q]|=K&67108863,G>=18?(G-=18,Q+=1,this.words[Q]|=K>>>26):G+=8}this._strip()};function N($,X,U,H){for(var G=0,Q=0,K=Math.min($.length,U),k=X;k<K;k++){var L=$.charCodeAt(k)-48;G*=H,L>=49?Q=L-49+10:L>=17?Q=L-17+10:Q=L,B(L>=0&&Q<H,"Invalid character"),G+=Q}return G}q.prototype._parseBase=function($,X,U){this.words=[0],this.length=1;for(var H=0,G=1;G<=67108863;G*=X)H++;H--,G=G/X|0;for(var Q=$.length-U,K=Q%H,k=Math.min(Q,Q-K)+U,L=0,_=U;_<k;_+=H)L=N($,_,_+H,X),this.imuln(G),this.words[0]+L<67108864?this.words[0]+=L:this._iaddn(L);if(K!==0){var t=1;for(L=N($,_,$.length,X),_=0;_<K;_++)t*=X;this.imuln(t),this.words[0]+L<67108864?this.words[0]+=L:this._iaddn(L)}this._strip()},q.prototype.copy=function($){$.words=new Array(this.length);for(var X=0;X<this.length;X++)$.words[X]=this.words[X];$.length=this.length,$.negative=this.negative,$.red=this.red};function W($,X){$.words=X.words,$.length=X.length,$.negative=X.negative,$.red=X.red}if(q.prototype._move=function($){W($,this)},q.prototype.clone=function(){var $=new q(null);return this.copy($),$},q.prototype._expand=function($){for(;this.length<$;)this.words[this.length++]=0;return this},q.prototype._strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},typeof Symbol<"u"&&typeof Symbol.for=="function")try{q.prototype[Symbol.for("nodejs.util.inspect.custom")]=I}catch{q.prototype.inspect=I}else q.prototype.inspect=I;function I(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"}var z=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],j=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],P=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function($,X){$=$||10,X=X|0||1;var U;if($===16||$==="hex"){U="";for(var H=0,G=0,Q=0;Q<this.length;Q++){var K=this.words[Q],k=((K<<H|G)&16777215).toString(16);G=K>>>24-H&16777215,H+=2,H>=26&&(H-=26,Q--),G!==0||Q!==this.length-1?U=z[6-k.length]+k+U:U=k+U}for(G!==0&&(U=G.toString(16)+U);U.length%X!==0;)U="0"+U;return this.negative!==0&&(U="-"+U),U}if($===($|0)&&$>=2&&$<=36){var L=j[$],_=P[$];U="";var t=this.clone();for(t.negative=0;!t.isZero();){var QJ=t.modrn(_).toString($);t=t.idivn(_),t.isZero()?U=QJ+U:U=z[L-QJ.length]+QJ+U}for(this.isZero()&&(U="0"+U);U.length%X!==0;)U="0"+U;return this.negative!==0&&(U="-"+U),U}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var $=this.words[0];return this.length===2?$+=this.words[1]*67108864:this.length===3&&this.words[2]===1?$+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-$:$},q.prototype.toJSON=function(){return this.toString(16,2)},Y&&(q.prototype.toBuffer=function($,X){return this.toArrayLike(Y,$,X)}),q.prototype.toArray=function($,X){return this.toArrayLike(Array,$,X)};var F=function($,X){return $.allocUnsafe?$.allocUnsafe(X):new $(X)};q.prototype.toArrayLike=function($,X,U){this._strip();var H=this.byteLength(),G=U||Math.max(1,H);B(H<=G,"byte array longer than desired length"),B(G>0,"Requested array length <= 0");var Q=F($,G),K=X==="le"?"LE":"BE";return this["_toArrayLike"+K](Q,H),Q},q.prototype._toArrayLikeLE=function($,X){for(var U=0,H=0,G=0,Q=0;G<this.length;G++){var K=this.words[G]<<Q|H;$[U++]=K&255,U<$.length&&($[U++]=K>>8&255),U<$.length&&($[U++]=K>>16&255),Q===6?(U<$.length&&($[U++]=K>>24&255),H=0,Q=0):(H=K>>>24,Q+=2)}if(U<$.length)for($[U++]=H;U<$.length;)$[U++]=0},q.prototype._toArrayLikeBE=function($,X){for(var U=$.length-1,H=0,G=0,Q=0;G<this.length;G++){var K=this.words[G]<<Q|H;$[U--]=K&255,U>=0&&($[U--]=K>>8&255),U>=0&&($[U--]=K>>16&255),Q===6?(U>=0&&($[U--]=K>>24&255),H=0,Q=0):(H=K>>>24,Q+=2)}if(U>=0)for($[U--]=H;U>=0;)$[U--]=0},Math.clz32?q.prototype._countBits=function($){return 32-Math.clz32($)}:q.prototype._countBits=function($){var X=$,U=0;return X>=4096&&(U+=13,X>>>=13),X>=64&&(U+=7,X>>>=7),X>=8&&(U+=4,X>>>=4),X>=2&&(U+=2,X>>>=2),U+X},q.prototype._zeroBits=function($){if($===0)return 26;var X=$,U=0;return(X&8191)===0&&(U+=13,X>>>=13),(X&127)===0&&(U+=7,X>>>=7),(X&15)===0&&(U+=4,X>>>=4),(X&3)===0&&(U+=2,X>>>=2),(X&1)===0&&U++,U},q.prototype.bitLength=function(){var $=this.words[this.length-1],X=this._countBits($);return(this.length-1)*26+X};function v($){for(var X=new Array($.bitLength()),U=0;U<X.length;U++){var H=U/26|0,G=U%26;X[U]=$.words[H]>>>G&1}return X}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var $=0,X=0;X<this.length;X++){var U=this._zeroBits(this.words[X]);if($+=U,U!==26)break}return $},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function($){return this.negative!==0?this.abs().inotn($).iaddn(1):this.clone()},q.prototype.fromTwos=function($){return this.testn($-1)?this.notn($).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function($){for(;this.length<$.length;)this.words[this.length++]=0;for(var X=0;X<$.length;X++)this.words[X]=this.words[X]|$.words[X];return this._strip()},q.prototype.ior=function($){return B((this.negative|$.negative)===0),this.iuor($)},q.prototype.or=function($){return this.length>$.length?this.clone().ior($):$.clone().ior(this)},q.prototype.uor=function($){return this.length>$.length?this.clone().iuor($):$.clone().iuor(this)},q.prototype.iuand=function($){var X;this.length>$.length?X=$:X=this;for(var U=0;U<X.length;U++)this.words[U]=this.words[U]&$.words[U];return this.length=X.length,this._strip()},q.prototype.iand=function($){return B((this.negative|$.negative)===0),this.iuand($)},q.prototype.and=function($){return this.length>$.length?this.clone().iand($):$.clone().iand(this)},q.prototype.uand=function($){return this.length>$.length?this.clone().iuand($):$.clone().iuand(this)},q.prototype.iuxor=function($){var X,U;this.length>$.length?(X=this,U=$):(X=$,U=this);for(var H=0;H<U.length;H++)this.words[H]=X.words[H]^U.words[H];if(this!==X)for(;H<X.length;H++)this.words[H]=X.words[H];return this.length=X.length,this._strip()},q.prototype.ixor=function($){return B((this.negative|$.negative)===0),this.iuxor($)},q.prototype.xor=function($){return this.length>$.length?this.clone().ixor($):$.clone().ixor(this)},q.prototype.uxor=function($){return this.length>$.length?this.clone().iuxor($):$.clone().iuxor(this)},q.prototype.inotn=function($){B(typeof $=="number"&&$>=0);var X=Math.ceil($/26)|0,U=$%26;this._expand(X),U>0&&X--;for(var H=0;H<X;H++)this.words[H]=~this.words[H]&67108863;return U>0&&(this.words[H]=~this.words[H]&67108863>>26-U),this._strip()},q.prototype.notn=function($){return this.clone().inotn($)},q.prototype.setn=function($,X){B(typeof $=="number"&&$>=0);var U=$/26|0,H=$%26;return this._expand(U+1),X?this.words[U]=this.words[U]|1<<H:this.words[U]=this.words[U]&~(1<<H),this._strip()},q.prototype.iadd=function($){var X;if(this.negative!==0&&$.negative===0)return this.negative=0,X=this.isub($),this.negative^=1,this._normSign();if(this.negative===0&&$.negative!==0)return $.negative=0,X=this.isub($),$.negative=1,X._normSign();var U,H;this.length>$.length?(U=this,H=$):(U=$,H=this);for(var G=0,Q=0;Q<H.length;Q++)X=(U.words[Q]|0)+(H.words[Q]|0)+G,this.words[Q]=X&67108863,G=X>>>26;for(;G!==0&&Q<U.length;Q++)X=(U.words[Q]|0)+G,this.words[Q]=X&67108863,G=X>>>26;if(this.length=U.length,G!==0)this.words[this.length]=G,this.length++;else if(U!==this)for(;Q<U.length;Q++)this.words[Q]=U.words[Q];return this},q.prototype.add=function($){var X;return $.negative!==0&&this.negative===0?($.negative=0,X=this.sub($),$.negative^=1,X):$.negative===0&&this.negative!==0?(this.negative=0,X=$.sub(this),this.negative=1,X):this.length>$.length?this.clone().iadd($):$.clone().iadd(this)},q.prototype.isub=function($){if($.negative!==0){$.negative=0;var X=this.iadd($);return $.negative=1,X._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd($),this.negative=1,this._normSign();var U=this.cmp($);if(U===0)return this.negative=0,this.length=1,this.words[0]=0,this;var H,G;U>0?(H=this,G=$):(H=$,G=this);for(var Q=0,K=0;K<G.length;K++)X=(H.words[K]|0)-(G.words[K]|0)+Q,Q=X>>26,this.words[K]=X&67108863;for(;Q!==0&&K<H.length;K++)X=(H.words[K]|0)+Q,Q=X>>26,this.words[K]=X&67108863;if(Q===0&&K<H.length&&H!==this)for(;K<H.length;K++)this.words[K]=H.words[K];return this.length=Math.max(this.length,K),H!==this&&(this.negative=1),this._strip()},q.prototype.sub=function($){return this.clone().isub($)};function S($,X,U){U.negative=X.negative^$.negative;var H=$.length+X.length|0;U.length=H,H=H-1|0;var G=$.words[0]|0,Q=X.words[0]|0,K=G*Q,k=K&67108863,L=K/67108864|0;U.words[0]=k;for(var _=1;_<H;_++){for(var t=L>>>26,QJ=L&67108863,GJ=Math.min(_,X.length-1),n=Math.max(0,_-$.length+1);n<=GJ;n++){var p=_-n|0;G=$.words[p]|0,Q=X.words[n]|0,K=G*Q+QJ,t+=K/67108864|0,QJ=K&67108863}U.words[_]=QJ|0,L=t|0}return L!==0?U.words[_]=L|0:U.length--,U._strip()}var w=function($,X,U){var H=$.words,G=X.words,Q=U.words,K=0,k,L,_,t=H[0]|0,QJ=t&8191,GJ=t>>>13,n=H[1]|0,p=n&8191,e=n>>>13,PJ=H[2]|0,XJ=PJ&8191,WJ=PJ>>>13,b=H[3]|0,C=b&8191,h=b>>>13,$J=H[4]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=H[5]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=H[6]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=H[7]|0,T=$Q&8191,D=$Q>>>13,u=H[8]|0,d=u&8191,a=u>>>13,CJ=H[9]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=G[0]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=G[1]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=G[2]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=G[3]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=G[4]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=G[5]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=G[6]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=G[7]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=G[8]|0,f=wQ&8191,zJ=wQ>>>13,CQ=G[9]|0,oJ=CQ&8191,tJ=CQ>>>13;U.negative=$.negative^X.negative,U.length=19,k=Math.imul(QJ,FJ),L=Math.imul(QJ,RJ),L=L+Math.imul(GJ,FJ)|0,_=Math.imul(GJ,RJ);var YQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,k=Math.imul(p,FJ),L=Math.imul(p,RJ),L=L+Math.imul(e,FJ)|0,_=Math.imul(e,RJ),k=k+Math.imul(QJ,SJ)|0,L=L+Math.imul(QJ,xJ)|0,L=L+Math.imul(GJ,SJ)|0,_=_+Math.imul(GJ,xJ)|0;var BQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,k=Math.imul(XJ,FJ),L=Math.imul(XJ,RJ),L=L+Math.imul(WJ,FJ)|0,_=Math.imul(WJ,RJ),k=k+Math.imul(p,SJ)|0,L=L+Math.imul(p,xJ)|0,L=L+Math.imul(e,SJ)|0,_=_+Math.imul(e,xJ)|0,k=k+Math.imul(QJ,AJ)|0,L=L+Math.imul(QJ,kJ)|0,L=L+Math.imul(GJ,AJ)|0,_=_+Math.imul(GJ,kJ)|0;var OQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,k=Math.imul(C,FJ),L=Math.imul(C,RJ),L=L+Math.imul(h,FJ)|0,_=Math.imul(h,RJ),k=k+Math.imul(XJ,SJ)|0,L=L+Math.imul(XJ,xJ)|0,L=L+Math.imul(WJ,SJ)|0,_=_+Math.imul(WJ,xJ)|0,k=k+Math.imul(p,AJ)|0,L=L+Math.imul(p,kJ)|0,L=L+Math.imul(e,AJ)|0,_=_+Math.imul(e,kJ)|0,k=k+Math.imul(QJ,vJ)|0,L=L+Math.imul(QJ,MJ)|0,L=L+Math.imul(GJ,vJ)|0,_=_+Math.imul(GJ,MJ)|0;var jQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,k=Math.imul(qJ,FJ),L=Math.imul(qJ,RJ),L=L+Math.imul(ZJ,FJ)|0,_=Math.imul(ZJ,RJ),k=k+Math.imul(C,SJ)|0,L=L+Math.imul(C,xJ)|0,L=L+Math.imul(h,SJ)|0,_=_+Math.imul(h,xJ)|0,k=k+Math.imul(XJ,AJ)|0,L=L+Math.imul(XJ,kJ)|0,L=L+Math.imul(WJ,AJ)|0,_=_+Math.imul(WJ,kJ)|0,k=k+Math.imul(p,vJ)|0,L=L+Math.imul(p,MJ)|0,L=L+Math.imul(e,vJ)|0,_=_+Math.imul(e,MJ)|0,k=k+Math.imul(QJ,wJ)|0,L=L+Math.imul(QJ,bJ)|0,L=L+Math.imul(GJ,wJ)|0,_=_+Math.imul(GJ,bJ)|0;var TQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,k=Math.imul(BJ,FJ),L=Math.imul(BJ,RJ),L=L+Math.imul(TJ,FJ)|0,_=Math.imul(TJ,RJ),k=k+Math.imul(qJ,SJ)|0,L=L+Math.imul(qJ,xJ)|0,L=L+Math.imul(ZJ,SJ)|0,_=_+Math.imul(ZJ,xJ)|0,k=k+Math.imul(C,AJ)|0,L=L+Math.imul(C,kJ)|0,L=L+Math.imul(h,AJ)|0,_=_+Math.imul(h,kJ)|0,k=k+Math.imul(XJ,vJ)|0,L=L+Math.imul(XJ,MJ)|0,L=L+Math.imul(WJ,vJ)|0,_=_+Math.imul(WJ,MJ)|0,k=k+Math.imul(p,wJ)|0,L=L+Math.imul(p,bJ)|0,L=L+Math.imul(e,wJ)|0,_=_+Math.imul(e,bJ)|0,k=k+Math.imul(QJ,_J)|0,L=L+Math.imul(QJ,NJ)|0,L=L+Math.imul(GJ,_J)|0,_=_+Math.imul(GJ,NJ)|0;var NQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,k=Math.imul(LJ,FJ),L=Math.imul(LJ,RJ),L=L+Math.imul(IJ,FJ)|0,_=Math.imul(IJ,RJ),k=k+Math.imul(BJ,SJ)|0,L=L+Math.imul(BJ,xJ)|0,L=L+Math.imul(TJ,SJ)|0,_=_+Math.imul(TJ,xJ)|0,k=k+Math.imul(qJ,AJ)|0,L=L+Math.imul(qJ,kJ)|0,L=L+Math.imul(ZJ,AJ)|0,_=_+Math.imul(ZJ,kJ)|0,k=k+Math.imul(C,vJ)|0,L=L+Math.imul(C,MJ)|0,L=L+Math.imul(h,vJ)|0,_=_+Math.imul(h,MJ)|0,k=k+Math.imul(XJ,wJ)|0,L=L+Math.imul(XJ,bJ)|0,L=L+Math.imul(WJ,wJ)|0,_=_+Math.imul(WJ,bJ)|0,k=k+Math.imul(p,_J)|0,L=L+Math.imul(p,NJ)|0,L=L+Math.imul(e,_J)|0,_=_+Math.imul(e,NJ)|0,k=k+Math.imul(QJ,yJ)|0,L=L+Math.imul(QJ,gJ)|0,L=L+Math.imul(GJ,yJ)|0,_=_+Math.imul(GJ,gJ)|0;var IQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,k=Math.imul(T,FJ),L=Math.imul(T,RJ),L=L+Math.imul(D,FJ)|0,_=Math.imul(D,RJ),k=k+Math.imul(LJ,SJ)|0,L=L+Math.imul(LJ,xJ)|0,L=L+Math.imul(IJ,SJ)|0,_=_+Math.imul(IJ,xJ)|0,k=k+Math.imul(BJ,AJ)|0,L=L+Math.imul(BJ,kJ)|0,L=L+Math.imul(TJ,AJ)|0,_=_+Math.imul(TJ,kJ)|0,k=k+Math.imul(qJ,vJ)|0,L=L+Math.imul(qJ,MJ)|0,L=L+Math.imul(ZJ,vJ)|0,_=_+Math.imul(ZJ,MJ)|0,k=k+Math.imul(C,wJ)|0,L=L+Math.imul(C,bJ)|0,L=L+Math.imul(h,wJ)|0,_=_+Math.imul(h,bJ)|0,k=k+Math.imul(XJ,_J)|0,L=L+Math.imul(XJ,NJ)|0,L=L+Math.imul(WJ,_J)|0,_=_+Math.imul(WJ,NJ)|0,k=k+Math.imul(p,yJ)|0,L=L+Math.imul(p,gJ)|0,L=L+Math.imul(e,yJ)|0,_=_+Math.imul(e,gJ)|0,k=k+Math.imul(QJ,cJ)|0,L=L+Math.imul(QJ,fJ)|0,L=L+Math.imul(GJ,cJ)|0,_=_+Math.imul(GJ,fJ)|0;var EQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,k=Math.imul(d,FJ),L=Math.imul(d,RJ),L=L+Math.imul(a,FJ)|0,_=Math.imul(a,RJ),k=k+Math.imul(T,SJ)|0,L=L+Math.imul(T,xJ)|0,L=L+Math.imul(D,SJ)|0,_=_+Math.imul(D,xJ)|0,k=k+Math.imul(LJ,AJ)|0,L=L+Math.imul(LJ,kJ)|0,L=L+Math.imul(IJ,AJ)|0,_=_+Math.imul(IJ,kJ)|0,k=k+Math.imul(BJ,vJ)|0,L=L+Math.imul(BJ,MJ)|0,L=L+Math.imul(TJ,vJ)|0,_=_+Math.imul(TJ,MJ)|0,k=k+Math.imul(qJ,wJ)|0,L=L+Math.imul(qJ,bJ)|0,L=L+Math.imul(ZJ,wJ)|0,_=_+Math.imul(ZJ,bJ)|0,k=k+Math.imul(C,_J)|0,L=L+Math.imul(C,NJ)|0,L=L+Math.imul(h,_J)|0,_=_+Math.imul(h,NJ)|0,k=k+Math.imul(XJ,yJ)|0,L=L+Math.imul(XJ,gJ)|0,L=L+Math.imul(WJ,yJ)|0,_=_+Math.imul(WJ,gJ)|0,k=k+Math.imul(p,cJ)|0,L=L+Math.imul(p,fJ)|0,L=L+Math.imul(e,cJ)|0,_=_+Math.imul(e,fJ)|0,k=k+Math.imul(QJ,f)|0,L=L+Math.imul(QJ,zJ)|0,L=L+Math.imul(GJ,f)|0,_=_+Math.imul(GJ,zJ)|0;var RQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,k=Math.imul(UJ,FJ),L=Math.imul(UJ,RJ),L=L+Math.imul(EJ,FJ)|0,_=Math.imul(EJ,RJ),k=k+Math.imul(d,SJ)|0,L=L+Math.imul(d,xJ)|0,L=L+Math.imul(a,SJ)|0,_=_+Math.imul(a,xJ)|0,k=k+Math.imul(T,AJ)|0,L=L+Math.imul(T,kJ)|0,L=L+Math.imul(D,AJ)|0,_=_+Math.imul(D,kJ)|0,k=k+Math.imul(LJ,vJ)|0,L=L+Math.imul(LJ,MJ)|0,L=L+Math.imul(IJ,vJ)|0,_=_+Math.imul(IJ,MJ)|0,k=k+Math.imul(BJ,wJ)|0,L=L+Math.imul(BJ,bJ)|0,L=L+Math.imul(TJ,wJ)|0,_=_+Math.imul(TJ,bJ)|0,k=k+Math.imul(qJ,_J)|0,L=L+Math.imul(qJ,NJ)|0,L=L+Math.imul(ZJ,_J)|0,_=_+Math.imul(ZJ,NJ)|0,k=k+Math.imul(C,yJ)|0,L=L+Math.imul(C,gJ)|0,L=L+Math.imul(h,yJ)|0,_=_+Math.imul(h,gJ)|0,k=k+Math.imul(XJ,cJ)|0,L=L+Math.imul(XJ,fJ)|0,L=L+Math.imul(WJ,cJ)|0,_=_+Math.imul(WJ,fJ)|0,k=k+Math.imul(p,f)|0,L=L+Math.imul(p,zJ)|0,L=L+Math.imul(e,f)|0,_=_+Math.imul(e,zJ)|0,k=k+Math.imul(QJ,oJ)|0,L=L+Math.imul(QJ,tJ)|0,L=L+Math.imul(GJ,oJ)|0,_=_+Math.imul(GJ,tJ)|0;var zQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,k=Math.imul(UJ,SJ),L=Math.imul(UJ,xJ),L=L+Math.imul(EJ,SJ)|0,_=Math.imul(EJ,xJ),k=k+Math.imul(d,AJ)|0,L=L+Math.imul(d,kJ)|0,L=L+Math.imul(a,AJ)|0,_=_+Math.imul(a,kJ)|0,k=k+Math.imul(T,vJ)|0,L=L+Math.imul(T,MJ)|0,L=L+Math.imul(D,vJ)|0,_=_+Math.imul(D,MJ)|0,k=k+Math.imul(LJ,wJ)|0,L=L+Math.imul(LJ,bJ)|0,L=L+Math.imul(IJ,wJ)|0,_=_+Math.imul(IJ,bJ)|0,k=k+Math.imul(BJ,_J)|0,L=L+Math.imul(BJ,NJ)|0,L=L+Math.imul(TJ,_J)|0,_=_+Math.imul(TJ,NJ)|0,k=k+Math.imul(qJ,yJ)|0,L=L+Math.imul(qJ,gJ)|0,L=L+Math.imul(ZJ,yJ)|0,_=_+Math.imul(ZJ,gJ)|0,k=k+Math.imul(C,cJ)|0,L=L+Math.imul(C,fJ)|0,L=L+Math.imul(h,cJ)|0,_=_+Math.imul(h,fJ)|0,k=k+Math.imul(XJ,f)|0,L=L+Math.imul(XJ,zJ)|0,L=L+Math.imul(WJ,f)|0,_=_+Math.imul(WJ,zJ)|0,k=k+Math.imul(p,oJ)|0,L=L+Math.imul(p,tJ)|0,L=L+Math.imul(e,oJ)|0,_=_+Math.imul(e,tJ)|0;var PQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,k=Math.imul(UJ,AJ),L=Math.imul(UJ,kJ),L=L+Math.imul(EJ,AJ)|0,_=Math.imul(EJ,kJ),k=k+Math.imul(d,vJ)|0,L=L+Math.imul(d,MJ)|0,L=L+Math.imul(a,vJ)|0,_=_+Math.imul(a,MJ)|0,k=k+Math.imul(T,wJ)|0,L=L+Math.imul(T,bJ)|0,L=L+Math.imul(D,wJ)|0,_=_+Math.imul(D,bJ)|0,k=k+Math.imul(LJ,_J)|0,L=L+Math.imul(LJ,NJ)|0,L=L+Math.imul(IJ,_J)|0,_=_+Math.imul(IJ,NJ)|0,k=k+Math.imul(BJ,yJ)|0,L=L+Math.imul(BJ,gJ)|0,L=L+Math.imul(TJ,yJ)|0,_=_+Math.imul(TJ,gJ)|0,k=k+Math.imul(qJ,cJ)|0,L=L+Math.imul(qJ,fJ)|0,L=L+Math.imul(ZJ,cJ)|0,_=_+Math.imul(ZJ,fJ)|0,k=k+Math.imul(C,f)|0,L=L+Math.imul(C,zJ)|0,L=L+Math.imul(h,f)|0,_=_+Math.imul(h,zJ)|0,k=k+Math.imul(XJ,oJ)|0,L=L+Math.imul(XJ,tJ)|0,L=L+Math.imul(WJ,oJ)|0,_=_+Math.imul(WJ,tJ)|0;var LQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,k=Math.imul(UJ,vJ),L=Math.imul(UJ,MJ),L=L+Math.imul(EJ,vJ)|0,_=Math.imul(EJ,MJ),k=k+Math.imul(d,wJ)|0,L=L+Math.imul(d,bJ)|0,L=L+Math.imul(a,wJ)|0,_=_+Math.imul(a,bJ)|0,k=k+Math.imul(T,_J)|0,L=L+Math.imul(T,NJ)|0,L=L+Math.imul(D,_J)|0,_=_+Math.imul(D,NJ)|0,k=k+Math.imul(LJ,yJ)|0,L=L+Math.imul(LJ,gJ)|0,L=L+Math.imul(IJ,yJ)|0,_=_+Math.imul(IJ,gJ)|0,k=k+Math.imul(BJ,cJ)|0,L=L+Math.imul(BJ,fJ)|0,L=L+Math.imul(TJ,cJ)|0,_=_+Math.imul(TJ,fJ)|0,k=k+Math.imul(qJ,f)|0,L=L+Math.imul(qJ,zJ)|0,L=L+Math.imul(ZJ,f)|0,_=_+Math.imul(ZJ,zJ)|0,k=k+Math.imul(C,oJ)|0,L=L+Math.imul(C,tJ)|0,L=L+Math.imul(h,oJ)|0,_=_+Math.imul(h,tJ)|0;var FQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,k=Math.imul(UJ,wJ),L=Math.imul(UJ,bJ),L=L+Math.imul(EJ,wJ)|0,_=Math.imul(EJ,bJ),k=k+Math.imul(d,_J)|0,L=L+Math.imul(d,NJ)|0,L=L+Math.imul(a,_J)|0,_=_+Math.imul(a,NJ)|0,k=k+Math.imul(T,yJ)|0,L=L+Math.imul(T,gJ)|0,L=L+Math.imul(D,yJ)|0,_=_+Math.imul(D,gJ)|0,k=k+Math.imul(LJ,cJ)|0,L=L+Math.imul(LJ,fJ)|0,L=L+Math.imul(IJ,cJ)|0,_=_+Math.imul(IJ,fJ)|0,k=k+Math.imul(BJ,f)|0,L=L+Math.imul(BJ,zJ)|0,L=L+Math.imul(TJ,f)|0,_=_+Math.imul(TJ,zJ)|0,k=k+Math.imul(qJ,oJ)|0,L=L+Math.imul(qJ,tJ)|0,L=L+Math.imul(ZJ,oJ)|0,_=_+Math.imul(ZJ,tJ)|0;var HQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,k=Math.imul(UJ,_J),L=Math.imul(UJ,NJ),L=L+Math.imul(EJ,_J)|0,_=Math.imul(EJ,NJ),k=k+Math.imul(d,yJ)|0,L=L+Math.imul(d,gJ)|0,L=L+Math.imul(a,yJ)|0,_=_+Math.imul(a,gJ)|0,k=k+Math.imul(T,cJ)|0,L=L+Math.imul(T,fJ)|0,L=L+Math.imul(D,cJ)|0,_=_+Math.imul(D,fJ)|0,k=k+Math.imul(LJ,f)|0,L=L+Math.imul(LJ,zJ)|0,L=L+Math.imul(IJ,f)|0,_=_+Math.imul(IJ,zJ)|0,k=k+Math.imul(BJ,oJ)|0,L=L+Math.imul(BJ,tJ)|0,L=L+Math.imul(TJ,oJ)|0,_=_+Math.imul(TJ,tJ)|0;var DQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,k=Math.imul(UJ,yJ),L=Math.imul(UJ,gJ),L=L+Math.imul(EJ,yJ)|0,_=Math.imul(EJ,gJ),k=k+Math.imul(d,cJ)|0,L=L+Math.imul(d,fJ)|0,L=L+Math.imul(a,cJ)|0,_=_+Math.imul(a,fJ)|0,k=k+Math.imul(T,f)|0,L=L+Math.imul(T,zJ)|0,L=L+Math.imul(D,f)|0,_=_+Math.imul(D,zJ)|0,k=k+Math.imul(LJ,oJ)|0,L=L+Math.imul(LJ,tJ)|0,L=L+Math.imul(IJ,oJ)|0,_=_+Math.imul(IJ,tJ)|0;var KQ=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,k=Math.imul(UJ,cJ),L=Math.imul(UJ,fJ),L=L+Math.imul(EJ,cJ)|0,_=Math.imul(EJ,fJ),k=k+Math.imul(d,f)|0,L=L+Math.imul(d,zJ)|0,L=L+Math.imul(a,f)|0,_=_+Math.imul(a,zJ)|0,k=k+Math.imul(T,oJ)|0,L=L+Math.imul(T,tJ)|0,L=L+Math.imul(D,oJ)|0,_=_+Math.imul(D,tJ)|0;var TV=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(TV>>>26)|0,TV&=67108863,k=Math.imul(UJ,f),L=Math.imul(UJ,zJ),L=L+Math.imul(EJ,f)|0,_=Math.imul(EJ,zJ),k=k+Math.imul(d,oJ)|0,L=L+Math.imul(d,tJ)|0,L=L+Math.imul(a,oJ)|0,_=_+Math.imul(a,tJ)|0;var NV=(K+k|0)+((L&8191)<<13)|0;K=(_+(L>>>13)|0)+(NV>>>26)|0,NV&=67108863,k=Math.imul(UJ,oJ),L=Math.imul(UJ,tJ),L=L+Math.imul(EJ,oJ)|0,_=Math.imul(EJ,tJ);var IV=(K+k|0)+((L&8191)<<13)|0;return K=(_+(L>>>13)|0)+(IV>>>26)|0,IV&=67108863,Q[0]=YQ,Q[1]=BQ,Q[2]=OQ,Q[3]=jQ,Q[4]=TQ,Q[5]=NQ,Q[6]=IQ,Q[7]=EQ,Q[8]=RQ,Q[9]=zQ,Q[10]=PQ,Q[11]=LQ,Q[12]=FQ,Q[13]=HQ,Q[14]=DQ,Q[15]=KQ,Q[16]=TV,Q[17]=NV,Q[18]=IV,K!==0&&(Q[19]=K,U.length++),U};Math.imul||(w=S);function y($,X,U){U.negative=X.negative^$.negative,U.length=$.length+X.length;for(var H=0,G=0,Q=0;Q<U.length-1;Q++){var K=G;G=0;for(var k=H&67108863,L=Math.min(Q,X.length-1),_=Math.max(0,Q-$.length+1);_<=L;_++){var t=Q-_,QJ=$.words[t]|0,GJ=X.words[_]|0,n=QJ*GJ,p=n&67108863;K=K+(n/67108864|0)|0,p=p+k|0,k=p&67108863,K=K+(p>>>26)|0,G+=K>>>26,K&=67108863}U.words[Q]=k,H=K,K=G}return H!==0?U.words[Q]=H:U.length--,U._strip()}function m($,X,U){return y($,X,U)}q.prototype.mulTo=function($,X){var U,H=this.length+$.length;return this.length===10&&$.length===10?U=w(this,$,X):H<63?U=S(this,$,X):H<1024?U=y(this,$,X):U=m(this,$,X),U};function i($,X){this.x=$,this.y=X}i.prototype.makeRBT=function($){for(var X=new Array($),U=q.prototype._countBits($)-1,H=0;H<$;H++)X[H]=this.revBin(H,U,$);return X},i.prototype.revBin=function($,X,U){if($===0||$===U-1)return $;for(var H=0,G=0;G<X;G++)H|=($&1)<<X-G-1,$>>=1;return H},i.prototype.permute=function($,X,U,H,G,Q){for(var K=0;K<Q;K++)H[K]=X[$[K]],G[K]=U[$[K]]},i.prototype.transform=function($,X,U,H,G,Q){this.permute(Q,$,X,U,H,G);for(var K=1;K<G;K<<=1)for(var k=K<<1,L=Math.cos(2*Math.PI/k),_=Math.sin(2*Math.PI/k),t=0;t<G;t+=k)for(var QJ=L,GJ=_,n=0;n<K;n++){var p=U[t+n],e=H[t+n],PJ=U[t+n+K],XJ=H[t+n+K],WJ=QJ*PJ-GJ*XJ;XJ=QJ*XJ+GJ*PJ,PJ=WJ,U[t+n]=p+PJ,H[t+n]=e+XJ,U[t+n+K]=p-PJ,H[t+n+K]=e-XJ,n!==k&&(WJ=L*QJ-_*GJ,GJ=L*GJ+_*QJ,QJ=WJ)}},i.prototype.guessLen13b=function($,X){var U=Math.max(X,$)|1,H=U&1,G=0;for(U=U/2|0;U;U=U>>>1)G++;return 1<<G+1+H},i.prototype.conjugate=function($,X,U){if(!(U<=1))for(var H=0;H<U/2;H++){var G=$[H];$[H]=$[U-H-1],$[U-H-1]=G,G=X[H],X[H]=-X[U-H-1],X[U-H-1]=-G}},i.prototype.normalize13b=function($,X){for(var U=0,H=0;H<X/2;H++){var G=Math.round($[2*H+1]/X)*8192+Math.round($[2*H]/X)+U;$[H]=G&67108863,G<67108864?U=0:U=G/67108864|0}return $},i.prototype.convert13b=function($,X,U,H){for(var G=0,Q=0;Q<X;Q++)G=G+($[Q]|0),U[2*Q]=G&8191,G=G>>>13,U[2*Q+1]=G&8191,G=G>>>13;for(Q=2*X;Q<H;++Q)U[Q]=0;B(G===0),B((G&-8192)===0)},i.prototype.stub=function($){for(var X=new Array($),U=0;U<$;U++)X[U]=0;return X},i.prototype.mulp=function($,X,U){var H=2*this.guessLen13b($.length,X.length),G=this.makeRBT(H),Q=this.stub(H),K=new Array(H),k=new Array(H),L=new Array(H),_=new Array(H),t=new Array(H),QJ=new Array(H),GJ=U.words;GJ.length=H,this.convert13b($.words,$.length,K,H),this.convert13b(X.words,X.length,_,H),this.transform(K,Q,k,L,H,G),this.transform(_,Q,t,QJ,H,G);for(var n=0;n<H;n++){var p=k[n]*t[n]-L[n]*QJ[n];L[n]=k[n]*QJ[n]+L[n]*t[n],k[n]=p}return this.conjugate(k,L,H),this.transform(k,L,GJ,Q,H,G),this.conjugate(GJ,Q,H),this.normalize13b(GJ,H),U.negative=$.negative^X.negative,U.length=$.length+X.length,U._strip()},q.prototype.mul=function($){var X=new q(null);return X.words=new Array(this.length+$.length),this.mulTo($,X)},q.prototype.mulf=function($){var X=new q(null);return X.words=new Array(this.length+$.length),m(this,$,X)},q.prototype.imul=function($){return this.clone().mulTo($,this)},q.prototype.imuln=function($){var X=$<0;X&&($=-$),B(typeof $=="number"),B($<67108864);for(var U=0,H=0;H<this.length;H++){var G=(this.words[H]|0)*$,Q=(G&67108863)+(U&67108863);U>>=26,U+=G/67108864|0,U+=Q>>>26,this.words[H]=Q&67108863}return U!==0&&(this.words[H]=U,this.length++),X?this.ineg():this},q.prototype.muln=function($){return this.clone().imuln($)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function($){var X=v($);if(X.length===0)return new q(1);for(var U=this,H=0;H<X.length&&X[H]===0;H++,U=U.sqr());if(++H<X.length)for(var G=U.sqr();H<X.length;H++,G=G.sqr())X[H]!==0&&(U=U.mul(G));return U},q.prototype.iushln=function($){B(typeof $=="number"&&$>=0);var X=$%26,U=($-X)/26,H=67108863>>>26-X<<26-X,G;if(X!==0){var Q=0;for(G=0;G<this.length;G++){var K=this.words[G]&H,k=(this.words[G]|0)-K<<X;this.words[G]=k|Q,Q=K>>>26-X}Q&&(this.words[G]=Q,this.length++)}if(U!==0){for(G=this.length-1;G>=0;G--)this.words[G+U]=this.words[G];for(G=0;G<U;G++)this.words[G]=0;this.length+=U}return this._strip()},q.prototype.ishln=function($){return B(this.negative===0),this.iushln($)},q.prototype.iushrn=function($,X,U){B(typeof $=="number"&&$>=0);var H;X?H=(X-X%26)/26:H=0;var G=$%26,Q=Math.min(($-G)/26,this.length),K=67108863^67108863>>>G<<G,k=U;if(H-=Q,H=Math.max(0,H),k){for(var L=0;L<Q;L++)k.words[L]=this.words[L];k.length=Q}if(Q!==0)if(this.length>Q)for(this.length-=Q,L=0;L<this.length;L++)this.words[L]=this.words[L+Q];else this.words[0]=0,this.length=1;var _=0;for(L=this.length-1;L>=0&&(_!==0||L>=H);L--){var t=this.words[L]|0;this.words[L]=_<<26-G|t>>>G,_=t&K}return k&&_!==0&&(k.words[k.length++]=_),this.length===0&&(this.words[0]=0,this.length=1),this._strip()},q.prototype.ishrn=function($,X,U){return B(this.negative===0),this.iushrn($,X,U)},q.prototype.shln=function($){return this.clone().ishln($)},q.prototype.ushln=function($){return this.clone().iushln($)},q.prototype.shrn=function($){return this.clone().ishrn($)},q.prototype.ushrn=function($){return this.clone().iushrn($)},q.prototype.testn=function($){B(typeof $=="number"&&$>=0);var X=$%26,U=($-X)/26,H=1<<X;if(this.length<=U)return!1;var G=this.words[U];return!!(G&H)},q.prototype.imaskn=function($){B(typeof $=="number"&&$>=0);var X=$%26,U=($-X)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=U)return this;if(X!==0&&U++,this.length=Math.min(U,this.length),X!==0){var H=67108863^67108863>>>X<<X;this.words[this.length-1]&=H}return this._strip()},q.prototype.maskn=function($){return this.clone().imaskn($)},q.prototype.iaddn=function($){return B(typeof $=="number"),B($<67108864),$<0?this.isubn(-$):this.negative!==0?this.length===1&&(this.words[0]|0)<=$?(this.words[0]=$-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn($),this.negative=1,this):this._iaddn($)},q.prototype._iaddn=function($){this.words[0]+=$;for(var X=0;X<this.length&&this.words[X]>=67108864;X++)this.words[X]-=67108864,X===this.length-1?this.words[X+1]=1:this.words[X+1]++;return this.length=Math.max(this.length,X+1),this},q.prototype.isubn=function($){if(B(typeof $=="number"),B($<67108864),$<0)return this.iaddn(-$);if(this.negative!==0)return this.negative=0,this.iaddn($),this.negative=1,this;if(this.words[0]-=$,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var X=0;X<this.length&&this.words[X]<0;X++)this.words[X]+=67108864,this.words[X+1]-=1;return this._strip()},q.prototype.addn=function($){return this.clone().iaddn($)},q.prototype.subn=function($){return this.clone().isubn($)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function($,X,U){var H=$.length+U,G;this._expand(H);var Q,K=0;for(G=0;G<$.length;G++){Q=(this.words[G+U]|0)+K;var k=($.words[G]|0)*X;Q-=k&67108863,K=(Q>>26)-(k/67108864|0),this.words[G+U]=Q&67108863}for(;G<this.length-U;G++)Q=(this.words[G+U]|0)+K,K=Q>>26,this.words[G+U]=Q&67108863;if(K===0)return this._strip();for(B(K===-1),K=0,G=0;G<this.length;G++)Q=-(this.words[G]|0)+K,K=Q>>26,this.words[G]=Q&67108863;return this.negative=1,this._strip()},q.prototype._wordDiv=function($,X){var U=this.length-$.length,H=this.clone(),G=$,Q=G.words[G.length-1]|0,K=this._countBits(Q);U=26-K,U!==0&&(G=G.ushln(U),H.iushln(U),Q=G.words[G.length-1]|0);var k=H.length-G.length,L;if(X!=="mod"){L=new q(null),L.length=k+1,L.words=new Array(L.length);for(var _=0;_<L.length;_++)L.words[_]=0}var t=H.clone()._ishlnsubmul(G,1,k);t.negative===0&&(H=t,L&&(L.words[k]=1));for(var QJ=k-1;QJ>=0;QJ--){var GJ=(H.words[G.length+QJ]|0)*67108864+(H.words[G.length+QJ-1]|0);for(GJ=Math.min(GJ/Q|0,67108863),H._ishlnsubmul(G,GJ,QJ);H.negative!==0;)GJ--,H.negative=0,H._ishlnsubmul(G,1,QJ),H.isZero()||(H.negative^=1);L&&(L.words[QJ]=GJ)}return L&&L._strip(),H._strip(),X!=="div"&&U!==0&&H.iushrn(U),{div:L||null,mod:H}},q.prototype.divmod=function($,X,U){if(B(!$.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var H,G,Q;return this.negative!==0&&$.negative===0?(Q=this.neg().divmod($,X),X!=="mod"&&(H=Q.div.neg()),X!=="div"&&(G=Q.mod.neg(),U&&G.negative!==0&&G.iadd($)),{div:H,mod:G}):this.negative===0&&$.negative!==0?(Q=this.divmod($.neg(),X),X!=="mod"&&(H=Q.div.neg()),{div:H,mod:Q.mod}):(this.negative&$.negative)!==0?(Q=this.neg().divmod($.neg(),X),X!=="div"&&(G=Q.mod.neg(),U&&G.negative!==0&&G.isub($)),{div:Q.div,mod:G}):$.length>this.length||this.cmp($)<0?{div:new q(0),mod:this}:$.length===1?X==="div"?{div:this.divn($.words[0]),mod:null}:X==="mod"?{div:null,mod:new q(this.modrn($.words[0]))}:{div:this.divn($.words[0]),mod:new q(this.modrn($.words[0]))}:this._wordDiv($,X)},q.prototype.div=function($){return this.divmod($,"div",!1).div},q.prototype.mod=function($){return this.divmod($,"mod",!1).mod},q.prototype.umod=function($){return this.divmod($,"mod",!0).mod},q.prototype.divRound=function($){var X=this.divmod($);if(X.mod.isZero())return X.div;var U=X.div.negative!==0?X.mod.isub($):X.mod,H=$.ushrn(1),G=$.andln(1),Q=U.cmp(H);return Q<0||G===1&&Q===0?X.div:X.div.negative!==0?X.div.isubn(1):X.div.iaddn(1)},q.prototype.modrn=function($){var X=$<0;X&&($=-$),B($<=67108863);for(var U=(1<<26)%$,H=0,G=this.length-1;G>=0;G--)H=(U*H+(this.words[G]|0))%$;return X?-H:H},q.prototype.modn=function($){return this.modrn($)},q.prototype.idivn=function($){var X=$<0;X&&($=-$),B($<=67108863);for(var U=0,H=this.length-1;H>=0;H--){var G=(this.words[H]|0)+U*67108864;this.words[H]=G/$|0,U=G%$}return this._strip(),X?this.ineg():this},q.prototype.divn=function($){return this.clone().idivn($)},q.prototype.egcd=function($){B($.negative===0),B(!$.isZero());var X=this,U=$.clone();X.negative!==0?X=X.umod($):X=X.clone();for(var H=new q(1),G=new q(0),Q=new q(0),K=new q(1),k=0;X.isEven()&&U.isEven();)X.iushrn(1),U.iushrn(1),++k;for(var L=U.clone(),_=X.clone();!X.isZero();){for(var t=0,QJ=1;(X.words[0]&QJ)===0&&t<26;++t,QJ<<=1);if(t>0)for(X.iushrn(t);t-- >0;)(H.isOdd()||G.isOdd())&&(H.iadd(L),G.isub(_)),H.iushrn(1),G.iushrn(1);for(var GJ=0,n=1;(U.words[0]&n)===0&&GJ<26;++GJ,n<<=1);if(GJ>0)for(U.iushrn(GJ);GJ-- >0;)(Q.isOdd()||K.isOdd())&&(Q.iadd(L),K.isub(_)),Q.iushrn(1),K.iushrn(1);X.cmp(U)>=0?(X.isub(U),H.isub(Q),G.isub(K)):(U.isub(X),Q.isub(H),K.isub(G))}return{a:Q,b:K,gcd:U.iushln(k)}},q.prototype._invmp=function($){B($.negative===0),B(!$.isZero());var X=this,U=$.clone();X.negative!==0?X=X.umod($):X=X.clone();for(var H=new q(1),G=new q(0),Q=U.clone();X.cmpn(1)>0&&U.cmpn(1)>0;){for(var K=0,k=1;(X.words[0]&k)===0&&K<26;++K,k<<=1);if(K>0)for(X.iushrn(K);K-- >0;)H.isOdd()&&H.iadd(Q),H.iushrn(1);for(var L=0,_=1;(U.words[0]&_)===0&&L<26;++L,_<<=1);if(L>0)for(U.iushrn(L);L-- >0;)G.isOdd()&&G.iadd(Q),G.iushrn(1);X.cmp(U)>=0?(X.isub(U),H.isub(G)):(U.isub(X),G.isub(H))}var t;return X.cmpn(1)===0?t=H:t=G,t.cmpn(0)<0&&t.iadd($),t},q.prototype.gcd=function($){if(this.isZero())return $.abs();if($.isZero())return this.abs();var X=this.clone(),U=$.clone();X.negative=0,U.negative=0;for(var H=0;X.isEven()&&U.isEven();H++)X.iushrn(1),U.iushrn(1);do{for(;X.isEven();)X.iushrn(1);for(;U.isEven();)U.iushrn(1);var G=X.cmp(U);if(G<0){var Q=X;X=U,U=Q}else if(G===0||U.cmpn(1)===0)break;X.isub(U)}while(!0);return U.iushln(H)},q.prototype.invm=function($){return this.egcd($).a.umod($)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function($){return this.words[0]&$},q.prototype.bincn=function($){B(typeof $=="number");var X=$%26,U=($-X)/26,H=1<<X;if(this.length<=U)return this._expand(U+1),this.words[U]|=H,this;for(var G=H,Q=U;G!==0&&Q<this.length;Q++){var K=this.words[Q]|0;K+=G,G=K>>>26,K&=67108863,this.words[Q]=K}return G!==0&&(this.words[Q]=G,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function($){var X=$<0;if(this.negative!==0&&!X)return-1;if(this.negative===0&&X)return 1;this._strip();var U;if(this.length>1)U=1;else{X&&($=-$),B($<=67108863,"Number is too big");var H=this.words[0]|0;U=H===$?0:H<$?-1:1}return this.negative!==0?-U|0:U},q.prototype.cmp=function($){if(this.negative!==0&&$.negative===0)return-1;if(this.negative===0&&$.negative!==0)return 1;var X=this.ucmp($);return this.negative!==0?-X|0:X},q.prototype.ucmp=function($){if(this.length>$.length)return 1;if(this.length<$.length)return-1;for(var X=0,U=this.length-1;U>=0;U--){var H=this.words[U]|0,G=$.words[U]|0;if(H!==G){H<G?X=-1:H>G&&(X=1);break}}return X},q.prototype.gtn=function($){return this.cmpn($)===1},q.prototype.gt=function($){return this.cmp($)===1},q.prototype.gten=function($){return this.cmpn($)>=0},q.prototype.gte=function($){return this.cmp($)>=0},q.prototype.ltn=function($){return this.cmpn($)===-1},q.prototype.lt=function($){return this.cmp($)===-1},q.prototype.lten=function($){return this.cmpn($)<=0},q.prototype.lte=function($){return this.cmp($)<=0},q.prototype.eqn=function($){return this.cmpn($)===0},q.prototype.eq=function($){return this.cmp($)===0},q.red=function($){return new V($)},q.prototype.toRed=function($){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),$.convertTo(this)._forceRed($)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function($){return this.red=$,this},q.prototype.forceRed=function($){return B(!this.red,"Already a number in reduction context"),this._forceRed($)},q.prototype.redAdd=function($){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,$)},q.prototype.redIAdd=function($){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,$)},q.prototype.redSub=function($){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,$)},q.prototype.redISub=function($){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,$)},q.prototype.redShl=function($){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,$)},q.prototype.redMul=function($){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,$),this.red.mul(this,$)},q.prototype.redIMul=function($){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,$),this.red.imul(this,$)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function($){return B(this.red&&!$.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,$)};var JJ={k256:null,p224:null,p192:null,p25519:null};function VJ($,X){this.name=$,this.p=new q(X,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}VJ.prototype._tmp=function(){var $=new q(null);return $.words=new Array(Math.ceil(this.n/13)),$},VJ.prototype.ireduce=function($){var X=$,U;do this.split(X,this.tmp),X=this.imulK(X),X=X.iadd(this.tmp),U=X.bitLength();while(U>this.n);var H=U<this.n?-1:X.ucmp(this.p);return H===0?(X.words[0]=0,X.length=1):H>0?X.isub(this.p):X.strip!==void 0?X.strip():X._strip(),X},VJ.prototype.split=function($,X){$.iushrn(this.n,0,X)},VJ.prototype.imulK=function($){return $.imul(this.k)};function HJ(){VJ.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(HJ,VJ),HJ.prototype.split=function($,X){for(var U=4194303,H=Math.min($.length,9),G=0;G<H;G++)X.words[G]=$.words[G];if(X.length=H,$.length<=9){$.words[0]=0,$.length=1;return}var Q=$.words[9];for(X.words[X.length++]=Q&U,G=10;G<$.length;G++){var K=$.words[G]|0;$.words[G-10]=(K&U)<<4|Q>>>22,Q=K}Q>>>=22,$.words[G-10]=Q,Q===0&&$.length>10?$.length-=10:$.length-=9},HJ.prototype.imulK=function($){$.words[$.length]=0,$.words[$.length+1]=0,$.length+=2;for(var X=0,U=0;U<$.length;U++){var H=$.words[U]|0;X+=H*977,$.words[U]=X&67108863,X=H*64+(X/67108864|0)}return $.words[$.length-1]===0&&($.length--,$.words[$.length-1]===0&&$.length--),$};function o(){VJ.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(o,VJ);function jJ(){VJ.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(jJ,VJ);function J(){VJ.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(J,VJ),J.prototype.imulK=function($){for(var X=0,U=0;U<$.length;U++){var H=($.words[U]|0)*19+X,G=H&67108863;H>>>=26,$.words[U]=G,X=H}return X!==0&&($.words[$.length++]=X),$},q._prime=function($){if(JJ[$])return JJ[$];var X;if($==="k256")X=new HJ;else if($==="p224")X=new o;else if($==="p192")X=new jJ;else if($==="p25519")X=new J;else throw new Error("Unknown prime "+$);return JJ[$]=X,X};function V($){if(typeof $=="string"){var X=q._prime($);this.m=X.p,this.prime=X}else B($.gtn(1),"modulus must be greater than 1"),this.m=$,this.prime=null}V.prototype._verify1=function($){B($.negative===0,"red works only with positives"),B($.red,"red works only with red numbers")},V.prototype._verify2=function($,X){B(($.negative|X.negative)===0,"red works only with positives"),B($.red&&$.red===X.red,"red works only with red numbers")},V.prototype.imod=function($){return this.prime?this.prime.ireduce($)._forceRed(this):(W($,$.umod(this.m)._forceRed(this)),$)},V.prototype.neg=function($){return $.isZero()?$.clone():this.m.sub($)._forceRed(this)},V.prototype.add=function($,X){this._verify2($,X);var U=$.add(X);return U.cmp(this.m)>=0&&U.isub(this.m),U._forceRed(this)},V.prototype.iadd=function($,X){this._verify2($,X);var U=$.iadd(X);return U.cmp(this.m)>=0&&U.isub(this.m),U},V.prototype.sub=function($,X){this._verify2($,X);var U=$.sub(X);return U.cmpn(0)<0&&U.iadd(this.m),U._forceRed(this)},V.prototype.isub=function($,X){this._verify2($,X);var U=$.isub(X);return U.cmpn(0)<0&&U.iadd(this.m),U},V.prototype.shl=function($,X){return this._verify1($),this.imod($.ushln(X))},V.prototype.imul=function($,X){return this._verify2($,X),this.imod($.imul(X))},V.prototype.mul=function($,X){return this._verify2($,X),this.imod($.mul(X))},V.prototype.isqr=function($){return this.imul($,$.clone())},V.prototype.sqr=function($){return this.mul($,$)},V.prototype.sqrt=function($){if($.isZero())return $.clone();var X=this.m.andln(3);if(B(X%2===1),X===3){var U=this.m.add(new q(1)).iushrn(2);return this.pow($,U)}for(var H=this.m.subn(1),G=0;!H.isZero()&&H.andln(1)===0;)G++,H.iushrn(1);B(!H.isZero());var Q=new q(1).toRed(this),K=Q.redNeg(),k=this.m.subn(1).iushrn(1),L=this.m.bitLength();for(L=new q(2*L*L).toRed(this);this.pow(L,k).cmp(K)!==0;)L.redIAdd(K);for(var _=this.pow(L,H),t=this.pow($,H.addn(1).iushrn(1)),QJ=this.pow($,H),GJ=G;QJ.cmp(Q)!==0;){for(var n=QJ,p=0;n.cmp(Q)!==0;p++)n=n.redSqr();B(p<GJ);var e=this.pow(_,new q(1).iushln(GJ-p-1));t=t.redMul(e),_=e.redSqr(),QJ=QJ.redMul(_),GJ=p}return t},V.prototype.invm=function($){var X=$._invmp(this.m);return X.negative!==0?(X.negative=0,this.imod(X).redNeg()):this.imod(X)},V.prototype.pow=function($,X){if(X.isZero())return new q(1).toRed(this);if(X.cmpn(1)===0)return $.clone();var U=4,H=new Array(1<<U);H[0]=new q(1).toRed(this),H[1]=$;for(var G=2;G<H.length;G++)H[G]=this.mul(H[G-1],$);var Q=H[0],K=0,k=0,L=X.bitLength()%26;for(L===0&&(L=26),G=X.length-1;G>=0;G--){for(var _=X.words[G],t=L-1;t>=0;t--){var QJ=_>>t&1;if(Q!==H[0]&&(Q=this.sqr(Q)),QJ===0&&K===0){k=0;continue}K<<=1,K|=QJ,k++,!(k!==U&&(G!==0||t!==0))&&(Q=this.mul(Q,H[K]),k=0,K=0)}L=26}return Q},V.prototype.convertTo=function($){var X=$.umod(this.m);return X===$?X.clone():X},V.prototype.convertFrom=function($){var X=$.clone();return X.red=null,X},q.mont=function($){return new Z($)};function Z($){V.call(this,$),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(Z,V),Z.prototype.convertTo=function($){return this.imod($.ushln(this.shift))},Z.prototype.convertFrom=function($){var X=this.imod($.mul(this.rinv));return X.red=null,X},Z.prototype.imul=function($,X){if($.isZero()||X.isZero())return $.words[0]=0,$.length=1,$;var U=$.imul(X),H=U.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),G=U.isub(H).iushrn(this.shift),Q=G;return G.cmp(this.m)>=0?Q=G.isub(this.m):G.cmpn(0)<0&&(Q=G.iadd(this.m)),Q._forceRed(this)},Z.prototype.mul=function($,X){if($.isZero()||X.isZero())return new q(0)._forceRed(this);var U=$.mul(X),H=U.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),G=U.isub(H).iushrn(this.shift),Q=G;return G.cmp(this.m)>=0?Q=G.isub(this.m):G.cmpn(0)<0&&(Q=G.iadd(this.m)),Q._forceRed(this)},Z.prototype.invm=function($){var X=this.imod($._invmp(this.m).mul(this.r2));return X._forceRed(this)}})(typeof g>"u"||g,l)}),$0=OJ((l,g)=>{var R=V0(),M=VV();function B(Y){var E=A(Y),O=E.toRed(R.mont(Y.modulus)).redPow(new R(Y.publicExponent)).fromRed();return{blinder:O,unblinder:E.invm(Y.modulus)}}function A(Y){var E=Y.modulus.byteLength(),O;do O=new R(M(E));while(O.cmp(Y.modulus)>=0||!O.umod(Y.prime1)||!O.umod(Y.prime2));return O}function q(Y,E){var O=B(E),N=E.modulus.byteLength(),W=new R(Y).mul(O.blinder).umod(E.modulus),I=W.toRed(R.mont(E.prime1)),z=W.toRed(R.mont(E.prime2)),j=E.coefficient,P=E.prime1,F=E.prime2,v=I.redPow(E.exponent1).fromRed(),S=z.redPow(E.exponent2).fromRed(),w=v.isub(S).imul(j).umod(P).imul(F);return S.iadd(w).imul(O.unblinder).umod(E.modulus).toArrayLike(Buffer,"be",N)}q.getr=A,g.exports=q}),n8=OJ((l,g)=>{g.exports={name:"elliptic",version:"6.5.4",description:"EC cryptography",main:"lib/elliptic.js",files:["lib"],scripts:{lint:"eslint lib test","lint:fix":"npm run lint -- --fix",unit:"istanbul test _mocha --reporter=spec test/index.js",test:"npm run lint && npm run unit",version:"grunt dist && git add dist/"},repository:{type:"git",url:"git@github.com:indutny/elliptic"},keywords:["EC","Elliptic","curve","Cryptography"],author:"Fedor Indutny <fedor@indutny.com>",license:"MIT",bugs:{url:"https://github.com/indutny/elliptic/issues"},homepage:"https://github.com/indutny/elliptic",devDependencies:{brfs:"^2.0.2",coveralls:"^3.1.0",eslint:"^7.6.0",grunt:"^1.2.1","grunt-browserify":"^5.3.0","grunt-cli":"^1.3.2","grunt-contrib-connect":"^3.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^5.0.0","grunt-mocha-istanbul":"^5.0.2","grunt-saucelabs":"^9.0.1",istanbul:"^0.4.5",mocha:"^8.0.1"},dependencies:{"bn.js":"^4.11.9",brorand:"^1.1.0","hash.js":"^1.0.0","hmac-drbg":"^1.0.1",inherits:"^2.0.4","minimalistic-assert":"^1.0.1","minimalistic-crypto-utils":"^1.0.1"}}}),dQ=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),K6=OJ((l)=>{var g=l;function R(A,q){if(Array.isArray(A))return A.slice();if(!A)return[];var Y=[];if(typeof A!="string"){for(var E=0;E<A.length;E++)Y[E]=A[E]|0;return Y}if(q==="hex"){A=A.replace(/[^a-z0-9]+/ig,""),A.length%2!==0&&(A="0"+A);for(var E=0;E<A.length;E+=2)Y.push(parseInt(A[E]+A[E+1],16))}else for(var E=0;E<A.length;E++){var O=A.charCodeAt(E),N=O>>8,W=O&255;N?Y.push(N,W):Y.push(W)}return Y}g.toArray=R;function M(A){return A.length===1?"0"+A:A}g.zero2=M;function B(A){for(var q="",Y=0;Y<A.length;Y++)q+=M(A[Y].toString(16));return q}g.toHex=B,g.encode=function(A,q){return q==="hex"?B(A):A}}),mQ=OJ((l)=>{var g=l,R=dQ(),M=hQ(),B=K6();g.assert=M,g.toArray=B.toArray,g.zero2=B.zero2,g.toHex=B.toHex,g.encode=B.encode;function A(N,W,I){var z=new Array(Math.max(N.bitLength(),I)+1);z.fill(0);for(var j=1<<W+1,P=N.clone(),F=0;F<z.length;F++){var v,S=P.andln(j-1);P.isOdd()?(S>(j>>1)-1?v=(j>>1)-S:v=S,P.isubn(v)):v=0,z[F]=v,P.iushrn(1)}return z}g.getNAF=A;function q(N,W){var I=[[],[]];N=N.clone(),W=W.clone();for(var z=0,j=0,P;N.cmpn(-z)>0||W.cmpn(-j)>0;){var F=N.andln(3)+z&3,v=W.andln(3)+j&3;F===3&&(F=-1),v===3&&(v=-1);var S;(F&1)===0?S=0:(P=N.andln(7)+z&7,(P===3||P===5)&&v===2?S=-F:S=F),I[0].push(S);var w;(v&1)===0?w=0:(P=W.andln(7)+j&7,(P===3||P===5)&&F===2?w=-v:w=v),I[1].push(w),2*z===S+1&&(z=1-z),2*j===w+1&&(j=1-j),N.iushrn(1),W.iushrn(1)}return I}g.getJSF=q;function Y(N,W,I){var z="_"+W;N.prototype[W]=function(){return this[z]!==void 0?this[z]:this[z]=I.call(this)}}g.cachedProperty=Y;function E(N){return typeof N=="string"?g.toArray(N,"hex"):N}g.parseBytes=E;function O(N){return new R(N,"hex","le")}g.intFromLE=O}),AV=OJ((l,g)=>{var R=dQ(),M=mQ(),B=M.getNAF,A=M.getJSF,q=M.assert;function Y(O,N){this.type=O,this.p=new R(N.p,16),this.red=N.prime?R.red(N.prime):R.mont(this.p),this.zero=new R(0).toRed(this.red),this.one=new R(1).toRed(this.red),this.two=new R(2).toRed(this.red),this.n=N.n&&new R(N.n,16),this.g=N.g&&this.pointFromJSON(N.g,N.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4),this._bitLength=this.n?this.n.bitLength():0;var W=this.n&&this.p.div(this.n);!W||W.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}g.exports=Y,Y.prototype.point=function(){throw new Error("Not implemented")},Y.prototype.validate=function(){throw new Error("Not implemented")},Y.prototype._fixedNafMul=function(O,N){q(O.precomputed);var W=O._getDoubles(),I=B(N,1,this._bitLength),z=(1<<W.step+1)-(W.step%2===0?2:1);z/=3;var j=[],P,F;for(P=0;P<I.length;P+=W.step){F=0;for(var v=P+W.step-1;v>=P;v--)F=(F<<1)+I[v];j.push(F)}for(var S=this.jpoint(null,null,null),w=this.jpoint(null,null,null),y=z;y>0;y--){for(P=0;P<j.length;P++)F=j[P],F===y?w=w.mixedAdd(W.points[P]):F===-y&&(w=w.mixedAdd(W.points[P].neg()));S=S.add(w)}return S.toP()},Y.prototype._wnafMul=function(O,N){var W=4,I=O._getNAFPoints(W);W=I.wnd;for(var z=I.points,j=B(N,W,this._bitLength),P=this.jpoint(null,null,null),F=j.length-1;F>=0;F--){for(var v=0;F>=0&&j[F]===0;F--)v++;if(F>=0&&v++,P=P.dblp(v),F<0)break;var S=j[F];q(S!==0),O.type==="affine"?S>0?P=P.mixedAdd(z[S-1>>1]):P=P.mixedAdd(z[-S-1>>1].neg()):S>0?P=P.add(z[S-1>>1]):P=P.add(z[-S-1>>1].neg())}return O.type==="affine"?P.toP():P},Y.prototype._wnafMulAdd=function(O,N,W,I,z){var j=this._wnafT1,P=this._wnafT2,F=this._wnafT3,v=0,S,w,y;for(S=0;S<I;S++){y=N[S];var m=y._getNAFPoints(O);j[S]=m.wnd,P[S]=m.points}for(S=I-1;S>=1;S-=2){var i=S-1,JJ=S;if(j[i]!==1||j[JJ]!==1){F[i]=B(W[i],j[i],this._bitLength),F[JJ]=B(W[JJ],j[JJ],this._bitLength),v=Math.max(F[i].length,v),v=Math.max(F[JJ].length,v);continue}var VJ=[N[i],null,null,N[JJ]];N[i].y.cmp(N[JJ].y)===0?(VJ[1]=N[i].add(N[JJ]),VJ[2]=N[i].toJ().mixedAdd(N[JJ].neg())):N[i].y.cmp(N[JJ].y.redNeg())===0?(VJ[1]=N[i].toJ().mixedAdd(N[JJ]),VJ[2]=N[i].add(N[JJ].neg())):(VJ[1]=N[i].toJ().mixedAdd(N[JJ]),VJ[2]=N[i].toJ().mixedAdd(N[JJ].neg()));var HJ=[-3,-1,-5,-7,0,7,5,1,3],o=A(W[i],W[JJ]);for(v=Math.max(o[0].length,v),F[i]=new Array(v),F[JJ]=new Array(v),w=0;w<v;w++){var jJ=o[0][w]|0,J=o[1][w]|0;F[i][w]=HJ[(jJ+1)*3+(J+1)],F[JJ][w]=0,P[i]=VJ}}var V=this.jpoint(null,null,null),Z=this._wnafT4;for(S=v;S>=0;S--){for(var $=0;S>=0;){var X=!0;for(w=0;w<I;w++)Z[w]=F[w][S]|0,Z[w]!==0&&(X=!1);if(!X)break;$++,S--}if(S>=0&&$++,V=V.dblp($),S<0)break;for(w=0;w<I;w++){var U=Z[w];U!==0&&(U>0?y=P[w][U-1>>1]:U<0&&(y=P[w][-U-1>>1].neg()),y.type==="affine"?V=V.mixedAdd(y):V=V.add(y))}}for(S=0;S<I;S++)P[S]=null;return z?V:V.toP()};function E(O,N){this.curve=O,this.type=N,this.precomputed=null}Y.BasePoint=E,E.prototype.eq=function(){throw new Error("Not implemented")},E.prototype.validate=function(){return this.curve.validate(this)},Y.prototype.decodePoint=function(O,N){O=M.toArray(O,N);var W=this.p.byteLength();if((O[0]===4||O[0]===6||O[0]===7)&&O.length-1===2*W){O[0]===6?q(O[O.length-1]%2===0):O[0]===7&&q(O[O.length-1]%2===1);var I=this.point(O.slice(1,1+W),O.slice(1+W,1+2*W));return I}else if((O[0]===2||O[0]===3)&&O.length-1===W)return this.pointFromX(O.slice(1,1+W),O[0]===3);throw new Error("Unknown point format")},E.prototype.encodeCompressed=function(O){return this.encode(O,!0)},E.prototype._encode=function(O){var N=this.curve.p.byteLength(),W=this.getX().toArray("be",N);return O?[this.getY().isEven()?2:3].concat(W):[4].concat(W,this.getY().toArray("be",N))},E.prototype.encode=function(O,N){return M.encode(this._encode(N),O)},E.prototype.precompute=function(O){if(this.precomputed)return this;var N={doubles:null,naf:null,beta:null};return N.naf=this._getNAFPoints(8),N.doubles=this._getDoubles(4,O),N.beta=this._getBeta(),this.precomputed=N,this},E.prototype._hasDoubles=function(O){if(!this.precomputed)return!1;var N=this.precomputed.doubles;return N?N.points.length>=Math.ceil((O.bitLength()+1)/N.step):!1},E.prototype._getDoubles=function(O,N){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var W=[this],I=this,z=0;z<N;z+=O){for(var j=0;j<O;j++)I=I.dbl();W.push(I)}return{step:O,points:W}},E.prototype._getNAFPoints=function(O){if(this.precomputed&&this.precomputed.naf)return this.precomputed.naf;for(var N=[this],W=(1<<O)-1,I=W===1?null:this.dbl(),z=1;z<W;z++)N[z]=N[z-1].add(I);return{wnd:O,points:N}},E.prototype._getBeta=function(){return null},E.prototype.dblp=function(O){for(var N=this,W=0;W<O;W++)N=N.dbl();return N}}),o8=OJ((l,g)=>{var R=mQ(),M=dQ(),B=JQ(),A=AV(),q=R.assert;function Y(N){A.call(this,"short",N),this.a=new M(N.a,16).toRed(this.red),this.b=new M(N.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=this.a.fromRed().cmpn(0)===0,this.threeA=this.a.fromRed().sub(this.p).cmpn(-3)===0,this.endo=this._getEndomorphism(N),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}B(Y,A),g.exports=Y,Y.prototype._getEndomorphism=function(N){if(!(!this.zeroA||!this.g||!this.n||this.p.modn(3)!==1)){var W,I;if(N.beta)W=new M(N.beta,16).toRed(this.red);else{var z=this._getEndoRoots(this.p);W=z[0].cmp(z[1])<0?z[0]:z[1],W=W.toRed(this.red)}if(N.lambda)I=new M(N.lambda,16);else{var j=this._getEndoRoots(this.n);this.g.mul(j[0]).x.cmp(this.g.x.redMul(W))===0?I=j[0]:(I=j[1],q(this.g.mul(I).x.cmp(this.g.x.redMul(W))===0))}var P;return N.basis?P=N.basis.map(function(F){return{a:new M(F.a,16),b:new M(F.b,16)}}):P=this._getEndoBasis(I),{beta:W,lambda:I,basis:P}}},Y.prototype._getEndoRoots=function(N){var W=N===this.p?this.red:M.mont(N),I=new M(2).toRed(W).redInvm(),z=I.redNeg(),j=new M(3).toRed(W).redNeg().redSqrt().redMul(I),P=z.redAdd(j).fromRed(),F=z.redSub(j).fromRed();return[P,F]},Y.prototype._getEndoBasis=function(N){for(var W=this.n.ushrn(Math.floor(this.n.bitLength()/2)),I=N,z=this.n.clone(),j=new M(1),P=new M(0),F=new M(0),v=new M(1),S,w,y,m,i,JJ,VJ,HJ=0,o,jJ;I.cmpn(0)!==0;){var J=z.div(I);o=z.sub(J.mul(I)),jJ=F.sub(J.mul(j));var V=v.sub(J.mul(P));if(!y&&o.cmp(W)<0)S=VJ.neg(),w=j,y=o.neg(),m=jJ;else if(y&&++HJ===2)break;VJ=o,z=I,I=o,F=j,j=jJ,v=P,P=V}i=o.neg(),JJ=jJ;var Z=y.sqr().add(m.sqr()),$=i.sqr().add(JJ.sqr());return $.cmp(Z)>=0&&(i=S,JJ=w),y.negative&&(y=y.neg(),m=m.neg()),i.negative&&(i=i.neg(),JJ=JJ.neg()),[{a:y,b:m},{a:i,b:JJ}]},Y.prototype._endoSplit=function(N){var W=this.endo.basis,I=W[0],z=W[1],j=z.b.mul(N).divRound(this.n),P=I.b.neg().mul(N).divRound(this.n),F=j.mul(I.a),v=P.mul(z.a),S=j.mul(I.b),w=P.mul(z.b),y=N.sub(F).sub(v),m=S.add(w).neg();return{k1:y,k2:m}},Y.prototype.pointFromX=function(N,W){N=new M(N,16),N.red||(N=N.toRed(this.red));var I=N.redSqr().redMul(N).redIAdd(N.redMul(this.a)).redIAdd(this.b),z=I.redSqrt();if(z.redSqr().redSub(I).cmp(this.zero)!==0)throw new Error("invalid point");var j=z.fromRed().isOdd();return(W&&!j||!W&&j)&&(z=z.redNeg()),this.point(N,z)},Y.prototype.validate=function(N){if(N.inf)return!0;var{x:W,y:I}=N,z=this.a.redMul(W),j=W.redSqr().redMul(W).redIAdd(z).redIAdd(this.b);return I.redSqr().redISub(j).cmpn(0)===0},Y.prototype._endoWnafMulAdd=function(N,W,I){for(var z=this._endoWnafT1,j=this._endoWnafT2,P=0;P<N.length;P++){var F=this._endoSplit(W[P]),v=N[P],S=v._getBeta();F.k1.negative&&(F.k1.ineg(),v=v.neg(!0)),F.k2.negative&&(F.k2.ineg(),S=S.neg(!0)),z[P*2]=v,z[P*2+1]=S,j[P*2]=F.k1,j[P*2+1]=F.k2}for(var w=this._wnafMulAdd(1,z,j,P*2,I),y=0;y<P*2;y++)z[y]=null,j[y]=null;return w};function E(N,W,I,z){A.BasePoint.call(this,N,"affine"),W===null&&I===null?(this.x=null,this.y=null,this.inf=!0):(this.x=new M(W,16),this.y=new M(I,16),z&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}B(E,A.BasePoint),Y.prototype.point=function(N,W,I){return new E(this,N,W,I)},Y.prototype.pointFromJSON=function(N,W){return E.fromJSON(this,N,W)},E.prototype._getBeta=function(){if(this.curve.endo){var N=this.precomputed;if(N&&N.beta)return N.beta;var W=this.curve.point(this.x.redMul(this.curve.endo.beta),this.y);if(N){var I=this.curve,z=function(j){return I.point(j.x.redMul(I.endo.beta),j.y)};N.beta=W,W.precomputed={beta:null,naf:N.naf&&{wnd:N.naf.wnd,points:N.naf.points.map(z)},doubles:N.doubles&&{step:N.doubles.step,points:N.doubles.points.map(z)}}}return W}},E.prototype.toJSON=function(){return this.precomputed?[this.x,this.y,this.precomputed&&{doubles:this.precomputed.doubles&&{step:this.precomputed.doubles.step,points:this.precomputed.doubles.points.slice(1)},naf:this.precomputed.naf&&{wnd:this.precomputed.naf.wnd,points:this.precomputed.naf.points.slice(1)}}]:[this.x,this.y]},E.fromJSON=function(N,W,I){typeof W=="string"&&(W=JSON.parse(W));var z=N.point(W[0],W[1],I);if(!W[2])return z;function j(F){return N.point(F[0],F[1],I)}var P=W[2];return z.precomputed={beta:null,doubles:P.doubles&&{step:P.doubles.step,points:[z].concat(P.doubles.points.map(j))},naf:P.naf&&{wnd:P.naf.wnd,points:[z].concat(P.naf.points.map(j))}},z},E.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" y: "+this.y.fromRed().toString(16,2)+">"},E.prototype.isInfinity=function(){return this.inf},E.prototype.add=function(N){if(this.inf)return N;if(N.inf)return this;if(this.eq(N))return this.dbl();if(this.neg().eq(N))return this.curve.point(null,null);if(this.x.cmp(N.x)===0)return this.curve.point(null,null);var W=this.y.redSub(N.y);W.cmpn(0)!==0&&(W=W.redMul(this.x.redSub(N.x).redInvm()));var I=W.redSqr().redISub(this.x).redISub(N.x),z=W.redMul(this.x.redSub(I)).redISub(this.y);return this.curve.point(I,z)},E.prototype.dbl=function(){if(this.inf)return this;var N=this.y.redAdd(this.y);if(N.cmpn(0)===0)return this.curve.point(null,null);var W=this.curve.a,I=this.x.redSqr(),z=N.redInvm(),j=I.redAdd(I).redIAdd(I).redIAdd(W).redMul(z),P=j.redSqr().redISub(this.x.redAdd(this.x)),F=j.redMul(this.x.redSub(P)).redISub(this.y);return this.curve.point(P,F)},E.prototype.getX=function(){return this.x.fromRed()},E.prototype.getY=function(){return this.y.fromRed()},E.prototype.mul=function(N){return N=new M(N,16),this.isInfinity()?this:this._hasDoubles(N)?this.curve._fixedNafMul(this,N):this.curve.endo?this.curve._endoWnafMulAdd([this],[N]):this.curve._wnafMul(this,N)},E.prototype.mulAdd=function(N,W,I){var z=[this,W],j=[N,I];return this.curve.endo?this.curve._endoWnafMulAdd(z,j):this.curve._wnafMulAdd(1,z,j,2)},E.prototype.jmulAdd=function(N,W,I){var z=[this,W],j=[N,I];return this.curve.endo?this.curve._endoWnafMulAdd(z,j,!0):this.curve._wnafMulAdd(1,z,j,2,!0)},E.prototype.eq=function(N){return this===N||this.inf===N.inf&&(this.inf||this.x.cmp(N.x)===0&&this.y.cmp(N.y)===0)},E.prototype.neg=function(N){if(this.inf)return this;var W=this.curve.point(this.x,this.y.redNeg());if(N&&this.precomputed){var I=this.precomputed,z=function(j){return j.neg()};W.precomputed={naf:I.naf&&{wnd:I.naf.wnd,points:I.naf.points.map(z)},doubles:I.doubles&&{step:I.doubles.step,points:I.doubles.points.map(z)}}}return W},E.prototype.toJ=function(){if(this.inf)return this.curve.jpoint(null,null,null);var N=this.curve.jpoint(this.x,this.y,this.curve.one);return N};function O(N,W,I,z){A.BasePoint.call(this,N,"jacobian"),W===null&&I===null&&z===null?(this.x=this.curve.one,this.y=this.curve.one,this.z=new M(0)):(this.x=new M(W,16),this.y=new M(I,16),this.z=new M(z,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}B(O,A.BasePoint),Y.prototype.jpoint=function(N,W,I){return new O(this,N,W,I)},O.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var N=this.z.redInvm(),W=N.redSqr(),I=this.x.redMul(W),z=this.y.redMul(W).redMul(N);return this.curve.point(I,z)},O.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},O.prototype.add=function(N){if(this.isInfinity())return N;if(N.isInfinity())return this;var W=N.z.redSqr(),I=this.z.redSqr(),z=this.x.redMul(W),j=N.x.redMul(I),P=this.y.redMul(W.redMul(N.z)),F=N.y.redMul(I.redMul(this.z)),v=z.redSub(j),S=P.redSub(F);if(v.cmpn(0)===0)return S.cmpn(0)!==0?this.curve.jpoint(null,null,null):this.dbl();var w=v.redSqr(),y=w.redMul(v),m=z.redMul(w),i=S.redSqr().redIAdd(y).redISub(m).redISub(m),JJ=S.redMul(m.redISub(i)).redISub(P.redMul(y)),VJ=this.z.redMul(N.z).redMul(v);return this.curve.jpoint(i,JJ,VJ)},O.prototype.mixedAdd=function(N){if(this.isInfinity())return N.toJ();if(N.isInfinity())return this;var W=this.z.redSqr(),I=this.x,z=N.x.redMul(W),j=this.y,P=N.y.redMul(W).redMul(this.z),F=I.redSub(z),v=j.redSub(P);if(F.cmpn(0)===0)return v.cmpn(0)!==0?this.curve.jpoint(null,null,null):this.dbl();var S=F.redSqr(),w=S.redMul(F),y=I.redMul(S),m=v.redSqr().redIAdd(w).redISub(y).redISub(y),i=v.redMul(y.redISub(m)).redISub(j.redMul(w)),JJ=this.z.redMul(F);return this.curve.jpoint(m,i,JJ)},O.prototype.dblp=function(N){if(N===0)return this;if(this.isInfinity())return this;if(!N)return this.dbl();var W;if(this.curve.zeroA||this.curve.threeA){var I=this;for(W=0;W<N;W++)I=I.dbl();return I}var z=this.curve.a,j=this.curve.tinv,P=this.x,F=this.y,v=this.z,S=v.redSqr().redSqr(),w=F.redAdd(F);for(W=0;W<N;W++){var y=P.redSqr(),m=w.redSqr(),i=m.redSqr(),JJ=y.redAdd(y).redIAdd(y).redIAdd(z.redMul(S)),VJ=P.redMul(m),HJ=JJ.redSqr().redISub(VJ.redAdd(VJ)),o=VJ.redISub(HJ),jJ=JJ.redMul(o);jJ=jJ.redIAdd(jJ).redISub(i);var J=w.redMul(v);W+1<N&&(S=S.redMul(i)),P=HJ,v=J,w=jJ}return this.curve.jpoint(P,w.redMul(j),v)},O.prototype.dbl=function(){return this.isInfinity()?this:this.curve.zeroA?this._zeroDbl():this.curve.threeA?this._threeDbl():this._dbl()},O.prototype._zeroDbl=function(){var N,W,I;if(this.zOne){var z=this.x.redSqr(),j=this.y.redSqr(),P=j.redSqr(),F=this.x.redAdd(j).redSqr().redISub(z).redISub(P);F=F.redIAdd(F);var v=z.redAdd(z).redIAdd(z),S=v.redSqr().redISub(F).redISub(F),w=P.redIAdd(P);w=w.redIAdd(w),w=w.redIAdd(w),N=S,W=v.redMul(F.redISub(S)).redISub(w),I=this.y.redAdd(this.y)}else{var y=this.x.redSqr(),m=this.y.redSqr(),i=m.redSqr(),JJ=this.x.redAdd(m).redSqr().redISub(y).redISub(i);JJ=JJ.redIAdd(JJ);var VJ=y.redAdd(y).redIAdd(y),HJ=VJ.redSqr(),o=i.redIAdd(i);o=o.redIAdd(o),o=o.redIAdd(o),N=HJ.redISub(JJ).redISub(JJ),W=VJ.redMul(JJ.redISub(N)).redISub(o),I=this.y.redMul(this.z),I=I.redIAdd(I)}return this.curve.jpoint(N,W,I)},O.prototype._threeDbl=function(){var N,W,I;if(this.zOne){var z=this.x.redSqr(),j=this.y.redSqr(),P=j.redSqr(),F=this.x.redAdd(j).redSqr().redISub(z).redISub(P);F=F.redIAdd(F);var v=z.redAdd(z).redIAdd(z).redIAdd(this.curve.a),S=v.redSqr().redISub(F).redISub(F);N=S;var w=P.redIAdd(P);w=w.redIAdd(w),w=w.redIAdd(w),W=v.redMul(F.redISub(S)).redISub(w),I=this.y.redAdd(this.y)}else{var y=this.z.redSqr(),m=this.y.redSqr(),i=this.x.redMul(m),JJ=this.x.redSub(y).redMul(this.x.redAdd(y));JJ=JJ.redAdd(JJ).redIAdd(JJ);var VJ=i.redIAdd(i);VJ=VJ.redIAdd(VJ);var HJ=VJ.redAdd(VJ);N=JJ.redSqr().redISub(HJ),I=this.y.redAdd(this.z).redSqr().redISub(m).redISub(y);var o=m.redSqr();o=o.redIAdd(o),o=o.redIAdd(o),o=o.redIAdd(o),W=JJ.redMul(VJ.redISub(N)).redISub(o)}return this.curve.jpoint(N,W,I)},O.prototype._dbl=function(){var N=this.curve.a,W=this.x,I=this.y,z=this.z,j=z.redSqr().redSqr(),P=W.redSqr(),F=I.redSqr(),v=P.redAdd(P).redIAdd(P).redIAdd(N.redMul(j)),S=W.redAdd(W);S=S.redIAdd(S);var w=S.redMul(F),y=v.redSqr().redISub(w.redAdd(w)),m=w.redISub(y),i=F.redSqr();i=i.redIAdd(i),i=i.redIAdd(i),i=i.redIAdd(i);var JJ=v.redMul(m).redISub(i),VJ=I.redAdd(I).redMul(z);return this.curve.jpoint(y,JJ,VJ)},O.prototype.trpl=function(){if(!this.curve.zeroA)return this.dbl().add(this);var N=this.x.redSqr(),W=this.y.redSqr(),I=this.z.redSqr(),z=W.redSqr(),j=N.redAdd(N).redIAdd(N),P=j.redSqr(),F=this.x.redAdd(W).redSqr().redISub(N).redISub(z);F=F.redIAdd(F),F=F.redAdd(F).redIAdd(F),F=F.redISub(P);var v=F.redSqr(),S=z.redIAdd(z);S=S.redIAdd(S),S=S.redIAdd(S),S=S.redIAdd(S);var w=j.redIAdd(F).redSqr().redISub(P).redISub(v).redISub(S),y=W.redMul(w);y=y.redIAdd(y),y=y.redIAdd(y);var m=this.x.redMul(v).redISub(y);m=m.redIAdd(m),m=m.redIAdd(m);var i=this.y.redMul(w.redMul(S.redISub(w)).redISub(F.redMul(v)));i=i.redIAdd(i),i=i.redIAdd(i),i=i.redIAdd(i);var JJ=this.z.redAdd(F).redSqr().redISub(I).redISub(v);return this.curve.jpoint(m,i,JJ)},O.prototype.mul=function(N,W){return N=new M(N,W),this.curve._wnafMul(this,N)},O.prototype.eq=function(N){if(N.type==="affine")return this.eq(N.toJ());if(this===N)return!0;var W=this.z.redSqr(),I=N.z.redSqr();if(this.x.redMul(I).redISub(N.x.redMul(W)).cmpn(0)!==0)return!1;var z=W.redMul(this.z),j=I.redMul(N.z);return this.y.redMul(j).redISub(N.y.redMul(z)).cmpn(0)===0},O.prototype.eqXToP=function(N){var W=this.z.redSqr(),I=N.toRed(this.curve.red).redMul(W);if(this.x.cmp(I)===0)return!0;for(var z=N.clone(),j=this.curve.redN.redMul(W);;){if(z.iadd(this.curve.n),z.cmp(this.curve.p)>=0)return!1;if(I.redIAdd(j),this.x.cmp(I)===0)return!0}},O.prototype.inspect=function(){return this.isInfinity()?"<EC JPoint Infinity>":"<EC JPoint x: "+this.x.toString(16,2)+" y: "+this.y.toString(16,2)+" z: "+this.z.toString(16,2)+">"},O.prototype.isInfinity=function(){return this.z.cmpn(0)===0}}),r8=OJ((l,g)=>{var R=dQ(),M=JQ(),B=AV(),A=mQ();function q(E){B.call(this,"mont",E),this.a=new R(E.a,16).toRed(this.red),this.b=new R(E.b,16).toRed(this.red),this.i4=new R(4).toRed(this.red).redInvm(),this.two=new R(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}M(q,B),g.exports=q,q.prototype.validate=function(E){var O=E.normalize().x,N=O.redSqr(),W=N.redMul(O).redAdd(N.redMul(this.a)).redAdd(O),I=W.redSqrt();return I.redSqr().cmp(W)===0};function Y(E,O,N){B.BasePoint.call(this,E,"projective"),O===null&&N===null?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new R(O,16),this.z=new R(N,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}M(Y,B.BasePoint),q.prototype.decodePoint=function(E,O){return this.point(A.toArray(E,O),1)},q.prototype.point=function(E,O){return new Y(this,E,O)},q.prototype.pointFromJSON=function(E){return Y.fromJSON(this,E)},Y.prototype.precompute=function(){},Y.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},Y.fromJSON=function(E,O){return new Y(E,O[0],O[1]||E.one)},Y.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" z: "+this.z.fromRed().toString(16,2)+">"},Y.prototype.isInfinity=function(){return this.z.cmpn(0)===0},Y.prototype.dbl=function(){var E=this.x.redAdd(this.z),O=E.redSqr(),N=this.x.redSub(this.z),W=N.redSqr(),I=O.redSub(W),z=O.redMul(W),j=I.redMul(W.redAdd(this.curve.a24.redMul(I)));return this.curve.point(z,j)},Y.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},Y.prototype.diffAdd=function(E,O){var N=this.x.redAdd(this.z),W=this.x.redSub(this.z),I=E.x.redAdd(E.z),z=E.x.redSub(E.z),j=z.redMul(N),P=I.redMul(W),F=O.z.redMul(j.redAdd(P).redSqr()),v=O.x.redMul(j.redISub(P).redSqr());return this.curve.point(F,v)},Y.prototype.mul=function(E){for(var O=E.clone(),N=this,W=this.curve.point(null,null),I=this,z=[];O.cmpn(0)!==0;O.iushrn(1))z.push(O.andln(1));for(var j=z.length-1;j>=0;j--)z[j]===0?(N=N.diffAdd(W,I),W=W.dbl()):(W=N.diffAdd(W,I),N=N.dbl());return W},Y.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},Y.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},Y.prototype.eq=function(E){return this.getX().cmp(E.getX())===0},Y.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},Y.prototype.getX=function(){return this.normalize(),this.x.fromRed()}}),a8=OJ((l,g)=>{var R=mQ(),M=dQ(),B=JQ(),A=AV(),q=R.assert;function Y(O){this.twisted=(O.a|0)!==1,this.mOneA=this.twisted&&(O.a|0)===-1,this.extended=this.mOneA,A.call(this,"edwards",O),this.a=new M(O.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new M(O.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new M(O.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),q(!this.twisted||this.c.fromRed().cmpn(1)===0),this.oneC=(O.c|0)===1}B(Y,A),g.exports=Y,Y.prototype._mulA=function(O){return this.mOneA?O.redNeg():this.a.redMul(O)},Y.prototype._mulC=function(O){return this.oneC?O:this.c.redMul(O)},Y.prototype.jpoint=function(O,N,W,I){return this.point(O,N,W,I)},Y.prototype.pointFromX=function(O,N){O=new M(O,16),O.red||(O=O.toRed(this.red));var W=O.redSqr(),I=this.c2.redSub(this.a.redMul(W)),z=this.one.redSub(this.c2.redMul(this.d).redMul(W)),j=I.redMul(z.redInvm()),P=j.redSqrt();if(P.redSqr().redSub(j).cmp(this.zero)!==0)throw new Error("invalid point");var F=P.fromRed().isOdd();return(N&&!F||!N&&F)&&(P=P.redNeg()),this.point(O,P)},Y.prototype.pointFromY=function(O,N){O=new M(O,16),O.red||(O=O.toRed(this.red));var W=O.redSqr(),I=W.redSub(this.c2),z=W.redMul(this.d).redMul(this.c2).redSub(this.a),j=I.redMul(z.redInvm());if(j.cmp(this.zero)===0){if(N)throw new Error("invalid point");return this.point(this.zero,O)}var P=j.redSqrt();if(P.redSqr().redSub(j).cmp(this.zero)!==0)throw new Error("invalid point");return P.fromRed().isOdd()!==N&&(P=P.redNeg()),this.point(P,O)},Y.prototype.validate=function(O){if(O.isInfinity())return!0;O.normalize();var N=O.x.redSqr(),W=O.y.redSqr(),I=N.redMul(this.a).redAdd(W),z=this.c2.redMul(this.one.redAdd(this.d.redMul(N).redMul(W)));return I.cmp(z)===0};function E(O,N,W,I,z){A.BasePoint.call(this,O,"projective"),N===null&&W===null&&I===null?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new M(N,16),this.y=new M(W,16),this.z=I?new M(I,16):this.curve.one,this.t=z&&new M(z,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}B(E,A.BasePoint),Y.prototype.pointFromJSON=function(O){return E.fromJSON(this,O)},Y.prototype.point=function(O,N,W,I){return new E(this,O,N,W,I)},E.fromJSON=function(O,N){return new E(O,N[0],N[1],N[2])},E.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" y: "+this.y.fromRed().toString(16,2)+" z: "+this.z.fromRed().toString(16,2)+">"},E.prototype.isInfinity=function(){return this.x.cmpn(0)===0&&(this.y.cmp(this.z)===0||this.zOne&&this.y.cmp(this.curve.c)===0)},E.prototype._extDbl=function(){var O=this.x.redSqr(),N=this.y.redSqr(),W=this.z.redSqr();W=W.redIAdd(W);var I=this.curve._mulA(O),z=this.x.redAdd(this.y).redSqr().redISub(O).redISub(N),j=I.redAdd(N),P=j.redSub(W),F=I.redSub(N),v=z.redMul(P),S=j.redMul(F),w=z.redMul(F),y=P.redMul(j);return this.curve.point(v,S,y,w)},E.prototype._projDbl=function(){var O=this.x.redAdd(this.y).redSqr(),N=this.x.redSqr(),W=this.y.redSqr(),I,z,j,P,F,v;if(this.curve.twisted){P=this.curve._mulA(N);var S=P.redAdd(W);this.zOne?(I=O.redSub(N).redSub(W).redMul(S.redSub(this.curve.two)),z=S.redMul(P.redSub(W)),j=S.redSqr().redSub(S).redSub(S)):(F=this.z.redSqr(),v=S.redSub(F).redISub(F),I=O.redSub(N).redISub(W).redMul(v),z=S.redMul(P.redSub(W)),j=S.redMul(v))}else P=N.redAdd(W),F=this.curve._mulC(this.z).redSqr(),v=P.redSub(F).redSub(F),I=this.curve._mulC(O.redISub(P)).redMul(v),z=this.curve._mulC(P).redMul(N.redISub(W)),j=P.redMul(v);return this.curve.point(I,z,j)},E.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},E.prototype._extAdd=function(O){var N=this.y.redSub(this.x).redMul(O.y.redSub(O.x)),W=this.y.redAdd(this.x).redMul(O.y.redAdd(O.x)),I=this.t.redMul(this.curve.dd).redMul(O.t),z=this.z.redMul(O.z.redAdd(O.z)),j=W.redSub(N),P=z.redSub(I),F=z.redAdd(I),v=W.redAdd(N),S=j.redMul(P),w=F.redMul(v),y=j.redMul(v),m=P.redMul(F);return this.curve.point(S,w,m,y)},E.prototype._projAdd=function(O){var N=this.z.redMul(O.z),W=N.redSqr(),I=this.x.redMul(O.x),z=this.y.redMul(O.y),j=this.curve.d.redMul(I).redMul(z),P=W.redSub(j),F=W.redAdd(j),v=this.x.redAdd(this.y).redMul(O.x.redAdd(O.y)).redISub(I).redISub(z),S=N.redMul(P).redMul(v),w,y;return this.curve.twisted?(w=N.redMul(F).redMul(z.redSub(this.curve._mulA(I))),y=P.redMul(F)):(w=N.redMul(F).redMul(z.redSub(I)),y=this.curve._mulC(P).redMul(F)),this.curve.point(S,w,y)},E.prototype.add=function(O){return this.isInfinity()?O:O.isInfinity()?this:this.curve.extended?this._extAdd(O):this._projAdd(O)},E.prototype.mul=function(O){return this._hasDoubles(O)?this.curve._fixedNafMul(this,O):this.curve._wnafMul(this,O)},E.prototype.mulAdd=function(O,N,W){return this.curve._wnafMulAdd(1,[this,N],[O,W],2,!1)},E.prototype.jmulAdd=function(O,N,W){return this.curve._wnafMulAdd(1,[this,N],[O,W],2,!0)},E.prototype.normalize=function(){if(this.zOne)return this;var O=this.z.redInvm();return this.x=this.x.redMul(O),this.y=this.y.redMul(O),this.t&&(this.t=this.t.redMul(O)),this.z=this.curve.one,this.zOne=!0,this},E.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},E.prototype.getX=function(){return this.normalize(),this.x.fromRed()},E.prototype.getY=function(){return this.normalize(),this.y.fromRed()},E.prototype.eq=function(O){return this===O||this.getX().cmp(O.getX())===0&&this.getY().cmp(O.getY())===0},E.prototype.eqXToP=function(O){var N=O.toRed(this.curve.red).redMul(this.z);if(this.x.cmp(N)===0)return!0;for(var W=O.clone(),I=this.curve.redN.redMul(this.z);;){if(W.iadd(this.curve.n),W.cmp(this.curve.p)>=0)return!1;if(N.redIAdd(I),this.x.cmp(N)===0)return!0}},E.prototype.toP=E.prototype.normalize,E.prototype.mixedAdd=E.prototype.add}),U6=OJ((l)=>{var g=l;g.base=AV(),g.short=o8(),g.mont=r8(),g.edwards=a8()}),pQ=OJ((l)=>{var g=hQ(),R=JQ();l.inherits=R;function M(V,Z){return(V.charCodeAt(Z)&64512)!==55296||Z<0||Z+1>=V.length?!1:(V.charCodeAt(Z+1)&64512)===56320}function B(V,Z){if(Array.isArray(V))return V.slice();if(!V)return[];var $=[];if(typeof V=="string")if(Z){if(Z==="hex")for(V=V.replace(/[^a-z0-9]+/ig,""),V.length%2!==0&&(V="0"+V),U=0;U<V.length;U+=2)$.push(parseInt(V[U]+V[U+1],16))}else for(var X=0,U=0;U<V.length;U++){var H=V.charCodeAt(U);H<128?$[X++]=H:H<2048?($[X++]=H>>6|192,$[X++]=H&63|128):M(V,U)?(H=65536+((H&1023)<<10)+(V.charCodeAt(++U)&1023),$[X++]=H>>18|240,$[X++]=H>>12&63|128,$[X++]=H>>6&63|128,$[X++]=H&63|128):($[X++]=H>>12|224,$[X++]=H>>6&63|128,$[X++]=H&63|128)}else for(U=0;U<V.length;U++)$[U]=V[U]|0;return $}l.toArray=B;function A(V){for(var Z="",$=0;$<V.length;$++)Z+=E(V[$].toString(16));return Z}l.toHex=A;function q(V){var Z=V>>>24|V>>>8&65280|V<<8&16711680|(V&255)<<24;return Z>>>0}l.htonl=q;function Y(V,Z){for(var $="",X=0;X<V.length;X++){var U=V[X];Z==="little"&&(U=q(U)),$+=O(U.toString(16))}return $}l.toHex32=Y;function E(V){return V.length===1?"0"+V:V}l.zero2=E;function O(V){return V.length===7?"0"+V:V.length===6?"00"+V:V.length===5?"000"+V:V.length===4?"0000"+V:V.length===3?"00000"+V:V.length===2?"000000"+V:V.length===1?"0000000"+V:V}l.zero8=O;function N(V,Z,$,X){var U=$-Z;g(U%4===0);for(var H=new Array(U/4),G=0,Q=Z;G<H.length;G++,Q+=4){var K;X==="big"?K=V[Q]<<24|V[Q+1]<<16|V[Q+2]<<8|V[Q+3]:K=V[Q+3]<<24|V[Q+2]<<16|V[Q+1]<<8|V[Q],H[G]=K>>>0}return H}l.join32=N;function W(V,Z){for(var $=new Array(V.length*4),X=0,U=0;X<V.length;X++,U+=4){var H=V[X];Z==="big"?($[U]=H>>>24,$[U+1]=H>>>16&255,$[U+2]=H>>>8&255,$[U+3]=H&255):($[U+3]=H>>>24,$[U+2]=H>>>16&255,$[U+1]=H>>>8&255,$[U]=H&255)}return $}l.split32=W;function I(V,Z){return V>>>Z|V<<32-Z}l.rotr32=I;function z(V,Z){return V<<Z|V>>>32-Z}l.rotl32=z;function j(V,Z){return V+Z>>>0}l.sum32=j;function P(V,Z,$){return V+Z+$>>>0}l.sum32_3=P;function F(V,Z,$,X){return V+Z+$+X>>>0}l.sum32_4=F;function v(V,Z,$,X,U){return V+Z+$+X+U>>>0}l.sum32_5=v;function S(V,Z,$,X){var U=V[Z],H=V[Z+1],G=X+H>>>0,Q=(G<X?1:0)+$+U;V[Z]=Q>>>0,V[Z+1]=G}l.sum64=S;function w(V,Z,$,X){var U=Z+X>>>0,H=(U<Z?1:0)+V+$;return H>>>0}l.sum64_hi=w;function y(V,Z,$,X){var U=Z+X;return U>>>0}l.sum64_lo=y;function m(V,Z,$,X,U,H,G,Q){var K=0,k=Z;k=k+X>>>0,K+=k<Z?1:0,k=k+H>>>0,K+=k<H?1:0,k=k+Q>>>0,K+=k<Q?1:0;var L=V+$+U+G+K;return L>>>0}l.sum64_4_hi=m;function i(V,Z,$,X,U,H,G,Q){var K=Z+X+H+Q;return K>>>0}l.sum64_4_lo=i;function JJ(V,Z,$,X,U,H,G,Q,K,k){var L=0,_=Z;_=_+X>>>0,L+=_<Z?1:0,_=_+H>>>0,L+=_<H?1:0,_=_+Q>>>0,L+=_<Q?1:0,_=_+k>>>0,L+=_<k?1:0;var t=V+$+U+G+K+L;return t>>>0}l.sum64_5_hi=JJ;function VJ(V,Z,$,X,U,H,G,Q,K,k){var L=Z+X+H+Q+k;return L>>>0}l.sum64_5_lo=VJ;function HJ(V,Z,$){var X=Z<<32-$|V>>>$;return X>>>0}l.rotr64_hi=HJ;function o(V,Z,$){var X=V<<32-$|Z>>>$;return X>>>0}l.rotr64_lo=o;function jJ(V,Z,$){return V>>>$}l.shr64_hi=jJ;function J(V,Z,$){var X=V<<32-$|Z>>>$;return X>>>0}l.shr64_lo=J}),BV=OJ((l)=>{var g=pQ(),R=hQ();function M(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}l.BlockHash=M,M.prototype.update=function(B,A){if(B=g.toArray(B,A),this.pending?this.pending=this.pending.concat(B):this.pending=B,this.pendingTotal+=B.length,this.pending.length>=this._delta8){B=this.pending;var q=B.length%this._delta8;this.pending=B.slice(B.length-q,B.length),this.pending.length===0&&(this.pending=null),B=g.join32(B,0,B.length-q,this.endian);for(var Y=0;Y<B.length;Y+=this._delta32)this._update(B,Y,Y+this._delta32)}return this},M.prototype.digest=function(B){return this.update(this._pad()),R(this.pending===null),this._digest(B)},M.prototype._pad=function(){var B=this.pendingTotal,A=this._delta8,q=A-(B+this.padLength)%A,Y=new Array(q+this.padLength);Y[0]=128;for(var E=1;E<q;E++)Y[E]=0;if(B<<=3,this.endian==="big"){for(var O=8;O<this.padLength;O++)Y[E++]=0;Y[E++]=0,Y[E++]=0,Y[E++]=0,Y[E++]=0,Y[E++]=B>>>24&255,Y[E++]=B>>>16&255,Y[E++]=B>>>8&255,Y[E++]=B&255}else for(Y[E++]=B&255,Y[E++]=B>>>8&255,Y[E++]=B>>>16&255,Y[E++]=B>>>24&255,Y[E++]=0,Y[E++]=0,Y[E++]=0,Y[E++]=0,O=8;O<this.padLength;O++)Y[E++]=0;return Y}}),H6=OJ((l)=>{var g=pQ(),R=g.rotr32;function M(W,I,z,j){if(W===0)return B(I,z,j);if(W===1||W===3)return q(I,z,j);if(W===2)return A(I,z,j)}l.ft_1=M;function B(W,I,z){return W&I^~W&z}l.ch32=B;function A(W,I,z){return W&I^W&z^I&z}l.maj32=A;function q(W,I,z){return W^I^z}l.p32=q;function Y(W){return R(W,2)^R(W,13)^R(W,22)}l.s0_256=Y;function E(W){return R(W,6)^R(W,11)^R(W,25)}l.s1_256=E;function O(W){return R(W,7)^R(W,18)^W>>>3}l.g0_256=O;function N(W){return R(W,17)^R(W,19)^W>>>10}l.g1_256=N}),t8=OJ((l,g)=>{var R=pQ(),M=BV(),B=H6(),A=R.rotl32,q=R.sum32,Y=R.sum32_5,E=B.ft_1,O=M.BlockHash,N=[1518500249,1859775393,2400959708,3395469782];function W(){if(!(this instanceof W))return new W;O.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}R.inherits(W,O),g.exports=W,W.blockSize=512,W.outSize=160,W.hmacStrength=80,W.padLength=64,W.prototype._update=function(I,z){for(var j=this.W,P=0;P<16;P++)j[P]=I[z+P];for(;P<j.length;P++)j[P]=A(j[P-3]^j[P-8]^j[P-14]^j[P-16],1);var F=this.h[0],v=this.h[1],S=this.h[2],w=this.h[3],y=this.h[4];for(P=0;P<j.length;P++){var m=~~(P/20),i=Y(A(F,5),E(m,v,S,w),y,j[P],N[m]);y=w,w=S,S=A(v,30),v=F,F=i}this.h[0]=q(this.h[0],F),this.h[1]=q(this.h[1],v),this.h[2]=q(this.h[2],S),this.h[3]=q(this.h[3],w),this.h[4]=q(this.h[4],y)},W.prototype._digest=function(I){return I==="hex"?R.toHex32(this.h,"big"):R.split32(this.h,"big")}}),W6=OJ((l,g)=>{var R=pQ(),M=BV(),B=H6(),A=hQ(),q=R.sum32,Y=R.sum32_4,E=R.sum32_5,O=B.ch32,N=B.maj32,W=B.s0_256,I=B.s1_256,z=B.g0_256,j=B.g1_256,P=M.BlockHash,F=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function v(){if(!(this instanceof v))return new v;P.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=F,this.W=new Array(64)}R.inherits(v,P),g.exports=v,v.blockSize=512,v.outSize=256,v.hmacStrength=192,v.padLength=64,v.prototype._update=function(S,w){for(var y=this.W,m=0;m<16;m++)y[m]=S[w+m];for(;m<y.length;m++)y[m]=Y(j(y[m-2]),y[m-7],z(y[m-15]),y[m-16]);var i=this.h[0],JJ=this.h[1],VJ=this.h[2],HJ=this.h[3],o=this.h[4],jJ=this.h[5],J=this.h[6],V=this.h[7];for(A(this.k.length===y.length),m=0;m<y.length;m++){var Z=E(V,I(o),O(o,jJ,J),this.k[m],y[m]),$=q(W(i),N(i,JJ,VJ));V=J,J=jJ,jJ=o,o=q(HJ,Z),HJ=VJ,VJ=JJ,JJ=i,i=q(Z,$)}this.h[0]=q(this.h[0],i),this.h[1]=q(this.h[1],JJ),this.h[2]=q(this.h[2],VJ),this.h[3]=q(this.h[3],HJ),this.h[4]=q(this.h[4],o),this.h[5]=q(this.h[5],jJ),this.h[6]=q(this.h[6],J),this.h[7]=q(this.h[7],V)},v.prototype._digest=function(S){return S==="hex"?R.toHex32(this.h,"big"):R.split32(this.h,"big")}}),e8=OJ((l,g)=>{var R=pQ(),M=W6();function B(){if(!(this instanceof B))return new B;M.call(this),this.h=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]}R.inherits(B,M),g.exports=B,B.blockSize=512,B.outSize=224,B.hmacStrength=192,B.padLength=64,B.prototype._digest=function(A){return A==="hex"?R.toHex32(this.h.slice(0,7),"big"):R.split32(this.h.slice(0,7),"big")}}),Y6=OJ((l,g)=>{var R=pQ(),M=BV(),B=hQ(),A=R.rotr64_hi,q=R.rotr64_lo,Y=R.shr64_hi,E=R.shr64_lo,O=R.sum64,N=R.sum64_hi,W=R.sum64_lo,I=R.sum64_4_hi,z=R.sum64_4_lo,j=R.sum64_5_hi,P=R.sum64_5_lo,F=M.BlockHash,v=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591];function S(){if(!(this instanceof S))return new S;F.call(this),this.h=[1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209],this.k=v,this.W=new Array(160)}R.inherits(S,F),g.exports=S,S.blockSize=1024,S.outSize=512,S.hmacStrength=192,S.padLength=128,S.prototype._prepareBlock=function($,X){for(var U=this.W,H=0;H<32;H++)U[H]=$[X+H];for(;H<U.length;H+=2){var G=V(U[H-4],U[H-3]),Q=Z(U[H-4],U[H-3]),K=U[H-14],k=U[H-13],L=jJ(U[H-30],U[H-29]),_=J(U[H-30],U[H-29]),t=U[H-32],QJ=U[H-31];U[H]=I(G,Q,K,k,L,_,t,QJ),U[H+1]=z(G,Q,K,k,L,_,t,QJ)}},S.prototype._update=function($,X){this._prepareBlock($,X);var U=this.W,H=this.h[0],G=this.h[1],Q=this.h[2],K=this.h[3],k=this.h[4],L=this.h[5],_=this.h[6],t=this.h[7],QJ=this.h[8],GJ=this.h[9],n=this.h[10],p=this.h[11],e=this.h[12],PJ=this.h[13],XJ=this.h[14],WJ=this.h[15];B(this.k.length===U.length);for(var b=0;b<U.length;b+=2){var C=XJ,h=WJ,$J=HJ(QJ,GJ),qJ=o(QJ,GJ),ZJ=w(QJ,GJ,n,p,e,PJ),mJ=y(QJ,GJ,n,p,e,PJ),BJ=this.k[b],TJ=this.k[b+1],dJ=U[b],LJ=U[b+1],IJ=j(C,h,$J,qJ,ZJ,mJ,BJ,TJ,dJ,LJ),$Q=P(C,h,$J,qJ,ZJ,mJ,BJ,TJ,dJ,LJ);C=JJ(H,G),h=VJ(H,G),$J=m(H,G,Q,K,k,L),qJ=i(H,G,Q,K,k,L);var T=N(C,h,$J,qJ),D=W(C,h,$J,qJ);XJ=e,WJ=PJ,e=n,PJ=p,n=QJ,p=GJ,QJ=N(_,t,IJ,$Q),GJ=W(t,t,IJ,$Q),_=k,t=L,k=Q,L=K,Q=H,K=G,H=N(IJ,$Q,T,D),G=W(IJ,$Q,T,D)}O(this.h,0,H,G),O(this.h,2,Q,K),O(this.h,4,k,L),O(this.h,6,_,t),O(this.h,8,QJ,GJ),O(this.h,10,n,p),O(this.h,12,e,PJ),O(this.h,14,XJ,WJ)},S.prototype._digest=function($){return $==="hex"?R.toHex32(this.h,"big"):R.split32(this.h,"big")};function w($,X,U,H,G){var Q=$&U^~$&G;return Q<0&&(Q+=4294967296),Q}function y($,X,U,H,G,Q){var K=X&H^~X&Q;return K<0&&(K+=4294967296),K}function m($,X,U,H,G){var Q=$&U^$&G^U&G;return Q<0&&(Q+=4294967296),Q}function i($,X,U,H,G,Q){var K=X&H^X&Q^H&Q;return K<0&&(K+=4294967296),K}function JJ($,X){var U=A($,X,28),H=A(X,$,2),G=A(X,$,7),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function VJ($,X){var U=q($,X,28),H=q(X,$,2),G=q(X,$,7),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function HJ($,X){var U=A($,X,14),H=A($,X,18),G=A(X,$,9),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function o($,X){var U=q($,X,14),H=q($,X,18),G=q(X,$,9),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function jJ($,X){var U=A($,X,1),H=A($,X,8),G=Y($,X,7),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function J($,X){var U=q($,X,1),H=q($,X,8),G=E($,X,7),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function V($,X){var U=A($,X,19),H=A(X,$,29),G=Y($,X,6),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}function Z($,X){var U=q($,X,19),H=q(X,$,29),G=E($,X,6),Q=U^H^G;return Q<0&&(Q+=4294967296),Q}}),J$=OJ((l,g)=>{var R=pQ(),M=Y6();function B(){if(!(this instanceof B))return new B;M.call(this),this.h=[3418070365,3238371032,1654270250,914150663,2438529370,812702999,355462360,4144912697,1731405415,4290775857,2394180231,1750603025,3675008525,1694076839,1203062813,3204075428]}R.inherits(B,M),g.exports=B,B.blockSize=1024,B.outSize=384,B.hmacStrength=192,B.padLength=128,B.prototype._digest=function(A){return A==="hex"?R.toHex32(this.h.slice(0,12),"big"):R.split32(this.h.slice(0,12),"big")}}),Q$=OJ((l)=>{l.sha1=t8(),l.sha224=e8(),l.sha256=W6(),l.sha384=J$(),l.sha512=Y6()}),V$=OJ((l)=>{var g=pQ(),R=BV(),M=g.rotl32,B=g.sum32,A=g.sum32_3,q=g.sum32_4,Y=R.BlockHash;function E(){if(!(this instanceof E))return new E;Y.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.endian="little"}g.inherits(E,Y),l.ripemd160=E,E.blockSize=512,E.outSize=160,E.hmacStrength=192,E.padLength=64,E.prototype._update=function(F,v){for(var S=this.h[0],w=this.h[1],y=this.h[2],m=this.h[3],i=this.h[4],JJ=S,VJ=w,HJ=y,o=m,jJ=i,J=0;J<80;J++){var V=B(M(q(S,O(J,w,y,m),F[I[J]+v],N(J)),j[J]),i);S=i,i=m,m=M(y,10),y=w,w=V,V=B(M(q(JJ,O(79-J,VJ,HJ,o),F[z[J]+v],W(J)),P[J]),jJ),JJ=jJ,jJ=o,o=M(HJ,10),HJ=VJ,VJ=V}V=A(this.h[1],y,o),this.h[1]=A(this.h[2],m,jJ),this.h[2]=A(this.h[3],i,JJ),this.h[3]=A(this.h[4],S,VJ),this.h[4]=A(this.h[0],w,HJ),this.h[0]=V},E.prototype._digest=function(F){return F==="hex"?g.toHex32(this.h,"little"):g.split32(this.h,"little")};function O(F,v,S,w){return F<=15?v^S^w:F<=31?v&S|~v&w:F<=47?(v|~S)^w:F<=63?v&w|S&~w:v^(S|~w)}function N(F){return F<=15?0:F<=31?1518500249:F<=47?1859775393:F<=63?2400959708:2840853838}function W(F){return F<=15?1352829926:F<=31?1548603684:F<=47?1836072691:F<=63?2053994217:0}var I=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],z=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],j=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],P=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]}),$$=OJ((l,g)=>{var R=pQ(),M=hQ();function B(A,q,Y){if(!(this instanceof B))return new B(A,q,Y);this.Hash=A,this.blockSize=A.blockSize/8,this.outSize=A.outSize/8,this.inner=null,this.outer=null,this._init(R.toArray(q,Y))}g.exports=B,B.prototype._init=function(A){A.length>this.blockSize&&(A=new this.Hash().update(A).digest()),M(A.length<=this.blockSize);for(var q=A.length;q<this.blockSize;q++)A.push(0);for(q=0;q<A.length;q++)A[q]^=54;for(this.inner=new this.Hash().update(A),q=0;q<A.length;q++)A[q]^=106;this.outer=new this.Hash().update(A)},B.prototype.update=function(A,q){return this.inner.update(A,q),this},B.prototype.digest=function(A){return this.outer.update(this.inner.digest()),this.outer.digest(A)}}),Z0=OJ((l)=>{var g=l;g.utils=pQ(),g.common=BV(),g.sha=Q$(),g.ripemd=V$(),g.hmac=$$(),g.sha1=g.sha.sha1,g.sha256=g.sha.sha256,g.sha224=g.sha.sha224,g.sha384=g.sha.sha384,g.sha512=g.sha.sha512,g.ripemd160=g.ripemd.ripemd160}),Z$=OJ((l,g)=>{g.exports={doubles:{step:4,points:[["e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a","f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"],["8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508","11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"],["175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739","d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"],["363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640","4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"],["8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c","4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"],["723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda","96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"],["eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa","5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"],["100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0","cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"],["e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d","9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"],["feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d","e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"],["da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1","9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"],["53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0","5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"],["8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047","10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"],["385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862","283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"],["6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7","7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"],["3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd","56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"],["85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83","7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"],["948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a","53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"],["6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8","bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"],["e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d","4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"],["e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725","7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"],["213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754","4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"],["4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c","17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"],["fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6","6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"],["76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39","c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"],["c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891","893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"],["d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b","febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"],["b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03","2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"],["e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d","eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"],["a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070","7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"],["90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4","e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"],["8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da","662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"],["e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11","1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"],["8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e","efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"],["e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41","2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"],["b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef","67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"],["d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8","db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"],["324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d","648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"],["4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96","35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"],["9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd","ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"],["6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5","9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"],["a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266","40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"],["7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71","34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"],["928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac","c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"],["85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751","1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"],["ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e","493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"],["827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241","c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"],["eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3","be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"],["e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f","4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"],["1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19","aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"],["146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be","b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"],["fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9","6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"],["da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2","8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"],["a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13","7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"],["174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c","ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"],["959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba","2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"],["d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151","e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"],["64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073","d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"],["8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458","38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"],["13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b","69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"],["bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366","d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"],["8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa","40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"],["8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0","620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"],["dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787","7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"],["f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e","ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"]]},naf:{wnd:7,points:[["f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9","388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"],["2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4","d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"],["5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc","6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"],["acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe","cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"],["774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb","d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"],["f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8","ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"],["d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e","581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"],["defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34","4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"],["2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c","85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"],["352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5","321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"],["2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f","2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"],["9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714","73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"],["daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729","a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"],["c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db","2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"],["6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4","e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"],["1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5","b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"],["605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479","2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"],["62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d","80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"],["80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f","1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"],["7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb","d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"],["d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9","eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"],["49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963","758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"],["77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74","958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"],["f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530","e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"],["463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b","5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"],["f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247","cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"],["caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1","cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"],["2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120","4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"],["7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435","91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"],["754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18","673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"],["e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8","59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"],["186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb","3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"],["df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f","55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"],["5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143","efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"],["290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba","e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"],["af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45","f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"],["766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a","744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"],["59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e","c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"],["f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8","e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"],["7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c","30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"],["948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519","e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"],["7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab","100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"],["3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca","ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"],["d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf","8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"],["1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610","68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"],["733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4","f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"],["15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c","d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"],["a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940","edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"],["e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980","a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"],["311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3","66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"],["34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf","9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"],["f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63","4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"],["d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448","fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"],["32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf","5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"],["7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5","8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"],["ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6","8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"],["16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5","5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"],["eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99","f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"],["78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51","f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"],["494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5","42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"],["a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5","204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"],["c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997","4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"],["841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881","73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"],["5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5","39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"],["36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66","d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"],["336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726","ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"],["8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede","6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"],["1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94","60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"],["85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31","3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"],["29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51","b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"],["a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252","ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"],["4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5","cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"],["d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b","6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"],["ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4","322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"],["af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f","6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"],["e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889","2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"],["591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246","b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"],["11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984","998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"],["3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a","b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"],["cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030","bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"],["c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197","6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"],["c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593","c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"],["a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef","21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"],["347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38","60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"],["da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a","49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"],["c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111","5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"],["4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502","7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"],["3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea","be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"],["cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26","8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"],["b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986","39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"],["d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e","62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"],["48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4","25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"],["dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda","ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"],["6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859","cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"],["e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f","f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"],["eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c","6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"],["13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942","fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"],["ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a","1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"],["b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80","5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"],["ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d","438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"],["8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1","cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"],["52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63","c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"],["e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352","6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"],["7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193","ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"],["5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00","9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"],["32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58","ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"],["e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7","d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"],["8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8","c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"],["4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e","67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"],["3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d","cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"],["674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b","299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"],["d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f","f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"],["30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6","462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"],["be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297","62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"],["93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a","7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"],["b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c","ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"],["d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52","4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"],["d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb","bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"],["463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065","bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"],["7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917","603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"],["74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9","cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"],["30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3","553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"],["9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57","712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"],["176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66","ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"],["75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8","9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"],["809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721","9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"],["1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180","4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"]]}}}),X0=OJ((l)=>{var g=l,R=Z0(),M=U6(),B=mQ(),A=B.assert;function q(O){O.type==="short"?this.curve=new M.short(O):O.type==="edwards"?this.curve=new M.edwards(O):this.curve=new M.mont(O),this.g=this.curve.g,this.n=this.curve.n,this.hash=O.hash,A(this.g.validate(),"Invalid curve"),A(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}g.PresetCurve=q;function Y(O,N){Object.defineProperty(g,O,{configurable:!0,enumerable:!0,get:function(){var W=new q(N);return Object.defineProperty(g,O,{configurable:!0,enumerable:!0,value:W}),W}})}Y("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:R.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),Y("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:R.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),Y("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:R.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),Y("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:R.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),Y("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:R.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),Y("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:R.sha256,gRed:!1,g:["9"]}),Y("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:R.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});var E;try{E=Z$()}catch{E=void 0}Y("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:R.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",E]})}),X$=OJ((l,g)=>{var R=Z0(),M=K6(),B=hQ();function A(q){if(!(this instanceof A))return new A(q);this.hash=q.hash,this.predResist=!!q.predResist,this.outLen=this.hash.outSize,this.minEntropy=q.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var Y=M.toArray(q.entropy,q.entropyEnc||"hex"),E=M.toArray(q.nonce,q.nonceEnc||"hex"),O=M.toArray(q.pers,q.persEnc||"hex");B(Y.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(Y,E,O)}g.exports=A,A.prototype._init=function(q,Y,E){var O=q.concat(Y).concat(E);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var N=0;N<this.V.length;N++)this.K[N]=0,this.V[N]=1;this._update(O),this._reseed=1,this.reseedInterval=281474976710656},A.prototype._hmac=function(){return new R.hmac(this.hash,this.K)},A.prototype._update=function(q){var Y=this._hmac().update(this.V).update([0]);q&&(Y=Y.update(q)),this.K=Y.digest(),this.V=this._hmac().update(this.V).digest(),q&&(this.K=this._hmac().update(this.V).update([1]).update(q).digest(),this.V=this._hmac().update(this.V).digest())},A.prototype.reseed=function(q,Y,E,O){typeof Y!="string"&&(O=E,E=Y,Y=null),q=M.toArray(q,Y),E=M.toArray(E,O),B(q.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(q.concat(E||[])),this._reseed=1},A.prototype.generate=function(q,Y,E,O){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");typeof Y!="string"&&(O=E,E=Y,Y=null),E&&(E=M.toArray(E,O||"hex"),this._update(E));for(var N=[];N.length<q;)this.V=this._hmac().update(this.V).digest(),N=N.concat(this.V);var W=N.slice(0,q);return this._update(E),this._reseed++,M.encode(W,Y)}}),q$=OJ((l,g)=>{var R=dQ(),M=mQ(),B=M.assert;function A(q,Y){this.ec=q,this.priv=null,this.pub=null,Y.priv&&this._importPrivate(Y.priv,Y.privEnc),Y.pub&&this._importPublic(Y.pub,Y.pubEnc)}g.exports=A,A.fromPublic=function(q,Y,E){return Y instanceof A?Y:new A(q,{pub:Y,pubEnc:E})},A.fromPrivate=function(q,Y,E){return Y instanceof A?Y:new A(q,{priv:Y,privEnc:E})},A.prototype.validate=function(){var q=this.getPublic();return q.isInfinity()?{result:!1,reason:"Invalid public key"}:q.validate()?q.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},A.prototype.getPublic=function(q,Y){return typeof q=="string"&&(Y=q,q=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),Y?this.pub.encode(Y,q):this.pub},A.prototype.getPrivate=function(q){return q==="hex"?this.priv.toString(16,2):this.priv},A.prototype._importPrivate=function(q,Y){this.priv=new R(q,Y||16),this.priv=this.priv.umod(this.ec.curve.n)},A.prototype._importPublic=function(q,Y){if(q.x||q.y){this.ec.curve.type==="mont"?B(q.x,"Need x coordinate"):(this.ec.curve.type==="short"||this.ec.curve.type==="edwards")&&B(q.x&&q.y,"Need both x and y coordinate"),this.pub=this.ec.curve.point(q.x,q.y);return}this.pub=this.ec.curve.decodePoint(q,Y)},A.prototype.derive=function(q){return q.validate()||B(q.validate(),"public point not validated"),q.mul(this.priv).getX()},A.prototype.sign=function(q,Y,E){return this.ec.sign(q,this,Y,E)},A.prototype.verify=function(q,Y){return this.ec.verify(q,Y,this)},A.prototype.inspect=function(){return"<Key priv: "+(this.priv&&this.priv.toString(16,2))+" pub: "+(this.pub&&this.pub.inspect())+" >"}}),G$=OJ((l,g)=>{var R=dQ(),M=mQ(),B=M.assert;function A(N,W){if(N instanceof A)return N;this._importDER(N,W)||(B(N.r&&N.s,"Signature without r or s"),this.r=new R(N.r,16),this.s=new R(N.s,16),N.recoveryParam===void 0?this.recoveryParam=null:this.recoveryParam=N.recoveryParam)}g.exports=A;function q(){this.place=0}function Y(N,W){var I=N[W.place++];if(!(I&128))return I;var z=I&15;if(z===0||z>4)return!1;for(var j=0,P=0,F=W.place;P<z;P++,F++)j<<=8,j|=N[F],j>>>=0;return j<=127?!1:(W.place=F,j)}function E(N){for(var W=0,I=N.length-1;!N[W]&&!(N[W+1]&128)&&W<I;)W++;return W===0?N:N.slice(W)}A.prototype._importDER=function(N,W){N=M.toArray(N,W);var I=new q;if(N[I.place++]!==48)return!1;var z=Y(N,I);if(z===!1||z+I.place!==N.length||N[I.place++]!==2)return!1;var j=Y(N,I);if(j===!1)return!1;var P=N.slice(I.place,j+I.place);if(I.place+=j,N[I.place++]!==2)return!1;var F=Y(N,I);if(F===!1||N.length!==F+I.place)return!1;var v=N.slice(I.place,F+I.place);if(P[0]===0)if(P[1]&128)P=P.slice(1);else return!1;if(v[0]===0)if(v[1]&128)v=v.slice(1);else return!1;return this.r=new R(P),this.s=new R(v),this.recoveryParam=null,!0};function O(N,W){if(W<128){N.push(W);return}var I=1+(Math.log(W)/Math.LN2>>>3);for(N.push(I|128);--I;)N.push(W>>>(I<<3)&255);N.push(W)}A.prototype.toDER=function(N){var W=this.r.toArray(),I=this.s.toArray();for(W[0]&128&&(W=[0].concat(W)),I[0]&128&&(I=[0].concat(I)),W=E(W),I=E(I);!I[0]&&!(I[1]&128);)I=I.slice(1);var z=[2];O(z,W.length),z=z.concat(W),z.push(2),O(z,I.length);var j=z.concat(I),P=[48];return O(P,j.length),P=P.concat(j),M.encode(P,N)}}),K$=OJ((l,g)=>{var R=dQ(),M=X$(),B=mQ(),A=X0(),q=J0(),Y=B.assert,E=q$(),O=G$();function N(W){if(!(this instanceof N))return new N(W);typeof W=="string"&&(Y(Object.prototype.hasOwnProperty.call(A,W),"Unknown curve "+W),W=A[W]),W instanceof A.PresetCurve&&(W={curve:W}),this.curve=W.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=W.curve.g,this.g.precompute(W.curve.n.bitLength()+1),this.hash=W.hash||W.curve.hash}g.exports=N,N.prototype.keyPair=function(W){return new E(this,W)},N.prototype.keyFromPrivate=function(W,I){return E.fromPrivate(this,W,I)},N.prototype.keyFromPublic=function(W,I){return E.fromPublic(this,W,I)},N.prototype.genKeyPair=function(W){W||(W={});for(var I=new M({hash:this.hash,pers:W.pers,persEnc:W.persEnc||"utf8",entropy:W.entropy||q(this.hash.hmacStrength),entropyEnc:W.entropy&&W.entropyEnc||"utf8",nonce:this.n.toArray()}),z=this.n.byteLength(),j=this.n.sub(new R(2));;){var P=new R(I.generate(z));if(!(P.cmp(j)>0))return P.iaddn(1),this.keyFromPrivate(P)}},N.prototype._truncateToN=function(W,I){var z=W.byteLength()*8-this.n.bitLength();return z>0&&(W=W.ushrn(z)),!I&&W.cmp(this.n)>=0?W.sub(this.n):W},N.prototype.sign=function(W,I,z,j){typeof z=="object"&&(j=z,z=null),j||(j={}),I=this.keyFromPrivate(I,z),W=this._truncateToN(new R(W,16));for(var P=this.n.byteLength(),F=I.getPrivate().toArray("be",P),v=W.toArray("be",P),S=new M({hash:this.hash,entropy:F,nonce:v,pers:j.pers,persEnc:j.persEnc||"utf8"}),w=this.n.sub(new R(1)),y=0;;y++){var m=j.k?j.k(y):new R(S.generate(this.n.byteLength()));if(m=this._truncateToN(m,!0),!(m.cmpn(1)<=0||m.cmp(w)>=0)){var i=this.g.mul(m);if(!i.isInfinity()){var JJ=i.getX(),VJ=JJ.umod(this.n);if(VJ.cmpn(0)!==0){var HJ=m.invm(this.n).mul(VJ.mul(I.getPrivate()).iadd(W));if(HJ=HJ.umod(this.n),HJ.cmpn(0)!==0){var o=(i.getY().isOdd()?1:0)|(JJ.cmp(VJ)!==0?2:0);return j.canonical&&HJ.cmp(this.nh)>0&&(HJ=this.n.sub(HJ),o^=1),new O({r:VJ,s:HJ,recoveryParam:o})}}}}}},N.prototype.verify=function(W,I,z,j){W=this._truncateToN(new R(W,16)),z=this.keyFromPublic(z,j),I=new O(I,"hex");var{r:P,s:F}=I;if(P.cmpn(1)<0||P.cmp(this.n)>=0||F.cmpn(1)<0||F.cmp(this.n)>=0)return!1;var v=F.invm(this.n),S=v.mul(W).umod(this.n),w=v.mul(P).umod(this.n),y;return this.curve._maxwellTrick?(y=this.g.jmulAdd(S,z.getPublic(),w),y.isInfinity()?!1:y.eqXToP(P)):(y=this.g.mulAdd(S,z.getPublic(),w),y.isInfinity()?!1:y.getX().umod(this.n).cmp(P)===0)},N.prototype.recoverPubKey=function(W,I,z,j){Y((3&z)===z,"The recovery param is more than two bits"),I=new O(I,j);var P=this.n,F=new R(W),v=I.r,S=I.s,w=z&1,y=z>>1;if(v.cmp(this.curve.p.umod(this.curve.n))>=0&&y)throw new Error("Unable to find sencond key candinate");y?v=this.curve.pointFromX(v.add(this.curve.n),w):v=this.curve.pointFromX(v,w);var m=I.r.invm(P),i=P.sub(F).mul(m).umod(P),JJ=S.mul(m).umod(P);return this.g.mulAdd(i,v,JJ)},N.prototype.getKeyRecoveryParam=function(W,I,z,j){if(I=new O(I,j),I.recoveryParam!==null)return I.recoveryParam;for(var P=0;P<4;P++){var F;try{F=this.recoverPubKey(W,I,P)}catch{continue}if(F.eq(z))return P}throw new Error("Unable to find valid recovery factor")}}),U$=OJ((l,g)=>{var R=mQ(),M=R.assert,B=R.parseBytes,A=R.cachedProperty;function q(Y,E){this.eddsa=Y,this._secret=B(E.secret),Y.isPoint(E.pub)?this._pub=E.pub:this._pubBytes=B(E.pub)}q.fromPublic=function(Y,E){return E instanceof q?E:new q(Y,{pub:E})},q.fromSecret=function(Y,E){return E instanceof q?E:new q(Y,{secret:E})},q.prototype.secret=function(){return this._secret},A(q,"pubBytes",function(){return this.eddsa.encodePoint(this.pub())}),A(q,"pub",function(){return this._pubBytes?this.eddsa.decodePoint(this._pubBytes):this.eddsa.g.mul(this.priv())}),A(q,"privBytes",function(){var Y=this.eddsa,E=this.hash(),O=Y.encodingLength-1,N=E.slice(0,Y.encodingLength);return N[0]&=248,N[O]&=127,N[O]|=64,N}),A(q,"priv",function(){return this.eddsa.decodeInt(this.privBytes())}),A(q,"hash",function(){return this.eddsa.hash().update(this.secret()).digest()}),A(q,"messagePrefix",function(){return this.hash().slice(this.eddsa.encodingLength)}),q.prototype.sign=function(Y){return M(this._secret,"KeyPair can only verify"),this.eddsa.sign(Y,this)},q.prototype.verify=function(Y,E){return this.eddsa.verify(Y,E,this)},q.prototype.getSecret=function(Y){return M(this._secret,"KeyPair is public only"),R.encode(this.secret(),Y)},q.prototype.getPublic=function(Y){return R.encode(this.pubBytes(),Y)},g.exports=q}),H$=OJ((l,g)=>{var R=dQ(),M=mQ(),B=M.assert,A=M.cachedProperty,q=M.parseBytes;function Y(E,O){this.eddsa=E,typeof O!="object"&&(O=q(O)),Array.isArray(O)&&(O={R:O.slice(0,E.encodingLength),S:O.slice(E.encodingLength)}),B(O.R&&O.S,"Signature without R or S"),E.isPoint(O.R)&&(this._R=O.R),O.S instanceof R&&(this._S=O.S),this._Rencoded=Array.isArray(O.R)?O.R:O.Rencoded,this._Sencoded=Array.isArray(O.S)?O.S:O.Sencoded}A(Y,"S",function(){return this.eddsa.decodeInt(this.Sencoded())}),A(Y,"R",function(){return this.eddsa.decodePoint(this.Rencoded())}),A(Y,"Rencoded",function(){return this.eddsa.encodePoint(this.R())}),A(Y,"Sencoded",function(){return this.eddsa.encodeInt(this.S())}),Y.prototype.toBytes=function(){return this.Rencoded().concat(this.Sencoded())},Y.prototype.toHex=function(){return M.encode(this.toBytes(),"hex").toUpperCase()},g.exports=Y}),W$=OJ((l,g)=>{var R=Z0(),M=X0(),B=mQ(),A=B.assert,q=B.parseBytes,Y=U$(),E=H$();function O(N){if(A(N==="ed25519","only tested with ed25519 so far"),!(this instanceof O))return new O(N);N=M[N].curve,this.curve=N,this.g=N.g,this.g.precompute(N.n.bitLength()+1),this.pointClass=N.point().constructor,this.encodingLength=Math.ceil(N.n.bitLength()/8),this.hash=R.sha512}g.exports=O,O.prototype.sign=function(N,W){N=q(N);var I=this.keyFromSecret(W),z=this.hashInt(I.messagePrefix(),N),j=this.g.mul(z),P=this.encodePoint(j),F=this.hashInt(P,I.pubBytes(),N).mul(I.priv()),v=z.add(F).umod(this.curve.n);return this.makeSignature({R:j,S:v,Rencoded:P})},O.prototype.verify=function(N,W,I){N=q(N),W=this.makeSignature(W);var z=this.keyFromPublic(I),j=this.hashInt(W.Rencoded(),z.pubBytes(),N),P=this.g.mul(W.S()),F=W.R().add(z.pub().mul(j));return F.eq(P)},O.prototype.hashInt=function(){for(var N=this.hash(),W=0;W<arguments.length;W++)N.update(arguments[W]);return B.intFromLE(N.digest()).umod(this.curve.n)},O.prototype.keyFromPublic=function(N){return Y.fromPublic(this,N)},O.prototype.keyFromSecret=function(N){return Y.fromSecret(this,N)},O.prototype.makeSignature=function(N){return N instanceof E?N:new E(this,N)},O.prototype.encodePoint=function(N){var W=N.getY().toArray("le",this.encodingLength);return W[this.encodingLength-1]|=N.getX().isOdd()?128:0,W},O.prototype.decodePoint=function(N){N=B.parseBytes(N);var W=N.length-1,I=N.slice(0,W).concat(N[W]&-129),z=(N[W]&128)!==0,j=B.intFromLE(I);return this.curve.pointFromY(j,z)},O.prototype.encodeInt=function(N){return N.toArray("le",this.encodingLength)},O.prototype.decodeInt=function(N){return B.intFromLE(N)},O.prototype.isPoint=function(N){return N instanceof this.pointClass}}),q0=OJ((l)=>{var g=l;g.version=n8().version,g.utils=mQ(),g.rand=J0(),g.curve=U6(),g.curves=X0(),g.ec=K$(),g.eddsa=W$()}),B6=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),G0=OJ((l,g)=>{var R=yQ(),M=R.Buffer,B={},A;for(A in R)!R.hasOwnProperty(A)||A==="SlowBuffer"||A==="Buffer"||(B[A]=R[A]);var q=B.Buffer={};for(A in M)!M.hasOwnProperty(A)||A==="allocUnsafe"||A==="allocUnsafeSlow"||(q[A]=M[A]);if(B.Buffer.prototype=M.prototype,(!q.from||q.from===Uint8Array.from)&&(q.from=function(Y,E,O){if(typeof Y=="number")throw new TypeError('The "value" argument must not be of type number. Received type '+typeof Y);if(Y&&typeof Y.length>"u")throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Y);return M(Y,E,O)}),q.alloc||(q.alloc=function(Y,E,O){if(typeof Y!="number")throw new TypeError('The "size" argument must be of type number. Received type '+typeof Y);if(Y<0||Y>=2*(1<<30))throw new RangeError('The value "'+Y+'" is invalid for option "size"');var N=M(Y);return!E||E.length===0?N.fill(0):typeof O=="string"?N.fill(E,O):N.fill(E),N}),!B.kStringMaxLength)try{B.kStringMaxLength=process.binding("buffer").kStringMaxLength}catch{}B.constants||(B.constants={MAX_LENGTH:B.kMaxLength},B.kStringMaxLength&&(B.constants.MAX_STRING_LENGTH=B.kStringMaxLength)),g.exports=B}),K0=OJ((l)=>{var g=JQ();function R(B){this._reporterState={obj:null,path:[],options:B||{},errors:[]}}l.Reporter=R,R.prototype.isError=function(B){return B instanceof M},R.prototype.save=function(){let B=this._reporterState;return{obj:B.obj,pathLen:B.path.length}},R.prototype.restore=function(B){let A=this._reporterState;A.obj=B.obj,A.path=A.path.slice(0,B.pathLen)},R.prototype.enterKey=function(B){return this._reporterState.path.push(B)},R.prototype.exitKey=function(B){let A=this._reporterState;A.path=A.path.slice(0,B-1)},R.prototype.leaveKey=function(B,A,q){let Y=this._reporterState;this.exitKey(B),Y.obj!==null&&(Y.obj[A]=q)},R.prototype.path=function(){return this._reporterState.path.join("/")},R.prototype.enterObject=function(){let B=this._reporterState,A=B.obj;return B.obj={},A},R.prototype.leaveObject=function(B){let A=this._reporterState,q=A.obj;return A.obj=B,q},R.prototype.error=function(B){let A,q=this._reporterState,Y=B instanceof M;if(Y?A=B:A=new M(q.path.map(function(E){return"["+JSON.stringify(E)+"]"}).join(""),B.message||B,B.stack),!q.options.partial)throw A;return Y||q.errors.push(A),A},R.prototype.wrapResult=function(B){let A=this._reporterState;return A.options.partial?{result:this.isError(B)?null:B,errors:A.errors}:B};function M(B,A){this.path=B,this.rethrow(A)}g(M,Error),M.prototype.rethrow=function(B){if(this.message=B+" at: "+(this.path||"(shallow)"),Error.captureStackTrace&&Error.captureStackTrace(this,M),!this.stack)try{throw new Error(this.message)}catch(A){this.stack=A.stack}return this}}),OV=OJ((l)=>{var g=JQ(),R=K0().Reporter,M=G0().Buffer;function B(q,Y){if(R.call(this,Y),!M.isBuffer(q)){this.error("Input not Buffer");return}this.base=q,this.offset=0,this.length=q.length}g(B,R),l.DecoderBuffer=B,B.isDecoderBuffer=function(q){return q instanceof B?!0:typeof q=="object"&&M.isBuffer(q.base)&&q.constructor.name==="DecoderBuffer"&&typeof q.offset=="number"&&typeof q.length=="number"&&typeof q.save=="function"&&typeof q.restore=="function"&&typeof q.isEmpty=="function"&&typeof q.readUInt8=="function"&&typeof q.skip=="function"&&typeof q.raw=="function"},B.prototype.save=function(){return{offset:this.offset,reporter:R.prototype.save.call(this)}},B.prototype.restore=function(q){let Y=new B(this.base);return Y.offset=q.offset,Y.length=this.offset,this.offset=q.offset,R.prototype.restore.call(this,q.reporter),Y},B.prototype.isEmpty=function(){return this.offset===this.length},B.prototype.readUInt8=function(q){return this.offset+1<=this.length?this.base.readUInt8(this.offset++,!0):this.error(q||"DecoderBuffer overrun")},B.prototype.skip=function(q,Y){if(!(this.offset+q<=this.length))return this.error(Y||"DecoderBuffer overrun");let E=new B(this.base);return E._reporterState=this._reporterState,E.offset=this.offset,E.length=this.offset+q,this.offset+=q,E},B.prototype.raw=function(q){return this.base.slice(q?q.offset:this.offset,this.length)};function A(q,Y){if(Array.isArray(q))this.length=0,this.value=q.map(function(E){return A.isEncoderBuffer(E)||(E=new A(E,Y)),this.length+=E.length,E},this);else if(typeof q=="number"){if(!(0<=q&&q<=255))return Y.error("non-byte EncoderBuffer value");this.value=q,this.length=1}else if(typeof q=="string")this.value=q,this.length=M.byteLength(q);else if(M.isBuffer(q))this.value=q,this.length=q.length;else return Y.error("Unsupported type: "+typeof q)}l.EncoderBuffer=A,A.isEncoderBuffer=function(q){return q instanceof A?!0:typeof q=="object"&&q.constructor.name==="EncoderBuffer"&&typeof q.length=="number"&&typeof q.join=="function"},A.prototype.join=function(q,Y){return q||(q=M.alloc(this.length)),Y||(Y=0),this.length===0||(Array.isArray(this.value)?this.value.forEach(function(E){E.join(q,Y),Y+=E.length}):(typeof this.value=="number"?q[Y]=this.value:typeof this.value=="string"?q.write(this.value,Y):M.isBuffer(this.value)&&this.value.copy(q,Y),Y+=this.length)),q}}),U0=OJ((l,g)=>{var R=K0().Reporter,M=OV().EncoderBuffer,B=OV().DecoderBuffer,A=hQ(),q=["seq","seqof","set","setof","objid","bool","gentime","utctime","null_","enum","int","objDesc","bitstr","bmpstr","charstr","genstr","graphstr","ia5str","iso646str","numstr","octstr","printstr","t61str","unistr","utf8str","videostr"],Y=["key","obj","use","optional","explicit","implicit","def","choice","any","contains"].concat(q),E=["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"];function O(W,I,z){let j={};this._baseState=j,j.name=z,j.enc=W,j.parent=I||null,j.children=null,j.tag=null,j.args=null,j.reverseArgs=null,j.choice=null,j.optional=!1,j.any=!1,j.obj=!1,j.use=null,j.useDecoder=null,j.key=null,j.default=null,j.explicit=null,j.implicit=null,j.contains=null,j.parent||(j.children=[],this._wrap())}g.exports=O;var N=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit","contains"];O.prototype.clone=function(){let W=this._baseState,I={};N.forEach(function(j){I[j]=W[j]});let z=new this.constructor(I.parent);return z._baseState=I,z},O.prototype._wrap=function(){let W=this._baseState;Y.forEach(function(I){this[I]=function(){let z=new this.constructor(this);return W.children.push(z),z[I].apply(z,arguments)}},this)},O.prototype._init=function(W){let I=this._baseState;A(I.parent===null),W.call(this),I.children=I.children.filter(function(z){return z._baseState.parent===this},this),A.equal(I.children.length,1,"Root node can have only one child")},O.prototype._useArgs=function(W){let I=this._baseState,z=W.filter(function(j){return j instanceof this.constructor},this);W=W.filter(function(j){return!(j instanceof this.constructor)},this),z.length!==0&&(A(I.children===null),I.children=z,z.forEach(function(j){j._baseState.parent=this},this)),W.length!==0&&(A(I.args===null),I.args=W,I.reverseArgs=W.map(function(j){if(typeof j!="object"||j.constructor!==Object)return j;let P={};return Object.keys(j).forEach(function(F){F==(F|0)&&(F|=0);let v=j[F];P[v]=F}),P}))},E.forEach(function(W){O.prototype[W]=function(){let I=this._baseState;throw new Error(W+" not implemented for encoding: "+I.enc)}}),q.forEach(function(W){O.prototype[W]=function(){let I=this._baseState,z=Array.prototype.slice.call(arguments);return A(I.tag===null),I.tag=W,this._useArgs(z),this}}),O.prototype.use=function(W){A(W);let I=this._baseState;return A(I.use===null),I.use=W,this},O.prototype.optional=function(){let W=this._baseState;return W.optional=!0,this},O.prototype.def=function(W){let I=this._baseState;return A(I.default===null),I.default=W,I.optional=!0,this},O.prototype.explicit=function(W){let I=this._baseState;return A(I.explicit===null&&I.implicit===null),I.explicit=W,this},O.prototype.implicit=function(W){let I=this._baseState;return A(I.explicit===null&&I.implicit===null),I.implicit=W,this},O.prototype.obj=function(){let W=this._baseState,I=Array.prototype.slice.call(arguments);return W.obj=!0,I.length!==0&&this._useArgs(I),this},O.prototype.key=function(W){let I=this._baseState;return A(I.key===null),I.key=W,this},O.prototype.any=function(){let W=this._baseState;return W.any=!0,this},O.prototype.choice=function(W){let I=this._baseState;return A(I.choice===null),I.choice=W,this._useArgs(Object.keys(W).map(function(z){return W[z]})),this},O.prototype.contains=function(W){let I=this._baseState;return A(I.use===null),I.contains=W,this},O.prototype._decode=function(W,I){let z=this._baseState;if(z.parent===null)return W.wrapResult(z.children[0]._decode(W,I));let j=z.default,P=!0,F=null;if(z.key!==null&&(F=W.enterKey(z.key)),z.optional){let S=null;if(z.explicit!==null?S=z.explicit:z.implicit!==null?S=z.implicit:z.tag!==null&&(S=z.tag),S===null&&!z.any){let w=W.save();try{z.choice===null?this._decodeGeneric(z.tag,W,I):this._decodeChoice(W,I),P=!0}catch{P=!1}W.restore(w)}else if(P=this._peekTag(W,S,z.any),W.isError(P))return P}let v;if(z.obj&&P&&(v=W.enterObject()),P){if(z.explicit!==null){let w=this._decodeTag(W,z.explicit);if(W.isError(w))return w;W=w}let S=W.offset;if(z.use===null&&z.choice===null){let w;z.any&&(w=W.save());let y=this._decodeTag(W,z.implicit!==null?z.implicit:z.tag,z.any);if(W.isError(y))return y;z.any?j=W.raw(w):W=y}if(I&&I.track&&z.tag!==null&&I.track(W.path(),S,W.length,"tagged"),I&&I.track&&z.tag!==null&&I.track(W.path(),W.offset,W.length,"content"),z.any||(z.choice===null?j=this._decodeGeneric(z.tag,W,I):j=this._decodeChoice(W,I)),W.isError(j))return j;if(!z.any&&z.choice===null&&z.children!==null&&z.children.forEach(function(w){w._decode(W,I)}),z.contains&&(z.tag==="octstr"||z.tag==="bitstr")){let w=new B(j);j=this._getUse(z.contains,W._reporterState.obj)._decode(w,I)}}return z.obj&&P&&(j=W.leaveObject(v)),z.key!==null&&(j!==null||P===!0)?W.leaveKey(F,z.key,j):F!==null&&W.exitKey(F),j},O.prototype._decodeGeneric=function(W,I,z){let j=this._baseState;return W==="seq"||W==="set"?null:W==="seqof"||W==="setof"?this._decodeList(I,W,j.args[0],z):/str$/.test(W)?this._decodeStr(I,W,z):W==="objid"&&j.args?this._decodeObjid(I,j.args[0],j.args[1],z):W==="objid"?this._decodeObjid(I,null,null,z):W==="gentime"||W==="utctime"?this._decodeTime(I,W,z):W==="null_"?this._decodeNull(I,z):W==="bool"?this._decodeBool(I,z):W==="objDesc"?this._decodeStr(I,W,z):W==="int"||W==="enum"?this._decodeInt(I,j.args&&j.args[0],z):j.use!==null?this._getUse(j.use,I._reporterState.obj)._decode(I,z):I.error("unknown tag: "+W)},O.prototype._getUse=function(W,I){let z=this._baseState;return z.useDecoder=this._use(W,I),A(z.useDecoder._baseState.parent===null),z.useDecoder=z.useDecoder._baseState.children[0],z.implicit!==z.useDecoder._baseState.implicit&&(z.useDecoder=z.useDecoder.clone(),z.useDecoder._baseState.implicit=z.implicit),z.useDecoder},O.prototype._decodeChoice=function(W,I){let z=this._baseState,j=null,P=!1;return Object.keys(z.choice).some(function(F){let v=W.save(),S=z.choice[F];try{let w=S._decode(W,I);if(W.isError(w))return!1;j={type:F,value:w},P=!0}catch{return W.restore(v),!1}return!0},this),P?j:W.error("Choice not matched")},O.prototype._createEncoderBuffer=function(W){return new M(W,this.reporter)},O.prototype._encode=function(W,I,z){let j=this._baseState;if(j.default!==null&&j.default===W)return;let P=this._encodeValue(W,I,z);if(P!==void 0&&!this._skipDefault(P,I,z))return P},O.prototype._encodeValue=function(W,I,z){let j=this._baseState;if(j.parent===null)return j.children[0]._encode(W,I||new R);let P=null;if(this.reporter=I,j.optional&&W===void 0)if(j.default!==null)W=j.default;else return;let F=null,v=!1;if(j.any)P=this._createEncoderBuffer(W);else if(j.choice)P=this._encodeChoice(W,I);else if(j.contains)F=this._getUse(j.contains,z)._encode(W,I),v=!0;else if(j.children)F=j.children.map(function(S){if(S._baseState.tag==="null_")return S._encode(null,I,W);if(S._baseState.key===null)return I.error("Child should have a key");let w=I.enterKey(S._baseState.key);if(typeof W!="object")return I.error("Child expected, but input is not object");let y=S._encode(W[S._baseState.key],I,W);return I.leaveKey(w),y},this).filter(function(S){return S}),F=this._createEncoderBuffer(F);else if(j.tag==="seqof"||j.tag==="setof"){if(!(j.args&&j.args.length===1))return I.error("Too many args for : "+j.tag);if(!Array.isArray(W))return I.error("seqof/setof, but data is not Array");let S=this.clone();S._baseState.implicit=null,F=this._createEncoderBuffer(W.map(function(w){let y=this._baseState;return this._getUse(y.args[0],W)._encode(w,I)},S))}else j.use!==null?P=this._getUse(j.use,z)._encode(W,I):(F=this._encodePrimitive(j.tag,W),v=!0);if(!j.any&&j.choice===null){let S=j.implicit!==null?j.implicit:j.tag,w=j.implicit===null?"universal":"context";S===null?j.use===null&&I.error("Tag could be omitted only for .use()"):j.use===null&&(P=this._encodeComposite(S,v,w,F))}return j.explicit!==null&&(P=this._encodeComposite(j.explicit,!1,"context",P)),P},O.prototype._encodeChoice=function(W,I){let z=this._baseState,j=z.choice[W.type];return j||A(!1,W.type+" not found in "+JSON.stringify(Object.keys(z.choice))),j._encode(W.value,I)},O.prototype._encodePrimitive=function(W,I){let z=this._baseState;if(/str$/.test(W))return this._encodeStr(I,W);if(W==="objid"&&z.args)return this._encodeObjid(I,z.reverseArgs[0],z.args[1]);if(W==="objid")return this._encodeObjid(I,null,null);if(W==="gentime"||W==="utctime")return this._encodeTime(I,W);if(W==="null_")return this._encodeNull();if(W==="int"||W==="enum")return this._encodeInt(I,z.args&&z.reverseArgs[0]);if(W==="bool")return this._encodeBool(I);if(W==="objDesc")return this._encodeStr(I,W);throw new Error("Unsupported tag: "+W)},O.prototype._isNumstr=function(W){return/^[0-9 ]*$/.test(W)},O.prototype._isPrintstr=function(W){return/^[A-Za-z0-9 '()+,-./:=?]*$/.test(W)}}),H0=OJ((l)=>{function g(R){let M={};return Object.keys(R).forEach(function(B){(B|0)==B&&(B=B|0);let A=R[B];M[A]=B}),M}l.tagClass={0:"universal",1:"application",2:"context",3:"private"},l.tagClassByName=g(l.tagClass),l.tag={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str",21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},l.tagByName=g(l.tag)}),O6=OJ((l,g)=>{var R=JQ(),M=G0().Buffer,B=U0(),A=H0();function q(N){this.enc="der",this.name=N.name,this.entity=N,this.tree=new Y,this.tree._init(N.body)}g.exports=q,q.prototype.encode=function(N,W){return this.tree._encode(N,W).join()};function Y(N){B.call(this,"der",N)}R(Y,B),Y.prototype._encodeComposite=function(N,W,I,z){let j=O(N,W,I,this.reporter);if(z.length<128){let v=M.alloc(2);return v[0]=j,v[1]=z.length,this._createEncoderBuffer([v,z])}let P=1;for(let v=z.length;v>=256;v>>=8)P++;let F=M.alloc(2+P);F[0]=j,F[1]=128|P;for(let v=1+P,S=z.length;S>0;v--,S>>=8)F[v]=S&255;return this._createEncoderBuffer([F,z])},Y.prototype._encodeStr=function(N,W){if(W==="bitstr")return this._createEncoderBuffer([N.unused|0,N.data]);if(W==="bmpstr"){let I=M.alloc(N.length*2);for(let z=0;z<N.length;z++)I.writeUInt16BE(N.charCodeAt(z),z*2);return this._createEncoderBuffer(I)}else return W==="numstr"?this._isNumstr(N)?this._createEncoderBuffer(N):this.reporter.error("Encoding of string type: numstr supports only digits and space"):W==="printstr"?this._isPrintstr(N)?this._createEncoderBuffer(N):this.reporter.error("Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark"):/str$/.test(W)?this._createEncoderBuffer(N):W==="objDesc"?this._createEncoderBuffer(N):this.reporter.error("Encoding of string type: "+W+" unsupported")},Y.prototype._encodeObjid=function(N,W,I){if(typeof N=="string"){if(!W)return this.reporter.error("string objid given, but no values map found");if(!W.hasOwnProperty(N))return this.reporter.error("objid not found in values map");N=W[N].split(/[\s.]+/g);for(let F=0;F<N.length;F++)N[F]|=0}else if(Array.isArray(N)){N=N.slice();for(let F=0;F<N.length;F++)N[F]|=0}if(!Array.isArray(N))return this.reporter.error("objid() should be either array or string, got: "+JSON.stringify(N));if(!I){if(N[1]>=40)return this.reporter.error("Second objid identifier OOB");N.splice(0,2,N[0]*40+N[1])}let z=0;for(let F=0;F<N.length;F++){let v=N[F];for(z++;v>=128;v>>=7)z++}let j=M.alloc(z),P=j.length-1;for(let F=N.length-1;F>=0;F--){let v=N[F];for(j[P--]=v&127;(v>>=7)>0;)j[P--]=128|v&127}return this._createEncoderBuffer(j)};function E(N){return N<10?"0"+N:N}Y.prototype._encodeTime=function(N,W){let I,z=new Date(N);return W==="gentime"?I=[E(z.getUTCFullYear()),E(z.getUTCMonth()+1),E(z.getUTCDate()),E(z.getUTCHours()),E(z.getUTCMinutes()),E(z.getUTCSeconds()),"Z"].join(""):W==="utctime"?I=[E(z.getUTCFullYear()%100),E(z.getUTCMonth()+1),E(z.getUTCDate()),E(z.getUTCHours()),E(z.getUTCMinutes()),E(z.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+W+" time is not supported yet"),this._encodeStr(I,"octstr")},Y.prototype._encodeNull=function(){return this._createEncoderBuffer("")},Y.prototype._encodeInt=function(N,W){if(typeof N=="string"){if(!W)return this.reporter.error("String int or enum given, but no values map");if(!W.hasOwnProperty(N))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(N));N=W[N]}if(typeof N!="number"&&!M.isBuffer(N)){let j=N.toArray();!N.sign&&j[0]&128&&j.unshift(0),N=M.from(j)}if(M.isBuffer(N)){let j=N.length;N.length===0&&j++;let P=M.alloc(j);return N.copy(P),N.length===0&&(P[0]=0),this._createEncoderBuffer(P)}if(N<128)return this._createEncoderBuffer(N);if(N<256)return this._createEncoderBuffer([0,N]);let I=1;for(let j=N;j>=256;j>>=8)I++;let z=new Array(I);for(let j=z.length-1;j>=0;j--)z[j]=N&255,N>>=8;return z[0]&128&&z.unshift(0),this._createEncoderBuffer(M.from(z))},Y.prototype._encodeBool=function(N){return this._createEncoderBuffer(N?255:0)},Y.prototype._use=function(N,W){return typeof N=="function"&&(N=N(W)),N._getEncoder("der").tree},Y.prototype._skipDefault=function(N,W,I){let z=this._baseState,j;if(z.default===null)return!1;let P=N.join();if(z.defaultBuffer===void 0&&(z.defaultBuffer=this._encodeValue(z.default,W,I).join()),P.length!==z.defaultBuffer.length)return!1;for(j=0;j<P.length;j++)if(P[j]!==z.defaultBuffer[j])return!1;return!0};function O(N,W,I,z){let j;if(N==="seqof"?N="seq":N==="setof"&&(N="set"),A.tagByName.hasOwnProperty(N))j=A.tagByName[N];else if(typeof N=="number"&&(N|0)===N)j=N;else return z.error("Unknown tag: "+N);return j>=31?z.error("Multi-octet tag encoding unsupported"):(W||(j|=32),j|=A.tagClassByName[I||"universal"]<<6,j)}}),Y$=OJ((l,g)=>{var R=JQ(),M=O6();function B(A){M.call(this,A),this.enc="pem"}R(B,M),g.exports=B,B.prototype.encode=function(A,q){let Y=M.prototype.encode.call(this,A).toString("base64"),E=["-----BEGIN "+q.label+"-----"];for(let O=0;O<Y.length;O+=64)E.push(Y.slice(O,O+64));return E.push("-----END "+q.label+"-----"),E.join(`
+`)}}),j6=OJ((l)=>{var g=l;g.der=O6(),g.pem=Y$()}),T6=OJ((l,g)=>{var R=JQ(),M=B6(),B=OV().DecoderBuffer,A=U0(),q=H0();function Y(W){this.enc="der",this.name=W.name,this.entity=W,this.tree=new E,this.tree._init(W.body)}g.exports=Y,Y.prototype.decode=function(W,I){return B.isDecoderBuffer(W)||(W=new B(W,I)),this.tree._decode(W,I)};function E(W){A.call(this,"der",W)}R(E,A),E.prototype._peekTag=function(W,I,z){if(W.isEmpty())return!1;let j=W.save(),P=O(W,'Failed to peek tag: "'+I+'"');return W.isError(P)?P:(W.restore(j),P.tag===I||P.tagStr===I||P.tagStr+"of"===I||z)},E.prototype._decodeTag=function(W,I,z){let j=O(W,'Failed to decode tag of "'+I+'"');if(W.isError(j))return j;let P=N(W,j.primitive,'Failed to get length of "'+I+'"');if(W.isError(P))return P;if(!z&&j.tag!==I&&j.tagStr!==I&&j.tagStr+"of"!==I)return W.error('Failed to match tag: "'+I+'"');if(j.primitive||P!==null)return W.skip(P,'Failed to match body of: "'+I+'"');let F=W.save(),v=this._skipUntilEnd(W,'Failed to skip indefinite length body: "'+this.tag+'"');return W.isError(v)?v:(P=W.offset-F.offset,W.restore(F),W.skip(P,'Failed to match body of: "'+I+'"'))},E.prototype._skipUntilEnd=function(W,I){for(;;){let z=O(W,I);if(W.isError(z))return z;let j=N(W,z.primitive,I);if(W.isError(j))return j;let P;if(z.primitive||j!==null?P=W.skip(j):P=this._skipUntilEnd(W,I),W.isError(P))return P;if(z.tagStr==="end")break}},E.prototype._decodeList=function(W,I,z,j){let P=[];for(;!W.isEmpty();){let F=this._peekTag(W,"end");if(W.isError(F))return F;let v=z.decode(W,"der",j);if(W.isError(v)&&F)break;P.push(v)}return P},E.prototype._decodeStr=function(W,I){if(I==="bitstr"){let z=W.readUInt8();return W.isError(z)?z:{unused:z,data:W.raw()}}else if(I==="bmpstr"){let z=W.raw();if(z.length%2===1)return W.error("Decoding of string type: bmpstr length mismatch");let j="";for(let P=0;P<z.length/2;P++)j+=String.fromCharCode(z.readUInt16BE(P*2));return j}else if(I==="numstr"){let z=W.raw().toString("ascii");return this._isNumstr(z)?z:W.error("Decoding of string type: numstr unsupported characters")}else{if(I==="octstr")return W.raw();if(I==="objDesc")return W.raw();if(I==="printstr"){let z=W.raw().toString("ascii");return this._isPrintstr(z)?z:W.error("Decoding of string type: printstr unsupported characters")}else return/str$/.test(I)?W.raw().toString():W.error("Decoding of string type: "+I+" unsupported")}},E.prototype._decodeObjid=function(W,I,z){let j,P=[],F=0,v=0;for(;!W.isEmpty();)v=W.readUInt8(),F<<=7,F|=v&127,(v&128)===0&&(P.push(F),F=0);v&128&&P.push(F);let S=P[0]/40|0,w=P[0]%40;if(z?j=P:j=[S,w].concat(P.slice(1)),I){let y=I[j.join(" ")];y===void 0&&(y=I[j.join(".")]),y!==void 0&&(j=y)}return j},E.prototype._decodeTime=function(W,I){let z=W.raw().toString(),j,P,F,v,S,w;if(I==="gentime")j=z.slice(0,4)|0,P=z.slice(4,6)|0,F=z.slice(6,8)|0,v=z.slice(8,10)|0,S=z.slice(10,12)|0,w=z.slice(12,14)|0;else if(I==="utctime")j=z.slice(0,2)|0,P=z.slice(2,4)|0,F=z.slice(4,6)|0,v=z.slice(6,8)|0,S=z.slice(8,10)|0,w=z.slice(10,12)|0,j<70?j=2000+j:j=1900+j;else return W.error("Decoding "+I+" time is not supported yet");return Date.UTC(j,P-1,F,v,S,w,0)},E.prototype._decodeNull=function(){return null},E.prototype._decodeBool=function(W){let I=W.readUInt8();return W.isError(I)?I:I!==0},E.prototype._decodeInt=function(W,I){let z=W.raw(),j=new M(z);return I&&(j=I[j.toString(10)]||j),j},E.prototype._use=function(W,I){return typeof W=="function"&&(W=W(I)),W._getDecoder("der").tree};function O(W,I){let z=W.readUInt8(I);if(W.isError(z))return z;let j=q.tagClass[z>>6],P=(z&32)===0;if((z&31)===31){let v=z;for(z=0;(v&128)===128;){if(v=W.readUInt8(I),W.isError(v))return v;z<<=7,z|=v&127}}else z&=31;let F=q.tag[z];return{cls:j,primitive:P,tag:z,tagStr:F}}function N(W,I,z){let j=W.readUInt8(z);if(W.isError(j))return j;if(!I&&j===128)return null;if((j&128)===0)return j;let P=j&127;if(P>4)return W.error("length octect is too long");j=0;for(let F=0;F<P;F++){j<<=8;let v=W.readUInt8(z);if(W.isError(v))return v;j|=v}return j}}),B$=OJ((l,g)=>{var R=JQ(),M=G0().Buffer,B=T6();function A(q){B.call(this,q),this.enc="pem"}R(A,B),g.exports=A,A.prototype.decode=function(q,Y){let E=q.toString().split(/[\r\n]+/g),O=Y.label.toUpperCase(),N=/^-----(BEGIN|END) ([^-]+)-----$/,W=-1,I=-1;for(let P=0;P<E.length;P++){let F=E[P].match(N);if(F!==null&&F[2]===O)if(W===-1){if(F[1]!=="BEGIN")break;W=P}else{if(F[1]!=="END")break;I=P;break}}if(W===-1||I===-1)throw new Error("PEM section not found for: "+O);let z=E.slice(W+1,I).join("");z.replace(/[^a-z0-9+/=]+/gi,"");let j=M.from(z,"base64");return B.prototype.decode.call(this,j,Y)}}),N6=OJ((l)=>{var g=l;g.der=T6(),g.pem=B$()}),O$=OJ((l)=>{var g=j6(),R=N6(),M=JQ(),B=l;B.define=function(q,Y){return new A(q,Y)};function A(q,Y){this.name=q,this.body=Y,this.decoders={},this.encoders={}}A.prototype._createNamed=function(q){let Y=this.name;function E(O){this._initNamed(O,Y)}return M(E,q),E.prototype._initNamed=function(O,N){q.call(this,O,N)},new E(this)},A.prototype._getDecoder=function(q){return q=q||"der",this.decoders.hasOwnProperty(q)||(this.decoders[q]=this._createNamed(R[q])),this.decoders[q]},A.prototype.decode=function(q,Y,E){return this._getDecoder(Y).decode(q,E)},A.prototype._getEncoder=function(q){return q=q||"der",this.encoders.hasOwnProperty(q)||(this.encoders[q]=this._createNamed(g[q])),this.encoders[q]},A.prototype.encode=function(q,Y,E){return this._getEncoder(Y).encode(q,E)}}),j$=OJ((l)=>{var g=l;g.Reporter=K0().Reporter,g.DecoderBuffer=OV().DecoderBuffer,g.EncoderBuffer=OV().EncoderBuffer,g.Node=U0()}),T$=OJ((l)=>{var g=l;g._reverse=function(R){let M={};return Object.keys(R).forEach(function(B){(B|0)==B&&(B=B|0);let A=R[B];M[A]=B}),M},g.der=H0()}),I6=OJ((l)=>{var g=l;g.bignum=B6(),g.define=O$().define,g.base=j$(),g.constants=T$(),g.decoders=N6(),g.encoders=j6()}),N$=OJ((l,g)=>{var R=I6(),M=R.define("Time",function(){this.choice({utcTime:this.utctime(),generalTime:this.gentime()})}),B=R.define("AttributeTypeValue",function(){this.seq().obj(this.key("type").objid(),this.key("value").any())}),A=R.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("parameters").optional(),this.key("curve").objid().optional())}),q=R.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(A),this.key("subjectPublicKey").bitstr())}),Y=R.define("RelativeDistinguishedName",function(){this.setof(B)}),E=R.define("RDNSequence",function(){this.seqof(Y)}),O=R.define("Name",function(){this.choice({rdnSequence:this.use(E)})}),N=R.define("Validity",function(){this.seq().obj(this.key("notBefore").use(M),this.key("notAfter").use(M))}),W=R.define("Extension",function(){this.seq().obj(this.key("extnID").objid(),this.key("critical").bool().def(!1),this.key("extnValue").octstr())}),I=R.define("TBSCertificate",function(){this.seq().obj(this.key("version").explicit(0).int().optional(),this.key("serialNumber").int(),this.key("signature").use(A),this.key("issuer").use(O),this.key("validity").use(N),this.key("subject").use(O),this.key("subjectPublicKeyInfo").use(q),this.key("issuerUniqueID").implicit(1).bitstr().optional(),this.key("subjectUniqueID").implicit(2).bitstr().optional(),this.key("extensions").explicit(3).seqof(W).optional())}),z=R.define("X509Certificate",function(){this.seq().obj(this.key("tbsCertificate").use(I),this.key("signatureAlgorithm").use(A),this.key("signatureValue").bitstr())});g.exports=z}),I$=OJ((l)=>{var g=I6();l.certificate=N$();var R=g.define("RSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("modulus").int(),this.key("publicExponent").int(),this.key("privateExponent").int(),this.key("prime1").int(),this.key("prime2").int(),this.key("exponent1").int(),this.key("exponent2").int(),this.key("coefficient").int())});l.RSAPrivateKey=R;var M=g.define("RSAPublicKey",function(){this.seq().obj(this.key("modulus").int(),this.key("publicExponent").int())});l.RSAPublicKey=M;var B=g.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(A),this.key("subjectPublicKey").bitstr())});l.PublicKey=B;var A=g.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("none").null_().optional(),this.key("curve").objid().optional(),this.key("params").seq().obj(this.key("p").int(),this.key("q").int(),this.key("g").int()).optional())}),q=g.define("PrivateKeyInfo",function(){this.seq().obj(this.key("version").int(),this.key("algorithm").use(A),this.key("subjectPrivateKey").octstr())});l.PrivateKey=q;var Y=g.define("EncryptedPrivateKeyInfo",function(){this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(),this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(),this.key("kdeparams").seq().obj(this.key("salt").octstr(),this.key("iters").int())),this.key("cipher").seq().obj(this.key("algo").objid(),this.key("iv").octstr()))),this.key("subjectPrivateKey").octstr())});l.EncryptedPrivateKey=Y;var E=g.define("DSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("p").int(),this.key("q").int(),this.key("g").int(),this.key("pub_key").int(),this.key("priv_key").int())});l.DSAPrivateKey=E,l.DSAparam=g.define("DSAparam",function(){this.int()});var O=g.define("ECPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("privateKey").octstr(),this.key("parameters").optional().explicit(0).use(N),this.key("publicKey").optional().explicit(1).bitstr())});l.ECPrivateKey=O;var N=g.define("ECParameters",function(){this.choice({namedCurve:this.objid()})});l.signature=g.define("signature",function(){this.seq().obj(this.key("r").int(),this.key("s").int())})}),E$=OJ((l,g)=>{g.exports={"2.16.840.1.101.3.4.1.1":"aes-128-ecb","2.16.840.1.101.3.4.1.2":"aes-128-cbc","2.16.840.1.101.3.4.1.3":"aes-128-ofb","2.16.840.1.101.3.4.1.4":"aes-128-cfb","2.16.840.1.101.3.4.1.21":"aes-192-ecb","2.16.840.1.101.3.4.1.22":"aes-192-cbc","2.16.840.1.101.3.4.1.23":"aes-192-ofb","2.16.840.1.101.3.4.1.24":"aes-192-cfb","2.16.840.1.101.3.4.1.41":"aes-256-ecb","2.16.840.1.101.3.4.1.42":"aes-256-cbc","2.16.840.1.101.3.4.1.43":"aes-256-ofb","2.16.840.1.101.3.4.1.44":"aes-256-cfb"}}),R$=OJ((l,g)=>{var R=/Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m,M=/^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m,B=/^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m,A=kV(),q=eV(),Y=XQ().Buffer;g.exports=function(E,O){var N=E.toString(),W=N.match(R),I;if(W){var z="aes"+W[1],j=Y.from(W[2],"hex"),P=Y.from(W[3].replace(/[\r\n]/g,""),"base64"),F=A(O,j.slice(0,8),parseInt(W[1],10)).key,v=[],S=q.createDecipheriv(z,F,j);v.push(S.update(P)),v.push(S.final()),I=Y.concat(v)}else{var w=N.match(B);I=Y.from(w[2].replace(/[\r\n]/g,""),"base64")}var y=N.match(M)[1];return{tag:y,data:I}}}),SV=OJ((l,g)=>{var R=I$(),M=E$(),B=R$(),A=eV(),q=l0(),Y=XQ().Buffer;g.exports=E;function E(N){var W;typeof N=="object"&&!Y.isBuffer(N)&&(W=N.passphrase,N=N.key),typeof N=="string"&&(N=Y.from(N));var I=B(N,W),z=I.tag,j=I.data,P,F;switch(z){case"CERTIFICATE":F=R.certificate.decode(j,"der").tbsCertificate.subjectPublicKeyInfo;case"PUBLIC KEY":switch(F||(F=R.PublicKey.decode(j,"der")),P=F.algorithm.algorithm.join("."),P){case"1.2.840.113549.1.1.1":return R.RSAPublicKey.decode(F.subjectPublicKey.data,"der");case"1.2.840.10045.2.1":return F.subjectPrivateKey=F.subjectPublicKey,{type:"ec",data:F};case"1.2.840.10040.4.1":return F.algorithm.params.pub_key=R.DSAparam.decode(F.subjectPublicKey.data,"der"),{type:"dsa",data:F.algorithm.params};default:throw new Error("unknown key id "+P)}case"ENCRYPTED PRIVATE KEY":j=R.EncryptedPrivateKey.decode(j,"der"),j=O(j,W);case"PRIVATE KEY":switch(F=R.PrivateKey.decode(j,"der"),P=F.algorithm.algorithm.join("."),P){case"1.2.840.113549.1.1.1":return R.RSAPrivateKey.decode(F.subjectPrivateKey,"der");case"1.2.840.10045.2.1":return{curve:F.algorithm.curve,privateKey:R.ECPrivateKey.decode(F.subjectPrivateKey,"der").privateKey};case"1.2.840.10040.4.1":return F.algorithm.params.priv_key=R.DSAparam.decode(F.subjectPrivateKey,"der"),{type:"dsa",params:F.algorithm.params};default:throw new Error("unknown key id "+P)}case"RSA PUBLIC KEY":return R.RSAPublicKey.decode(j,"der");case"RSA PRIVATE KEY":return R.RSAPrivateKey.decode(j,"der");case"DSA PRIVATE KEY":return{type:"dsa",params:R.DSAPrivateKey.decode(j,"der")};case"EC PRIVATE KEY":return j=R.ECPrivateKey.decode(j,"der"),{curve:j.parameters.value,privateKey:j.privateKey};default:throw new Error("unknown key type "+z)}}E.signature=R.signature;function O(N,W){var I=N.algorithm.decrypt.kde.kdeparams.salt,z=parseInt(N.algorithm.decrypt.kde.kdeparams.iters.toString(),10),j=M[N.algorithm.decrypt.cipher.algo.join(".")],P=N.algorithm.decrypt.cipher.iv,F=N.subjectPrivateKey,v=parseInt(j.split("-")[1],10)/8,S=q.pbkdf2Sync(W,I,z,v,"sha1"),w=A.createDecipheriv(j,S,P),y=[];return y.push(w.update(F)),y.push(w.final()),Y.concat(y)}}),E6=OJ((l,g)=>{g.exports={"1.3.132.0.10":"secp256k1","1.3.132.0.33":"p224","1.2.840.10045.3.1.1":"p192","1.2.840.10045.3.1.7":"p256","1.3.132.0.34":"p384","1.3.132.0.35":"p521"}}),z$=OJ((l,g)=>{var R=XQ().Buffer,M=f0(),B=$0(),A=q0().ec,q=V0(),Y=SV(),E=E6();function O(S,w,y,m,i){var JJ=Y(w);if(JJ.curve){if(m!=="ecdsa"&&m!=="ecdsa/rsa")throw new Error("wrong private key type");return N(S,JJ)}else if(JJ.type==="dsa"){if(m!=="dsa")throw new Error("wrong private key type");return W(S,JJ,y)}else if(m!=="rsa"&&m!=="ecdsa/rsa")throw new Error("wrong private key type");S=R.concat([i,S]);for(var VJ=JJ.modulus.byteLength(),HJ=[0,1];S.length+HJ.length+1<VJ;)HJ.push(255);HJ.push(0);for(var o=-1;++o<S.length;)HJ.push(S[o]);var jJ=B(HJ,JJ);return jJ}function N(S,w){var y=E[w.curve.join(".")];if(!y)throw new Error("unknown curve "+w.curve.join("."));var m=new A(y),i=m.keyFromPrivate(w.privateKey),JJ=i.sign(S);return R.from(JJ.toDER())}function W(S,w,y){for(var m=w.params.priv_key,i=w.params.p,JJ=w.params.q,VJ=w.params.g,HJ=new q(0),o,jJ=j(S,JJ).mod(JJ),J=!1,V=z(m,JJ,S,y);J===!1;)o=F(JJ,V,y),HJ=v(VJ,o,i,JJ),J=o.invm(JJ).imul(jJ.add(m.mul(HJ))).mod(JJ),J.cmpn(0)===0&&(J=!1,HJ=new q(0));return I(HJ,J)}function I(S,w){S=S.toArray(),w=w.toArray(),S[0]&128&&(S=[0].concat(S)),w[0]&128&&(w=[0].concat(w));var y=S.length+w.length+4,m=[48,y,2,S.length];return m=m.concat(S,[2,w.length],w),R.from(m)}function z(S,w,y,m){if(S=R.from(S.toArray()),S.length<w.byteLength()){var i=R.alloc(w.byteLength()-S.length);S=R.concat([i,S])}var JJ=y.length,VJ=P(y,w),HJ=R.alloc(JJ);HJ.fill(1);var o=R.alloc(JJ);return o=M(m,o).update(HJ).update(R.from([0])).update(S).update(VJ).digest(),HJ=M(m,o).update(HJ).digest(),o=M(m,o).update(HJ).update(R.from([1])).update(S).update(VJ).digest(),HJ=M(m,o).update(HJ).digest(),{k:o,v:HJ}}function j(S,w){var y=new q(S),m=(S.length<<3)-w.bitLength();return m>0&&y.ishrn(m),y}function P(S,w){S=j(S,w),S=S.mod(w);var y=R.from(S.toArray());if(y.length<w.byteLength()){var m=R.alloc(w.byteLength()-y.length);y=R.concat([m,y])}return y}function F(S,w,y){var m,i;do{for(m=R.alloc(0);m.length*8<S.bitLength();)w.v=M(y,w.k).update(w.v).digest(),m=R.concat([m,w.v]);i=j(m,S),w.k=M(y,w.k).update(w.v).update(R.from([0])).digest(),w.v=M(y,w.k).update(w.v).digest()}while(i.cmp(S)!==-1);return i}function v(S,w,y,m){return S.toRed(q.mont(y)).redPow(w).fromRed().mod(m)}g.exports=O,g.exports.getKey=z,g.exports.makeKey=F}),P$=OJ((l,g)=>{var R=XQ().Buffer,M=V0(),B=q0().ec,A=SV(),q=E6();function Y(W,I,z,j,P){var F=A(z);if(F.type==="ec"){if(j!=="ecdsa"&&j!=="ecdsa/rsa")throw new Error("wrong public key type");return E(W,I,F)}else if(F.type==="dsa"){if(j!=="dsa")throw new Error("wrong public key type");return O(W,I,F)}else if(j!=="rsa"&&j!=="ecdsa/rsa")throw new Error("wrong public key type");I=R.concat([P,I]);for(var v=F.modulus.byteLength(),S=[1],w=0;I.length+S.length+2<v;)S.push(255),w++;S.push(0);for(var y=-1;++y<I.length;)S.push(I[y]);S=R.from(S);var m=M.mont(F.modulus);W=new M(W).toRed(m),W=W.redPow(new M(F.publicExponent)),W=R.from(W.fromRed().toArray());var i=w<8?1:0;for(v=Math.min(W.length,S.length),W.length!==S.length&&(i=1),y=-1;++y<v;)i|=W[y]^S[y];return i===0}function E(W,I,z){var j=q[z.data.algorithm.curve.join(".")];if(!j)throw new Error("unknown curve "+z.data.algorithm.curve.join("."));var P=new B(j),F=z.data.subjectPrivateKey.data;return P.verify(I,W,F)}function O(W,I,z){var j=z.data.p,P=z.data.q,F=z.data.g,v=z.data.pub_key,S=A.signature.decode(W,"der"),w=S.s,y=S.r;N(w,P),N(y,P);var m=M.mont(j),i=w.invm(P),JJ=F.toRed(m).redPow(new M(I).mul(i).mod(P)).fromRed().mul(v.toRed(m).redPow(y.mul(i).mod(P)).fromRed()).mod(j).mod(P);return JJ.cmp(y)===0}function N(W,I){if(W.cmpn(0)<=0)throw new Error("invalid sig");if(W.cmp(I)>=I)throw new Error("invalid sig")}g.exports=Y}),L$=OJ((l,g)=>{var R=XQ().Buffer,M=WV(),B=d8(),A=JQ(),q=z$(),Y=P$(),E=h0();Object.keys(E).forEach(function(z){E[z].id=R.from(E[z].id,"hex"),E[z.toLowerCase()]=E[z]});function O(z){B.Writable.call(this);var j=E[z];if(!j)throw new Error("Unknown message digest");this._hashType=j.hash,this._hash=M(j.hash),this._tag=j.id,this._signType=j.sign}A(O,B.Writable),O.prototype._write=function(z,j,P){this._hash.update(z),P()},O.prototype.update=function(z,j){return typeof z=="string"&&(z=R.from(z,j)),this._hash.update(z),this},O.prototype.sign=function(z,j){this.end();var P=this._hash.digest(),F=q(P,z,this._hashType,this._signType,this._tag);return j?F.toString(j):F};function N(z){B.Writable.call(this);var j=E[z];if(!j)throw new Error("Unknown message digest");this._hash=M(j.hash),this._tag=j.id,this._signType=j.sign}A(N,B.Writable),N.prototype._write=function(z,j,P){this._hash.update(z),P()},N.prototype.update=function(z,j){return typeof z=="string"&&(z=R.from(z,j)),this._hash.update(z),this},N.prototype.verify=function(z,j,P){typeof j=="string"&&(j=R.from(j,P)),this.end();var F=this._hash.digest();return Y(j,F,z,this._signType,this._tag)};function W(z){return new O(z)}function I(z){return new N(z)}g.exports={Sign:W,Verify:I,createSign:W,createVerify:I}}),F$=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),D$=OJ((l,g)=>{var R=q0(),M=F$();g.exports=function(Y){return new A(Y)};var B={secp256k1:{name:"secp256k1",byteLength:32},secp224r1:{name:"p224",byteLength:28},prime256v1:{name:"p256",byteLength:32},prime192v1:{name:"p192",byteLength:24},ed25519:{name:"ed25519",byteLength:32},secp384r1:{name:"p384",byteLength:48},secp521r1:{name:"p521",byteLength:66}};B.p224=B.secp224r1,B.p256=B.secp256r1=B.prime256v1,B.p192=B.secp192r1=B.prime192v1,B.p384=B.secp384r1,B.p521=B.secp521r1;function A(Y){this.curveType=B[Y],this.curveType||(this.curveType={name:Y}),this.curve=new R.ec(this.curveType.name),this.keys=void 0}A.prototype.generateKeys=function(Y,E){return this.keys=this.curve.genKeyPair(),this.getPublicKey(Y,E)},A.prototype.computeSecret=function(Y,E,O){E=E||"utf8",Buffer.isBuffer(Y)||(Y=new Buffer(Y,E));var N=this.curve.keyFromPublic(Y).getPublic(),W=N.mul(this.keys.getPrivate()).getX();return q(W,O,this.curveType.byteLength)},A.prototype.getPublicKey=function(Y,E){var O=this.keys.getPublic(E==="compressed",!0);return E==="hybrid"&&(O[O.length-1]%2?O[0]=7:O[0]=6),q(O,Y)},A.prototype.getPrivateKey=function(Y){return q(this.keys.getPrivate(),Y)},A.prototype.setPublicKey=function(Y,E){return E=E||"utf8",Buffer.isBuffer(Y)||(Y=new Buffer(Y,E)),this.keys._importPublic(Y),this},A.prototype.setPrivateKey=function(Y,E){E=E||"utf8",Buffer.isBuffer(Y)||(Y=new Buffer(Y,E));var O=new M(Y);return O=O.toString(16),this.keys=this.curve.genKeyPair(),this.keys._importPrivate(O),this};function q(Y,E,O){Array.isArray(Y)||(Y=Y.toArray());var N=new Buffer(Y);if(O&&N.length<O){var W=new Buffer(O-N.length);W.fill(0),N=Buffer.concat([W,N])}return E?N.toString(E):N}}),R6=OJ((l,g)=>{var R=WV(),M=XQ().Buffer;g.exports=function(A,q){for(var Y=M.alloc(0),E=0,O;Y.length<q;)O=B(E++),Y=M.concat([Y,R("sha1").update(A).update(O).digest()]);return Y.slice(0,q)};function B(A){var q=M.allocUnsafe(4);return q.writeUInt32BE(A,0),q}}),z6=OJ((l,g)=>{g.exports=function(R,M){for(var B=R.length,A=-1;++A<B;)R[A]^=M[A];return R}}),W0=OJ((l,g)=>{(function(R,M){function B(J,V){if(!J)throw new Error(V||"Assertion failed")}function A(J,V){J.super_=V;var Z=function(){};Z.prototype=V.prototype,J.prototype=new Z,J.prototype.constructor=J}function q(J,V,Z){if(q.isBN(J))return J;this.negative=0,this.words=null,this.length=0,this.red=null,J!==null&&((V==="le"||V==="be")&&(Z=V,V=10),this._init(J||0,V||10,Z||"be"))}typeof R=="object"?R.exports=q:M.BN=q,q.BN=q,q.wordSize=26;var Y;try{typeof window<"u"&&typeof window.Buffer<"u"?Y=window.Buffer:Y=JV().Buffer}catch{}q.isBN=function(J){return J instanceof q?!0:J!==null&&typeof J=="object"&&J.constructor.wordSize===q.wordSize&&Array.isArray(J.words)},q.max=function(J,V){return J.cmp(V)>0?J:V},q.min=function(J,V){return J.cmp(V)<0?J:V},q.prototype._init=function(J,V,Z){if(typeof J=="number")return this._initNumber(J,V,Z);if(typeof J=="object")return this._initArray(J,V,Z);V==="hex"&&(V=16),B(V===(V|0)&&V>=2&&V<=36),J=J.toString().replace(/\s+/g,"");var $=0;J[0]==="-"&&($++,this.negative=1),$<J.length&&(V===16?this._parseHex(J,$,Z):(this._parseBase(J,V,$),Z==="le"&&this._initArray(this.toArray(),V,Z)))},q.prototype._initNumber=function(J,V,Z){J<0&&(this.negative=1,J=-J),J<67108864?(this.words=[J&67108863],this.length=1):J<4503599627370496?(this.words=[J&67108863,J/67108864&67108863],this.length=2):(B(J<9007199254740992),this.words=[J&67108863,J/67108864&67108863,1],this.length=3),Z==="le"&&this._initArray(this.toArray(),V,Z)},q.prototype._initArray=function(J,V,Z){if(B(typeof J.length=="number"),J.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(J.length/3),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X,U,H=0;if(Z==="be")for($=J.length-1,X=0;$>=0;$-=3)U=J[$]|J[$-1]<<8|J[$-2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);else if(Z==="le")for($=0,X=0;$<J.length;$+=3)U=J[$]|J[$+1]<<8|J[$+2]<<16,this.words[X]|=U<<H&67108863,this.words[X+1]=U>>>26-H&67108863,H+=24,H>=26&&(H-=26,X++);return this.strip()};function E(J,V){var Z=J.charCodeAt(V);return Z>=65&&Z<=70?Z-55:Z>=97&&Z<=102?Z-87:Z-48&15}function O(J,V,Z){var $=E(J,Z);return Z-1>=V&&($|=E(J,Z-1)<<4),$}q.prototype._parseHex=function(J,V,Z){this.length=Math.ceil((J.length-V)/6),this.words=new Array(this.length);for(var $=0;$<this.length;$++)this.words[$]=0;var X=0,U=0,H;if(Z==="be")for($=J.length-1;$>=V;$-=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8;else{var G=J.length-V;for($=G%2===0?V+1:V;$<J.length;$+=2)H=O(J,V,$)<<X,this.words[U]|=H&67108863,X>=18?(X-=18,U+=1,this.words[U]|=H>>>26):X+=8}this.strip()};function N(J,V,Z,$){for(var X=0,U=Math.min(J.length,Z),H=V;H<U;H++){var G=J.charCodeAt(H)-48;X*=$,G>=49?X+=G-49+10:G>=17?X+=G-17+10:X+=G}return X}q.prototype._parseBase=function(J,V,Z){this.words=[0],this.length=1;for(var $=0,X=1;X<=67108863;X*=V)$++;$--,X=X/V|0;for(var U=J.length-Z,H=U%$,G=Math.min(U,U-H)+Z,Q=0,K=Z;K<G;K+=$)Q=N(J,K,K+$,V),this.imuln(X),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q);if(H!==0){var k=1;for(Q=N(J,K,J.length,V),K=0;K<H;K++)k*=V;this.imuln(k),this.words[0]+Q<67108864?this.words[0]+=Q:this._iaddn(Q)}this.strip()},q.prototype.copy=function(J){J.words=new Array(this.length);for(var V=0;V<this.length;V++)J.words[V]=this.words[V];J.length=this.length,J.negative=this.negative,J.red=this.red},q.prototype.clone=function(){var J=new q(null);return this.copy(J),J},q.prototype._expand=function(J){for(;this.length<J;)this.words[this.length++]=0;return this},q.prototype.strip=function(){for(;this.length>1&&this.words[this.length-1]===0;)this.length--;return this._normSign()},q.prototype._normSign=function(){return this.length===1&&this.words[0]===0&&(this.negative=0),this},q.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var W=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],I=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],z=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64000000,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,24300000,28629151,33554432,39135393,45435424,52521875,60466176];q.prototype.toString=function(J,V){J=J||10,V=V|0||1;var Z;if(J===16||J==="hex"){Z="";for(var $=0,X=0,U=0;U<this.length;U++){var H=this.words[U],G=((H<<$|X)&16777215).toString(16);X=H>>>24-$&16777215,X!==0||U!==this.length-1?Z=W[6-G.length]+G+Z:Z=G+Z,$+=2,$>=26&&($-=26,U--)}for(X!==0&&(Z=X.toString(16)+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}if(J===(J|0)&&J>=2&&J<=36){var Q=I[J],K=z[J];Z="";var k=this.clone();for(k.negative=0;!k.isZero();){var L=k.modn(K).toString(J);k=k.idivn(K),k.isZero()?Z=L+Z:Z=W[Q-L.length]+L+Z}for(this.isZero()&&(Z="0"+Z);Z.length%V!==0;)Z="0"+Z;return this.negative!==0&&(Z="-"+Z),Z}B(!1,"Base should be between 2 and 36")},q.prototype.toNumber=function(){var J=this.words[0];return this.length===2?J+=this.words[1]*67108864:this.length===3&&this.words[2]===1?J+=4503599627370496+this.words[1]*67108864:this.length>2&&B(!1,"Number can only safely store up to 53 bits"),this.negative!==0?-J:J},q.prototype.toJSON=function(){return this.toString(16)},q.prototype.toBuffer=function(J,V){return B(typeof Y<"u"),this.toArrayLike(Y,J,V)},q.prototype.toArray=function(J,V){return this.toArrayLike(Array,J,V)},q.prototype.toArrayLike=function(J,V,Z){var $=this.byteLength(),X=Z||Math.max(1,$);B($<=X,"byte array longer than desired length"),B(X>0,"Requested array length <= 0"),this.strip();var U=V==="le",H=new J(X),G,Q,K=this.clone();if(U){for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[Q]=G;for(;Q<X;Q++)H[Q]=0}else{for(Q=0;Q<X-$;Q++)H[Q]=0;for(Q=0;!K.isZero();Q++)G=K.andln(255),K.iushrn(8),H[X-Q-1]=G}return H},Math.clz32?q.prototype._countBits=function(J){return 32-Math.clz32(J)}:q.prototype._countBits=function(J){var V=J,Z=0;return V>=4096&&(Z+=13,V>>>=13),V>=64&&(Z+=7,V>>>=7),V>=8&&(Z+=4,V>>>=4),V>=2&&(Z+=2,V>>>=2),Z+V},q.prototype._zeroBits=function(J){if(J===0)return 26;var V=J,Z=0;return(V&8191)===0&&(Z+=13,V>>>=13),(V&127)===0&&(Z+=7,V>>>=7),(V&15)===0&&(Z+=4,V>>>=4),(V&3)===0&&(Z+=2,V>>>=2),(V&1)===0&&Z++,Z},q.prototype.bitLength=function(){var J=this.words[this.length-1],V=this._countBits(J);return(this.length-1)*26+V};function j(J){for(var V=new Array(J.bitLength()),Z=0;Z<V.length;Z++){var $=Z/26|0,X=Z%26;V[Z]=(J.words[$]&1<<X)>>>X}return V}q.prototype.zeroBits=function(){if(this.isZero())return 0;for(var J=0,V=0;V<this.length;V++){var Z=this._zeroBits(this.words[V]);if(J+=Z,Z!==26)break}return J},q.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},q.prototype.toTwos=function(J){return this.negative!==0?this.abs().inotn(J).iaddn(1):this.clone()},q.prototype.fromTwos=function(J){return this.testn(J-1)?this.notn(J).iaddn(1).ineg():this.clone()},q.prototype.isNeg=function(){return this.negative!==0},q.prototype.neg=function(){return this.clone().ineg()},q.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},q.prototype.iuor=function(J){for(;this.length<J.length;)this.words[this.length++]=0;for(var V=0;V<J.length;V++)this.words[V]=this.words[V]|J.words[V];return this.strip()},q.prototype.ior=function(J){return B((this.negative|J.negative)===0),this.iuor(J)},q.prototype.or=function(J){return this.length>J.length?this.clone().ior(J):J.clone().ior(this)},q.prototype.uor=function(J){return this.length>J.length?this.clone().iuor(J):J.clone().iuor(this)},q.prototype.iuand=function(J){var V;this.length>J.length?V=J:V=this;for(var Z=0;Z<V.length;Z++)this.words[Z]=this.words[Z]&J.words[Z];return this.length=V.length,this.strip()},q.prototype.iand=function(J){return B((this.negative|J.negative)===0),this.iuand(J)},q.prototype.and=function(J){return this.length>J.length?this.clone().iand(J):J.clone().iand(this)},q.prototype.uand=function(J){return this.length>J.length?this.clone().iuand(J):J.clone().iuand(this)},q.prototype.iuxor=function(J){var V,Z;this.length>J.length?(V=this,Z=J):(V=J,Z=this);for(var $=0;$<Z.length;$++)this.words[$]=V.words[$]^Z.words[$];if(this!==V)for(;$<V.length;$++)this.words[$]=V.words[$];return this.length=V.length,this.strip()},q.prototype.ixor=function(J){return B((this.negative|J.negative)===0),this.iuxor(J)},q.prototype.xor=function(J){return this.length>J.length?this.clone().ixor(J):J.clone().ixor(this)},q.prototype.uxor=function(J){return this.length>J.length?this.clone().iuxor(J):J.clone().iuxor(this)},q.prototype.inotn=function(J){B(typeof J=="number"&&J>=0);var V=Math.ceil(J/26)|0,Z=J%26;this._expand(V),Z>0&&V--;for(var $=0;$<V;$++)this.words[$]=~this.words[$]&67108863;return Z>0&&(this.words[$]=~this.words[$]&67108863>>26-Z),this.strip()},q.prototype.notn=function(J){return this.clone().inotn(J)},q.prototype.setn=function(J,V){B(typeof J=="number"&&J>=0);var Z=J/26|0,$=J%26;return this._expand(Z+1),V?this.words[Z]=this.words[Z]|1<<$:this.words[Z]=this.words[Z]&~(1<<$),this.strip()},q.prototype.iadd=function(J){var V;if(this.negative!==0&&J.negative===0)return this.negative=0,V=this.isub(J),this.negative^=1,this._normSign();if(this.negative===0&&J.negative!==0)return J.negative=0,V=this.isub(J),J.negative=1,V._normSign();var Z,$;this.length>J.length?(Z=this,$=J):(Z=J,$=this);for(var X=0,U=0;U<$.length;U++)V=(Z.words[U]|0)+($.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;for(;X!==0&&U<Z.length;U++)V=(Z.words[U]|0)+X,this.words[U]=V&67108863,X=V>>>26;if(this.length=Z.length,X!==0)this.words[this.length]=X,this.length++;else if(Z!==this)for(;U<Z.length;U++)this.words[U]=Z.words[U];return this},q.prototype.add=function(J){var V;return J.negative!==0&&this.negative===0?(J.negative=0,V=this.sub(J),J.negative^=1,V):J.negative===0&&this.negative!==0?(this.negative=0,V=J.sub(this),this.negative=1,V):this.length>J.length?this.clone().iadd(J):J.clone().iadd(this)},q.prototype.isub=function(J){if(J.negative!==0){J.negative=0;var V=this.iadd(J);return J.negative=1,V._normSign()}else if(this.negative!==0)return this.negative=0,this.iadd(J),this.negative=1,this._normSign();var Z=this.cmp(J);if(Z===0)return this.negative=0,this.length=1,this.words[0]=0,this;var $,X;Z>0?($=this,X=J):($=J,X=this);for(var U=0,H=0;H<X.length;H++)V=($.words[H]|0)-(X.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;for(;U!==0&&H<$.length;H++)V=($.words[H]|0)+U,U=V>>26,this.words[H]=V&67108863;if(U===0&&H<$.length&&$!==this)for(;H<$.length;H++)this.words[H]=$.words[H];return this.length=Math.max(this.length,H),$!==this&&(this.negative=1),this.strip()},q.prototype.sub=function(J){return this.clone().isub(J)};function P(J,V,Z){Z.negative=V.negative^J.negative;var $=J.length+V.length|0;Z.length=$,$=$-1|0;var X=J.words[0]|0,U=V.words[0]|0,H=X*U,G=H&67108863,Q=H/67108864|0;Z.words[0]=G;for(var K=1;K<$;K++){for(var k=Q>>>26,L=Q&67108863,_=Math.min(K,V.length-1),t=Math.max(0,K-J.length+1);t<=_;t++){var QJ=K-t|0;X=J.words[QJ]|0,U=V.words[t]|0,H=X*U+L,k+=H/67108864|0,L=H&67108863}Z.words[K]=L|0,Q=k|0}return Q!==0?Z.words[K]=Q|0:Z.length--,Z.strip()}var F=function(J,V,Z){var $=J.words,X=V.words,U=Z.words,H=0,G,Q,K,k=$[0]|0,L=k&8191,_=k>>>13,t=$[1]|0,QJ=t&8191,GJ=t>>>13,n=$[2]|0,p=n&8191,e=n>>>13,PJ=$[3]|0,XJ=PJ&8191,WJ=PJ>>>13,b=$[4]|0,C=b&8191,h=b>>>13,$J=$[5]|0,qJ=$J&8191,ZJ=$J>>>13,mJ=$[6]|0,BJ=mJ&8191,TJ=mJ>>>13,dJ=$[7]|0,LJ=dJ&8191,IJ=dJ>>>13,$Q=$[8]|0,T=$Q&8191,D=$Q>>>13,u=$[9]|0,d=u&8191,a=u>>>13,CJ=X[0]|0,UJ=CJ&8191,EJ=CJ>>>13,QQ=X[1]|0,FJ=QQ&8191,RJ=QQ>>>13,aJ=X[2]|0,SJ=aJ&8191,xJ=aJ>>>13,nJ=X[3]|0,AJ=nJ&8191,kJ=nJ>>>13,ZQ=X[4]|0,vJ=ZQ&8191,MJ=ZQ>>>13,xQ=X[5]|0,wJ=xQ&8191,bJ=xQ>>>13,WQ=X[6]|0,_J=WQ&8191,NJ=WQ>>>13,vQ=X[7]|0,yJ=vQ&8191,gJ=vQ>>>13,MQ=X[8]|0,cJ=MQ&8191,fJ=MQ>>>13,wQ=X[9]|0,f=wQ&8191,zJ=wQ>>>13;Z.negative=J.negative^V.negative,Z.length=19,G=Math.imul(L,UJ),Q=Math.imul(L,EJ),Q=Q+Math.imul(_,UJ)|0,K=Math.imul(_,EJ);var CQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(CQ>>>26)|0,CQ&=67108863,G=Math.imul(QJ,UJ),Q=Math.imul(QJ,EJ),Q=Q+Math.imul(GJ,UJ)|0,K=Math.imul(GJ,EJ),G=G+Math.imul(L,FJ)|0,Q=Q+Math.imul(L,RJ)|0,Q=Q+Math.imul(_,FJ)|0,K=K+Math.imul(_,RJ)|0;var oJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(oJ>>>26)|0,oJ&=67108863,G=Math.imul(p,UJ),Q=Math.imul(p,EJ),Q=Q+Math.imul(e,UJ)|0,K=Math.imul(e,EJ),G=G+Math.imul(QJ,FJ)|0,Q=Q+Math.imul(QJ,RJ)|0,Q=Q+Math.imul(GJ,FJ)|0,K=K+Math.imul(GJ,RJ)|0,G=G+Math.imul(L,SJ)|0,Q=Q+Math.imul(L,xJ)|0,Q=Q+Math.imul(_,SJ)|0,K=K+Math.imul(_,xJ)|0;var tJ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(tJ>>>26)|0,tJ&=67108863,G=Math.imul(XJ,UJ),Q=Math.imul(XJ,EJ),Q=Q+Math.imul(WJ,UJ)|0,K=Math.imul(WJ,EJ),G=G+Math.imul(p,FJ)|0,Q=Q+Math.imul(p,RJ)|0,Q=Q+Math.imul(e,FJ)|0,K=K+Math.imul(e,RJ)|0,G=G+Math.imul(QJ,SJ)|0,Q=Q+Math.imul(QJ,xJ)|0,Q=Q+Math.imul(GJ,SJ)|0,K=K+Math.imul(GJ,xJ)|0,G=G+Math.imul(L,AJ)|0,Q=Q+Math.imul(L,kJ)|0,Q=Q+Math.imul(_,AJ)|0,K=K+Math.imul(_,kJ)|0;var YQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(YQ>>>26)|0,YQ&=67108863,G=Math.imul(C,UJ),Q=Math.imul(C,EJ),Q=Q+Math.imul(h,UJ)|0,K=Math.imul(h,EJ),G=G+Math.imul(XJ,FJ)|0,Q=Q+Math.imul(XJ,RJ)|0,Q=Q+Math.imul(WJ,FJ)|0,K=K+Math.imul(WJ,RJ)|0,G=G+Math.imul(p,SJ)|0,Q=Q+Math.imul(p,xJ)|0,Q=Q+Math.imul(e,SJ)|0,K=K+Math.imul(e,xJ)|0,G=G+Math.imul(QJ,AJ)|0,Q=Q+Math.imul(QJ,kJ)|0,Q=Q+Math.imul(GJ,AJ)|0,K=K+Math.imul(GJ,kJ)|0,G=G+Math.imul(L,vJ)|0,Q=Q+Math.imul(L,MJ)|0,Q=Q+Math.imul(_,vJ)|0,K=K+Math.imul(_,MJ)|0;var BQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(BQ>>>26)|0,BQ&=67108863,G=Math.imul(qJ,UJ),Q=Math.imul(qJ,EJ),Q=Q+Math.imul(ZJ,UJ)|0,K=Math.imul(ZJ,EJ),G=G+Math.imul(C,FJ)|0,Q=Q+Math.imul(C,RJ)|0,Q=Q+Math.imul(h,FJ)|0,K=K+Math.imul(h,RJ)|0,G=G+Math.imul(XJ,SJ)|0,Q=Q+Math.imul(XJ,xJ)|0,Q=Q+Math.imul(WJ,SJ)|0,K=K+Math.imul(WJ,xJ)|0,G=G+Math.imul(p,AJ)|0,Q=Q+Math.imul(p,kJ)|0,Q=Q+Math.imul(e,AJ)|0,K=K+Math.imul(e,kJ)|0,G=G+Math.imul(QJ,vJ)|0,Q=Q+Math.imul(QJ,MJ)|0,Q=Q+Math.imul(GJ,vJ)|0,K=K+Math.imul(GJ,MJ)|0,G=G+Math.imul(L,wJ)|0,Q=Q+Math.imul(L,bJ)|0,Q=Q+Math.imul(_,wJ)|0,K=K+Math.imul(_,bJ)|0;var OQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(OQ>>>26)|0,OQ&=67108863,G=Math.imul(BJ,UJ),Q=Math.imul(BJ,EJ),Q=Q+Math.imul(TJ,UJ)|0,K=Math.imul(TJ,EJ),G=G+Math.imul(qJ,FJ)|0,Q=Q+Math.imul(qJ,RJ)|0,Q=Q+Math.imul(ZJ,FJ)|0,K=K+Math.imul(ZJ,RJ)|0,G=G+Math.imul(C,SJ)|0,Q=Q+Math.imul(C,xJ)|0,Q=Q+Math.imul(h,SJ)|0,K=K+Math.imul(h,xJ)|0,G=G+Math.imul(XJ,AJ)|0,Q=Q+Math.imul(XJ,kJ)|0,Q=Q+Math.imul(WJ,AJ)|0,K=K+Math.imul(WJ,kJ)|0,G=G+Math.imul(p,vJ)|0,Q=Q+Math.imul(p,MJ)|0,Q=Q+Math.imul(e,vJ)|0,K=K+Math.imul(e,MJ)|0,G=G+Math.imul(QJ,wJ)|0,Q=Q+Math.imul(QJ,bJ)|0,Q=Q+Math.imul(GJ,wJ)|0,K=K+Math.imul(GJ,bJ)|0,G=G+Math.imul(L,_J)|0,Q=Q+Math.imul(L,NJ)|0,Q=Q+Math.imul(_,_J)|0,K=K+Math.imul(_,NJ)|0;var jQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(jQ>>>26)|0,jQ&=67108863,G=Math.imul(LJ,UJ),Q=Math.imul(LJ,EJ),Q=Q+Math.imul(IJ,UJ)|0,K=Math.imul(IJ,EJ),G=G+Math.imul(BJ,FJ)|0,Q=Q+Math.imul(BJ,RJ)|0,Q=Q+Math.imul(TJ,FJ)|0,K=K+Math.imul(TJ,RJ)|0,G=G+Math.imul(qJ,SJ)|0,Q=Q+Math.imul(qJ,xJ)|0,Q=Q+Math.imul(ZJ,SJ)|0,K=K+Math.imul(ZJ,xJ)|0,G=G+Math.imul(C,AJ)|0,Q=Q+Math.imul(C,kJ)|0,Q=Q+Math.imul(h,AJ)|0,K=K+Math.imul(h,kJ)|0,G=G+Math.imul(XJ,vJ)|0,Q=Q+Math.imul(XJ,MJ)|0,Q=Q+Math.imul(WJ,vJ)|0,K=K+Math.imul(WJ,MJ)|0,G=G+Math.imul(p,wJ)|0,Q=Q+Math.imul(p,bJ)|0,Q=Q+Math.imul(e,wJ)|0,K=K+Math.imul(e,bJ)|0,G=G+Math.imul(QJ,_J)|0,Q=Q+Math.imul(QJ,NJ)|0,Q=Q+Math.imul(GJ,_J)|0,K=K+Math.imul(GJ,NJ)|0,G=G+Math.imul(L,yJ)|0,Q=Q+Math.imul(L,gJ)|0,Q=Q+Math.imul(_,yJ)|0,K=K+Math.imul(_,gJ)|0;var TQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(TQ>>>26)|0,TQ&=67108863,G=Math.imul(T,UJ),Q=Math.imul(T,EJ),Q=Q+Math.imul(D,UJ)|0,K=Math.imul(D,EJ),G=G+Math.imul(LJ,FJ)|0,Q=Q+Math.imul(LJ,RJ)|0,Q=Q+Math.imul(IJ,FJ)|0,K=K+Math.imul(IJ,RJ)|0,G=G+Math.imul(BJ,SJ)|0,Q=Q+Math.imul(BJ,xJ)|0,Q=Q+Math.imul(TJ,SJ)|0,K=K+Math.imul(TJ,xJ)|0,G=G+Math.imul(qJ,AJ)|0,Q=Q+Math.imul(qJ,kJ)|0,Q=Q+Math.imul(ZJ,AJ)|0,K=K+Math.imul(ZJ,kJ)|0,G=G+Math.imul(C,vJ)|0,Q=Q+Math.imul(C,MJ)|0,Q=Q+Math.imul(h,vJ)|0,K=K+Math.imul(h,MJ)|0,G=G+Math.imul(XJ,wJ)|0,Q=Q+Math.imul(XJ,bJ)|0,Q=Q+Math.imul(WJ,wJ)|0,K=K+Math.imul(WJ,bJ)|0,G=G+Math.imul(p,_J)|0,Q=Q+Math.imul(p,NJ)|0,Q=Q+Math.imul(e,_J)|0,K=K+Math.imul(e,NJ)|0,G=G+Math.imul(QJ,yJ)|0,Q=Q+Math.imul(QJ,gJ)|0,Q=Q+Math.imul(GJ,yJ)|0,K=K+Math.imul(GJ,gJ)|0,G=G+Math.imul(L,cJ)|0,Q=Q+Math.imul(L,fJ)|0,Q=Q+Math.imul(_,cJ)|0,K=K+Math.imul(_,fJ)|0;var NQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(NQ>>>26)|0,NQ&=67108863,G=Math.imul(d,UJ),Q=Math.imul(d,EJ),Q=Q+Math.imul(a,UJ)|0,K=Math.imul(a,EJ),G=G+Math.imul(T,FJ)|0,Q=Q+Math.imul(T,RJ)|0,Q=Q+Math.imul(D,FJ)|0,K=K+Math.imul(D,RJ)|0,G=G+Math.imul(LJ,SJ)|0,Q=Q+Math.imul(LJ,xJ)|0,Q=Q+Math.imul(IJ,SJ)|0,K=K+Math.imul(IJ,xJ)|0,G=G+Math.imul(BJ,AJ)|0,Q=Q+Math.imul(BJ,kJ)|0,Q=Q+Math.imul(TJ,AJ)|0,K=K+Math.imul(TJ,kJ)|0,G=G+Math.imul(qJ,vJ)|0,Q=Q+Math.imul(qJ,MJ)|0,Q=Q+Math.imul(ZJ,vJ)|0,K=K+Math.imul(ZJ,MJ)|0,G=G+Math.imul(C,wJ)|0,Q=Q+Math.imul(C,bJ)|0,Q=Q+Math.imul(h,wJ)|0,K=K+Math.imul(h,bJ)|0,G=G+Math.imul(XJ,_J)|0,Q=Q+Math.imul(XJ,NJ)|0,Q=Q+Math.imul(WJ,_J)|0,K=K+Math.imul(WJ,NJ)|0,G=G+Math.imul(p,yJ)|0,Q=Q+Math.imul(p,gJ)|0,Q=Q+Math.imul(e,yJ)|0,K=K+Math.imul(e,gJ)|0,G=G+Math.imul(QJ,cJ)|0,Q=Q+Math.imul(QJ,fJ)|0,Q=Q+Math.imul(GJ,cJ)|0,K=K+Math.imul(GJ,fJ)|0,G=G+Math.imul(L,f)|0,Q=Q+Math.imul(L,zJ)|0,Q=Q+Math.imul(_,f)|0,K=K+Math.imul(_,zJ)|0;var IQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(IQ>>>26)|0,IQ&=67108863,G=Math.imul(d,FJ),Q=Math.imul(d,RJ),Q=Q+Math.imul(a,FJ)|0,K=Math.imul(a,RJ),G=G+Math.imul(T,SJ)|0,Q=Q+Math.imul(T,xJ)|0,Q=Q+Math.imul(D,SJ)|0,K=K+Math.imul(D,xJ)|0,G=G+Math.imul(LJ,AJ)|0,Q=Q+Math.imul(LJ,kJ)|0,Q=Q+Math.imul(IJ,AJ)|0,K=K+Math.imul(IJ,kJ)|0,G=G+Math.imul(BJ,vJ)|0,Q=Q+Math.imul(BJ,MJ)|0,Q=Q+Math.imul(TJ,vJ)|0,K=K+Math.imul(TJ,MJ)|0,G=G+Math.imul(qJ,wJ)|0,Q=Q+Math.imul(qJ,bJ)|0,Q=Q+Math.imul(ZJ,wJ)|0,K=K+Math.imul(ZJ,bJ)|0,G=G+Math.imul(C,_J)|0,Q=Q+Math.imul(C,NJ)|0,Q=Q+Math.imul(h,_J)|0,K=K+Math.imul(h,NJ)|0,G=G+Math.imul(XJ,yJ)|0,Q=Q+Math.imul(XJ,gJ)|0,Q=Q+Math.imul(WJ,yJ)|0,K=K+Math.imul(WJ,gJ)|0,G=G+Math.imul(p,cJ)|0,Q=Q+Math.imul(p,fJ)|0,Q=Q+Math.imul(e,cJ)|0,K=K+Math.imul(e,fJ)|0,G=G+Math.imul(QJ,f)|0,Q=Q+Math.imul(QJ,zJ)|0,Q=Q+Math.imul(GJ,f)|0,K=K+Math.imul(GJ,zJ)|0;var EQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(EQ>>>26)|0,EQ&=67108863,G=Math.imul(d,SJ),Q=Math.imul(d,xJ),Q=Q+Math.imul(a,SJ)|0,K=Math.imul(a,xJ),G=G+Math.imul(T,AJ)|0,Q=Q+Math.imul(T,kJ)|0,Q=Q+Math.imul(D,AJ)|0,K=K+Math.imul(D,kJ)|0,G=G+Math.imul(LJ,vJ)|0,Q=Q+Math.imul(LJ,MJ)|0,Q=Q+Math.imul(IJ,vJ)|0,K=K+Math.imul(IJ,MJ)|0,G=G+Math.imul(BJ,wJ)|0,Q=Q+Math.imul(BJ,bJ)|0,Q=Q+Math.imul(TJ,wJ)|0,K=K+Math.imul(TJ,bJ)|0,G=G+Math.imul(qJ,_J)|0,Q=Q+Math.imul(qJ,NJ)|0,Q=Q+Math.imul(ZJ,_J)|0,K=K+Math.imul(ZJ,NJ)|0,G=G+Math.imul(C,yJ)|0,Q=Q+Math.imul(C,gJ)|0,Q=Q+Math.imul(h,yJ)|0,K=K+Math.imul(h,gJ)|0,G=G+Math.imul(XJ,cJ)|0,Q=Q+Math.imul(XJ,fJ)|0,Q=Q+Math.imul(WJ,cJ)|0,K=K+Math.imul(WJ,fJ)|0,G=G+Math.imul(p,f)|0,Q=Q+Math.imul(p,zJ)|0,Q=Q+Math.imul(e,f)|0,K=K+Math.imul(e,zJ)|0;var RQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(RQ>>>26)|0,RQ&=67108863,G=Math.imul(d,AJ),Q=Math.imul(d,kJ),Q=Q+Math.imul(a,AJ)|0,K=Math.imul(a,kJ),G=G+Math.imul(T,vJ)|0,Q=Q+Math.imul(T,MJ)|0,Q=Q+Math.imul(D,vJ)|0,K=K+Math.imul(D,MJ)|0,G=G+Math.imul(LJ,wJ)|0,Q=Q+Math.imul(LJ,bJ)|0,Q=Q+Math.imul(IJ,wJ)|0,K=K+Math.imul(IJ,bJ)|0,G=G+Math.imul(BJ,_J)|0,Q=Q+Math.imul(BJ,NJ)|0,Q=Q+Math.imul(TJ,_J)|0,K=K+Math.imul(TJ,NJ)|0,G=G+Math.imul(qJ,yJ)|0,Q=Q+Math.imul(qJ,gJ)|0,Q=Q+Math.imul(ZJ,yJ)|0,K=K+Math.imul(ZJ,gJ)|0,G=G+Math.imul(C,cJ)|0,Q=Q+Math.imul(C,fJ)|0,Q=Q+Math.imul(h,cJ)|0,K=K+Math.imul(h,fJ)|0,G=G+Math.imul(XJ,f)|0,Q=Q+Math.imul(XJ,zJ)|0,Q=Q+Math.imul(WJ,f)|0,K=K+Math.imul(WJ,zJ)|0;var zQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(zQ>>>26)|0,zQ&=67108863,G=Math.imul(d,vJ),Q=Math.imul(d,MJ),Q=Q+Math.imul(a,vJ)|0,K=Math.imul(a,MJ),G=G+Math.imul(T,wJ)|0,Q=Q+Math.imul(T,bJ)|0,Q=Q+Math.imul(D,wJ)|0,K=K+Math.imul(D,bJ)|0,G=G+Math.imul(LJ,_J)|0,Q=Q+Math.imul(LJ,NJ)|0,Q=Q+Math.imul(IJ,_J)|0,K=K+Math.imul(IJ,NJ)|0,G=G+Math.imul(BJ,yJ)|0,Q=Q+Math.imul(BJ,gJ)|0,Q=Q+Math.imul(TJ,yJ)|0,K=K+Math.imul(TJ,gJ)|0,G=G+Math.imul(qJ,cJ)|0,Q=Q+Math.imul(qJ,fJ)|0,Q=Q+Math.imul(ZJ,cJ)|0,K=K+Math.imul(ZJ,fJ)|0,G=G+Math.imul(C,f)|0,Q=Q+Math.imul(C,zJ)|0,Q=Q+Math.imul(h,f)|0,K=K+Math.imul(h,zJ)|0;var PQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(PQ>>>26)|0,PQ&=67108863,G=Math.imul(d,wJ),Q=Math.imul(d,bJ),Q=Q+Math.imul(a,wJ)|0,K=Math.imul(a,bJ),G=G+Math.imul(T,_J)|0,Q=Q+Math.imul(T,NJ)|0,Q=Q+Math.imul(D,_J)|0,K=K+Math.imul(D,NJ)|0,G=G+Math.imul(LJ,yJ)|0,Q=Q+Math.imul(LJ,gJ)|0,Q=Q+Math.imul(IJ,yJ)|0,K=K+Math.imul(IJ,gJ)|0,G=G+Math.imul(BJ,cJ)|0,Q=Q+Math.imul(BJ,fJ)|0,Q=Q+Math.imul(TJ,cJ)|0,K=K+Math.imul(TJ,fJ)|0,G=G+Math.imul(qJ,f)|0,Q=Q+Math.imul(qJ,zJ)|0,Q=Q+Math.imul(ZJ,f)|0,K=K+Math.imul(ZJ,zJ)|0;var LQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(LQ>>>26)|0,LQ&=67108863,G=Math.imul(d,_J),Q=Math.imul(d,NJ),Q=Q+Math.imul(a,_J)|0,K=Math.imul(a,NJ),G=G+Math.imul(T,yJ)|0,Q=Q+Math.imul(T,gJ)|0,Q=Q+Math.imul(D,yJ)|0,K=K+Math.imul(D,gJ)|0,G=G+Math.imul(LJ,cJ)|0,Q=Q+Math.imul(LJ,fJ)|0,Q=Q+Math.imul(IJ,cJ)|0,K=K+Math.imul(IJ,fJ)|0,G=G+Math.imul(BJ,f)|0,Q=Q+Math.imul(BJ,zJ)|0,Q=Q+Math.imul(TJ,f)|0,K=K+Math.imul(TJ,zJ)|0;var FQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(FQ>>>26)|0,FQ&=67108863,G=Math.imul(d,yJ),Q=Math.imul(d,gJ),Q=Q+Math.imul(a,yJ)|0,K=Math.imul(a,gJ),G=G+Math.imul(T,cJ)|0,Q=Q+Math.imul(T,fJ)|0,Q=Q+Math.imul(D,cJ)|0,K=K+Math.imul(D,fJ)|0,G=G+Math.imul(LJ,f)|0,Q=Q+Math.imul(LJ,zJ)|0,Q=Q+Math.imul(IJ,f)|0,K=K+Math.imul(IJ,zJ)|0;var HQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(HQ>>>26)|0,HQ&=67108863,G=Math.imul(d,cJ),Q=Math.imul(d,fJ),Q=Q+Math.imul(a,cJ)|0,K=Math.imul(a,fJ),G=G+Math.imul(T,f)|0,Q=Q+Math.imul(T,zJ)|0,Q=Q+Math.imul(D,f)|0,K=K+Math.imul(D,zJ)|0;var DQ=(H+G|0)+((Q&8191)<<13)|0;H=(K+(Q>>>13)|0)+(DQ>>>26)|0,DQ&=67108863,G=Math.imul(d,f),Q=Math.imul(d,zJ),Q=Q+Math.imul(a,f)|0,K=Math.imul(a,zJ);var KQ=(H+G|0)+((Q&8191)<<13)|0;return H=(K+(Q>>>13)|0)+(KQ>>>26)|0,KQ&=67108863,U[0]=CQ,U[1]=oJ,U[2]=tJ,U[3]=YQ,U[4]=BQ,U[5]=OQ,U[6]=jQ,U[7]=TQ,U[8]=NQ,U[9]=IQ,U[10]=EQ,U[11]=RQ,U[12]=zQ,U[13]=PQ,U[14]=LQ,U[15]=FQ,U[16]=HQ,U[17]=DQ,U[18]=KQ,H!==0&&(U[19]=H,Z.length++),Z};Math.imul||(F=P);function v(J,V,Z){Z.negative=V.negative^J.negative,Z.length=J.length+V.length;for(var $=0,X=0,U=0;U<Z.length-1;U++){var H=X;X=0;for(var G=$&67108863,Q=Math.min(U,V.length-1),K=Math.max(0,U-J.length+1);K<=Q;K++){var k=U-K,L=J.words[k]|0,_=V.words[K]|0,t=L*_,QJ=t&67108863;H=H+(t/67108864|0)|0,QJ=QJ+G|0,G=QJ&67108863,H=H+(QJ>>>26)|0,X+=H>>>26,H&=67108863}Z.words[U]=G,$=H,H=X}return $!==0?Z.words[U]=$:Z.length--,Z.strip()}function S(J,V,Z){var $=new w;return $.mulp(J,V,Z)}q.prototype.mulTo=function(J,V){var Z,$=this.length+J.length;return this.length===10&&J.length===10?Z=F(this,J,V):$<63?Z=P(this,J,V):$<1024?Z=v(this,J,V):Z=S(this,J,V),Z};function w(J,V){this.x=J,this.y=V}w.prototype.makeRBT=function(J){for(var V=new Array(J),Z=q.prototype._countBits(J)-1,$=0;$<J;$++)V[$]=this.revBin($,Z,J);return V},w.prototype.revBin=function(J,V,Z){if(J===0||J===Z-1)return J;for(var $=0,X=0;X<V;X++)$|=(J&1)<<V-X-1,J>>=1;return $},w.prototype.permute=function(J,V,Z,$,X,U){for(var H=0;H<U;H++)$[H]=V[J[H]],X[H]=Z[J[H]]},w.prototype.transform=function(J,V,Z,$,X,U){this.permute(U,J,V,Z,$,X);for(var H=1;H<X;H<<=1)for(var G=H<<1,Q=Math.cos(2*Math.PI/G),K=Math.sin(2*Math.PI/G),k=0;k<X;k+=G)for(var L=Q,_=K,t=0;t<H;t++){var QJ=Z[k+t],GJ=$[k+t],n=Z[k+t+H],p=$[k+t+H],e=L*n-_*p;p=L*p+_*n,n=e,Z[k+t]=QJ+n,$[k+t]=GJ+p,Z[k+t+H]=QJ-n,$[k+t+H]=GJ-p,t!==G&&(e=Q*L-K*_,_=Q*_+K*L,L=e)}},w.prototype.guessLen13b=function(J,V){var Z=Math.max(V,J)|1,$=Z&1,X=0;for(Z=Z/2|0;Z;Z=Z>>>1)X++;return 1<<X+1+$},w.prototype.conjugate=function(J,V,Z){if(!(Z<=1))for(var $=0;$<Z/2;$++){var X=J[$];J[$]=J[Z-$-1],J[Z-$-1]=X,X=V[$],V[$]=-V[Z-$-1],V[Z-$-1]=-X}},w.prototype.normalize13b=function(J,V){for(var Z=0,$=0;$<V/2;$++){var X=Math.round(J[2*$+1]/V)*8192+Math.round(J[2*$]/V)+Z;J[$]=X&67108863,X<67108864?Z=0:Z=X/67108864|0}return J},w.prototype.convert13b=function(J,V,Z,$){for(var X=0,U=0;U<V;U++)X=X+(J[U]|0),Z[2*U]=X&8191,X=X>>>13,Z[2*U+1]=X&8191,X=X>>>13;for(U=2*V;U<$;++U)Z[U]=0;B(X===0),B((X&-8192)===0)},w.prototype.stub=function(J){for(var V=new Array(J),Z=0;Z<J;Z++)V[Z]=0;return V},w.prototype.mulp=function(J,V,Z){var $=2*this.guessLen13b(J.length,V.length),X=this.makeRBT($),U=this.stub($),H=new Array($),G=new Array($),Q=new Array($),K=new Array($),k=new Array($),L=new Array($),_=Z.words;_.length=$,this.convert13b(J.words,J.length,H,$),this.convert13b(V.words,V.length,K,$),this.transform(H,U,G,Q,$,X),this.transform(K,U,k,L,$,X);for(var t=0;t<$;t++){var QJ=G[t]*k[t]-Q[t]*L[t];Q[t]=G[t]*L[t]+Q[t]*k[t],G[t]=QJ}return this.conjugate(G,Q,$),this.transform(G,Q,_,U,$,X),this.conjugate(_,U,$),this.normalize13b(_,$),Z.negative=J.negative^V.negative,Z.length=J.length+V.length,Z.strip()},q.prototype.mul=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),this.mulTo(J,V)},q.prototype.mulf=function(J){var V=new q(null);return V.words=new Array(this.length+J.length),S(this,J,V)},q.prototype.imul=function(J){return this.clone().mulTo(J,this)},q.prototype.imuln=function(J){B(typeof J=="number"),B(J<67108864);for(var V=0,Z=0;Z<this.length;Z++){var $=(this.words[Z]|0)*J,X=($&67108863)+(V&67108863);V>>=26,V+=$/67108864|0,V+=X>>>26,this.words[Z]=X&67108863}return V!==0&&(this.words[Z]=V,this.length++),this},q.prototype.muln=function(J){return this.clone().imuln(J)},q.prototype.sqr=function(){return this.mul(this)},q.prototype.isqr=function(){return this.imul(this.clone())},q.prototype.pow=function(J){var V=j(J);if(V.length===0)return new q(1);for(var Z=this,$=0;$<V.length&&V[$]===0;$++,Z=Z.sqr());if(++$<V.length)for(var X=Z.sqr();$<V.length;$++,X=X.sqr())V[$]!==0&&(Z=Z.mul(X));return Z},q.prototype.iushln=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=67108863>>>26-V<<26-V,X;if(V!==0){var U=0;for(X=0;X<this.length;X++){var H=this.words[X]&$,G=(this.words[X]|0)-H<<V;this.words[X]=G|U,U=H>>>26-V}U&&(this.words[X]=U,this.length++)}if(Z!==0){for(X=this.length-1;X>=0;X--)this.words[X+Z]=this.words[X];for(X=0;X<Z;X++)this.words[X]=0;this.length+=Z}return this.strip()},q.prototype.ishln=function(J){return B(this.negative===0),this.iushln(J)},q.prototype.iushrn=function(J,V,Z){B(typeof J=="number"&&J>=0);var $;V?$=(V-V%26)/26:$=0;var X=J%26,U=Math.min((J-X)/26,this.length),H=67108863^67108863>>>X<<X,G=Z;if($-=U,$=Math.max(0,$),G){for(var Q=0;Q<U;Q++)G.words[Q]=this.words[Q];G.length=U}if(U!==0)if(this.length>U)for(this.length-=U,Q=0;Q<this.length;Q++)this.words[Q]=this.words[Q+U];else this.words[0]=0,this.length=1;var K=0;for(Q=this.length-1;Q>=0&&(K!==0||Q>=$);Q--){var k=this.words[Q]|0;this.words[Q]=K<<26-X|k>>>X,K=k&H}return G&&K!==0&&(G.words[G.length++]=K),this.length===0&&(this.words[0]=0,this.length=1),this.strip()},q.prototype.ishrn=function(J,V,Z){return B(this.negative===0),this.iushrn(J,V,Z)},q.prototype.shln=function(J){return this.clone().ishln(J)},q.prototype.ushln=function(J){return this.clone().iushln(J)},q.prototype.shrn=function(J){return this.clone().ishrn(J)},q.prototype.ushrn=function(J){return this.clone().iushrn(J)},q.prototype.testn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return!1;var X=this.words[Z];return!!(X&$)},q.prototype.imaskn=function(J){B(typeof J=="number"&&J>=0);var V=J%26,Z=(J-V)/26;if(B(this.negative===0,"imaskn works only with positive numbers"),this.length<=Z)return this;if(V!==0&&Z++,this.length=Math.min(Z,this.length),V!==0){var $=67108863^67108863>>>V<<V;this.words[this.length-1]&=$}return this.strip()},q.prototype.maskn=function(J){return this.clone().imaskn(J)},q.prototype.iaddn=function(J){return B(typeof J=="number"),B(J<67108864),J<0?this.isubn(-J):this.negative!==0?this.length===1&&(this.words[0]|0)<J?(this.words[0]=J-(this.words[0]|0),this.negative=0,this):(this.negative=0,this.isubn(J),this.negative=1,this):this._iaddn(J)},q.prototype._iaddn=function(J){this.words[0]+=J;for(var V=0;V<this.length&&this.words[V]>=67108864;V++)this.words[V]-=67108864,V===this.length-1?this.words[V+1]=1:this.words[V+1]++;return this.length=Math.max(this.length,V+1),this},q.prototype.isubn=function(J){if(B(typeof J=="number"),B(J<67108864),J<0)return this.iaddn(-J);if(this.negative!==0)return this.negative=0,this.iaddn(J),this.negative=1,this;if(this.words[0]-=J,this.length===1&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var V=0;V<this.length&&this.words[V]<0;V++)this.words[V]+=67108864,this.words[V+1]-=1;return this.strip()},q.prototype.addn=function(J){return this.clone().iaddn(J)},q.prototype.subn=function(J){return this.clone().isubn(J)},q.prototype.iabs=function(){return this.negative=0,this},q.prototype.abs=function(){return this.clone().iabs()},q.prototype._ishlnsubmul=function(J,V,Z){var $=J.length+Z,X;this._expand($);var U,H=0;for(X=0;X<J.length;X++){U=(this.words[X+Z]|0)+H;var G=(J.words[X]|0)*V;U-=G&67108863,H=(U>>26)-(G/67108864|0),this.words[X+Z]=U&67108863}for(;X<this.length-Z;X++)U=(this.words[X+Z]|0)+H,H=U>>26,this.words[X+Z]=U&67108863;if(H===0)return this.strip();for(B(H===-1),H=0,X=0;X<this.length;X++)U=-(this.words[X]|0)+H,H=U>>26,this.words[X]=U&67108863;return this.negative=1,this.strip()},q.prototype._wordDiv=function(J,V){var Z=this.length-J.length,$=this.clone(),X=J,U=X.words[X.length-1]|0,H=this._countBits(U);Z=26-H,Z!==0&&(X=X.ushln(Z),$.iushln(Z),U=X.words[X.length-1]|0);var G=$.length-X.length,Q;if(V!=="mod"){Q=new q(null),Q.length=G+1,Q.words=new Array(Q.length);for(var K=0;K<Q.length;K++)Q.words[K]=0}var k=$.clone()._ishlnsubmul(X,1,G);k.negative===0&&($=k,Q&&(Q.words[G]=1));for(var L=G-1;L>=0;L--){var _=($.words[X.length+L]|0)*67108864+($.words[X.length+L-1]|0);for(_=Math.min(_/U|0,67108863),$._ishlnsubmul(X,_,L);$.negative!==0;)_--,$.negative=0,$._ishlnsubmul(X,1,L),$.isZero()||($.negative^=1);Q&&(Q.words[L]=_)}return Q&&Q.strip(),$.strip(),V!=="div"&&Z!==0&&$.iushrn(Z),{div:Q||null,mod:$}},q.prototype.divmod=function(J,V,Z){if(B(!J.isZero()),this.isZero())return{div:new q(0),mod:new q(0)};var $,X,U;return this.negative!==0&&J.negative===0?(U=this.neg().divmod(J,V),V!=="mod"&&($=U.div.neg()),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.iadd(J)),{div:$,mod:X}):this.negative===0&&J.negative!==0?(U=this.divmod(J.neg(),V),V!=="mod"&&($=U.div.neg()),{div:$,mod:U.mod}):(this.negative&J.negative)!==0?(U=this.neg().divmod(J.neg(),V),V!=="div"&&(X=U.mod.neg(),Z&&X.negative!==0&&X.isub(J)),{div:U.div,mod:X}):J.length>this.length||this.cmp(J)<0?{div:new q(0),mod:this}:J.length===1?V==="div"?{div:this.divn(J.words[0]),mod:null}:V==="mod"?{div:null,mod:new q(this.modn(J.words[0]))}:{div:this.divn(J.words[0]),mod:new q(this.modn(J.words[0]))}:this._wordDiv(J,V)},q.prototype.div=function(J){return this.divmod(J,"div",!1).div},q.prototype.mod=function(J){return this.divmod(J,"mod",!1).mod},q.prototype.umod=function(J){return this.divmod(J,"mod",!0).mod},q.prototype.divRound=function(J){var V=this.divmod(J);if(V.mod.isZero())return V.div;var Z=V.div.negative!==0?V.mod.isub(J):V.mod,$=J.ushrn(1),X=J.andln(1),U=Z.cmp($);return U<0||X===1&&U===0?V.div:V.div.negative!==0?V.div.isubn(1):V.div.iaddn(1)},q.prototype.modn=function(J){B(J<=67108863);for(var V=(1<<26)%J,Z=0,$=this.length-1;$>=0;$--)Z=(V*Z+(this.words[$]|0))%J;return Z},q.prototype.idivn=function(J){B(J<=67108863);for(var V=0,Z=this.length-1;Z>=0;Z--){var $=(this.words[Z]|0)+V*67108864;this.words[Z]=$/J|0,V=$%J}return this.strip()},q.prototype.divn=function(J){return this.clone().idivn(J)},q.prototype.egcd=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=new q(0),H=new q(1),G=0;V.isEven()&&Z.isEven();)V.iushrn(1),Z.iushrn(1),++G;for(var Q=Z.clone(),K=V.clone();!V.isZero();){for(var k=0,L=1;(V.words[0]&L)===0&&k<26;++k,L<<=1);if(k>0)for(V.iushrn(k);k-- >0;)($.isOdd()||X.isOdd())&&($.iadd(Q),X.isub(K)),$.iushrn(1),X.iushrn(1);for(var _=0,t=1;(Z.words[0]&t)===0&&_<26;++_,t<<=1);if(_>0)for(Z.iushrn(_);_-- >0;)(U.isOdd()||H.isOdd())&&(U.iadd(Q),H.isub(K)),U.iushrn(1),H.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(U),X.isub(H)):(Z.isub(V),U.isub($),H.isub(X))}return{a:U,b:H,gcd:Z.iushln(G)}},q.prototype._invmp=function(J){B(J.negative===0),B(!J.isZero());var V=this,Z=J.clone();V.negative!==0?V=V.umod(J):V=V.clone();for(var $=new q(1),X=new q(0),U=Z.clone();V.cmpn(1)>0&&Z.cmpn(1)>0;){for(var H=0,G=1;(V.words[0]&G)===0&&H<26;++H,G<<=1);if(H>0)for(V.iushrn(H);H-- >0;)$.isOdd()&&$.iadd(U),$.iushrn(1);for(var Q=0,K=1;(Z.words[0]&K)===0&&Q<26;++Q,K<<=1);if(Q>0)for(Z.iushrn(Q);Q-- >0;)X.isOdd()&&X.iadd(U),X.iushrn(1);V.cmp(Z)>=0?(V.isub(Z),$.isub(X)):(Z.isub(V),X.isub($))}var k;return V.cmpn(1)===0?k=$:k=X,k.cmpn(0)<0&&k.iadd(J),k},q.prototype.gcd=function(J){if(this.isZero())return J.abs();if(J.isZero())return this.abs();var V=this.clone(),Z=J.clone();V.negative=0,Z.negative=0;for(var $=0;V.isEven()&&Z.isEven();$++)V.iushrn(1),Z.iushrn(1);do{for(;V.isEven();)V.iushrn(1);for(;Z.isEven();)Z.iushrn(1);var X=V.cmp(Z);if(X<0){var U=V;V=Z,Z=U}else if(X===0||Z.cmpn(1)===0)break;V.isub(Z)}while(!0);return Z.iushln($)},q.prototype.invm=function(J){return this.egcd(J).a.umod(J)},q.prototype.isEven=function(){return(this.words[0]&1)===0},q.prototype.isOdd=function(){return(this.words[0]&1)===1},q.prototype.andln=function(J){return this.words[0]&J},q.prototype.bincn=function(J){B(typeof J=="number");var V=J%26,Z=(J-V)/26,$=1<<V;if(this.length<=Z)return this._expand(Z+1),this.words[Z]|=$,this;for(var X=$,U=Z;X!==0&&U<this.length;U++){var H=this.words[U]|0;H+=X,X=H>>>26,H&=67108863,this.words[U]=H}return X!==0&&(this.words[U]=X,this.length++),this},q.prototype.isZero=function(){return this.length===1&&this.words[0]===0},q.prototype.cmpn=function(J){var V=J<0;if(this.negative!==0&&!V)return-1;if(this.negative===0&&V)return 1;this.strip();var Z;if(this.length>1)Z=1;else{V&&(J=-J),B(J<=67108863,"Number is too big");var $=this.words[0]|0;Z=$===J?0:$<J?-1:1}return this.negative!==0?-Z|0:Z},q.prototype.cmp=function(J){if(this.negative!==0&&J.negative===0)return-1;if(this.negative===0&&J.negative!==0)return 1;var V=this.ucmp(J);return this.negative!==0?-V|0:V},q.prototype.ucmp=function(J){if(this.length>J.length)return 1;if(this.length<J.length)return-1;for(var V=0,Z=this.length-1;Z>=0;Z--){var $=this.words[Z]|0,X=J.words[Z]|0;if($!==X){$<X?V=-1:$>X&&(V=1);break}}return V},q.prototype.gtn=function(J){return this.cmpn(J)===1},q.prototype.gt=function(J){return this.cmp(J)===1},q.prototype.gten=function(J){return this.cmpn(J)>=0},q.prototype.gte=function(J){return this.cmp(J)>=0},q.prototype.ltn=function(J){return this.cmpn(J)===-1},q.prototype.lt=function(J){return this.cmp(J)===-1},q.prototype.lten=function(J){return this.cmpn(J)<=0},q.prototype.lte=function(J){return this.cmp(J)<=0},q.prototype.eqn=function(J){return this.cmpn(J)===0},q.prototype.eq=function(J){return this.cmp(J)===0},q.red=function(J){return new o(J)},q.prototype.toRed=function(J){return B(!this.red,"Already a number in reduction context"),B(this.negative===0,"red works only with positives"),J.convertTo(this)._forceRed(J)},q.prototype.fromRed=function(){return B(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},q.prototype._forceRed=function(J){return this.red=J,this},q.prototype.forceRed=function(J){return B(!this.red,"Already a number in reduction context"),this._forceRed(J)},q.prototype.redAdd=function(J){return B(this.red,"redAdd works only with red numbers"),this.red.add(this,J)},q.prototype.redIAdd=function(J){return B(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,J)},q.prototype.redSub=function(J){return B(this.red,"redSub works only with red numbers"),this.red.sub(this,J)},q.prototype.redISub=function(J){return B(this.red,"redISub works only with red numbers"),this.red.isub(this,J)},q.prototype.redShl=function(J){return B(this.red,"redShl works only with red numbers"),this.red.shl(this,J)},q.prototype.redMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.mul(this,J)},q.prototype.redIMul=function(J){return B(this.red,"redMul works only with red numbers"),this.red._verify2(this,J),this.red.imul(this,J)},q.prototype.redSqr=function(){return B(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},q.prototype.redISqr=function(){return B(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},q.prototype.redSqrt=function(){return B(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},q.prototype.redInvm=function(){return B(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},q.prototype.redNeg=function(){return B(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},q.prototype.redPow=function(J){return B(this.red&&!J.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,J)};var y={k256:null,p224:null,p192:null,p25519:null};function m(J,V){this.name=J,this.p=new q(V,16),this.n=this.p.bitLength(),this.k=new q(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}m.prototype._tmp=function(){var J=new q(null);return J.words=new Array(Math.ceil(this.n/13)),J},m.prototype.ireduce=function(J){var V=J,Z;do this.split(V,this.tmp),V=this.imulK(V),V=V.iadd(this.tmp),Z=V.bitLength();while(Z>this.n);var $=Z<this.n?-1:V.ucmp(this.p);return $===0?(V.words[0]=0,V.length=1):$>0?V.isub(this.p):V.strip!==void 0?V.strip():V._strip(),V},m.prototype.split=function(J,V){J.iushrn(this.n,0,V)},m.prototype.imulK=function(J){return J.imul(this.k)};function i(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}A(i,m),i.prototype.split=function(J,V){for(var Z=4194303,$=Math.min(J.length,9),X=0;X<$;X++)V.words[X]=J.words[X];if(V.length=$,J.length<=9){J.words[0]=0,J.length=1;return}var U=J.words[9];for(V.words[V.length++]=U&Z,X=10;X<J.length;X++){var H=J.words[X]|0;J.words[X-10]=(H&Z)<<4|U>>>22,U=H}U>>>=22,J.words[X-10]=U,U===0&&J.length>10?J.length-=10:J.length-=9},i.prototype.imulK=function(J){J.words[J.length]=0,J.words[J.length+1]=0,J.length+=2;for(var V=0,Z=0;Z<J.length;Z++){var $=J.words[Z]|0;V+=$*977,J.words[Z]=V&67108863,V=$*64+(V/67108864|0)}return J.words[J.length-1]===0&&(J.length--,J.words[J.length-1]===0&&J.length--),J};function JJ(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}A(JJ,m);function VJ(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}A(VJ,m);function HJ(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}A(HJ,m),HJ.prototype.imulK=function(J){for(var V=0,Z=0;Z<J.length;Z++){var $=(J.words[Z]|0)*19+V,X=$&67108863;$>>>=26,J.words[Z]=X,V=$}return V!==0&&(J.words[J.length++]=V),J},q._prime=function(J){if(y[J])return y[J];var V;if(J==="k256")V=new i;else if(J==="p224")V=new JJ;else if(J==="p192")V=new VJ;else if(J==="p25519")V=new HJ;else throw new Error("Unknown prime "+J);return y[J]=V,V};function o(J){if(typeof J=="string"){var V=q._prime(J);this.m=V.p,this.prime=V}else B(J.gtn(1),"modulus must be greater than 1"),this.m=J,this.prime=null}o.prototype._verify1=function(J){B(J.negative===0,"red works only with positives"),B(J.red,"red works only with red numbers")},o.prototype._verify2=function(J,V){B((J.negative|V.negative)===0,"red works only with positives"),B(J.red&&J.red===V.red,"red works only with red numbers")},o.prototype.imod=function(J){return this.prime?this.prime.ireduce(J)._forceRed(this):J.umod(this.m)._forceRed(this)},o.prototype.neg=function(J){return J.isZero()?J.clone():this.m.sub(J)._forceRed(this)},o.prototype.add=function(J,V){this._verify2(J,V);var Z=J.add(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z._forceRed(this)},o.prototype.iadd=function(J,V){this._verify2(J,V);var Z=J.iadd(V);return Z.cmp(this.m)>=0&&Z.isub(this.m),Z},o.prototype.sub=function(J,V){this._verify2(J,V);var Z=J.sub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z._forceRed(this)},o.prototype.isub=function(J,V){this._verify2(J,V);var Z=J.isub(V);return Z.cmpn(0)<0&&Z.iadd(this.m),Z},o.prototype.shl=function(J,V){return this._verify1(J),this.imod(J.ushln(V))},o.prototype.imul=function(J,V){return this._verify2(J,V),this.imod(J.imul(V))},o.prototype.mul=function(J,V){return this._verify2(J,V),this.imod(J.mul(V))},o.prototype.isqr=function(J){return this.imul(J,J.clone())},o.prototype.sqr=function(J){return this.mul(J,J)},o.prototype.sqrt=function(J){if(J.isZero())return J.clone();var V=this.m.andln(3);if(B(V%2===1),V===3){var Z=this.m.add(new q(1)).iushrn(2);return this.pow(J,Z)}for(var $=this.m.subn(1),X=0;!$.isZero()&&$.andln(1)===0;)X++,$.iushrn(1);B(!$.isZero());var U=new q(1).toRed(this),H=U.redNeg(),G=this.m.subn(1).iushrn(1),Q=this.m.bitLength();for(Q=new q(2*Q*Q).toRed(this);this.pow(Q,G).cmp(H)!==0;)Q.redIAdd(H);for(var K=this.pow(Q,$),k=this.pow(J,$.addn(1).iushrn(1)),L=this.pow(J,$),_=X;L.cmp(U)!==0;){for(var t=L,QJ=0;t.cmp(U)!==0;QJ++)t=t.redSqr();B(QJ<_);var GJ=this.pow(K,new q(1).iushln(_-QJ-1));k=k.redMul(GJ),K=GJ.redSqr(),L=L.redMul(K),_=QJ}return k},o.prototype.invm=function(J){var V=J._invmp(this.m);return V.negative!==0?(V.negative=0,this.imod(V).redNeg()):this.imod(V)},o.prototype.pow=function(J,V){if(V.isZero())return new q(1).toRed(this);if(V.cmpn(1)===0)return J.clone();var Z=4,$=new Array(1<<Z);$[0]=new q(1).toRed(this),$[1]=J;for(var X=2;X<$.length;X++)$[X]=this.mul($[X-1],J);var U=$[0],H=0,G=0,Q=V.bitLength()%26;for(Q===0&&(Q=26),X=V.length-1;X>=0;X--){for(var K=V.words[X],k=Q-1;k>=0;k--){var L=K>>k&1;if(U!==$[0]&&(U=this.sqr(U)),L===0&&H===0){G=0;continue}H<<=1,H|=L,G++,!(G!==Z&&(X!==0||k!==0))&&(U=this.mul(U,$[H]),G=0,H=0)}Q=26}return U},o.prototype.convertTo=function(J){var V=J.umod(this.m);return V===J?V.clone():V},o.prototype.convertFrom=function(J){var V=J.clone();return V.red=null,V},q.mont=function(J){return new jJ(J)};function jJ(J){o.call(this,J),this.shift=this.m.bitLength(),this.shift%26!==0&&(this.shift+=26-this.shift%26),this.r=new q(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}A(jJ,o),jJ.prototype.convertTo=function(J){return this.imod(J.ushln(this.shift))},jJ.prototype.convertFrom=function(J){var V=this.imod(J.mul(this.rinv));return V.red=null,V},jJ.prototype.imul=function(J,V){if(J.isZero()||V.isZero())return J.words[0]=0,J.length=1,J;var Z=J.imul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.mul=function(J,V){if(J.isZero()||V.isZero())return new q(0)._forceRed(this);var Z=J.mul(V),$=Z.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),X=Z.isub($).iushrn(this.shift),U=X;return X.cmp(this.m)>=0?U=X.isub(this.m):X.cmpn(0)<0&&(U=X.iadd(this.m)),U._forceRed(this)},jJ.prototype.invm=function(J){var V=this.imod(J._invmp(this.m).mul(this.r2));return V._forceRed(this)}})(typeof g>"u"||g,l)}),P6=OJ((l,g)=>{var R=W0(),M=XQ().Buffer;function B(A,q){return M.from(A.toRed(R.mont(q.modulus)).redPow(new R(q.publicExponent)).fromRed().toArray())}g.exports=B}),C$=OJ((l,g)=>{var R=SV(),M=VV(),B=WV(),A=R6(),q=z6(),Y=W0(),E=P6(),O=$0(),N=XQ().Buffer;g.exports=function(j,P,F){var v;j.padding?v=j.padding:F?v=1:v=4;var S=R(j),w;if(v===4)w=W(S,P);else if(v===1)w=I(S,P,F);else if(v===3){if(w=new Y(P),w.cmp(S.modulus)>=0)throw new Error("data too long for modulus")}else throw new Error("unknown padding");return F?O(w,S):E(w,S)};function W(j,P){var F=j.modulus.byteLength(),v=P.length,S=B("sha1").update(N.alloc(0)).digest(),w=S.length,y=2*w;if(v>F-y-2)throw new Error("message too long");var m=N.alloc(F-v-y-2),i=F-w-1,JJ=M(w),VJ=q(N.concat([S,m,N.alloc(1,1),P],i),A(JJ,i)),HJ=q(JJ,A(VJ,w));return new Y(N.concat([N.alloc(1),HJ,VJ],F))}function I(j,P,F){var v=P.length,S=j.modulus.byteLength();if(v>S-11)throw new Error("message too long");var w;return F?w=N.alloc(S-v-3,255):w=z(S-v-3),new Y(N.concat([N.from([0,F?1:2]),w,N.alloc(1),P],S))}function z(j){for(var P=N.allocUnsafe(j),F=0,v=M(j*2),S=0,w;F<j;)S===v.length&&(v=M(j*2),S=0),w=v[S++],w&&(P[F++]=w);return P}}),k$=OJ((l,g)=>{var R=SV(),M=R6(),B=z6(),A=W0(),q=$0(),Y=WV(),E=P6(),O=XQ().Buffer;g.exports=function(z,j,P){var F;z.padding?F=z.padding:P?F=1:F=4;var v=R(z),S=v.modulus.byteLength();if(j.length>S||new A(j).cmp(v.modulus)>=0)throw new Error("decryption error");var w;P?w=E(new A(j),v):w=q(j,v);var y=O.alloc(S-w.length);if(w=O.concat([y,w],S),F===4)return N(v,w);if(F===1)return W(v,w,P);if(F===3)return w;throw new Error("unknown padding")};function N(z,j){var P=z.modulus.byteLength(),F=Y("sha1").update(O.alloc(0)).digest(),v=F.length;if(j[0]!==0)throw new Error("decryption error");var S=j.slice(1,v+1),w=j.slice(v+1),y=B(S,M(w,v)),m=B(w,M(y,P-v-1));if(I(F,m.slice(0,v)))throw new Error("decryption error");for(var i=v;m[i]===0;)i++;if(m[i++]!==1)throw new Error("decryption error");return m.slice(i)}function W(z,j,P){for(var F=j.slice(0,2),v=2,S=0;j[v++]!==0;)if(v>=j.length){S++;break}var w=j.slice(2,v-1);if((F.toString("hex")!=="0002"&&!P||F.toString("hex")!=="0001"&&P)&&S++,w.length<8&&S++,S)throw new Error("decryption error");return j.slice(v)}function I(z,j){z=O.from(z),j=O.from(j);var P=0,F=z.length;z.length!==j.length&&(P++,F=Math.min(z.length,j.length));for(var v=-1;++v<F;)P+=z[v]^j[v];return P}}),A$=OJ((l)=>{l.publicEncrypt=C$(),l.privateDecrypt=k$(),l.privateEncrypt=function(g,R){return l.publicEncrypt(g,R,!0)},l.publicDecrypt=function(g,R){return l.privateDecrypt(g,R,!0)}}),S$=OJ((l)=>{function g(){throw new Error(`secure random number generation not supported by this browser
+use chrome, FireFox or Internet Explorer 11`)}var R=XQ(),M=VV(),B=R.Buffer,A=R.kMaxLength,q=global.crypto||global.msCrypto,Y=Math.pow(2,32)-1;function E(z,j){if(typeof z!="number"||z!==z)throw new TypeError("offset must be a number");if(z>Y||z<0)throw new TypeError("offset must be a uint32");if(z>A||z>j)throw new RangeError("offset out of range")}function O(z,j,P){if(typeof z!="number"||z!==z)throw new TypeError("size must be a number");if(z>Y||z<0)throw new TypeError("size must be a uint32");if(z+j>P||z>A)throw new RangeError("buffer too small")}q&&q.getRandomValues?(l.randomFill=N,l.randomFillSync=I):(l.randomFill=g,l.randomFillSync=g);function N(z,j,P,F){if(!B.isBuffer(z)&&!(z instanceof global.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');if(typeof j=="function")F=j,j=0,P=z.length;else if(typeof P=="function")F=P,P=z.length-j;else if(typeof F!="function")throw new TypeError('"cb" argument must be a function');return E(j,z.length),O(P,j,z.length),W(z,j,P,F)}function W(z,j,P,F){var v=z.buffer,S=new Uint8Array(v,j,P);if(q.getRandomValues(S),F){process.nextTick(function(){F(null,z)});return}return z;var w}function I(z,j,P){if(typeof j>"u"&&(j=0),!B.isBuffer(z)&&!(z instanceof global.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');return E(j,z.length),P===void 0&&(P=z.length-j),O(P,j,z.length),W(z,j,P)}}),L6=OJ((l)=>{l.randomBytes=l.rng=l.pseudoRandomBytes=l.prng=VV(),l.createHash=l.Hash=WV(),l.createHmac=l.Hmac=f0();var g=R8(),R=Object.keys(g),M=["sha1","sha224","sha256","sha384","sha512","md5","rmd160"].concat(R);l.getHashes=function(){return M};var B=l0();l.pbkdf2=B.pbkdf2,l.pbkdf2Sync=B.pbkdf2Sync;var A=y8();l.Cipher=A.Cipher,l.createCipher=A.createCipher,l.Cipheriv=A.Cipheriv,l.createCipheriv=A.createCipheriv,l.Decipher=A.Decipher,l.createDecipher=A.createDecipher,l.Decipheriv=A.Decipheriv,l.createDecipheriv=A.createDecipheriv,l.getCiphers=A.getCiphers,l.listCiphers=A.listCiphers;var q=m8();l.DiffieHellmanGroup=q.DiffieHellmanGroup,l.createDiffieHellmanGroup=q.createDiffieHellmanGroup,l.getDiffieHellman=q.getDiffieHellman,l.createDiffieHellman=q.createDiffieHellman,l.DiffieHellman=q.DiffieHellman;var Y=L$();l.createSign=Y.createSign,l.Sign=Y.Sign,l.createVerify=Y.createVerify,l.Verify=Y.Verify,l.createECDH=D$();var E=A$();l.publicEncrypt=E.publicEncrypt,l.privateEncrypt=E.privateEncrypt,l.publicDecrypt=E.publicDecrypt,l.privateDecrypt=E.privateDecrypt;var O=S$();l.randomFill=O.randomFill,l.randomFillSync=O.randomFillSync,l.createCredentials=function(){throw new Error(["sorry, createCredentials is not implemented yet","we accept pull requests","https://github.com/crypto-browserify/crypto-browserify"].join(`
+`))},l.constants={DH_CHECK_P_NOT_SAFE_PRIME:2,DH_CHECK_P_NOT_PRIME:1,DH_UNABLE_TO_CHECK_GENERATOR:4,DH_NOT_SUITABLE_GENERATOR:8,NPN_ENABLED:1,ALPN_ENABLED:1,RSA_PKCS1_PADDING:1,RSA_SSLV23_PADDING:2,RSA_NO_PADDING:3,RSA_PKCS1_OAEP_PADDING:4,RSA_X931_PADDING:5,RSA_PKCS1_PSS_PADDING:6,POINT_CONVERSION_COMPRESSED:2,POINT_CONVERSION_UNCOMPRESSED:4,POINT_CONVERSION_HYBRID:6}}),F6={},RV(F6,{DEFAULT_ENCODING:()=>UV,default:()=>A6,getCurves:()=>Y0,getRandomValues:()=>B0,randomUUID:()=>O0,scrypt:()=>wV,scryptSync:()=>xV,timingSafeEqual:()=>jV,webcrypto:()=>j0}),fV(F6,oQ(L6())),x$=oQ(L6()),UV="buffer",B0=(l)=>crypto.getRandomValues(l),O0=()=>crypto.randomUUID(),w$=["p192","p224","p256","p384","p521","curve25519","ed25519","secp256k1","secp224r1","prime256v1","prime192v1","ed25519","secp384r1","secp521r1"],jV="timingSafeEqual"in crypto?(l,g)=>{let{byteLength:R}=l,{byteLength:M}=g;if(typeof R!="number"||typeof M!="number")throw new TypeError("Input must be an array buffer view");if(R!==M)throw new RangeError("Input buffers must have the same length");return crypto.timingSafeEqual(l,g)}:void 0,xV="scryptSync"in crypto?(l,g,R,M)=>{let B=crypto.scryptSync(l,g,R,M);return UV!=="buffer"?new Buffer(B).toString(UV):new Buffer(B)}:void 0,wV="scryptSync"in crypto?function(l,g,R,M,B){if(typeof M=="function"&&(B=M,M=void 0),typeof B!="function"){var A=new TypeError("callback must be a function");throw A.code="ERR_INVALID_CALLBACK",A}try{let q=crypto.scryptSync(l,g,R,M);process.nextTick(B,null,UV!=="buffer"?new Buffer(q).toString(UV):new Buffer(q))}catch(q){throw q}}:void 0,jV&&(Object.defineProperty(jV,"name",{value:"::bunternal::"}),Object.defineProperty(wV,"name",{value:"::bunternal::"}),Object.defineProperty(xV,"name",{value:"::bunternal::"})),j0=crypto,A6={...x$,getRandomValues:B0,randomUUID:O0,timingSafeEqual:jV,scryptSync:xV,scrypt:wV,webcrypto:j0,getCurves:Y0};/*!
+   * The buffer module from node.js, for the browser.
+   *
+   * @author   Feross Aboukhadijeh <https://feross.org>
+   * @license  MIT
+   *//*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *//*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */}),H5="./",v$="./piper.js",B5=(()=>{var l=typeof document!=="undefined"&&document.currentScript?document.currentScript.src:void 0;if(typeof v$!=="undefined")l=l||v$;return function(g={}){var R=g,M,B;if(R.ready=new Promise((x,c)=>{M=x,B=c}),!R.expectedDataFileDownloads)R.expectedDataFileDownloads=0;R.expectedDataFileDownloads++,function(){if(R.ENVIRONMENT_IS_PTHREAD||R.$ww)return;var x=function(c){var s="";if(typeof window==="object")s=window.encodeURIComponent(window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/");else if(typeof process==="undefined"&&typeof location!=="undefined")s=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/");var r="piper_phonemize.data",KJ="piper_phonemize.data";if(typeof R.locateFilePackage==="function"&&!R.locateFile)R.locateFile=R.locateFilePackage,y("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)");var YJ=R.locateFile?R.locateFile(KJ,""):KJ,DJ=c.remote_package_size;function hJ(iJ,lJ,eJ,SQ){if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){(()=>({})).readFile(iJ,function(qQ,uJ){if(qQ)SQ(qQ);else eJ(uJ.buffer)});return}var UQ=new XMLHttpRequest;UQ.open("GET",iJ,!0),UQ.responseType="arraybuffer",UQ.onprogress=function(qQ){var uJ=iJ,sJ=lJ;if(qQ.total)sJ=qQ.total;if(qQ.loaded){if(!UQ.addedTotal){if(UQ.addedTotal=!0,!R.dataFileDownloads)R.dataFileDownloads={};R.dataFileDownloads[uJ]={loaded:qQ.loaded,total:sJ}}else R.dataFileDownloads[uJ].loaded=qQ.loaded;var AQ=0,kQ=0,cQ=0;for(var _Q in R.dataFileDownloads){var f6=R.dataFileDownloads[_Q];AQ+=f6.total,kQ+=f6.loaded,cQ++}if(AQ=Math.ceil(AQ*R.expectedDataFileDownloads/cQ),R.setStatus)R.setStatus(`Downloading data... (${kQ}/${AQ})`)}else if(!R.dataFileDownloads){if(R.setStatus)R.setStatus("Downloading data...")}},UQ.onerror=function(qQ){throw new Error("NetworkError for: "+iJ)},UQ.onload=function(qQ){if(UQ.status==200||UQ.status==304||UQ.status==206||UQ.status==0&&UQ.response){var uJ=UQ.response;eJ(uJ)}else throw new Error(UQ.statusText+" : "+UQ.responseURL)},UQ.send(null)}function pJ(iJ){console.error("package error:",iJ)}var rJ=null,VQ=R.getPreloadedPackage?R.getPreloadedPackage(YJ,DJ):null;if(!VQ)hJ(YJ,DJ,function(iJ){if(rJ)rJ(iJ),rJ=null;else VQ=iJ},pJ);function GQ(){function iJ(qQ,uJ){if(!qQ)throw uJ+new Error().stack}R.FS_createPath("/","espeak-ng-data",!0,!0),R.FS_createPath("/espeak-ng-data","lang",!0,!0),R.FS_createPath("/espeak-ng-data/lang","aav",!0,!0),R.FS_createPath("/espeak-ng-data/lang","art",!0,!0),R.FS_createPath("/espeak-ng-data/lang","azc",!0,!0),R.FS_createPath("/espeak-ng-data/lang","bat",!0,!0),R.FS_createPath("/espeak-ng-data/lang","bnt",!0,!0),R.FS_createPath("/espeak-ng-data/lang","ccs",!0,!0),R.FS_createPath("/espeak-ng-data/lang","cel",!0,!0),R.FS_createPath("/espeak-ng-data/lang","cus",!0,!0),R.FS_createPath("/espeak-ng-data/lang","dra",!0,!0),R.FS_createPath("/espeak-ng-data/lang","esx",!0,!0),R.FS_createPath("/espeak-ng-data/lang","gmq",!0,!0),R.FS_createPath("/espeak-ng-data/lang","gmw",!0,!0),R.FS_createPath("/espeak-ng-data/lang","grk",!0,!0),R.FS_createPath("/espeak-ng-data/lang","inc",!0,!0),R.FS_createPath("/espeak-ng-data/lang","ine",!0,!0),R.FS_createPath("/espeak-ng-data/lang","ira",!0,!0),R.FS_createPath("/espeak-ng-data/lang","iro",!0,!0),R.FS_createPath("/espeak-ng-data/lang","itc",!0,!0),R.FS_createPath("/espeak-ng-data/lang","jpx",!0,!0),R.FS_createPath("/espeak-ng-data/lang","map",!0,!0),R.FS_createPath("/espeak-ng-data/lang","miz",!0,!0),R.FS_createPath("/espeak-ng-data/lang","myn",!0,!0),R.FS_createPath("/espeak-ng-data/lang","poz",!0,!0),R.FS_createPath("/espeak-ng-data/lang","roa",!0,!0),R.FS_createPath("/espeak-ng-data/lang","sai",!0,!0),R.FS_createPath("/espeak-ng-data/lang","sem",!0,!0),R.FS_createPath("/espeak-ng-data/lang","sit",!0,!0),R.FS_createPath("/espeak-ng-data/lang","tai",!0,!0),R.FS_createPath("/espeak-ng-data/lang","trk",!0,!0),R.FS_createPath("/espeak-ng-data/lang","urj",!0,!0),R.FS_createPath("/espeak-ng-data/lang","zle",!0,!0),R.FS_createPath("/espeak-ng-data/lang","zls",!0,!0),R.FS_createPath("/espeak-ng-data/lang","zlw",!0,!0),R.FS_createPath("/espeak-ng-data","mbrola_ph",!0,!0),R.FS_createPath("/espeak-ng-data","voices",!0,!0),R.FS_createPath("/espeak-ng-data/voices","!v",!0,!0),R.FS_createPath("/espeak-ng-data/voices","mb",!0,!0);function lJ(qQ,uJ,sJ){this.start=qQ,this.end=uJ,this.audio=sJ}lJ.prototype={requests:{},open:function(qQ,uJ){this.name=uJ,this.requests[uJ]=this,R.addRunDependency(`fp ${this.name}`)},send:function(){},onload:function(){var qQ=this.byteArray.subarray(this.start,this.end);this.finish(qQ)},finish:function(qQ){var uJ=this;R.FS_createDataFile(this.name,null,qQ,!0,!0,!0),R.removeRunDependency(`fp ${uJ.name}`),this.requests[this.name]=null}};var eJ=c.files;for(var SQ=0;SQ<eJ.length;++SQ)new lJ(eJ[SQ].start,eJ[SQ].end,eJ[SQ].audio||0).open("GET",eJ[SQ].filename);function UQ(qQ){iJ(qQ,"Loading data file failed."),iJ(qQ.constructor.name===ArrayBuffer.name,"bad input to processPackageData");var uJ=new Uint8Array(qQ);lJ.prototype.byteArray=uJ;var sJ=c.files;for(var AQ=0;AQ<sJ.length;++AQ)lJ.prototype.requests[sJ[AQ].filename].onload();R.removeRunDependency("datafile_piper_phonemize.data")}if(R.addRunDependency("datafile_piper_phonemize.data"),!R.preloadResults)R.preloadResults={};if(R.preloadResults[r]={fromCache:!1},VQ)UQ(VQ),VQ=null;else rJ=UQ}if(R.calledRun)GQ();else{if(!R.preRun)R.preRun=[];R.preRun.push(GQ)}};x({files:[{filename:"/espeak-ng-data/af_dict",start:0,end:121473},{filename:"/espeak-ng-data/am_dict",start:121473,end:185351},{filename:"/espeak-ng-data/an_dict",start:185351,end:192042},{filename:"/espeak-ng-data/ar_dict",start:192042,end:670207},{filename:"/espeak-ng-data/as_dict",start:670207,end:675212},{filename:"/espeak-ng-data/az_dict",start:675212,end:718985},{filename:"/espeak-ng-data/ba_dict",start:718985,end:721083},{filename:"/espeak-ng-data/be_dict",start:721083,end:723735},{filename:"/espeak-ng-data/bg_dict",start:723735,end:810786},{filename:"/espeak-ng-data/bn_dict",start:810786,end:900765},{filename:"/espeak-ng-data/bpy_dict",start:900765,end:905991},{filename:"/espeak-ng-data/bs_dict",start:905991,end:953059},{filename:"/espeak-ng-data/ca_dict",start:953059,end:998625},{filename:"/espeak-ng-data/chr_dict",start:998625,end:1001484},{filename:"/espeak-ng-data/cmn_dict",start:1001484,end:2567819},{filename:"/espeak-ng-data/cs_dict",start:2567819,end:2617464},{filename:"/espeak-ng-data/cv_dict",start:2617464,end:2618808},{filename:"/espeak-ng-data/cy_dict",start:2618808,end:2661938},{filename:"/espeak-ng-data/da_dict",start:2661938,end:2907225},{filename:"/espeak-ng-data/de_dict",start:2907225,end:2975501},{filename:"/espeak-ng-data/el_dict",start:2975501,end:3048342},{filename:"/espeak-ng-data/en_dict",start:3048342,end:3215286},{filename:"/espeak-ng-data/eo_dict",start:3215286,end:3219952},{filename:"/espeak-ng-data/es_dict",start:3219952,end:3269204},{filename:"/espeak-ng-data/et_dict",start:3269204,end:3313467},{filename:"/espeak-ng-data/eu_dict",start:3313467,end:3362308},{filename:"/espeak-ng-data/fa_dict",start:3362308,end:3655543},{filename:"/espeak-ng-data/fi_dict",start:3655543,end:3699471},{filename:"/espeak-ng-data/fr_dict",start:3699471,end:3763198},{filename:"/espeak-ng-data/ga_dict",start:3763198,end:3815871},{filename:"/espeak-ng-data/gd_dict",start:3815871,end:3864992},{filename:"/espeak-ng-data/gn_dict",start:3864992,end:3868240},{filename:"/espeak-ng-data/grc_dict",start:3868240,end:3871673},{filename:"/espeak-ng-data/gu_dict",start:3871673,end:3954153},{filename:"/espeak-ng-data/hak_dict",start:3954153,end:3957488},{filename:"/espeak-ng-data/haw_dict",start:3957488,end:3959931},{filename:"/espeak-ng-data/he_dict",start:3959931,end:3966894},{filename:"/espeak-ng-data/hi_dict",start:3966894,end:4059037},{filename:"/espeak-ng-data/hr_dict",start:4059037,end:4108425},{filename:"/espeak-ng-data/ht_dict",start:4108425,end:4110228},{filename:"/espeak-ng-data/hu_dict",start:4110228,end:4264013},{filename:"/espeak-ng-data/hy_dict",start:4264013,end:4326276},{filename:"/espeak-ng-data/ia_dict",start:4326276,end:4657551},{filename:"/espeak-ng-data/id_dict",start:4657551,end:4701009},{filename:"/espeak-ng-data/intonations",start:4701009,end:4703049},{filename:"/espeak-ng-data/io_dict",start:4703049,end:4705214},{filename:"/espeak-ng-data/is_dict",start:4705214,end:4749568},{filename:"/espeak-ng-data/it_dict",start:4749568,end:4902457},{filename:"/espeak-ng-data/ja_dict",start:4902457,end:4950109},{filename:"/espeak-ng-data/jbo_dict",start:4950109,end:4952352},{filename:"/espeak-ng-data/ka_dict",start:4952352,end:5040127},{filename:"/espeak-ng-data/kk_dict",start:5040127,end:5041986},{filename:"/espeak-ng-data/kl_dict",start:5041986,end:5044824},{filename:"/espeak-ng-data/kn_dict",start:5044824,end:5132652},{filename:"/espeak-ng-data/ko_dict",start:5132652,end:5180175},{filename:"/espeak-ng-data/kok_dict",start:5180175,end:5186569},{filename:"/espeak-ng-data/ku_dict",start:5186569,end:5188834},{filename:"/espeak-ng-data/ky_dict",start:5188834,end:5253811},{filename:"/espeak-ng-data/la_dict",start:5253811,end:5257617},{filename:"/espeak-ng-data/lang/aav/vi",start:5257617,end:5257728},{filename:"/espeak-ng-data/lang/aav/vi-VN-x-central",start:5257728,end:5257871},{filename:"/espeak-ng-data/lang/aav/vi-VN-x-south",start:5257871,end:5258013},{filename:"/espeak-ng-data/lang/art/eo",start:5258013,end:5258054},{filename:"/espeak-ng-data/lang/art/ia",start:5258054,end:5258083},{filename:"/espeak-ng-data/lang/art/io",start:5258083,end:5258133},{filename:"/espeak-ng-data/lang/art/jbo",start:5258133,end:5258202},{filename:"/espeak-ng-data/lang/art/lfn",start:5258202,end:5258337},{filename:"/espeak-ng-data/lang/art/piqd",start:5258337,end:5258393},{filename:"/espeak-ng-data/lang/art/py",start:5258393,end:5258533},{filename:"/espeak-ng-data/lang/art/qdb",start:5258533,end:5258590},{filename:"/espeak-ng-data/lang/art/qya",start:5258590,end:5258763},{filename:"/espeak-ng-data/lang/art/sjn",start:5258763,end:5258938},{filename:"/espeak-ng-data/lang/azc/nci",start:5258938,end:5259052},{filename:"/espeak-ng-data/lang/bat/lt",start:5259052,end:5259080},{filename:"/espeak-ng-data/lang/bat/ltg",start:5259080,end:5259392},{filename:"/espeak-ng-data/lang/bat/lv",start:5259392,end:5259621},{filename:"/espeak-ng-data/lang/bnt/sw",start:5259621,end:5259662},{filename:"/espeak-ng-data/lang/bnt/tn",start:5259662,end:5259704},{filename:"/espeak-ng-data/lang/ccs/ka",start:5259704,end:5259828},{filename:"/espeak-ng-data/lang/cel/cy",start:5259828,end:5259865},{filename:"/espeak-ng-data/lang/cel/ga",start:5259865,end:5259931},{filename:"/espeak-ng-data/lang/cel/gd",start:5259931,end:5259982},{filename:"/espeak-ng-data/lang/cus/om",start:5259982,end:5260021},{filename:"/espeak-ng-data/lang/dra/kn",start:5260021,end:5260076},{filename:"/espeak-ng-data/lang/dra/ml",start:5260076,end:5260133},{filename:"/espeak-ng-data/lang/dra/ta",start:5260133,end:5260184},{filename:"/espeak-ng-data/lang/dra/te",start:5260184,end:5260254},{filename:"/espeak-ng-data/lang/esx/kl",start:5260254,end:5260284},{filename:"/espeak-ng-data/lang/eu",start:5260284,end:5260338},{filename:"/espeak-ng-data/lang/gmq/da",start:5260338,end:5260381},{filename:"/espeak-ng-data/lang/gmq/is",start:5260381,end:5260408},{filename:"/espeak-ng-data/lang/gmq/nb",start:5260408,end:5260495},{filename:"/espeak-ng-data/lang/gmq/sv",start:5260495,end:5260520},{filename:"/espeak-ng-data/lang/gmw/af",start:5260520,end:5260643},{filename:"/espeak-ng-data/lang/gmw/de",start:5260643,end:5260685},{filename:"/espeak-ng-data/lang/gmw/en",start:5260685,end:5260825},{filename:"/espeak-ng-data/lang/gmw/en-029",start:5260825,end:5261160},{filename:"/espeak-ng-data/lang/gmw/en-GB-scotland",start:5261160,end:5261455},{filename:"/espeak-ng-data/lang/gmw/en-GB-x-gbclan",start:5261455,end:5261693},{filename:"/espeak-ng-data/lang/gmw/en-GB-x-gbcwmd",start:5261693,end:5261881},{filename:"/espeak-ng-data/lang/gmw/en-GB-x-rp",start:5261881,end:5262130},{filename:"/espeak-ng-data/lang/gmw/en-US",start:5262130,end:5262387},{filename:"/espeak-ng-data/lang/gmw/en-US-nyc",start:5262387,end:5262658},{filename:"/espeak-ng-data/lang/gmw/lb",start:5262658,end:5262689},{filename:"/espeak-ng-data/lang/gmw/nl",start:5262689,end:5262712},{filename:"/espeak-ng-data/lang/grk/el",start:5262712,end:5262735},{filename:"/espeak-ng-data/lang/grk/grc",start:5262735,end:5262834},{filename:"/espeak-ng-data/lang/inc/as",start:5262834,end:5262876},{filename:"/espeak-ng-data/lang/inc/bn",start:5262876,end:5262901},{filename:"/espeak-ng-data/lang/inc/bpy",start:5262901,end:5262940},{filename:"/espeak-ng-data/lang/inc/gu",start:5262940,end:5262982},{filename:"/espeak-ng-data/lang/inc/hi",start:5262982,end:5263005},{filename:"/espeak-ng-data/lang/inc/kok",start:5263005,end:5263031},{filename:"/espeak-ng-data/lang/inc/mr",start:5263031,end:5263072},{filename:"/espeak-ng-data/lang/inc/ne",start:5263072,end:5263109},{filename:"/espeak-ng-data/lang/inc/or",start:5263109,end:5263148},{filename:"/espeak-ng-data/lang/inc/pa",start:5263148,end:5263173},{filename:"/espeak-ng-data/lang/inc/sd",start:5263173,end:5263239},{filename:"/espeak-ng-data/lang/inc/si",start:5263239,end:5263294},{filename:"/espeak-ng-data/lang/inc/ur",start:5263294,end:5263388},{filename:"/espeak-ng-data/lang/ine/hy",start:5263388,end:5263449},{filename:"/espeak-ng-data/lang/ine/hyw",start:5263449,end:5263814},{filename:"/espeak-ng-data/lang/ine/sq",start:5263814,end:5263917},{filename:"/espeak-ng-data/lang/ira/fa",start:5263917,end:5264007},{filename:"/espeak-ng-data/lang/ira/fa-Latn",start:5264007,end:5264276},{filename:"/espeak-ng-data/lang/ira/ku",start:5264276,end:5264316},{filename:"/espeak-ng-data/lang/iro/chr",start:5264316,end:5264885},{filename:"/espeak-ng-data/lang/itc/la",start:5264885,end:5265182},{filename:"/espeak-ng-data/lang/jpx/ja",start:5265182,end:5265234},{filename:"/espeak-ng-data/lang/ko",start:5265234,end:5265285},{filename:"/espeak-ng-data/lang/map/haw",start:5265285,end:5265327},{filename:"/espeak-ng-data/lang/miz/mto",start:5265327,end:5265510},{filename:"/espeak-ng-data/lang/myn/quc",start:5265510,end:5265720},{filename:"/espeak-ng-data/lang/poz/id",start:5265720,end:5265854},{filename:"/espeak-ng-data/lang/poz/mi",start:5265854,end:5266221},{filename:"/espeak-ng-data/lang/poz/ms",start:5266221,end:5266651},{filename:"/espeak-ng-data/lang/qu",start:5266651,end:5266739},{filename:"/espeak-ng-data/lang/roa/an",start:5266739,end:5266766},{filename:"/espeak-ng-data/lang/roa/ca",start:5266766,end:5266791},{filename:"/espeak-ng-data/lang/roa/es",start:5266791,end:5266854},{filename:"/espeak-ng-data/lang/roa/es-419",start:5266854,end:5267021},{filename:"/espeak-ng-data/lang/roa/fr",start:5267021,end:5267100},{filename:"/espeak-ng-data/lang/roa/fr-BE",start:5267100,end:5267184},{filename:"/espeak-ng-data/lang/roa/fr-CH",start:5267184,end:5267270},{filename:"/espeak-ng-data/lang/roa/ht",start:5267270,end:5267410},{filename:"/espeak-ng-data/lang/roa/it",start:5267410,end:5267519},{filename:"/espeak-ng-data/lang/roa/pap",start:5267519,end:5267581},{filename:"/espeak-ng-data/lang/roa/pt",start:5267581,end:5267676},{filename:"/espeak-ng-data/lang/roa/pt-BR",start:5267676,end:5267785},{filename:"/espeak-ng-data/lang/roa/ro",start:5267785,end:5267811},{filename:"/espeak-ng-data/lang/sai/gn",start:5267811,end:5267858},{filename:"/espeak-ng-data/lang/sem/am",start:5267858,end:5267899},{filename:"/espeak-ng-data/lang/sem/ar",start:5267899,end:5267949},{filename:"/espeak-ng-data/lang/sem/he",start:5267949,end:5267989},{filename:"/espeak-ng-data/lang/sem/mt",start:5267989,end:5268030},{filename:"/espeak-ng-data/lang/sit/cmn",start:5268030,end:5268716},{filename:"/espeak-ng-data/lang/sit/cmn-Latn-pinyin",start:5268716,end:5268877},{filename:"/espeak-ng-data/lang/sit/hak",start:5268877,end:5269005},{filename:"/espeak-ng-data/lang/sit/my",start:5269005,end:5269061},{filename:"/espeak-ng-data/lang/sit/yue",start:5269061,end:5269255},{filename:"/espeak-ng-data/lang/sit/yue-Latn-jyutping",start:5269255,end:5269468},{filename:"/espeak-ng-data/lang/tai/shn",start:5269468,end:5269560},{filename:"/espeak-ng-data/lang/tai/th",start:5269560,end:5269597},{filename:"/espeak-ng-data/lang/trk/az",start:5269597,end:5269642},{filename:"/espeak-ng-data/lang/trk/ba",start:5269642,end:5269667},{filename:"/espeak-ng-data/lang/trk/cv",start:5269667,end:5269707},{filename:"/espeak-ng-data/lang/trk/kk",start:5269707,end:5269747},{filename:"/espeak-ng-data/lang/trk/ky",start:5269747,end:5269790},{filename:"/espeak-ng-data/lang/trk/nog",start:5269790,end:5269829},{filename:"/espeak-ng-data/lang/trk/tk",start:5269829,end:5269854},{filename:"/espeak-ng-data/lang/trk/tr",start:5269854,end:5269879},{filename:"/espeak-ng-data/lang/trk/tt",start:5269879,end:5269902},{filename:"/espeak-ng-data/lang/trk/ug",start:5269902,end:5269926},{filename:"/espeak-ng-data/lang/trk/uz",start:5269926,end:5269965},{filename:"/espeak-ng-data/lang/urj/et",start:5269965,end:5270202},{filename:"/espeak-ng-data/lang/urj/fi",start:5270202,end:5270439},{filename:"/espeak-ng-data/lang/urj/hu",start:5270439,end:5270512},{filename:"/espeak-ng-data/lang/urj/smj",start:5270512,end:5270557},{filename:"/espeak-ng-data/lang/zle/be",start:5270557,end:5270609},{filename:"/espeak-ng-data/lang/zle/ru",start:5270609,end:5270666},{filename:"/espeak-ng-data/lang/zle/ru-LV",start:5270666,end:5270946},{filename:"/espeak-ng-data/lang/zle/ru-cl",start:5270946,end:5271037},{filename:"/espeak-ng-data/lang/zle/uk",start:5271037,end:5271134},{filename:"/espeak-ng-data/lang/zls/bg",start:5271134,end:5271245},{filename:"/espeak-ng-data/lang/zls/bs",start:5271245,end:5271475},{filename:"/espeak-ng-data/lang/zls/hr",start:5271475,end:5271737},{filename:"/espeak-ng-data/lang/zls/mk",start:5271737,end:5271765},{filename:"/espeak-ng-data/lang/zls/sl",start:5271765,end:5271808},{filename:"/espeak-ng-data/lang/zls/sr",start:5271808,end:5272058},{filename:"/espeak-ng-data/lang/zlw/cs",start:5272058,end:5272081},{filename:"/espeak-ng-data/lang/zlw/pl",start:5272081,end:5272119},{filename:"/espeak-ng-data/lang/zlw/sk",start:5272119,end:5272143},{filename:"/espeak-ng-data/lb_dict",start:5272143,end:5960074},{filename:"/espeak-ng-data/lfn_dict",start:5960074,end:5962867},{filename:"/espeak-ng-data/lt_dict",start:5962867,end:6012757},{filename:"/espeak-ng-data/lv_dict",start:6012757,end:6079094},{filename:"/espeak-ng-data/mbrola_ph/af1_phtrans",start:6079094,end:6080730},{filename:"/espeak-ng-data/mbrola_ph/ar1_phtrans",start:6080730,end:6082342},{filename:"/espeak-ng-data/mbrola_ph/ar2_phtrans",start:6082342,end:6083954},{filename:"/espeak-ng-data/mbrola_ph/ca_phtrans",start:6083954,end:6085950},{filename:"/espeak-ng-data/mbrola_ph/cmn_phtrans",start:6085950,end:6087442},{filename:"/espeak-ng-data/mbrola_ph/cr1_phtrans",start:6087442,end:6089606},{filename:"/espeak-ng-data/mbrola_ph/cs_phtrans",start:6089606,end:6090186},{filename:"/espeak-ng-data/mbrola_ph/de2_phtrans",start:6090186,end:6091918},{filename:"/espeak-ng-data/mbrola_ph/de4_phtrans",start:6091918,end:6093722},{filename:"/espeak-ng-data/mbrola_ph/de6_phtrans",start:6093722,end:6095118},{filename:"/espeak-ng-data/mbrola_ph/de8_phtrans",start:6095118,end:6096274},{filename:"/espeak-ng-data/mbrola_ph/ee1_phtrans",start:6096274,end:6097718},{filename:"/espeak-ng-data/mbrola_ph/en1_phtrans",start:6097718,end:6098514},{filename:"/espeak-ng-data/mbrola_ph/es3_phtrans",start:6098514,end:6099574},{filename:"/espeak-ng-data/mbrola_ph/es4_phtrans",start:6099574,end:6100682},{filename:"/espeak-ng-data/mbrola_ph/es_phtrans",start:6100682,end:6102414},{filename:"/espeak-ng-data/mbrola_ph/fr_phtrans",start:6102414,end:6104386},{filename:"/espeak-ng-data/mbrola_ph/gr1_phtrans",start:6104386,end:6106598},{filename:"/espeak-ng-data/mbrola_ph/gr2_phtrans",start:6106598,end:6108810},{filename:"/espeak-ng-data/mbrola_ph/grc-de6_phtrans",start:6108810,end:6109294},{filename:"/espeak-ng-data/mbrola_ph/he_phtrans",start:6109294,end:6110042},{filename:"/espeak-ng-data/mbrola_ph/hn1_phtrans",start:6110042,end:6110574},{filename:"/espeak-ng-data/mbrola_ph/hu1_phtrans",start:6110574,end:6112018},{filename:"/espeak-ng-data/mbrola_ph/ic1_phtrans",start:6112018,end:6113150},{filename:"/espeak-ng-data/mbrola_ph/id1_phtrans",start:6113150,end:6114858},{filename:"/espeak-ng-data/mbrola_ph/in_phtrans",start:6114858,end:6116302},{filename:"/espeak-ng-data/mbrola_ph/ir1_phtrans",start:6116302,end:6122114},{filename:"/espeak-ng-data/mbrola_ph/it1_phtrans",start:6122114,end:6123438},{filename:"/espeak-ng-data/mbrola_ph/it3_phtrans",start:6123438,end:6124330},{filename:"/espeak-ng-data/mbrola_ph/jp_phtrans",start:6124330,end:6125366},{filename:"/espeak-ng-data/mbrola_ph/la1_phtrans",start:6125366,end:6126114},{filename:"/espeak-ng-data/mbrola_ph/lt_phtrans",start:6126114,end:6127174},{filename:"/espeak-ng-data/mbrola_ph/ma1_phtrans",start:6127174,end:6128114},{filename:"/espeak-ng-data/mbrola_ph/mx1_phtrans",start:6128114,end:6129918},{filename:"/espeak-ng-data/mbrola_ph/mx2_phtrans",start:6129918,end:6131746},{filename:"/espeak-ng-data/mbrola_ph/nl_phtrans",start:6131746,end:6133430},{filename:"/espeak-ng-data/mbrola_ph/nz1_phtrans",start:6133430,end:6134154},{filename:"/espeak-ng-data/mbrola_ph/pl1_phtrans",start:6134154,end:6135742},{filename:"/espeak-ng-data/mbrola_ph/pt1_phtrans",start:6135742,end:6137834},{filename:"/espeak-ng-data/mbrola_ph/ptbr4_phtrans",start:6137834,end:6140190},{filename:"/espeak-ng-data/mbrola_ph/ptbr_phtrans",start:6140190,end:6142714},{filename:"/espeak-ng-data/mbrola_ph/ro1_phtrans",start:6142714,end:6144878},{filename:"/espeak-ng-data/mbrola_ph/sv2_phtrans",start:6144878,end:6146466},{filename:"/espeak-ng-data/mbrola_ph/sv_phtrans",start:6146466,end:6148054},{filename:"/espeak-ng-data/mbrola_ph/tl1_phtrans",start:6148054,end:6148826},{filename:"/espeak-ng-data/mbrola_ph/tr1_phtrans",start:6148826,end:6149190},{filename:"/espeak-ng-data/mbrola_ph/us3_phtrans",start:6149190,end:6150346},{filename:"/espeak-ng-data/mbrola_ph/us_phtrans",start:6150346,end:6151574},{filename:"/espeak-ng-data/mbrola_ph/vz_phtrans",start:6151574,end:6153858},{filename:"/espeak-ng-data/mi_dict",start:6153858,end:6155204},{filename:"/espeak-ng-data/mk_dict",start:6155204,end:6219063},{filename:"/espeak-ng-data/ml_dict",start:6219063,end:6311408},{filename:"/espeak-ng-data/mr_dict",start:6311408,end:6398799},{filename:"/espeak-ng-data/ms_dict",start:6398799,end:6452340},{filename:"/espeak-ng-data/mt_dict",start:6452340,end:6456724},{filename:"/espeak-ng-data/mto_dict",start:6456724,end:6460684},{filename:"/espeak-ng-data/my_dict",start:6460684,end:6556632},{filename:"/espeak-ng-data/nci_dict",start:6556632,end:6558166},{filename:"/espeak-ng-data/ne_dict",start:6558166,end:6653543},{filename:"/espeak-ng-data/nl_dict",start:6653543,end:6719522},{filename:"/espeak-ng-data/no_dict",start:6719522,end:6723700},{filename:"/espeak-ng-data/nog_dict",start:6723700,end:6726994},{filename:"/espeak-ng-data/om_dict",start:6726994,end:6729296},{filename:"/espeak-ng-data/or_dict",start:6729296,end:6818542},{filename:"/espeak-ng-data/pa_dict",start:6818542,end:6898495},{filename:"/espeak-ng-data/pap_dict",start:6898495,end:6900623},{filename:"/espeak-ng-data/phondata",start:6900623,end:7451047},{filename:"/espeak-ng-data/phondata-manifest",start:7451047,end:7472868},{filename:"/espeak-ng-data/phonindex",start:7472868,end:7511942},{filename:"/espeak-ng-data/phontab",start:7511942,end:7567738},{filename:"/espeak-ng-data/piqd_dict",start:7567738,end:7569448},{filename:"/espeak-ng-data/pl_dict",start:7569448,end:7646178},{filename:"/espeak-ng-data/pt_dict",start:7646178,end:7713995},{filename:"/espeak-ng-data/py_dict",start:7713995,end:7716404},{filename:"/espeak-ng-data/qdb_dict",start:7716404,end:7719432},{filename:"/espeak-ng-data/qu_dict",start:7719432,end:7721351},{filename:"/espeak-ng-data/quc_dict",start:7721351,end:7722801},{filename:"/espeak-ng-data/qya_dict",start:7722801,end:7724740},{filename:"/espeak-ng-data/ro_dict",start:7724740,end:7793278},{filename:"/espeak-ng-data/ru_dict",start:7793278,end:16325670},{filename:"/espeak-ng-data/sd_dict",start:16325670,end:16385598},{filename:"/espeak-ng-data/shn_dict",start:16385598,end:16473770},{filename:"/espeak-ng-data/si_dict",start:16473770,end:16559154},{filename:"/espeak-ng-data/sjn_dict",start:16559154,end:16560937},{filename:"/espeak-ng-data/sk_dict",start:16560937,end:16610939},{filename:"/espeak-ng-data/sl_dict",start:16610939,end:16655986},{filename:"/espeak-ng-data/smj_dict",start:16655986,end:16691081},{filename:"/espeak-ng-data/sq_dict",start:16691081,end:16736084},{filename:"/espeak-ng-data/sr_dict",start:16736084,end:16782916},{filename:"/espeak-ng-data/sv_dict",start:16782916,end:16830752},{filename:"/espeak-ng-data/sw_dict",start:16830752,end:16878556},{filename:"/espeak-ng-data/ta_dict",start:16878556,end:17088109},{filename:"/espeak-ng-data/te_dict",start:17088109,end:17182946},{filename:"/espeak-ng-data/th_dict",start:17182946,end:17185247},{filename:"/espeak-ng-data/tk_dict",start:17185247,end:17206115},{filename:"/espeak-ng-data/tn_dict",start:17206115,end:17209187},{filename:"/espeak-ng-data/tr_dict",start:17209187,end:17255980},{filename:"/espeak-ng-data/tt_dict",start:17255980,end:17258101},{filename:"/espeak-ng-data/ug_dict",start:17258101,end:17260171},{filename:"/espeak-ng-data/uk_dict",start:17260171,end:17263663},{filename:"/espeak-ng-data/ur_dict",start:17263663,end:17397219},{filename:"/espeak-ng-data/uz_dict",start:17397219,end:17399759},{filename:"/espeak-ng-data/vi_dict",start:17399759,end:17452367},{filename:"/espeak-ng-data/voices/!v/Alex",start:17452367,end:17452495},{filename:"/espeak-ng-data/voices/!v/Alicia",start:17452495,end:17452969},{filename:"/espeak-ng-data/voices/!v/Andrea",start:17452969,end:17453326},{filename:"/espeak-ng-data/voices/!v/Andy",start:17453326,end:17453646},{filename:"/espeak-ng-data/voices/!v/Annie",start:17453646,end:17453961},{filename:"/espeak-ng-data/voices/!v/AnxiousAndy",start:17453961,end:17454322},{filename:"/espeak-ng-data/voices/!v/Demonic",start:17454322,end:17458180},{filename:"/espeak-ng-data/voices/!v/Denis",start:17458180,end:17458485},{filename:"/espeak-ng-data/voices/!v/Diogo",start:17458485,end:17458864},{filename:"/espeak-ng-data/voices/!v/Gene",start:17458864,end:17459145},{filename:"/espeak-ng-data/voices/!v/Gene2",start:17459145,end:17459428},{filename:"/espeak-ng-data/voices/!v/Henrique",start:17459428,end:17459809},{filename:"/espeak-ng-data/voices/!v/Hugo",start:17459809,end:17460187},{filename:"/espeak-ng-data/voices/!v/Jacky",start:17460187,end:17460454},{filename:"/espeak-ng-data/voices/!v/Lee",start:17460454,end:17460792},{filename:"/espeak-ng-data/voices/!v/Marco",start:17460792,end:17461259},{filename:"/espeak-ng-data/voices/!v/Mario",start:17461259,end:17461529},{filename:"/espeak-ng-data/voices/!v/Michael",start:17461529,end:17461799},{filename:"/espeak-ng-data/voices/!v/Mike",start:17461799,end:17461911},{filename:"/espeak-ng-data/voices/!v/Mr serious",start:17461911,end:17465104},{filename:"/espeak-ng-data/voices/!v/Nguyen",start:17465104,end:17465384},{filename:"/espeak-ng-data/voices/!v/Reed",start:17465384,end:17465586},{filename:"/espeak-ng-data/voices/!v/RicishayMax",start:17465586,end:17465819},{filename:"/espeak-ng-data/voices/!v/RicishayMax2",start:17465819,end:17466254},{filename:"/espeak-ng-data/voices/!v/RicishayMax3",start:17466254,end:17466689},{filename:"/espeak-ng-data/voices/!v/Storm",start:17466689,end:17467109},{filename:"/espeak-ng-data/voices/!v/Tweaky",start:17467109,end:17470298},{filename:"/espeak-ng-data/voices/!v/UniRobot",start:17470298,end:17470715},{filename:"/espeak-ng-data/voices/!v/adam",start:17470715,end:17470790},{filename:"/espeak-ng-data/voices/!v/anika",start:17470790,end:17471283},{filename:"/espeak-ng-data/voices/!v/anikaRobot",start:17471283,end:17471795},{filename:"/espeak-ng-data/voices/!v/announcer",start:17471795,end:17472095},{filename:"/espeak-ng-data/voices/!v/antonio",start:17472095,end:17472476},{filename:"/espeak-ng-data/voices/!v/aunty",start:17472476,end:17472834},{filename:"/espeak-ng-data/voices/!v/belinda",start:17472834,end:17473174},{filename:"/espeak-ng-data/voices/!v/benjamin",start:17473174,end:17473375},{filename:"/espeak-ng-data/voices/!v/boris",start:17473375,end:17473599},{filename:"/espeak-ng-data/voices/!v/caleb",start:17473599,end:17473656},{filename:"/espeak-ng-data/voices/!v/croak",start:17473656,end:17473749},{filename:"/espeak-ng-data/voices/!v/david",start:17473749,end:17473861},{filename:"/espeak-ng-data/voices/!v/ed",start:17473861,end:17474148},{filename:"/espeak-ng-data/voices/!v/edward",start:17474148,end:17474299},{filename:"/espeak-ng-data/voices/!v/edward2",start:17474299,end:17474451},{filename:"/espeak-ng-data/voices/!v/f1",start:17474451,end:17474775},{filename:"/espeak-ng-data/voices/!v/f2",start:17474775,end:17475132},{filename:"/espeak-ng-data/voices/!v/f3",start:17475132,end:17475507},{filename:"/espeak-ng-data/voices/!v/f4",start:17475507,end:17475857},{filename:"/espeak-ng-data/voices/!v/f5",start:17475857,end:17476289},{filename:"/espeak-ng-data/voices/!v/fast",start:17476289,end:17476438},{filename:"/espeak-ng-data/voices/!v/grandma",start:17476438,end:17476701},{filename:"/espeak-ng-data/voices/!v/grandpa",start:17476701,end:17476957},{filename:"/espeak-ng-data/voices/!v/gustave",start:17476957,end:17477210},{filename:"/espeak-ng-data/voices/!v/ian",start:17477210,end:17480378},{filename:"/espeak-ng-data/voices/!v/iven",start:17480378,end:17480639},{filename:"/espeak-ng-data/voices/!v/iven2",start:17480639,end:17480918},{filename:"/espeak-ng-data/voices/!v/iven3",start:17480918,end:17481180},{filename:"/espeak-ng-data/voices/!v/iven4",start:17481180,end:17481441},{filename:"/espeak-ng-data/voices/!v/john",start:17481441,end:17484627},{filename:"/espeak-ng-data/voices/!v/kaukovalta",start:17484627,end:17484988},{filename:"/espeak-ng-data/voices/!v/klatt",start:17484988,end:17485026},{filename:"/espeak-ng-data/voices/!v/klatt2",start:17485026,end:17485064},{filename:"/espeak-ng-data/voices/!v/klatt3",start:17485064,end:17485103},{filename:"/espeak-ng-data/voices/!v/klatt4",start:17485103,end:17485142},{filename:"/espeak-ng-data/voices/!v/klatt5",start:17485142,end:17485181},{filename:"/espeak-ng-data/voices/!v/klatt6",start:17485181,end:17485220},{filename:"/espeak-ng-data/voices/!v/linda",start:17485220,end:17485570},{filename:"/espeak-ng-data/voices/!v/m1",start:17485570,end:17485905},{filename:"/espeak-ng-data/voices/!v/m2",start:17485905,end:17486169},{filename:"/espeak-ng-data/voices/!v/m3",start:17486169,end:17486469},{filename:"/espeak-ng-data/voices/!v/m4",start:17486469,end:17486759},{filename:"/espeak-ng-data/voices/!v/m5",start:17486759,end:17487021},{filename:"/espeak-ng-data/voices/!v/m6",start:17487021,end:17487209},{filename:"/espeak-ng-data/voices/!v/m7",start:17487209,end:17487463},{filename:"/espeak-ng-data/voices/!v/m8",start:17487463,end:17487747},{filename:"/espeak-ng-data/voices/!v/marcelo",start:17487747,end:17487998},{filename:"/espeak-ng-data/voices/!v/max",start:17487998,end:17488223},{filename:"/espeak-ng-data/voices/!v/michel",start:17488223,end:17488627},{filename:"/espeak-ng-data/voices/!v/miguel",start:17488627,end:17489009},{filename:"/espeak-ng-data/voices/!v/mike2",start:17489009,end:17489197},{filename:"/espeak-ng-data/voices/!v/norbert",start:17489197,end:17492386},{filename:"/espeak-ng-data/voices/!v/pablo",start:17492386,end:17495528},{filename:"/espeak-ng-data/voices/!v/paul",start:17495528,end:17495812},{filename:"/espeak-ng-data/voices/!v/pedro",start:17495812,end:17496164},{filename:"/espeak-ng-data/voices/!v/quincy",start:17496164,end:17496518},{filename:"/espeak-ng-data/voices/!v/rob",start:17496518,end:17496783},{filename:"/espeak-ng-data/voices/!v/robert",start:17496783,end:17497057},{filename:"/espeak-ng-data/voices/!v/robosoft",start:17497057,end:17497508},{filename:"/espeak-ng-data/voices/!v/robosoft2",start:17497508,end:17497962},{filename:"/espeak-ng-data/voices/!v/robosoft3",start:17497962,end:17498417},{filename:"/espeak-ng-data/voices/!v/robosoft4",start:17498417,end:17498864},{filename:"/espeak-ng-data/voices/!v/robosoft5",start:17498864,end:17499309},{filename:"/espeak-ng-data/voices/!v/robosoft6",start:17499309,end:17499596},{filename:"/espeak-ng-data/voices/!v/robosoft7",start:17499596,end:17500006},{filename:"/espeak-ng-data/voices/!v/robosoft8",start:17500006,end:17500249},{filename:"/espeak-ng-data/voices/!v/sandro",start:17500249,end:17500779},{filename:"/espeak-ng-data/voices/!v/shelby",start:17500779,end:17501059},{filename:"/espeak-ng-data/voices/!v/steph",start:17501059,end:17501423},{filename:"/espeak-ng-data/voices/!v/steph2",start:17501423,end:17501790},{filename:"/espeak-ng-data/voices/!v/steph3",start:17501790,end:17502167},{filename:"/espeak-ng-data/voices/!v/travis",start:17502167,end:17502550},{filename:"/espeak-ng-data/voices/!v/victor",start:17502550,end:17502803},{filename:"/espeak-ng-data/voices/!v/whisper",start:17502803,end:17502989},{filename:"/espeak-ng-data/voices/!v/whisperf",start:17502989,end:17503381},{filename:"/espeak-ng-data/voices/!v/zac",start:17503381,end:17503656},{filename:"/espeak-ng-data/voices/mb/mb-af1",start:17503656,end:17503744},{filename:"/espeak-ng-data/voices/mb/mb-af1-en",start:17503744,end:17503827},{filename:"/espeak-ng-data/voices/mb/mb-ar1",start:17503827,end:17503911},{filename:"/espeak-ng-data/voices/mb/mb-ar2",start:17503911,end:17503995},{filename:"/espeak-ng-data/voices/mb/mb-br1",start:17503995,end:17504127},{filename:"/espeak-ng-data/voices/mb/mb-br2",start:17504127,end:17504263},{filename:"/espeak-ng-data/voices/mb/mb-br3",start:17504263,end:17504395},{filename:"/espeak-ng-data/voices/mb/mb-br4",start:17504395,end:17504531},{filename:"/espeak-ng-data/voices/mb/mb-ca1",start:17504531,end:17504636},{filename:"/espeak-ng-data/voices/mb/mb-ca2",start:17504636,end:17504741},{filename:"/espeak-ng-data/voices/mb/mb-cn1",start:17504741,end:17504833},{filename:"/espeak-ng-data/voices/mb/mb-cr1",start:17504833,end:17504944},{filename:"/espeak-ng-data/voices/mb/mb-cz1",start:17504944,end:17505014},{filename:"/espeak-ng-data/voices/mb/mb-cz2",start:17505014,end:17505096},{filename:"/espeak-ng-data/voices/mb/mb-de1",start:17505096,end:17505240},{filename:"/espeak-ng-data/voices/mb/mb-de1-en",start:17505240,end:17505336},{filename:"/espeak-ng-data/voices/mb/mb-de2",start:17505336,end:17505464},{filename:"/espeak-ng-data/voices/mb/mb-de2-en",start:17505464,end:17505544},{filename:"/espeak-ng-data/voices/mb/mb-de3",start:17505544,end:17505643},{filename:"/espeak-ng-data/voices/mb/mb-de3-en",start:17505643,end:17505739},{filename:"/espeak-ng-data/voices/mb/mb-de4",start:17505739,end:17505868},{filename:"/espeak-ng-data/voices/mb/mb-de4-en",start:17505868,end:17505949},{filename:"/espeak-ng-data/voices/mb/mb-de5",start:17505949,end:17506185},{filename:"/espeak-ng-data/voices/mb/mb-de5-en",start:17506185,end:17506275},{filename:"/espeak-ng-data/voices/mb/mb-de6",start:17506275,end:17506397},{filename:"/espeak-ng-data/voices/mb/mb-de6-en",start:17506397,end:17506471},{filename:"/espeak-ng-data/voices/mb/mb-de6-grc",start:17506471,end:17506554},{filename:"/espeak-ng-data/voices/mb/mb-de7",start:17506554,end:17506704},{filename:"/espeak-ng-data/voices/mb/mb-de8",start:17506704,end:17506775},{filename:"/espeak-ng-data/voices/mb/mb-ee1",start:17506775,end:17506872},{filename:"/espeak-ng-data/voices/mb/mb-en1",start:17506872,end:17507003},{filename:"/espeak-ng-data/voices/mb/mb-es1",start:17507003,end:17507117},{filename:"/espeak-ng-data/voices/mb/mb-es2",start:17507117,end:17507225},{filename:"/espeak-ng-data/voices/mb/mb-es3",start:17507225,end:17507329},{filename:"/espeak-ng-data/voices/mb/mb-es4",start:17507329,end:17507417},{filename:"/espeak-ng-data/voices/mb/mb-fr1",start:17507417,end:17507583},{filename:"/espeak-ng-data/voices/mb/mb-fr1-en",start:17507583,end:17507687},{filename:"/espeak-ng-data/voices/mb/mb-fr2",start:17507687,end:17507790},{filename:"/espeak-ng-data/voices/mb/mb-fr3",start:17507790,end:17507890},{filename:"/espeak-ng-data/voices/mb/mb-fr4",start:17507890,end:17508017},{filename:"/espeak-ng-data/voices/mb/mb-fr4-en",start:17508017,end:17508124},{filename:"/espeak-ng-data/voices/mb/mb-fr5",start:17508124,end:17508224},{filename:"/espeak-ng-data/voices/mb/mb-fr6",start:17508224,end:17508324},{filename:"/espeak-ng-data/voices/mb/mb-fr7",start:17508324,end:17508407},{filename:"/espeak-ng-data/voices/mb/mb-gr1",start:17508407,end:17508501},{filename:"/espeak-ng-data/voices/mb/mb-gr2",start:17508501,end:17508595},{filename:"/espeak-ng-data/voices/mb/mb-gr2-en",start:17508595,end:17508683},{filename:"/espeak-ng-data/voices/mb/mb-hb1",start:17508683,end:17508751},{filename:"/espeak-ng-data/voices/mb/mb-hb2",start:17508751,end:17508834},{filename:"/espeak-ng-data/voices/mb/mb-hu1",start:17508834,end:17508936},{filename:"/espeak-ng-data/voices/mb/mb-hu1-en",start:17508936,end:17509033},{filename:"/espeak-ng-data/voices/mb/mb-ic1",start:17509033,end:17509121},{filename:"/espeak-ng-data/voices/mb/mb-id1",start:17509121,end:17509222},{filename:"/espeak-ng-data/voices/mb/mb-in1",start:17509222,end:17509291},{filename:"/espeak-ng-data/voices/mb/mb-in2",start:17509291,end:17509376},{filename:"/espeak-ng-data/voices/mb/mb-ir1",start:17509376,end:17510129},{filename:"/espeak-ng-data/voices/mb/mb-it1",start:17510129,end:17510213},{filename:"/espeak-ng-data/voices/mb/mb-it2",start:17510213,end:17510300},{filename:"/espeak-ng-data/voices/mb/mb-it3",start:17510300,end:17510442},{filename:"/espeak-ng-data/voices/mb/mb-it4",start:17510442,end:17510587},{filename:"/espeak-ng-data/voices/mb/mb-jp1",start:17510587,end:17510658},{filename:"/espeak-ng-data/voices/mb/mb-jp2",start:17510658,end:17510759},{filename:"/espeak-ng-data/voices/mb/mb-jp3",start:17510759,end:17510846},{filename:"/espeak-ng-data/voices/mb/mb-la1",start:17510846,end:17510929},{filename:"/espeak-ng-data/voices/mb/mb-lt1",start:17510929,end:17511016},{filename:"/espeak-ng-data/voices/mb/mb-lt2",start:17511016,end:17511103},{filename:"/espeak-ng-data/voices/mb/mb-ma1",start:17511103,end:17511201},{filename:"/espeak-ng-data/voices/mb/mb-mx1",start:17511201,end:17511321},{filename:"/espeak-ng-data/voices/mb/mb-mx2",start:17511321,end:17511441},{filename:"/espeak-ng-data/voices/mb/mb-nl1",start:17511441,end:17511510},{filename:"/espeak-ng-data/voices/mb/mb-nl2",start:17511510,end:17511606},{filename:"/espeak-ng-data/voices/mb/mb-nl2-en",start:17511606,end:17511697},{filename:"/espeak-ng-data/voices/mb/mb-nl3",start:17511697,end:17511782},{filename:"/espeak-ng-data/voices/mb/mb-nz1",start:17511782,end:17511850},{filename:"/espeak-ng-data/voices/mb/mb-pl1",start:17511850,end:17511949},{filename:"/espeak-ng-data/voices/mb/mb-pl1-en",start:17511949,end:17512031},{filename:"/espeak-ng-data/voices/mb/mb-pt1",start:17512031,end:17512162},{filename:"/espeak-ng-data/voices/mb/mb-ro1",start:17512162,end:17512249},{filename:"/espeak-ng-data/voices/mb/mb-ro1-en",start:17512249,end:17512330},{filename:"/espeak-ng-data/voices/mb/mb-sw1",start:17512330,end:17512428},{filename:"/espeak-ng-data/voices/mb/mb-sw1-en",start:17512428,end:17512521},{filename:"/espeak-ng-data/voices/mb/mb-sw2",start:17512521,end:17512623},{filename:"/espeak-ng-data/voices/mb/mb-sw2-en",start:17512623,end:17512722},{filename:"/espeak-ng-data/voices/mb/mb-tl1",start:17512722,end:17512807},{filename:"/espeak-ng-data/voices/mb/mb-tr1",start:17512807,end:17512892},{filename:"/espeak-ng-data/voices/mb/mb-tr2",start:17512892,end:17513006},{filename:"/espeak-ng-data/voices/mb/mb-us1",start:17513006,end:17513176},{filename:"/espeak-ng-data/voices/mb/mb-us2",start:17513176,end:17513354},{filename:"/espeak-ng-data/voices/mb/mb-us3",start:17513354,end:17513534},{filename:"/espeak-ng-data/voices/mb/mb-vz1",start:17513534,end:17513678},{filename:"/espeak-ng-data/yue_dict",start:17513678,end:18077249}],remote_package_size:18077249})}();var A=Object.assign({},R),q=[],Y="./this.program",E=(x,c)=>{throw c},O=typeof window=="object",N=typeof importScripts=="function",W=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",I="";function z(x){if(R.locateFile)return R.locateFile(x,I);return I+x}var j,P,F;if(W){var v=()=>({}),S=(K5(),C6(b$));if(N)I=S.dirname(I)+"/";else I=H5+"/";if(j=(x,c)=>{return x=mJ(x)?new URL(x):S.normalize(x),v.readFileSync(x,c?void 0:"utf8")},F=(x)=>{var c=j(x,!0);if(!c.buffer)c=new Uint8Array(c);return c},P=(x,c,s,r=!0)=>{x=mJ(x)?new URL(x):S.normalize(x),v.readFile(x,r?void 0:"utf8",(KJ,YJ)=>{if(KJ)s(KJ);else c(r?YJ.buffer:YJ)})},!R.thisProgram&&process.argv.length>1)Y=process.argv[1].replace(/\\/g,"/");q=process.argv.slice(2),E=(x,c)=>{throw process.exitCode=x,c},R.inspect=()=>"[Emscripten Module object]"}else if(O||N){if(N)I=self.location.href;else if(typeof document!="undefined"&&document.currentScript)I=document.currentScript.src;if(l)I=l;if(I.indexOf("blob:")!==0)I=I.substr(0,I.replace(/[?#].*/,"").lastIndexOf("/")+1);else I="";{if(j=(x)=>{var c=new XMLHttpRequest;return c.open("GET",x,!1),c.send(null),c.responseText},N)F=(x)=>{var c=new XMLHttpRequest;return c.open("GET",x,!1),c.responseType="arraybuffer",c.send(null),new Uint8Array(c.response)};P=(x,c,s)=>{var r=new XMLHttpRequest;r.open("GET",x,!0),r.responseType="arraybuffer",r.onload=()=>{if(r.status==200||r.status==0&&r.response){c(r.response);return}s()},r.onerror=s,r.send(null)}}}var w=R.print||console.log.bind(console),y=R.printErr||console.error.bind(console);if(Object.assign(R,A),A=null,R.arguments)q=R.arguments;if(R.thisProgram)Y=R.thisProgram;if(R.quit)E=R.quit;var m;if(R.wasmBinary)m=R.wasmBinary;if(typeof WebAssembly!="object")$J("no native wasm support detected");var i,JJ=!1,VJ;function HJ(x,c){if(!x)$J(c)}var o,jJ,J,V,Z,$,X,U;function H(){var x=i.buffer;R.HEAP8=o=new Int8Array(x),R.HEAP16=J=new Int16Array(x),R.HEAPU8=jJ=new Uint8Array(x),R.HEAPU16=V=new Uint16Array(x),R.HEAP32=Z=new Int32Array(x),R.HEAPU32=$=new Uint32Array(x),R.HEAPF32=X=new Float32Array(x),R.HEAPF64=U=new Float64Array(x)}var G=[],Q=[],K=[],k=[],L=!1;function _(){if(R.preRun){if(typeof R.preRun=="function")R.preRun=[R.preRun];while(R.preRun.length)n(R.preRun.shift())}d(G)}function t(){if(L=!0,!R.noFSInit&&!f.init.initialized)f.init();f.ignorePermissions=!1,WQ.init(),d(Q)}function QJ(){d(K)}function GJ(){if(R.postRun){if(typeof R.postRun=="function")R.postRun=[R.postRun];while(R.postRun.length)e(R.postRun.shift())}d(k)}function n(x){G.unshift(x)}function p(x){Q.unshift(x)}function e(x){k.unshift(x)}var PJ=0,XJ=null,WJ=null;function b(x){return x}function C(x){if(PJ++,R.monitorRunDependencies)R.monitorRunDependencies(PJ)}function h(x){if(PJ--,R.monitorRunDependencies)R.monitorRunDependencies(PJ);if(PJ==0){if(XJ!==null)clearInterval(XJ),XJ=null;if(WJ){var c=WJ;WJ=null,c()}}}function $J(x){if(R.onAbort)R.onAbort(x);x="Aborted("+x+")",y(x),JJ=!0,VJ=1,x+=". Build with -sASSERTIONS for more info.";var c=new WebAssembly.RuntimeError(x);throw B(c),c}var qJ="data:application/octet-stream;base64,",ZJ=(x)=>x.startsWith(qJ),mJ=(x)=>x.startsWith("file://"),BJ;if(BJ="piper_phonemize.wasm",!ZJ(BJ))BJ=z(BJ);function TJ(x){if(x==BJ&&m)return new Uint8Array(m);if(F)return F(x);throw"both async and sync fetching of the wasm failed"}function dJ(x){if(!m&&(O||N)){if(typeof fetch=="function"&&!mJ(x))return fetch(x,{credentials:"same-origin"}).then((c)=>{if(!c.ok)throw"failed to load wasm binary file at '"+x+"'";return c.arrayBuffer()}).catch(()=>TJ(x));else if(P)return new Promise((c,s)=>{P(x,(r)=>c(new Uint8Array(r)),s)})}return Promise.resolve().then(()=>TJ(x))}function LJ(x,c,s){return dJ(x).then((r)=>WebAssembly.instantiate(r,c)).then((r)=>r).then(s,(r)=>{y(`failed to asynchronously prepare wasm: ${r}`),$J(r)})}function IJ(x,c,s,r){if(!x&&typeof WebAssembly.instantiateStreaming=="function"&&!ZJ(c)&&!mJ(c)&&!W&&typeof fetch=="function")return fetch(c,{credentials:"same-origin"}).then((KJ)=>{var YJ=WebAssembly.instantiateStreaming(KJ,s);return YJ.then(r,function(DJ){return y(`wasm streaming compile failed: ${DJ}`),y("falling back to ArrayBuffer instantiation"),LJ(c,s,r)})});return LJ(c,s,r)}function $Q(){var x={a:Q5};function c(r,KJ){return uQ=r.exports,i=uQ.w,H(),p(uQ.x),h("wasm-instantiate"),uQ}C("wasm-instantiate");function s(r){c(r.instance)}if(R.instantiateWasm)try{return R.instantiateWasm(x,c)}catch(r){y(`Module.instantiateWasm callback failed with error: ${r}`),B(r)}return IJ(m,BJ,x,s).catch(B),{}}var T,D;function u(x){this.name="ExitStatus",this.message=`Program terminated with exit(${x})`,this.status=x}var d=(x)=>{while(x.length>0)x.shift()(R)},a=R.noExitRuntime||!0,CJ=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0,UJ=(x,c,s)=>{var r=c+s,KJ=c;while(x[KJ]&&!(KJ>=r))++KJ;if(KJ-c>16&&x.buffer&&CJ)return CJ.decode(x.subarray(c,KJ));var YJ="";while(c<KJ){var DJ=x[c++];if(!(DJ&128)){YJ+=String.fromCharCode(DJ);continue}var hJ=x[c++]&63;if((DJ&224)==192){YJ+=String.fromCharCode((DJ&31)<<6|hJ);continue}var pJ=x[c++]&63;if((DJ&240)==224)DJ=(DJ&15)<<12|hJ<<6|pJ;else DJ=(DJ&7)<<18|hJ<<12|pJ<<6|x[c++]&63;if(DJ<65536)YJ+=String.fromCharCode(DJ);else{var rJ=DJ-65536;YJ+=String.fromCharCode(55296|rJ>>10,56320|rJ&1023)}}return YJ},EJ=(x,c)=>x?UJ(jJ,x,c):"",QQ=(x,c,s,r)=>{$J(`Assertion failed: ${EJ(x)}, at: `+[c?EJ(c):"unknown filename",s,r?EJ(r):"unknown function"])};function FJ(x){this.excPtr=x,this.ptr=x-24,this.set_type=function(c){$[this.ptr+4>>2]=c},this.get_type=function(){return $[this.ptr+4>>2]},this.set_destructor=function(c){$[this.ptr+8>>2]=c},this.get_destructor=function(){return $[this.ptr+8>>2]},this.set_caught=function(c){c=c?1:0,o[this.ptr+12>>0]=c},this.get_caught=function(){return o[this.ptr+12>>0]!=0},this.set_rethrown=function(c){c=c?1:0,o[this.ptr+13>>0]=c},this.get_rethrown=function(){return o[this.ptr+13>>0]!=0},this.init=function(c,s){this.set_adjusted_ptr(0),this.set_type(c),this.set_destructor(s)},this.set_adjusted_ptr=function(c){$[this.ptr+16>>2]=c},this.get_adjusted_ptr=function(){return $[this.ptr+16>>2]},this.get_exception_ptr=function(){var c=b6(this.get_type());if(c)return $[this.excPtr>>2];var s=this.get_adjusted_ptr();if(s!==0)return s;return this.excPtr}}var RJ=0,aJ=0,SJ=(x,c,s)=>{var r=new FJ(x);throw r.init(c,s),RJ=x,aJ++,RJ},xJ=(x)=>{return Z[_6()>>2]=x,x},nJ={isAbs:(x)=>x.charAt(0)==="/",splitPath:(x)=>{var c=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return c.exec(x).slice(1)},normalizeArray:(x,c)=>{var s=0;for(var r=x.length-1;r>=0;r--){var KJ=x[r];if(KJ===".")x.splice(r,1);else if(KJ==="..")x.splice(r,1),s++;else if(s)x.splice(r,1),s--}if(c)for(;s;s--)x.unshift("..");return x},normalize:(x)=>{var c=nJ.isAbs(x),s=x.substr(-1)==="/";if(x=nJ.normalizeArray(x.split("/").filter((r)=>!!r),!c).join("/"),!x&&!c)x=".";if(x&&s)x+="/";return(c?"/":"")+x},dirname:(x)=>{var c=nJ.splitPath(x),s=c[0],r=c[1];if(!s&&!r)return".";if(r)r=r.substr(0,r.length-1);return s+r},basename:(x)=>{if(x==="/")return"/";x=nJ.normalize(x),x=x.replace(/\/$/,"");var c=x.lastIndexOf("/");if(c===-1)return x;return x.substr(c+1)},join:function(){var x=Array.prototype.slice.call(arguments);return nJ.normalize(x.join("/"))},join2:(x,c)=>nJ.normalize(x+"/"+c)},AJ=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return(r)=>crypto.getRandomValues(r);else if(W)try{var x=(U5(),C6(y$)),c=x.randomFillSync;if(c)return(r)=>x.randomFillSync(r);var s=x.randomBytes;return(r)=>(r.set(s(r.byteLength)),r)}catch(r){}$J("initRandomDevice")},kJ=(x)=>(kJ=AJ())(x),ZQ={resolve:function(){var x="",c=!1;for(var s=arguments.length-1;s>=-1&&!c;s--){var r=s>=0?arguments[s]:f.cwd();if(typeof r!="string")throw new TypeError("Arguments to path.resolve must be strings");else if(!r)return"";x=r+"/"+x,c=nJ.isAbs(r)}return x=nJ.normalizeArray(x.split("/").filter((KJ)=>!!KJ),!c).join("/"),(c?"/":"")+x||"."},relative:(x,c)=>{x=ZQ.resolve(x).substr(1),c=ZQ.resolve(c).substr(1);function s(rJ){var VQ=0;for(;VQ<rJ.length;VQ++)if(rJ[VQ]!=="")break;var GQ=rJ.length-1;for(;GQ>=0;GQ--)if(rJ[GQ]!=="")break;if(VQ>GQ)return[];return rJ.slice(VQ,GQ-VQ+1)}var r=s(x.split("/")),KJ=s(c.split("/")),YJ=Math.min(r.length,KJ.length),DJ=YJ;for(var hJ=0;hJ<YJ;hJ++)if(r[hJ]!==KJ[hJ]){DJ=hJ;break}var pJ=[];for(var hJ=DJ;hJ<r.length;hJ++)pJ.push("..");return pJ=pJ.concat(KJ.slice(DJ)),pJ.join("/")}},vJ=[],MJ=(x)=>{var c=0;for(var s=0;s<x.length;++s){var r=x.charCodeAt(s);if(r<=127)c++;else if(r<=2047)c+=2;else if(r>=55296&&r<=57343)c+=4,++s;else c+=3}return c},xQ=(x,c,s,r)=>{if(!(r>0))return 0;var KJ=s,YJ=s+r-1;for(var DJ=0;DJ<x.length;++DJ){var hJ=x.charCodeAt(DJ);if(hJ>=55296&&hJ<=57343){var pJ=x.charCodeAt(++DJ);hJ=65536+((hJ&1023)<<10)|pJ&1023}if(hJ<=127){if(s>=YJ)break;c[s++]=hJ}else if(hJ<=2047){if(s+1>=YJ)break;c[s++]=192|hJ>>6,c[s++]=128|hJ&63}else if(hJ<=65535){if(s+2>=YJ)break;c[s++]=224|hJ>>12,c[s++]=128|hJ>>6&63,c[s++]=128|hJ&63}else{if(s+3>=YJ)break;c[s++]=240|hJ>>18,c[s++]=128|hJ>>12&63,c[s++]=128|hJ>>6&63,c[s++]=128|hJ&63}}return c[s]=0,s-KJ};function wJ(x,c,s){var r=s>0?s:MJ(x)+1,KJ=new Array(r),YJ=xQ(x,KJ,0,KJ.length);if(c)KJ.length=YJ;return KJ}var bJ=()=>{if(!vJ.length){var x=null;if(W){var c=256,s=Buffer.alloc(c),r=0,KJ=process.stdin.fd;try{r=v.readSync(KJ,s)}catch(YJ){if(YJ.toString().includes("EOF"))r=0;else throw YJ}if(r>0)x=s.slice(0,r).toString("utf-8");else x=null}else if(typeof window!="undefined"&&typeof window.prompt=="function"){if(x=window.prompt("Input: "),x!==null)x+="\n"}else if(typeof readline=="function"){if(x=readline(),x!==null)x+="\n"}if(!x)return null;vJ=wJ(x,!0)}return vJ.shift()},WQ={ttys:[],init(){},shutdown(){},register(x,c){WQ.ttys[x]={input:[],output:[],ops:c},f.registerDevice(x,WQ.stream_ops)},stream_ops:{open(x){var c=WQ.ttys[x.node.rdev];if(!c)throw new f.ErrnoError(43);x.tty=c,x.seekable=!1},close(x){x.tty.ops.fsync(x.tty)},fsync(x){x.tty.ops.fsync(x.tty)},read(x,c,s,r,KJ){if(!x.tty||!x.tty.ops.get_char)throw new f.ErrnoError(60);var YJ=0;for(var DJ=0;DJ<r;DJ++){var hJ;try{hJ=x.tty.ops.get_char(x.tty)}catch(pJ){throw new f.ErrnoError(29)}if(hJ===void 0&&YJ===0)throw new f.ErrnoError(6);if(hJ===null||hJ===void 0)break;YJ++,c[s+DJ]=hJ}if(YJ)x.node.timestamp=Date.now();return YJ},write(x,c,s,r,KJ){if(!x.tty||!x.tty.ops.put_char)throw new f.ErrnoError(60);try{for(var YJ=0;YJ<r;YJ++)x.tty.ops.put_char(x.tty,c[s+YJ])}catch(DJ){throw new f.ErrnoError(29)}if(r)x.node.timestamp=Date.now();return YJ}},default_tty_ops:{get_char(x){return bJ()},put_char(x,c){if(c===null||c===10)w(UJ(x.output,0)),x.output=[];else if(c!=0)x.output.push(c)},fsync(x){if(x.output&&x.output.length>0)w(UJ(x.output,0)),x.output=[]},ioctl_tcgets(x){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(x,c,s){return 0},ioctl_tiocgwinsz(x){return[24,80]}},default_tty1_ops:{put_char(x,c){if(c===null||c===10)y(UJ(x.output,0)),x.output=[];else if(c!=0)x.output.push(c)},fsync(x){if(x.output&&x.output.length>0)y(UJ(x.output,0)),x.output=[]}}},_J=(x)=>{$J()},NJ={ops_table:null,mount(x){return NJ.createNode(null,"/",16384|511,0)},createNode(x,c,s,r){if(f.isBlkdev(s)||f.isFIFO(s))throw new f.ErrnoError(63);if(!NJ.ops_table)NJ.ops_table={dir:{node:{getattr:NJ.node_ops.getattr,setattr:NJ.node_ops.setattr,lookup:NJ.node_ops.lookup,mknod:NJ.node_ops.mknod,rename:NJ.node_ops.rename,unlink:NJ.node_ops.unlink,rmdir:NJ.node_ops.rmdir,readdir:NJ.node_ops.readdir,symlink:NJ.node_ops.symlink},stream:{llseek:NJ.stream_ops.llseek}},file:{node:{getattr:NJ.node_ops.getattr,setattr:NJ.node_ops.setattr},stream:{llseek:NJ.stream_ops.llseek,read:NJ.stream_ops.read,write:NJ.stream_ops.write,allocate:NJ.stream_ops.allocate,mmap:NJ.stream_ops.mmap,msync:NJ.stream_ops.msync}},link:{node:{getattr:NJ.node_ops.getattr,setattr:NJ.node_ops.setattr,readlink:NJ.node_ops.readlink},stream:{}},chrdev:{node:{getattr:NJ.node_ops.getattr,setattr:NJ.node_ops.setattr},stream:f.chrdev_stream_ops}};var KJ=f.createNode(x,c,s,r);if(f.isDir(KJ.mode))KJ.node_ops=NJ.ops_table.dir.node,KJ.stream_ops=NJ.ops_table.dir.stream,KJ.contents={};else if(f.isFile(KJ.mode))KJ.node_ops=NJ.ops_table.file.node,KJ.stream_ops=NJ.ops_table.file.stream,KJ.usedBytes=0,KJ.contents=null;else if(f.isLink(KJ.mode))KJ.node_ops=NJ.ops_table.link.node,KJ.stream_ops=NJ.ops_table.link.stream;else if(f.isChrdev(KJ.mode))KJ.node_ops=NJ.ops_table.chrdev.node,KJ.stream_ops=NJ.ops_table.chrdev.stream;if(KJ.timestamp=Date.now(),x)x.contents[c]=KJ,x.timestamp=KJ.timestamp;return KJ},getFileDataAsTypedArray(x){if(!x.contents)return new Uint8Array(0);if(x.contents.subarray)return x.contents.subarray(0,x.usedBytes);return new Uint8Array(x.contents)},expandFileStorage(x,c){var s=x.contents?x.contents.length:0;if(s>=c)return;var r=1048576;if(c=Math.max(c,s*(s<r?2:1.125)>>>0),s!=0)c=Math.max(c,256);var KJ=x.contents;if(x.contents=new Uint8Array(c),x.usedBytes>0)x.contents.set(KJ.subarray(0,x.usedBytes),0)},resizeFileStorage(x,c){if(x.usedBytes==c)return;if(c==0)x.contents=null,x.usedBytes=0;else{var s=x.contents;if(x.contents=new Uint8Array(c),s)x.contents.set(s.subarray(0,Math.min(c,x.usedBytes)));x.usedBytes=c}},node_ops:{getattr(x){var c={};if(c.dev=f.isChrdev(x.mode)?x.id:1,c.ino=x.id,c.mode=x.mode,c.nlink=1,c.uid=0,c.gid=0,c.rdev=x.rdev,f.isDir(x.mode))c.size=4096;else if(f.isFile(x.mode))c.size=x.usedBytes;else if(f.isLink(x.mode))c.size=x.link.length;else c.size=0;return c.atime=new Date(x.timestamp),c.mtime=new Date(x.timestamp),c.ctime=new Date(x.timestamp),c.blksize=4096,c.blocks=Math.ceil(c.size/c.blksize),c},setattr(x,c){if(c.mode!==void 0)x.mode=c.mode;if(c.timestamp!==void 0)x.timestamp=c.timestamp;if(c.size!==void 0)NJ.resizeFileStorage(x,c.size)},lookup(x,c){throw f.genericErrors[44]},mknod(x,c,s,r){return NJ.createNode(x,c,s,r)},rename(x,c,s){if(f.isDir(x.mode)){var r;try{r=f.lookupNode(c,s)}catch(YJ){}if(r)for(var KJ in r.contents)throw new f.ErrnoError(55)}delete x.parent.contents[x.name],x.parent.timestamp=Date.now(),x.name=s,c.contents[s]=x,c.timestamp=x.parent.timestamp,x.parent=c},unlink(x,c){delete x.contents[c],x.timestamp=Date.now()},rmdir(x,c){var s=f.lookupNode(x,c);for(var r in s.contents)throw new f.ErrnoError(55);delete x.contents[c],x.timestamp=Date.now()},readdir(x){var c=[".",".."];for(var s in x.contents){if(!x.contents.hasOwnProperty(s))continue;c.push(s)}return c},symlink(x,c,s){var r=NJ.createNode(x,c,511|40960,0);return r.link=s,r},readlink(x){if(!f.isLink(x.mode))throw new f.ErrnoError(28);return x.link}},stream_ops:{read(x,c,s,r,KJ){var YJ=x.node.contents;if(KJ>=x.node.usedBytes)return 0;var DJ=Math.min(x.node.usedBytes-KJ,r);if(DJ>8&&YJ.subarray)c.set(YJ.subarray(KJ,KJ+DJ),s);else for(var hJ=0;hJ<DJ;hJ++)c[s+hJ]=YJ[KJ+hJ];return DJ},write(x,c,s,r,KJ,YJ){if(!r)return 0;var DJ=x.node;if(DJ.timestamp=Date.now(),c.subarray&&(!DJ.contents||DJ.contents.subarray)){if(YJ)return DJ.contents=c.subarray(s,s+r),DJ.usedBytes=r,r;else if(DJ.usedBytes===0&&KJ===0)return DJ.contents=c.slice(s,s+r),DJ.usedBytes=r,r;else if(KJ+r<=DJ.usedBytes)return DJ.contents.set(c.subarray(s,s+r),KJ),r}if(NJ.expandFileStorage(DJ,KJ+r),DJ.contents.subarray&&c.subarray)DJ.contents.set(c.subarray(s,s+r),KJ);else for(var hJ=0;hJ<r;hJ++)DJ.contents[KJ+hJ]=c[s+hJ];return DJ.usedBytes=Math.max(DJ.usedBytes,KJ+r),r},llseek(x,c,s){var r=c;if(s===1)r+=x.position;else if(s===2){if(f.isFile(x.node.mode))r+=x.node.usedBytes}if(r<0)throw new f.ErrnoError(28);return r},allocate(x,c,s){NJ.expandFileStorage(x.node,c+s),x.node.usedBytes=Math.max(x.node.usedBytes,c+s)},mmap(x,c,s,r,KJ){if(!f.isFile(x.node.mode))throw new f.ErrnoError(43);var YJ,DJ,hJ=x.node.contents;if(!(KJ&2)&&hJ.buffer===o.buffer)DJ=!1,YJ=hJ.byteOffset;else{if(s>0||s+c<hJ.length)if(hJ.subarray)hJ=hJ.subarray(s,s+c);else hJ=Array.prototype.slice.call(hJ,s,s+c);if(DJ=!0,YJ=_J(c),!YJ)throw new f.ErrnoError(48);o.set(hJ,YJ)}return{ptr:YJ,allocated:DJ}},msync(x,c,s,r,KJ){return NJ.stream_ops.write(x,c,0,r,s,!1),0}}},vQ=(x,c,s,r)=>{var KJ=!r?b(`al ${x}`):"";if(P(x,(YJ)=>{if(HJ(YJ,`Loading data file "${x}" failed (no arrayBuffer).`),c(new Uint8Array(YJ)),KJ)h(KJ)},(YJ)=>{if(s)s();else throw`Loading data file "${x}" failed.`}),KJ)C(KJ)},yJ=(x,c,s,r,KJ,YJ)=>f.createDataFile(x,c,s,r,KJ,YJ),gJ=R.preloadPlugins||[],MQ=(x,c,s,r)=>{if(typeof Browser!="undefined")Browser.init();var KJ=!1;return gJ.forEach((YJ)=>{if(KJ)return;if(YJ.canHandle(c))YJ.handle(x,c,s,r),KJ=!0}),KJ},cJ=(x,c,s,r,KJ,YJ,DJ,hJ,pJ,rJ)=>{var VQ=c?ZQ.resolve(nJ.join2(x,c)):x,GQ=b(`cp ${VQ}`);function iJ(lJ){function eJ(SQ){if(rJ)rJ();if(!hJ)yJ(x,c,SQ,r,KJ,pJ);if(YJ)YJ();h(GQ)}if(MQ(lJ,VQ,eJ,()=>{if(DJ)DJ();h(GQ)}))return;eJ(lJ)}if(C(GQ),typeof s=="string")vQ(s,(lJ)=>iJ(lJ),DJ);else iJ(s)},fJ=(x)=>{var c={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2},s=c[x];if(typeof s=="undefined")throw new Error(`Unknown file open mode: ${x}`);return s},wQ=(x,c)=>{var s=0;if(x)s|=292|73;if(c)s|=146;return s},f={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(x,c={}){if(x=ZQ.resolve(x),!x)return{path:"",node:null};var s={follow_mount:!0,recurse_count:0};if(c=Object.assign(s,c),c.recurse_count>8)throw new f.ErrnoError(32);var r=x.split("/").filter((GQ)=>!!GQ),KJ=f.root,YJ="/";for(var DJ=0;DJ<r.length;DJ++){var hJ=DJ===r.length-1;if(hJ&&c.parent)break;if(KJ=f.lookupNode(KJ,r[DJ]),YJ=nJ.join2(YJ,r[DJ]),f.isMountpoint(KJ)){if(!hJ||hJ&&c.follow_mount)KJ=KJ.mounted.root}if(!hJ||c.follow){var pJ=0;while(f.isLink(KJ.mode)){var rJ=f.readlink(YJ);YJ=ZQ.resolve(nJ.dirname(YJ),rJ);var VQ=f.lookupPath(YJ,{recurse_count:c.recurse_count+1});if(KJ=VQ.node,pJ++>40)throw new f.ErrnoError(32)}}}return{path:YJ,node:KJ}},getPath(x){var c;while(!0){if(f.isRoot(x)){var s=x.mount.mountpoint;if(!c)return s;return s[s.length-1]!=="/"?`${s}/${c}`:s+c}c=c?`${x.name}/${c}`:x.name,x=x.parent}},hashName(x,c){var s=0;for(var r=0;r<c.length;r++)s=(s<<5)-s+c.charCodeAt(r)|0;return(x+s>>>0)%f.nameTable.length},hashAddNode(x){var c=f.hashName(x.parent.id,x.name);x.name_next=f.nameTable[c],f.nameTable[c]=x},hashRemoveNode(x){var c=f.hashName(x.parent.id,x.name);if(f.nameTable[c]===x)f.nameTable[c]=x.name_next;else{var s=f.nameTable[c];while(s){if(s.name_next===x){s.name_next=x.name_next;break}s=s.name_next}}},lookupNode(x,c){var s=f.mayLookup(x);if(s)throw new f.ErrnoError(s,x);var r=f.hashName(x.id,c);for(var KJ=f.nameTable[r];KJ;KJ=KJ.name_next){var YJ=KJ.name;if(KJ.parent.id===x.id&&YJ===c)return KJ}return f.lookup(x,c)},createNode(x,c,s,r){var KJ=new f.FSNode(x,c,s,r);return f.hashAddNode(KJ),KJ},destroyNode(x){f.hashRemoveNode(x)},isRoot(x){return x===x.parent},isMountpoint(x){return!!x.mounted},isFile(x){return(x&61440)===32768},isDir(x){return(x&61440)===16384},isLink(x){return(x&61440)===40960},isChrdev(x){return(x&61440)===8192},isBlkdev(x){return(x&61440)===24576},isFIFO(x){return(x&61440)===4096},isSocket(x){return(x&49152)===49152},flagsToPermissionString(x){var c=["r","w","rw"][x&3];if(x&512)c+="w";return c},nodePermissions(x,c){if(f.ignorePermissions)return 0;if(c.includes("r")&&!(x.mode&292))return 2;else if(c.includes("w")&&!(x.mode&146))return 2;else if(c.includes("x")&&!(x.mode&73))return 2;return 0},mayLookup(x){var c=f.nodePermissions(x,"x");if(c)return c;if(!x.node_ops.lookup)return 2;return 0},mayCreate(x,c){try{var s=f.lookupNode(x,c);return 20}catch(r){}return f.nodePermissions(x,"wx")},mayDelete(x,c,s){var r;try{r=f.lookupNode(x,c)}catch(YJ){return YJ.errno}var KJ=f.nodePermissions(x,"wx");if(KJ)return KJ;if(s){if(!f.isDir(r.mode))return 54;if(f.isRoot(r)||f.getPath(r)===f.cwd())return 10}else if(f.isDir(r.mode))return 31;return 0},mayOpen(x,c){if(!x)return 44;if(f.isLink(x.mode))return 32;else if(f.isDir(x.mode)){if(f.flagsToPermissionString(c)!=="r"||c&512)return 31}return f.nodePermissions(x,f.flagsToPermissionString(c))},MAX_OPEN_FDS:4096,nextfd(){for(var x=0;x<=f.MAX_OPEN_FDS;x++)if(!f.streams[x])return x;throw new f.ErrnoError(33)},getStreamChecked(x){var c=f.getStream(x);if(!c)throw new f.ErrnoError(8);return c},getStream:(x)=>f.streams[x],createStream(x,c=-1){if(!f.FSStream)f.FSStream=function(){this.shared={}},f.FSStream.prototype={},Object.defineProperties(f.FSStream.prototype,{object:{get(){return this.node},set(s){this.node=s}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(s){this.shared.flags=s}},position:{get(){return this.shared.position},set(s){this.shared.position=s}}});if(x=Object.assign(new f.FSStream,x),c==-1)c=f.nextfd();return x.fd=c,f.streams[c]=x,x},closeStream(x){f.streams[x]=null},chrdev_stream_ops:{open(x){var c=f.getDevice(x.node.rdev);if(x.stream_ops=c.stream_ops,x.stream_ops.open)x.stream_ops.open(x)},llseek(){throw new f.ErrnoError(70)}},major:(x)=>x>>8,minor:(x)=>x&255,makedev:(x,c)=>x<<8|c,registerDevice(x,c){f.devices[x]={stream_ops:c}},getDevice:(x)=>f.devices[x],getMounts(x){var c=[],s=[x];while(s.length){var r=s.pop();c.push(r),s.push.apply(s,r.mounts)}return c},syncfs(x,c){if(typeof x=="function")c=x,x=!1;if(f.syncFSRequests++,f.syncFSRequests>1)y(`warning: ${f.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var s=f.getMounts(f.root.mount),r=0;function KJ(DJ){return f.syncFSRequests--,c(DJ)}function YJ(DJ){if(DJ){if(!YJ.errored)return YJ.errored=!0,KJ(DJ);return}if(++r>=s.length)KJ(null)}s.forEach((DJ)=>{if(!DJ.type.syncfs)return YJ(null);DJ.type.syncfs(DJ,x,YJ)})},mount(x,c,s){var r=s==="/",KJ=!s,YJ;if(r&&f.root)throw new f.ErrnoError(10);else if(!r&&!KJ){var DJ=f.lookupPath(s,{follow_mount:!1});if(s=DJ.path,YJ=DJ.node,f.isMountpoint(YJ))throw new f.ErrnoError(10);if(!f.isDir(YJ.mode))throw new f.ErrnoError(54)}var hJ={type:x,opts:c,mountpoint:s,mounts:[]},pJ=x.mount(hJ);if(pJ.mount=hJ,hJ.root=pJ,r)f.root=pJ;else if(YJ){if(YJ.mounted=hJ,YJ.mount)YJ.mount.mounts.push(hJ)}return pJ},unmount(x){var c=f.lookupPath(x,{follow_mount:!1});if(!f.isMountpoint(c.node))throw new f.ErrnoError(28);var s=c.node,r=s.mounted,KJ=f.getMounts(r);Object.keys(f.nameTable).forEach((DJ)=>{var hJ=f.nameTable[DJ];while(hJ){var pJ=hJ.name_next;if(KJ.includes(hJ.mount))f.destroyNode(hJ);hJ=pJ}}),s.mounted=null;var YJ=s.mount.mounts.indexOf(r);s.mount.mounts.splice(YJ,1)},lookup(x,c){return x.node_ops.lookup(x,c)},mknod(x,c,s){var r=f.lookupPath(x,{parent:!0}),KJ=r.node,YJ=nJ.basename(x);if(!YJ||YJ==="."||YJ==="..")throw new f.ErrnoError(28);var DJ=f.mayCreate(KJ,YJ);if(DJ)throw new f.ErrnoError(DJ);if(!KJ.node_ops.mknod)throw new f.ErrnoError(63);return KJ.node_ops.mknod(KJ,YJ,c,s)},create(x,c){return c=c!==void 0?c:438,c&=4095,c|=32768,f.mknod(x,c,0)},mkdir(x,c){return c=c!==void 0?c:511,c&=511|512,c|=16384,f.mknod(x,c,0)},mkdirTree(x,c){var s=x.split("/"),r="";for(var KJ=0;KJ<s.length;++KJ){if(!s[KJ])continue;r+="/"+s[KJ];try{f.mkdir(r,c)}catch(YJ){if(YJ.errno!=20)throw YJ}}},mkdev(x,c,s){if(typeof s=="undefined")s=c,c=438;return c|=8192,f.mknod(x,c,s)},symlink(x,c){if(!ZQ.resolve(x))throw new f.ErrnoError(44);var s=f.lookupPath(c,{parent:!0}),r=s.node;if(!r)throw new f.ErrnoError(44);var KJ=nJ.basename(c),YJ=f.mayCreate(r,KJ);if(YJ)throw new f.ErrnoError(YJ);if(!r.node_ops.symlink)throw new f.ErrnoError(63);return r.node_ops.symlink(r,KJ,x)},rename(x,c){var s=nJ.dirname(x),r=nJ.dirname(c),KJ=nJ.basename(x),YJ=nJ.basename(c),DJ,hJ,pJ;if(DJ=f.lookupPath(x,{parent:!0}),hJ=DJ.node,DJ=f.lookupPath(c,{parent:!0}),pJ=DJ.node,!hJ||!pJ)throw new f.ErrnoError(44);if(hJ.mount!==pJ.mount)throw new f.ErrnoError(75);var rJ=f.lookupNode(hJ,KJ),VQ=ZQ.relative(x,r);if(VQ.charAt(0)!==".")throw new f.ErrnoError(28);if(VQ=ZQ.relative(c,s),VQ.charAt(0)!==".")throw new f.ErrnoError(55);var GQ;try{GQ=f.lookupNode(pJ,YJ)}catch(eJ){}if(rJ===GQ)return;var iJ=f.isDir(rJ.mode),lJ=f.mayDelete(hJ,KJ,iJ);if(lJ)throw new f.ErrnoError(lJ);if(lJ=GQ?f.mayDelete(pJ,YJ,iJ):f.mayCreate(pJ,YJ),lJ)throw new f.ErrnoError(lJ);if(!hJ.node_ops.rename)throw new f.ErrnoError(63);if(f.isMountpoint(rJ)||GQ&&f.isMountpoint(GQ))throw new f.ErrnoError(10);if(pJ!==hJ){if(lJ=f.nodePermissions(hJ,"w"),lJ)throw new f.ErrnoError(lJ)}f.hashRemoveNode(rJ);try{hJ.node_ops.rename(rJ,pJ,YJ)}catch(eJ){throw eJ}finally{f.hashAddNode(rJ)}},rmdir(x){var c=f.lookupPath(x,{parent:!0}),s=c.node,r=nJ.basename(x),KJ=f.lookupNode(s,r),YJ=f.mayDelete(s,r,!0);if(YJ)throw new f.ErrnoError(YJ);if(!s.node_ops.rmdir)throw new f.ErrnoError(63);if(f.isMountpoint(KJ))throw new f.ErrnoError(10);s.node_ops.rmdir(s,r),f.destroyNode(KJ)},readdir(x){var c=f.lookupPath(x,{follow:!0}),s=c.node;if(!s.node_ops.readdir)throw new f.ErrnoError(54);return s.node_ops.readdir(s)},unlink(x){var c=f.lookupPath(x,{parent:!0}),s=c.node;if(!s)throw new f.ErrnoError(44);var r=nJ.basename(x),KJ=f.lookupNode(s,r),YJ=f.mayDelete(s,r,!1);if(YJ)throw new f.ErrnoError(YJ);if(!s.node_ops.unlink)throw new f.ErrnoError(63);if(f.isMountpoint(KJ))throw new f.ErrnoError(10);s.node_ops.unlink(s,r),f.destroyNode(KJ)},readlink(x){var c=f.lookupPath(x),s=c.node;if(!s)throw new f.ErrnoError(44);if(!s.node_ops.readlink)throw new f.ErrnoError(28);return ZQ.resolve(f.getPath(s.parent),s.node_ops.readlink(s))},stat(x,c){var s=f.lookupPath(x,{follow:!c}),r=s.node;if(!r)throw new f.ErrnoError(44);if(!r.node_ops.getattr)throw new f.ErrnoError(63);return r.node_ops.getattr(r)},lstat(x){return f.stat(x,!0)},chmod(x,c,s){var r;if(typeof x=="string"){var KJ=f.lookupPath(x,{follow:!s});r=KJ.node}else r=x;if(!r.node_ops.setattr)throw new f.ErrnoError(63);r.node_ops.setattr(r,{mode:c&4095|r.mode&~4095,timestamp:Date.now()})},lchmod(x,c){f.chmod(x,c,!0)},fchmod(x,c){var s=f.getStreamChecked(x);f.chmod(s.node,c)},chown(x,c,s,r){var KJ;if(typeof x=="string"){var YJ=f.lookupPath(x,{follow:!r});KJ=YJ.node}else KJ=x;if(!KJ.node_ops.setattr)throw new f.ErrnoError(63);KJ.node_ops.setattr(KJ,{timestamp:Date.now()})},lchown(x,c,s){f.chown(x,c,s,!0)},fchown(x,c,s){var r=f.getStreamChecked(x);f.chown(r.node,c,s)},truncate(x,c){if(c<0)throw new f.ErrnoError(28);var s;if(typeof x=="string"){var r=f.lookupPath(x,{follow:!0});s=r.node}else s=x;if(!s.node_ops.setattr)throw new f.ErrnoError(63);if(f.isDir(s.mode))throw new f.ErrnoError(31);if(!f.isFile(s.mode))throw new f.ErrnoError(28);var KJ=f.nodePermissions(s,"w");if(KJ)throw new f.ErrnoError(KJ);s.node_ops.setattr(s,{size:c,timestamp:Date.now()})},ftruncate(x,c){var s=f.getStreamChecked(x);if((s.flags&2097155)===0)throw new f.ErrnoError(28);f.truncate(s.node,c)},utime(x,c,s){var r=f.lookupPath(x,{follow:!0}),KJ=r.node;KJ.node_ops.setattr(KJ,{timestamp:Math.max(c,s)})},open(x,c,s){if(x==="")throw new f.ErrnoError(44);if(c=typeof c=="string"?fJ(c):c,s=typeof s=="undefined"?438:s,c&64)s=s&4095|32768;else s=0;var r;if(typeof x=="object")r=x;else{x=nJ.normalize(x);try{var KJ=f.lookupPath(x,{follow:!(c&131072)});r=KJ.node}catch(pJ){}}var YJ=!1;if(c&64)if(r){if(c&128)throw new f.ErrnoError(20)}else r=f.mknod(x,s,0),YJ=!0;if(!r)throw new f.ErrnoError(44);if(f.isChrdev(r.mode))c&=~512;if(c&65536&&!f.isDir(r.mode))throw new f.ErrnoError(54);if(!YJ){var DJ=f.mayOpen(r,c);if(DJ)throw new f.ErrnoError(DJ)}if(c&512&&!YJ)f.truncate(r,0);c&=~(128|512|131072);var hJ=f.createStream({node:r,path:f.getPath(r),flags:c,seekable:!0,position:0,stream_ops:r.stream_ops,ungotten:[],error:!1});if(hJ.stream_ops.open)hJ.stream_ops.open(hJ);if(R.logReadFiles&&!(c&1)){if(!f.readFiles)f.readFiles={};if(!(x in f.readFiles))f.readFiles[x]=1}return hJ},close(x){if(f.isClosed(x))throw new f.ErrnoError(8);if(x.getdents)x.getdents=null;try{if(x.stream_ops.close)x.stream_ops.close(x)}catch(c){throw c}finally{f.closeStream(x.fd)}x.fd=null},isClosed(x){return x.fd===null},llseek(x,c,s){if(f.isClosed(x))throw new f.ErrnoError(8);if(!x.seekable||!x.stream_ops.llseek)throw new f.ErrnoError(70);if(s!=0&&s!=1&&s!=2)throw new f.ErrnoError(28);return x.position=x.stream_ops.llseek(x,c,s),x.ungotten=[],x.position},read(x,c,s,r,KJ){if(r<0||KJ<0)throw new f.ErrnoError(28);if(f.isClosed(x))throw new f.ErrnoError(8);if((x.flags&2097155)===1)throw new f.ErrnoError(8);if(f.isDir(x.node.mode))throw new f.ErrnoError(31);if(!x.stream_ops.read)throw new f.ErrnoError(28);var YJ=typeof KJ!="undefined";if(!YJ)KJ=x.position;else if(!x.seekable)throw new f.ErrnoError(70);var DJ=x.stream_ops.read(x,c,s,r,KJ);if(!YJ)x.position+=DJ;return DJ},write(x,c,s,r,KJ,YJ){if(r<0||KJ<0)throw new f.ErrnoError(28);if(f.isClosed(x))throw new f.ErrnoError(8);if((x.flags&2097155)===0)throw new f.ErrnoError(8);if(f.isDir(x.node.mode))throw new f.ErrnoError(31);if(!x.stream_ops.write)throw new f.ErrnoError(28);if(x.seekable&&x.flags&1024)f.llseek(x,0,2);var DJ=typeof KJ!="undefined";if(!DJ)KJ=x.position;else if(!x.seekable)throw new f.ErrnoError(70);var hJ=x.stream_ops.write(x,c,s,r,KJ,YJ);if(!DJ)x.position+=hJ;return hJ},allocate(x,c,s){if(f.isClosed(x))throw new f.ErrnoError(8);if(c<0||s<=0)throw new f.ErrnoError(28);if((x.flags&2097155)===0)throw new f.ErrnoError(8);if(!f.isFile(x.node.mode)&&!f.isDir(x.node.mode))throw new f.ErrnoError(43);if(!x.stream_ops.allocate)throw new f.ErrnoError(138);x.stream_ops.allocate(x,c,s)},mmap(x,c,s,r,KJ){if((r&2)!==0&&(KJ&2)===0&&(x.flags&2097155)!==2)throw new f.ErrnoError(2);if((x.flags&2097155)===1)throw new f.ErrnoError(2);if(!x.stream_ops.mmap)throw new f.ErrnoError(43);return x.stream_ops.mmap(x,c,s,r,KJ)},msync(x,c,s,r,KJ){if(!x.stream_ops.msync)return 0;return x.stream_ops.msync(x,c,s,r,KJ)},munmap:(x)=>0,ioctl(x,c,s){if(!x.stream_ops.ioctl)throw new f.ErrnoError(59);return x.stream_ops.ioctl(x,c,s)},readFile(x,c={}){if(c.flags=c.flags||0,c.encoding=c.encoding||"binary",c.encoding!=="utf8"&&c.encoding!=="binary")throw new Error(`Invalid encoding type "${c.encoding}"`);var s,r=f.open(x,c.flags),KJ=f.stat(x),YJ=KJ.size,DJ=new Uint8Array(YJ);if(f.read(r,DJ,0,YJ,0),c.encoding==="utf8")s=UJ(DJ,0);else if(c.encoding==="binary")s=DJ;return f.close(r),s},writeFile(x,c,s={}){s.flags=s.flags||577;var r=f.open(x,s.flags,s.mode);if(typeof c=="string"){var KJ=new Uint8Array(MJ(c)+1),YJ=xQ(c,KJ,0,KJ.length);f.write(r,KJ,0,YJ,void 0,s.canOwn)}else if(ArrayBuffer.isView(c))f.write(r,c,0,c.byteLength,void 0,s.canOwn);else throw new Error("Unsupported data type");f.close(r)},cwd:()=>f.currentPath,chdir(x){var c=f.lookupPath(x,{follow:!0});if(c.node===null)throw new f.ErrnoError(44);if(!f.isDir(c.node.mode))throw new f.ErrnoError(54);var s=f.nodePermissions(c.node,"x");if(s)throw new f.ErrnoError(s);f.currentPath=c.path},createDefaultDirectories(){f.mkdir("/tmp"),f.mkdir("/home"),f.mkdir("/home/web_user")},createDefaultDevices(){f.mkdir("/dev"),f.registerDevice(f.makedev(1,3),{read:()=>0,write:(r,KJ,YJ,DJ,hJ)=>DJ}),f.mkdev("/dev/null",f.makedev(1,3)),WQ.register(f.makedev(5,0),WQ.default_tty_ops),WQ.register(f.makedev(6,0),WQ.default_tty1_ops),f.mkdev("/dev/tty",f.makedev(5,0)),f.mkdev("/dev/tty1",f.makedev(6,0));var x=new Uint8Array(1024),c=0,s=()=>{if(c===0)c=kJ(x).byteLength;return x[--c]};f.createDevice("/dev","random",s),f.createDevice("/dev","urandom",s),f.mkdir("/dev/shm"),f.mkdir("/dev/shm/tmp")},createSpecialDirectories(){f.mkdir("/proc");var x=f.mkdir("/proc/self");f.mkdir("/proc/self/fd"),f.mount({mount(){var c=f.createNode(x,"fd",16384|511,73);return c.node_ops={lookup(s,r){var KJ=+r,YJ=f.getStreamChecked(KJ),DJ={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>YJ.path}};return DJ.parent=DJ,DJ}},c}},{},"/proc/self/fd")},createStandardStreams(){if(R.stdin)f.createDevice("/dev","stdin",R.stdin);else f.symlink("/dev/tty","/dev/stdin");if(R.stdout)f.createDevice("/dev","stdout",null,R.stdout);else f.symlink("/dev/tty","/dev/stdout");if(R.stderr)f.createDevice("/dev","stderr",null,R.stderr);else f.symlink("/dev/tty1","/dev/stderr");var x=f.open("/dev/stdin",0),c=f.open("/dev/stdout",1),s=f.open("/dev/stderr",1)},ensureErrnoError(){if(f.ErrnoError)return;f.ErrnoError=function x(c,s){this.name="ErrnoError",this.node=s,this.setErrno=function(r){this.errno=r},this.setErrno(c),this.message="FS error"},f.ErrnoError.prototype=new Error,f.ErrnoError.prototype.constructor=f.ErrnoError,[44].forEach((x)=>{f.genericErrors[x]=new f.ErrnoError(x),f.genericErrors[x].stack="<generic error, no stack>"})},staticInit(){f.ensureErrnoError(),f.nameTable=new Array(4096),f.mount(NJ,{},"/"),f.createDefaultDirectories(),f.createDefaultDevices(),f.createSpecialDirectories(),f.filesystems={MEMFS:NJ}},init(x,c,s){f.init.initialized=!0,f.ensureErrnoError(),R.stdin=x||R.stdin,R.stdout=c||R.stdout,R.stderr=s||R.stderr,f.createStandardStreams()},quit(){f.init.initialized=!1;for(var x=0;x<f.streams.length;x++){var c=f.streams[x];if(!c)continue;f.close(c)}},findObject(x,c){var s=f.analyzePath(x,c);if(!s.exists)return null;return s.object},analyzePath(x,c){try{var s=f.lookupPath(x,{follow:!c});x=s.path}catch(KJ){}var r={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var s=f.lookupPath(x,{parent:!0});r.parentExists=!0,r.parentPath=s.path,r.parentObject=s.node,r.name=nJ.basename(x),s=f.lookupPath(x,{follow:!c}),r.exists=!0,r.path=s.path,r.object=s.node,r.name=s.node.name,r.isRoot=s.path==="/"}catch(KJ){r.error=KJ.errno}return r},createPath(x,c,s,r){x=typeof x=="string"?x:f.getPath(x);var KJ=c.split("/").reverse();while(KJ.length){var YJ=KJ.pop();if(!YJ)continue;var DJ=nJ.join2(x,YJ);try{f.mkdir(DJ)}catch(hJ){}x=DJ}return DJ},createFile(x,c,s,r,KJ){var YJ=nJ.join2(typeof x=="string"?x:f.getPath(x),c),DJ=wQ(r,KJ);return f.create(YJ,DJ)},createDataFile(x,c,s,r,KJ,YJ){var DJ=c;if(x)x=typeof x=="string"?x:f.getPath(x),DJ=c?nJ.join2(x,c):x;var hJ=wQ(r,KJ),pJ=f.create(DJ,hJ);if(s){if(typeof s=="string"){var rJ=new Array(s.length);for(var VQ=0,GQ=s.length;VQ<GQ;++VQ)rJ[VQ]=s.charCodeAt(VQ);s=rJ}f.chmod(pJ,hJ|146);var iJ=f.open(pJ,577);f.write(iJ,s,0,s.length,0,YJ),f.close(iJ),f.chmod(pJ,hJ)}return pJ},createDevice(x,c,s,r){var KJ=nJ.join2(typeof x=="string"?x:f.getPath(x),c),YJ=wQ(!!s,!!r);if(!f.createDevice.major)f.createDevice.major=64;var DJ=f.makedev(f.createDevice.major++,0);return f.registerDevice(DJ,{open(hJ){hJ.seekable=!1},close(hJ){if(r&&r.buffer&&r.buffer.length)r(10)},read(hJ,pJ,rJ,VQ,GQ){var iJ=0;for(var lJ=0;lJ<VQ;lJ++){var eJ;try{eJ=s()}catch(SQ){throw new f.ErrnoError(29)}if(eJ===void 0&&iJ===0)throw new f.ErrnoError(6);if(eJ===null||eJ===void 0)break;iJ++,pJ[rJ+lJ]=eJ}if(iJ)hJ.node.timestamp=Date.now();return iJ},write(hJ,pJ,rJ,VQ,GQ){for(var iJ=0;iJ<VQ;iJ++)try{r(pJ[rJ+iJ])}catch(lJ){throw new f.ErrnoError(29)}if(VQ)hJ.node.timestamp=Date.now();return iJ}}),f.mkdev(KJ,YJ,DJ)},forceLoadFile(x){if(x.isDevice||x.isFolder||x.link||x.contents)return!0;if(typeof XMLHttpRequest!="undefined")throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");else if(j)try{x.contents=wJ(j(x.url),!0),x.usedBytes=x.contents.length}catch(c){throw new f.ErrnoError(29)}else throw new Error("Cannot load without read() or XMLHttpRequest.")},createLazyFile(x,c,s,r,KJ){function YJ(){this.lengthKnown=!1,this.chunks=[]}if(YJ.prototype.get=function iJ(lJ){if(lJ>this.length-1||lJ<0)return;var eJ=lJ%this.chunkSize,SQ=lJ/this.chunkSize|0;return this.getter(SQ)[eJ]},YJ.prototype.setDataGetter=function iJ(lJ){this.getter=lJ},YJ.prototype.cacheLength=function iJ(){var lJ=new XMLHttpRequest;if(lJ.open("HEAD",s,!1),lJ.send(null),!(lJ.status>=200&&lJ.status<300||lJ.status===304))throw new Error("Couldn't load "+s+". Status: "+lJ.status);var eJ=Number(lJ.getResponseHeader("Content-length")),SQ,UQ=(SQ=lJ.getResponseHeader("Accept-Ranges"))&&SQ==="bytes",qQ=(SQ=lJ.getResponseHeader("Content-Encoding"))&&SQ==="gzip",uJ=1048576;if(!UQ)uJ=eJ;var sJ=(kQ,cQ)=>{if(kQ>cQ)throw new Error("invalid range ("+kQ+", "+cQ+") or no bytes requested!");if(cQ>eJ-1)throw new Error("only "+eJ+" bytes available! programmer error!");var _Q=new XMLHttpRequest;if(_Q.open("GET",s,!1),eJ!==uJ)_Q.setRequestHeader("Range","bytes="+kQ+"-"+cQ);if(_Q.responseType="arraybuffer",_Q.overrideMimeType)_Q.overrideMimeType("text/plain; charset=x-user-defined");if(_Q.send(null),!(_Q.status>=200&&_Q.status<300||_Q.status===304))throw new Error("Couldn't load "+s+". Status: "+_Q.status);if(_Q.response!==void 0)return new Uint8Array(_Q.response||[]);return wJ(_Q.responseText||"",!0)},AQ=this;if(AQ.setDataGetter((kQ)=>{var cQ=kQ*uJ,_Q=(kQ+1)*uJ-1;if(_Q=Math.min(_Q,eJ-1),typeof AQ.chunks[kQ]=="undefined")AQ.chunks[kQ]=sJ(cQ,_Q);if(typeof AQ.chunks[kQ]=="undefined")throw new Error("doXHR failed!");return AQ.chunks[kQ]}),qQ||!eJ)uJ=eJ=1,eJ=this.getter(0).length,uJ=eJ,w("LazyFiles on gzip forces download of the whole file when length is accessed");this._length=eJ,this._chunkSize=uJ,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!N)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var DJ=new YJ;Object.defineProperties(DJ,{length:{get:function(){if(!this.lengthKnown)this.cacheLength();return this._length}},chunkSize:{get:function(){if(!this.lengthKnown)this.cacheLength();return this._chunkSize}}});var hJ={isDevice:!1,contents:DJ}}else var hJ={isDevice:!1,url:s};var pJ=f.createFile(x,c,hJ,r,KJ);if(hJ.contents)pJ.contents=hJ.contents;else if(hJ.url)pJ.contents=null,pJ.url=hJ.url;Object.defineProperties(pJ,{usedBytes:{get:function(){return this.contents.length}}});var rJ={},VQ=Object.keys(pJ.stream_ops);VQ.forEach((iJ)=>{var lJ=pJ.stream_ops[iJ];rJ[iJ]=function eJ(){return f.forceLoadFile(pJ),lJ.apply(null,arguments)}});function GQ(iJ,lJ,eJ,SQ,UQ){var qQ=iJ.node.contents;if(UQ>=qQ.length)return 0;var uJ=Math.min(qQ.length-UQ,SQ);if(qQ.slice)for(var sJ=0;sJ<uJ;sJ++)lJ[eJ+sJ]=qQ[UQ+sJ];else for(var sJ=0;sJ<uJ;sJ++)lJ[eJ+sJ]=qQ.get(UQ+sJ);return uJ}return rJ.read=(iJ,lJ,eJ,SQ,UQ)=>{return f.forceLoadFile(pJ),GQ(iJ,lJ,eJ,SQ,UQ)},rJ.mmap=(iJ,lJ,eJ,SQ,UQ)=>{f.forceLoadFile(pJ);var qQ=_J(lJ);if(!qQ)throw new f.ErrnoError(48);return GQ(iJ,o,qQ,lJ,eJ),{ptr:qQ,allocated:!0}},pJ.stream_ops=rJ,pJ}},zJ={DEFAULT_POLLMASK:5,calculateAt(x,c,s){if(nJ.isAbs(c))return c;var r;if(x===-100)r=f.cwd();else{var KJ=zJ.getStreamFromFD(x);r=KJ.path}if(c.length==0){if(!s)throw new f.ErrnoError(44);return r}return nJ.join2(r,c)},doStat(x,c,s){try{var r=x(c)}catch(hJ){if(hJ&&hJ.node&&nJ.normalize(c)!==nJ.normalize(f.getPath(hJ.node)))return-54;throw hJ}Z[s>>2]=r.dev,Z[s+4>>2]=r.mode,$[s+8>>2]=r.nlink,Z[s+12>>2]=r.uid,Z[s+16>>2]=r.gid,Z[s+20>>2]=r.rdev,D=[r.size>>>0,(T=r.size,+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[s+24>>2]=D[0],Z[s+28>>2]=D[1],Z[s+32>>2]=4096,Z[s+36>>2]=r.blocks;var KJ=r.atime.getTime(),YJ=r.mtime.getTime(),DJ=r.ctime.getTime();return D=[Math.floor(KJ/1000)>>>0,(T=Math.floor(KJ/1000),+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[s+40>>2]=D[0],Z[s+44>>2]=D[1],$[s+48>>2]=KJ%1000*1000,D=[Math.floor(YJ/1000)>>>0,(T=Math.floor(YJ/1000),+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[s+56>>2]=D[0],Z[s+60>>2]=D[1],$[s+64>>2]=YJ%1000*1000,D=[Math.floor(DJ/1000)>>>0,(T=Math.floor(DJ/1000),+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[s+72>>2]=D[0],Z[s+76>>2]=D[1],$[s+80>>2]=DJ%1000*1000,D=[r.ino>>>0,(T=r.ino,+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[s+88>>2]=D[0],Z[s+92>>2]=D[1],0},doMsync(x,c,s,r,KJ){if(!f.isFile(c.node.mode))throw new f.ErrnoError(43);if(r&2)return 0;var YJ=jJ.slice(x,x+s);f.msync(c,YJ,KJ,s,r)},varargs:void 0,get(){var x=Z[+zJ.varargs>>2];return zJ.varargs+=4,x},getp(){return zJ.get()},getStr(x){var c=EJ(x);return c},getStreamFromFD(x){var c=f.getStreamChecked(x);return c}};function CQ(x,c,s){zJ.varargs=s;try{var r=zJ.getStreamFromFD(x);switch(c){case 0:{var KJ=zJ.get();if(KJ<0)return-28;while(f.streams[KJ])KJ++;var YJ=f.createStream(r,KJ);return YJ.fd}case 1:case 2:return 0;case 3:return r.flags;case 4:{var KJ=zJ.get();return r.flags|=KJ,0}case 5:{var KJ=zJ.getp(),DJ=0;return J[KJ+DJ>>1]=2,0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:return xJ(28),-1;default:return-28}}catch(hJ){if(typeof f=="undefined"||hJ.name!=="ErrnoError")throw hJ;return-hJ.errno}}var oJ=(x,c,s)=>xQ(x,jJ,c,s);function tJ(x,c,s){try{var r=zJ.getStreamFromFD(x);if(!r.getdents)r.getdents=f.readdir(r.path);var KJ=280,YJ=0,DJ=f.llseek(r,0,1),hJ=Math.floor(DJ/KJ);while(hJ<r.getdents.length&&YJ+KJ<=s){var pJ,rJ,VQ=r.getdents[hJ];if(VQ===".")pJ=r.node.id,rJ=4;else if(VQ===".."){var GQ=f.lookupPath(r.path,{parent:!0});pJ=GQ.node.id,rJ=4}else{var iJ=f.lookupNode(r.node,VQ);pJ=iJ.id,rJ=f.isChrdev(iJ.mode)?2:f.isDir(iJ.mode)?4:f.isLink(iJ.mode)?10:8}D=[pJ>>>0,(T=pJ,+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[c+YJ>>2]=D[0],Z[c+YJ+4>>2]=D[1],D=[(hJ+1)*KJ>>>0,(T=(hJ+1)*KJ,+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[c+YJ+8>>2]=D[0],Z[c+YJ+12>>2]=D[1],J[c+YJ+16>>1]=280,o[c+YJ+18>>0]=rJ,oJ(VQ,c+YJ+19,256),YJ+=KJ,hJ+=1}return f.llseek(r,hJ*KJ,0),YJ}catch(lJ){if(typeof f=="undefined"||lJ.name!=="ErrnoError")throw lJ;return-lJ.errno}}function YQ(x,c,s){zJ.varargs=s;try{var r=zJ.getStreamFromFD(x);switch(c){case 21509:{if(!r.tty)return-59;return 0}case 21505:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcgets){var KJ=r.tty.ops.ioctl_tcgets(r),YJ=zJ.getp();Z[YJ>>2]=KJ.c_iflag||0,Z[YJ+4>>2]=KJ.c_oflag||0,Z[YJ+8>>2]=KJ.c_cflag||0,Z[YJ+12>>2]=KJ.c_lflag||0;for(var DJ=0;DJ<32;DJ++)o[YJ+DJ+17>>0]=KJ.c_cc[DJ]||0;return 0}return 0}case 21510:case 21511:case 21512:{if(!r.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tcsets){var YJ=zJ.getp(),hJ=Z[YJ>>2],pJ=Z[YJ+4>>2],rJ=Z[YJ+8>>2],VQ=Z[YJ+12>>2],GQ=[];for(var DJ=0;DJ<32;DJ++)GQ.push(o[YJ+DJ+17>>0]);return r.tty.ops.ioctl_tcsets(r.tty,c,{c_iflag:hJ,c_oflag:pJ,c_cflag:rJ,c_lflag:VQ,c_cc:GQ})}return 0}case 21519:{if(!r.tty)return-59;var YJ=zJ.getp();return Z[YJ>>2]=0,0}case 21520:{if(!r.tty)return-59;return-28}case 21531:{var YJ=zJ.getp();return f.ioctl(r,c,YJ)}case 21523:{if(!r.tty)return-59;if(r.tty.ops.ioctl_tiocgwinsz){var iJ=r.tty.ops.ioctl_tiocgwinsz(r.tty),YJ=zJ.getp();J[YJ>>1]=iJ[0],J[YJ+2>>1]=iJ[1]}return 0}case 21524:{if(!r.tty)return-59;return 0}case 21515:{if(!r.tty)return-59;return 0}default:return-28}}catch(lJ){if(typeof f=="undefined"||lJ.name!=="ErrnoError")throw lJ;return-lJ.errno}}function BQ(x,c,s,r){zJ.varargs=r;try{c=zJ.getStr(c),c=zJ.calculateAt(x,c);var KJ=r?zJ.get():0;return f.open(c,s,KJ).fd}catch(YJ){if(typeof f=="undefined"||YJ.name!=="ErrnoError")throw YJ;return-YJ.errno}}function OQ(x){try{return x=zJ.getStr(x),f.rmdir(x),0}catch(c){if(typeof f=="undefined"||c.name!=="ErrnoError")throw c;return-c.errno}}function jQ(x,c){try{return x=zJ.getStr(x),zJ.doStat(f.stat,x,c)}catch(s){if(typeof f=="undefined"||s.name!=="ErrnoError")throw s;return-s.errno}}function TQ(x,c,s){try{if(c=zJ.getStr(c),c=zJ.calculateAt(x,c),s===0)f.unlink(c);else if(s===512)f.rmdir(c);else $J("Invalid flags passed to unlinkat");return 0}catch(r){if(typeof f=="undefined"||r.name!=="ErrnoError")throw r;return-r.errno}}var NQ=!0,IQ=()=>NQ,EQ=()=>{$J("")},RQ=()=>Date.now(),zQ;zQ=()=>performance.now();var PQ=(x,c,s)=>jJ.copyWithin(x,c,c+s),LQ=(x)=>{$J("OOM")},FQ=(x)=>{var c=jJ.length;x>>>=0,LQ(x)},HQ={},DQ=()=>Y||"./this.program",KQ=()=>{if(!KQ.strings){var x=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",c={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:x,_:DQ()};for(var s in HQ)if(HQ[s]===void 0)delete c[s];else c[s]=HQ[s];var r=[];for(var s in c)r.push(`${s}=${c[s]}`);KQ.strings=r}return KQ.strings},TV=(x,c)=>{for(var s=0;s<x.length;++s)o[c++>>0]=x.charCodeAt(s);o[c>>0]=0},NV=(x,c)=>{var s=0;return KQ().forEach((r,KJ)=>{var YJ=c+s;$[x+KJ*4>>2]=YJ,TV(r,YJ),s+=r.length+1}),0},IV=(x,c)=>{var s=KQ();$[x>>2]=s.length;var r=0;return s.forEach((KJ)=>r+=KJ.length+1),$[c>>2]=r,0},g$=0,c$=()=>a||g$>0,f$=(x)=>{if(VJ=x,!c$()){if(R.onExit)R.onExit(x);JJ=!0}E(x,new u(x))},S6=(x,c)=>{VJ=x,f$(x)},h$=S6;function m$(x){try{var c=zJ.getStreamFromFD(x);return f.close(c),0}catch(s){if(typeof f=="undefined"||s.name!=="ErrnoError")throw s;return s.errno}}var u$=(x,c,s,r)=>{var KJ=0;for(var YJ=0;YJ<s;YJ++){var DJ=$[c>>2],hJ=$[c+4>>2];c+=8;var pJ=f.read(x,o,DJ,hJ,r);if(pJ<0)return-1;if(KJ+=pJ,pJ<hJ)break;if(typeof r!=="undefined")r+=pJ}return KJ};function p$(x,c,s,r){try{var KJ=zJ.getStreamFromFD(x),YJ=u$(KJ,c,s);return $[r>>2]=YJ,0}catch(DJ){if(typeof f=="undefined"||DJ.name!=="ErrnoError")throw DJ;return DJ.errno}}var i$=(x,c)=>c+2097152>>>0<4194305-!!x?(x>>>0)+c*4294967296:NaN;function l$(x,c,s,r,KJ){var YJ=i$(c,s);try{if(isNaN(YJ))return 61;var DJ=zJ.getStreamFromFD(x);if(f.llseek(DJ,YJ,r),D=[DJ.position>>>0,(T=DJ.position,+Math.abs(T)>=1?T>0?+Math.floor(T/4294967296)>>>0:~~+Math.ceil((T-+(~~T>>>0))/4294967296)>>>0:0)],Z[KJ>>2]=D[0],Z[KJ+4>>2]=D[1],DJ.getdents&&YJ===0&&r===0)DJ.getdents=null;return 0}catch(hJ){if(typeof f=="undefined"||hJ.name!=="ErrnoError")throw hJ;return hJ.errno}}var s$=(x,c,s,r)=>{var KJ=0;for(var YJ=0;YJ<s;YJ++){var DJ=$[c>>2],hJ=$[c+4>>2];c+=8;var pJ=f.write(x,o,DJ,hJ,r);if(pJ<0)return-1;if(KJ+=pJ,typeof r!=="undefined")r+=pJ}return KJ};function d$(x,c,s,r){try{var KJ=zJ.getStreamFromFD(x),YJ=s$(KJ,c,s);return $[r>>2]=YJ,0}catch(DJ){if(typeof f=="undefined"||DJ.name!=="ErrnoError")throw DJ;return DJ.errno}}var vV=(x)=>x%4===0&&(x%100!==0||x%400===0),n$=(x,c)=>{var s=0;for(var r=0;r<=c;s+=x[r++]);return s},x6=[31,29,31,30,31,30,31,31,30,31,30,31],w6=[31,28,31,30,31,30,31,31,30,31,30,31],o$=(x,c)=>{var s=new Date(x.getTime());while(c>0){var r=vV(s.getFullYear()),KJ=s.getMonth(),YJ=(r?x6:w6)[KJ];if(c>YJ-s.getDate())if(c-=YJ-s.getDate()+1,s.setDate(1),KJ<11)s.setMonth(KJ+1);else s.setMonth(0),s.setFullYear(s.getFullYear()+1);else return s.setDate(s.getDate()+c),s}return s},r$=(x,c)=>{o.set(x,c)},a$=(x,c,s,r)=>{var KJ=$[r+40>>2],YJ={tm_sec:Z[r>>2],tm_min:Z[r+4>>2],tm_hour:Z[r+8>>2],tm_mday:Z[r+12>>2],tm_mon:Z[r+16>>2],tm_year:Z[r+20>>2],tm_wday:Z[r+24>>2],tm_yday:Z[r+28>>2],tm_isdst:Z[r+32>>2],tm_gmtoff:Z[r+36>>2],tm_zone:KJ?EJ(KJ):""},DJ=EJ(s),hJ={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var pJ in hJ)DJ=DJ.replace(new RegExp(pJ,"g"),hJ[pJ]);var rJ=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],VQ=["January","February","March","April","May","June","July","August","September","October","November","December"];function GQ(uJ,sJ,AQ){var kQ=typeof uJ=="number"?uJ.toString():uJ||"";while(kQ.length<sJ)kQ=AQ[0]+kQ;return kQ}function iJ(uJ,sJ){return GQ(uJ,sJ,"0")}function lJ(uJ,sJ){function AQ(cQ){return cQ<0?-1:cQ>0?1:0}var kQ;if((kQ=AQ(uJ.getFullYear()-sJ.getFullYear()))===0){if((kQ=AQ(uJ.getMonth()-sJ.getMonth()))===0)kQ=AQ(uJ.getDate()-sJ.getDate())}return kQ}function eJ(uJ){switch(uJ.getDay()){case 0:return new Date(uJ.getFullYear()-1,11,29);case 1:return uJ;case 2:return new Date(uJ.getFullYear(),0,3);case 3:return new Date(uJ.getFullYear(),0,2);case 4:return new Date(uJ.getFullYear(),0,1);case 5:return new Date(uJ.getFullYear()-1,11,31);case 6:return new Date(uJ.getFullYear()-1,11,30)}}function SQ(uJ){var sJ=o$(new Date(uJ.tm_year+1900,0,1),uJ.tm_yday),AQ=new Date(sJ.getFullYear(),0,4),kQ=new Date(sJ.getFullYear()+1,0,4),cQ=eJ(AQ),_Q=eJ(kQ);if(lJ(cQ,sJ)<=0){if(lJ(_Q,sJ)<=0)return sJ.getFullYear()+1;return sJ.getFullYear()}return sJ.getFullYear()-1}var UQ={"%a":(uJ)=>rJ[uJ.tm_wday].substring(0,3),"%A":(uJ)=>rJ[uJ.tm_wday],"%b":(uJ)=>VQ[uJ.tm_mon].substring(0,3),"%B":(uJ)=>VQ[uJ.tm_mon],"%C":(uJ)=>{var sJ=uJ.tm_year+1900;return iJ(sJ/100|0,2)},"%d":(uJ)=>iJ(uJ.tm_mday,2),"%e":(uJ)=>GQ(uJ.tm_mday,2," "),"%g":(uJ)=>SQ(uJ).toString().substring(2),"%G":(uJ)=>SQ(uJ),"%H":(uJ)=>iJ(uJ.tm_hour,2),"%I":(uJ)=>{var sJ=uJ.tm_hour;if(sJ==0)sJ=12;else if(sJ>12)sJ-=12;return iJ(sJ,2)},"%j":(uJ)=>iJ(uJ.tm_mday+n$(vV(uJ.tm_year+1900)?x6:w6,uJ.tm_mon-1),3),"%m":(uJ)=>iJ(uJ.tm_mon+1,2),"%M":(uJ)=>iJ(uJ.tm_min,2),"%n":()=>"\n","%p":(uJ)=>{if(uJ.tm_hour>=0&&uJ.tm_hour<12)return"AM";return"PM"},"%S":(uJ)=>iJ(uJ.tm_sec,2),"%t":()=>"\t","%u":(uJ)=>uJ.tm_wday||7,"%U":(uJ)=>{var sJ=uJ.tm_yday+7-uJ.tm_wday;return iJ(Math.floor(sJ/7),2)},"%V":(uJ)=>{var sJ=Math.floor((uJ.tm_yday+7-(uJ.tm_wday+6)%7)/7);if((uJ.tm_wday+371-uJ.tm_yday-2)%7<=2)sJ++;if(!sJ){sJ=52;var AQ=(uJ.tm_wday+7-uJ.tm_yday-1)%7;if(AQ==4||AQ==5&&vV(uJ.tm_year%400-1))sJ++}else if(sJ==53){var kQ=(uJ.tm_wday+371-uJ.tm_yday)%7;if(kQ!=4&&(kQ!=3||!vV(uJ.tm_year)))sJ=1}return iJ(sJ,2)},"%w":(uJ)=>uJ.tm_wday,"%W":(uJ)=>{var sJ=uJ.tm_yday+7-(uJ.tm_wday+6)%7;return iJ(Math.floor(sJ/7),2)},"%y":(uJ)=>(uJ.tm_year+1900).toString().substring(2),"%Y":(uJ)=>uJ.tm_year+1900,"%z":(uJ)=>{var sJ=uJ.tm_gmtoff,AQ=sJ>=0;return sJ=Math.abs(sJ)/60,sJ=sJ/60*100+sJ%60,(AQ?"+":"-")+String("0000"+sJ).slice(-4)},"%Z":(uJ)=>uJ.tm_zone,"%%":()=>"%"};DJ=DJ.replace(/%%/g,"\0\0");for(var pJ in UQ)if(DJ.includes(pJ))DJ=DJ.replace(new RegExp(pJ,"g"),UQ[pJ](YJ));DJ=DJ.replace(/\0\0/g,"%");var qQ=wJ(DJ,!1);if(qQ.length>c)return 0;return r$(qQ,x),qQ.length-1},t$=(x,c,s,r,KJ)=>a$(x,c,s,r),e$=(x)=>{if(x instanceof u||x=="unwind")return VJ;E(1,x)},J5=(x)=>{var c=MJ(x)+1,s=T0(c);return oJ(x,s,c),s},v6=function(x,c,s,r){if(!x)x=this;this.parent=x,this.mount=x.mount,this.mounted=null,this.id=f.nextInode++,this.name=c,this.mode=s,this.node_ops={},this.stream_ops={},this.rdev=r},MV=292|73,_V=146;Object.defineProperties(v6.prototype,{read:{get:function(){return(this.mode&MV)===MV},set:function(x){x?this.mode|=MV:this.mode&=~MV}},write:{get:function(){return(this.mode&_V)===_V},set:function(x){x?this.mode|=_V:this.mode&=~_V}},isFolder:{get:function(){return f.isDir(this.mode)}},isDevice:{get:function(){return f.isChrdev(this.mode)}}}),f.FSNode=v6,f.createPreloadedFile=cJ,f.staticInit(),R.FS_createPath=f.createPath,R.FS_createDataFile=f.createDataFile,R.FS_createPreloadedFile=f.createPreloadedFile,R.FS_unlink=f.unlink,R.FS_createLazyFile=f.createLazyFile,R.FS_createDevice=f.createDevice;var Q5={a:QQ,b:SJ,e:CQ,r:tJ,v:YQ,f:BQ,p:OQ,o:jQ,q:TQ,j:IQ,h:EQ,g:RQ,k:PQ,n:FQ,s:NV,t:IV,d:h$,c:m$,u:p$,l:l$,i:d$,m:t$},uQ=$Q(),V5=()=>(V5=uQ.x)(),M6=R._main=(x,c)=>(M6=R._main=uQ.y)(x,c),_6=()=>(_6=uQ.z)(),$5=(x)=>($5=uQ.free)(x),Z5=(x)=>(Z5=uQ.malloc)(x),T0=(x)=>(T0=uQ.B)(x),b6=(x)=>(b6=uQ.C)(x);R.addRunDependency=C,R.removeRunDependency=h,R.FS_createPath=f.createPath,R.FS_createLazyFile=f.createLazyFile,R.FS_createDevice=f.createDevice,R.callMain=y6,R.FS_createPreloadedFile=f.createPreloadedFile,R.FS=f,R.FS_createDataFile=f.createDataFile,R.FS_unlink=f.unlink;var bV;WJ=function x(){if(!bV)g6();if(!bV)WJ=x};function y6(x=[]){var c=M6;x.unshift(Y);var s=x.length,r=T0((s+1)*4),KJ=r;x.forEach((DJ)=>{$[KJ>>2]=J5(DJ),KJ+=4}),$[KJ>>2]=0;try{var YJ=c(s,r);return S6(YJ,!0),YJ}catch(DJ){return e$(DJ)}}function g6(x=q){if(PJ>0)return;if(_(),PJ>0)return;function c(){if(bV)return;if(bV=!0,R.calledRun=!0,JJ)return;if(t(),QJ(),M(R),R.onRuntimeInitialized)R.onRuntimeInitialized();if(c6)y6(x);GJ()}if(R.setStatus)R.setStatus("Running..."),setTimeout(function(){setTimeout(function(){R.setStatus("")},1),c()},1);else c()}if(R.preInit){if(typeof R.preInit=="function")R.preInit=[R.preInit];while(R.preInit.length>0)R.preInit.pop()()}var c6=!1;if(R.noInitialRun)c6=!1;return g6(),g.ready}})();export{B5 as createPiperPhonemize};
diff --git a/example/browser-standalone-bundle.js b/example/browser-standalone-bundle.js
new file mode 100644
index 0000000..88912fb
--- /dev/null
+++ b/example/browser-standalone-bundle.js
@@ -0,0 +1,377 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+// This code was bundled using `deno bundle` and it's not recommended to edit it manually
+
+const HF_BASE = 'https://huggingface.co/diffusionstudio/piper-voices/resolve/main';
+const ONNX_BASE = 'https://cdnjs.cloudflare.com/ajax/libs/onnxruntime-web/1.18.0/';
+const WASM_BASE = "https://cdn.jsdelivr.net/npm/@diffusionstudio/piper-wasm@1.0.0/build/piper_phonemize";
+const PATH_MAP = {
+  /*  'ar_JO-kareem-low': 'ar/ar_JO/kareem/low/ar_JO-kareem-low.onnx',
+    'ar_JO-kareem-medium': 'ar/ar_JO/kareem/medium/ar_JO-kareem-medium.onnx',
+    'ca_ES-upc_ona-medium': 'ca/ca_ES/upc_ona/medium/ca_ES-upc_ona-medium.onnx',
+    'ca_ES-upc_ona-x_low': 'ca/ca_ES/upc_ona/x_low/ca_ES-upc_ona-x_low.onnx',
+    'ca_ES-upc_pau-x_low': 'ca/ca_ES/upc_pau/x_low/ca_ES-upc_pau-x_low.onnx',
+    'cs_CZ-jirka-low': 'cs/cs_CZ/jirka/low/cs_CZ-jirka-low.onnx',
+    'cs_CZ-jirka-medium': 'cs/cs_CZ/jirka/medium/cs_CZ-jirka-medium.onnx',
+    'da_DK-talesyntese-medium': 'da/da_DK/talesyntese/medium/da_DK-talesyntese-medium.onnx',
+    'de_DE-eva_k-x_low': 'de/de_DE/eva_k/x_low/de_DE-eva_k-x_low.onnx',
+    'de_DE-karlsson-low': 'de/de_DE/karlsson/low/de_DE-karlsson-low.onnx',
+    'de_DE-kerstin-low': 'de/de_DE/kerstin/low/de_DE-kerstin-low.onnx',
+    'de_DE-mls-medium': 'de/de_DE/mls/medium/de_DE-mls-medium.onnx',
+    'de_DE-pavoque-low': 'de/de_DE/pavoque/low/de_DE-pavoque-low.onnx',
+    'de_DE-ramona-low': 'de/de_DE/ramona/low/de_DE-ramona-low.onnx',
+    'de_DE-thorsten-high': 'de/de_DE/thorsten/high/de_DE-thorsten-high.onnx',
+    'de_DE-thorsten-low': 'de/de_DE/thorsten/low/de_DE-thorsten-low.onnx',
+    'de_DE-thorsten-medium': 'de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx',
+    'de_DE-thorsten_emotional-medium': 'de/de_DE/thorsten_emotional/medium/de_DE-thorsten_emotional-medium.onnx',
+    'el_GR-rapunzelina-low': 'el/el_GR/rapunzelina/low/el_GR-rapunzelina-low.onnx',
+    'en_GB-alan-low': 'en/en_GB/alan/low/en_GB-alan-low.onnx',
+    'en_GB-alan-medium': 'en/en_GB/alan/medium/en_GB-alan-medium.onnx',
+    'en_GB-alba-medium': 'en/en_GB/alba/medium/en_GB-alba-medium.onnx',
+    'en_GB-aru-medium': 'en/en_GB/aru/medium/en_GB-aru-medium.onnx',
+    'en_GB-cori-high': 'en/en_GB/cori/high/en_GB-cori-high.onnx',
+    'en_GB-cori-medium': 'en/en_GB/cori/medium/en_GB-cori-medium.onnx',
+    'en_GB-jenny_dioco-medium': 'en/en_GB/jenny_dioco/medium/en_GB-jenny_dioco-medium.onnx',
+    'en_GB-northern_english_male-medium': 'en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx',
+    'en_GB-semaine-medium': 'en/en_GB/semaine/medium/en_GB-semaine-medium.onnx',
+    'en_GB-southern_english_female-low': 'en/en_GB/southern_english_female/low/en_GB-southern_english_female-low.onnx',
+  'en_GB-vctk-medium': 'en/en_GB/vctk/medium/en_GB-vctk-medium.onnx',
+  'en_US-amy-low': 'en/en_US/amy/low/en_US-amy-low.onnx',
+  'en_US-amy-medium': 'en/en_US/amy/medium/en_US-amy-medium.onnx',
+  'en_US-arctic-medium': 'en/en_US/arctic/medium/en_US-arctic-medium.onnx',
+  'en_US-danny-low': 'en/en_US/danny/low/en_US-danny-low.onnx', */
+  'en_US-hfc_female-medium': 'en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx',
+  /* 'en_US-hfc_male-medium': 'en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx',
+  'en_US-joe-medium': 'en/en_US/joe/medium/en_US-joe-medium.onnx',
+  'en_US-kathleen-low': 'en/en_US/kathleen/low/en_US-kathleen-low.onnx',
+  'en_US-kristin-medium': 'en/en_US/kristin/medium/en_US-kristin-medium.onnx',
+  'en_US-kusal-medium': 'en/en_US/kusal/medium/en_US-kusal-medium.onnx',
+  'en_US-l2arctic-medium': 'en/en_US/l2arctic/medium/en_US-l2arctic-medium.onnx',
+  'en_US-lessac-high': 'en/en_US/lessac/high/en_US-lessac-high.onnx',
+  'en_US-lessac-low': 'en/en_US/lessac/low/en_US-lessac-low.onnx',
+  'en_US-lessac-medium': 'en/en_US/lessac/medium/en_US-lessac-medium.onnx',
+  'en_US-libritts-high': 'en/en_US/libritts/high/en_US-libritts-high.onnx',
+  'en_US-libritts_r-medium': 'en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx',
+  'en_US-ljspeech-high': 'en/en_US/ljspeech/high/en_US-ljspeech-high.onnx',
+  'en_US-ljspeech-medium': 'en/en_US/ljspeech/medium/en_US-ljspeech-medium.onnx',
+  'en_US-ryan-high': 'en/en_US/ryan/high/en_US-ryan-high.onnx',
+  'en_US-ryan-low': 'en/en_US/ryan/low/en_US-ryan-low.onnx',
+  'en_US-ryan-medium': 'en/en_US/ryan/medium/en_US-ryan-medium.onnx',
+  'es_ES-carlfm-x_low': 'es/es_ES/carlfm/x_low/es_ES-carlfm-x_low.onnx',
+    'es_ES-davefx-medium': 'es/es_ES/davefx/medium/es_ES-davefx-medium.onnx',
+    'es_ES-mls_10246-low': 'es/es_ES/mls_10246/low/es_ES-mls_10246-low.onnx',
+    'es_ES-mls_9972-low': 'es/es_ES/mls_9972/low/es_ES-mls_9972-low.onnx',
+    'es_ES-sharvard-medium': 'es/es_ES/sharvard/medium/es_ES-sharvard-medium.onnx',
+    'es_MX-ald-medium': 'es/es_MX/ald/medium/es_MX-ald-medium.onnx',
+    'es_MX-claude-high': 'es/es_MX/claude/high/es_MX-claude-high.onnx',
+    'fa_IR-amir-medium': 'fa/fa_IR/amir/medium/fa_IR-amir-medium.onnx',
+    'fa_IR-gyro-medium': 'fa/fa_IR/gyro/medium/fa_IR-gyro-medium.onnx',
+    'fi_FI-harri-low': 'fi/fi_FI/harri/low/fi_FI-harri-low.onnx',
+    'fi_FI-harri-medium': 'fi/fi_FI/harri/medium/fi_FI-harri-medium.onnx',
+    'fr_FR-gilles-low': 'fr/fr_FR/gilles/low/fr_FR-gilles-low.onnx',
+    'fr_FR-mls-medium': 'fr/fr_FR/mls/medium/fr_FR-mls-medium.onnx',
+    'fr_FR-mls_1840-low': 'fr/fr_FR/mls_1840/low/fr_FR-mls_1840-low.onnx',
+    'fr_FR-siwis-low': 'fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx',
+    'fr_FR-siwis-medium': 'fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx',
+    'fr_FR-tom-medium': 'fr/fr_FR/tom/medium/fr_FR-tom-medium.onnx',
+    'fr_FR-upmc-medium': 'fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx',
+    'hu_HU-anna-medium': 'hu/hu_HU/anna/medium/hu_HU-anna-medium.onnx',
+    'hu_HU-berta-medium': 'hu/hu_HU/berta/medium/hu_HU-berta-medium.onnx',
+    'hu_HU-imre-medium': 'hu/hu_HU/imre/medium/hu_HU-imre-medium.onnx',
+    'is_IS-bui-medium': 'is/is_IS/bui/medium/is_IS-bui-medium.onnx',
+    'is_IS-salka-medium': 'is/is_IS/salka/medium/is_IS-salka-medium.onnx',
+    'is_IS-steinn-medium': 'is/is_IS/steinn/medium/is_IS-steinn-medium.onnx',
+    'is_IS-ugla-medium': 'is/is_IS/ugla/medium/is_IS-ugla-medium.onnx',
+    'it_IT-riccardo-x_low': 'it/it_IT/riccardo/x_low/it_IT-riccardo-x_low.onnx',
+    'ka_GE-natia-medium': 'ka/ka_GE/natia/medium/ka_GE-natia-medium.onnx',
+    'kk_KZ-iseke-x_low': 'kk/kk_KZ/iseke/x_low/kk_KZ-iseke-x_low.onnx',
+    'kk_KZ-issai-high': 'kk/kk_KZ/issai/high/kk_KZ-issai-high.onnx',
+    'kk_KZ-raya-x_low': 'kk/kk_KZ/raya/x_low/kk_KZ-raya-x_low.onnx',
+    'lb_LU-marylux-medium': 'lb/lb_LU/marylux/medium/lb_LU-marylux-medium.onnx',
+    'ne_NP-google-medium': 'ne/ne_NP/google/medium/ne_NP-google-medium.onnx',
+    'ne_NP-google-x_low': 'ne/ne_NP/google/x_low/ne_NP-google-x_low.onnx',
+    'nl_BE-nathalie-medium': 'nl/nl_BE/nathalie/medium/nl_BE-nathalie-medium.onnx',
+    'nl_BE-nathalie-x_low': 'nl/nl_BE/nathalie/x_low/nl_BE-nathalie-x_low.onnx',
+    'nl_BE-rdh-medium': 'nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx',
+    'nl_BE-rdh-x_low': 'nl/nl_BE/rdh/x_low/nl_BE-rdh-x_low.onnx',
+    'nl_NL-mls-medium': 'nl/nl_NL/mls/medium/nl_NL-mls-medium.onnx',
+    'nl_NL-mls_5809-low': 'nl/nl_NL/mls_5809/low/nl_NL-mls_5809-low.onnx',
+    'nl_NL-mls_7432-low': 'nl/nl_NL/mls_7432/low/nl_NL-mls_7432-low.onnx',
+    'no_NO-talesyntese-medium': 'no/no_NO/talesyntese/medium/no_NO-talesyntese-medium.onnx',
+    'pl_PL-darkman-medium': 'pl/pl_PL/darkman/medium/pl_PL-darkman-medium.onnx',
+    'pl_PL-gosia-medium': 'pl/pl_PL/gosia/medium/pl_PL-gosia-medium.onnx',
+    'pl_PL-mc_speech-medium': 'pl/pl_PL/mc_speech/medium/pl_PL-mc_speech-medium.onnx',
+    'pl_PL-mls_6892-low': 'pl/pl_PL/mls_6892/low/pl_PL-mls_6892-low.onnx',
+    'pt_BR-edresson-low': 'pt/pt_BR/edresson/low/pt_BR-edresson-low.onnx',
+    'pt_BR-faber-medium': 'pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx',
+    'pt_PT-tugão-medium': 'pt/pt_PT/tugão/medium/pt_PT-tugão-medium.onnx',
+    'ro_RO-mihai-medium': 'ro/ro_RO/mihai/medium/ro_RO-mihai-medium.onnx',
+    'ru_RU-denis-medium': 'ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx',
+    'ru_RU-dmitri-medium': 'ru/ru_RU/dmitri/medium/ru_RU-dmitri-medium.onnx',
+    'ru_RU-irina-medium': 'ru/ru_RU/irina/medium/ru_RU-irina-medium.onnx',
+    'ru_RU-ruslan-medium': 'ru/ru_RU/ruslan/medium/ru_RU-ruslan-medium.onnx',
+    'sk_SK-lili-medium': 'sk/sk_SK/lili/medium/sk_SK-lili-medium.onnx',
+    'sl_SI-artur-medium': 'sl/sl_SI/artur/medium/sl_SI-artur-medium.onnx',
+    'sr_RS-serbski_institut-medium': 'sr/sr_RS/serbski_institut/medium/sr_RS-serbski_institut-medium.onnx',
+    'sv_SE-nst-medium': 'sv/sv_SE/nst/medium/sv_SE-nst-medium.onnx',
+    'sw_CD-lanfrica-medium': 'sw/sw_CD/lanfrica/medium/sw_CD-lanfrica-medium.onnx',
+    'tr_TR-dfki-medium': 'tr/tr_TR/dfki/medium/tr_TR-dfki-medium.onnx',
+    'tr_TR-fahrettin-medium': 'tr/tr_TR/fahrettin/medium/tr_TR-fahrettin-medium.onnx',
+    'tr_TR-fettah-medium': 'tr/tr_TR/fettah/medium/tr_TR-fettah-medium.onnx',
+    'uk_UA-lada-x_low': 'uk/uk_UA/lada/x_low/uk_UA-lada-x_low.onnx',
+    'uk_UA-ukrainian_tts-medium': 'uk/uk_UA/ukrainian_tts/medium/uk_UA-ukrainian_tts-medium.onnx',
+    'vi_VN-25hours_single-low': 'vi/vi_VN/25hours_single/low/vi_VN-25hours_single-low.onnx',
+    'vi_VN-vais1000-medium': 'vi/vi_VN/vais1000/medium/vi_VN-vais1000-medium.onnx',
+    'vi_VN-vivos-x_low': 'vi/vi_VN/vivos/x_low/vi_VN-vivos-x_low.onnx',
+    'zh_CN-huayan-medium': 'zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx',
+    'zh_CN-huayan-x_low': 'zh/zh_CN/huayan/x_low/zh_CN-huayan-x_low.onnx' */
+};
+//export { HF_BASE as HF_BASE };
+//export { ONNX_BASE as ONNX_BASE };
+//export { WASM_BASE as WASM_BASE };
+//export { PATH_MAP as PATH_MAP };
+async function writeBlob(url, blob) {
+  if (!url.match('https://huggingface.co'))
+    return;
+  try {
+    console.log(blob);
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle('piper', {
+      create: true
+    });
+    const path = url.split('/').at(-1);
+    const file = await dir.getFileHandle(path, {
+      create: true
+    });
+    const writable = await file.createWritable();
+    await writable.write(blob);
+    await writable.close();
+  } catch (e) {
+    console.error(e);
+  }
+}
+async function removeBlob(url) {
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle('piper');
+    const path = url.split('/').at(-1);
+    const file = await dir.getFileHandle(path);
+    await file.remove();
+  } catch (e) {
+    console.error(e);
+  }
+}
+async function readBlob(url) {
+  if (!url.match('https://huggingface.co'))
+    return;
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle('piper', {
+      create: true
+    });
+    const path = url.split('/').at(-1);
+    const file = await dir.getFileHandle(path);
+    return await file.getFile();
+  } catch (e) {
+    return undefined;
+  }
+}
+async function fetchBlob(url, callback) {
+  console.log(url);
+  return await new Promise( (resolve) => {
+    let xContentLength;
+    const xhr = new XMLHttpRequest();
+    xhr.responseType = "blob";
+    
+    xhr.onprogress = (event) => {
+      callback?.({
+        url,
+        total: xContentLength ??= event.total,
+        loaded: event.loaded
+      });
+    }
+    ;
+    
+    xhr.onreadystatechange = () => {
+      if (xhr.readyState >= xhr.HEADERS_RECEIVED && xContentLength == undefined && xhr.getAllResponseHeaders().includes("x-content-length")) {
+        xContentLength = Number(xhr.getResponseHeader("x-content-length"));
+      }
+      if (xhr.readyState === xhr.DONE) {
+        callback?.({
+          url,
+          total: xContentLength,
+          loaded: xContentLength
+        });
+        resolve(xhr.response);
+      }
+    }
+    ;
+    xhr.open("GET", url);
+    xhr.send();
+  }
+  );
+}
+function pcm2wav(buffer, numChannels, sampleRate) {
+  const bufferLength = buffer.length;
+  const view = new DataView(new ArrayBuffer(bufferLength * numChannels * 2 + 44));
+  view.setUint32(0, 0x46464952, true);
+  view.setUint32(4, view.buffer.byteLength - 8, true);
+  view.setUint32(8, 0x45564157, true);
+  view.setUint32(12, 0x20746d66, true);
+  view.setUint32(16, 0x10, true);
+  view.setUint16(20, 0x0001, true);
+  view.setUint16(22, numChannels, true);
+  view.setUint32(24, sampleRate, true);
+  view.setUint32(28, numChannels * 2 * sampleRate, true);
+  view.setUint16(32, numChannels * 2, true);
+  view.setUint16(34, 16, true);
+  view.setUint32(36, 0x61746164, true);
+  view.setUint32(40, 2 * bufferLength, true);
+  let p = 44;
+  for (let i = 0; i < bufferLength; i++) {
+    const v = buffer[i];
+    if (v >= 1)
+      view.setInt16(p, 0x7fff, true);
+    else if (v <= -1)
+      view.setInt16(p, -0x8000, true);
+    else
+      view.setInt16(p, v * 0x8000 | 0, true);
+    p += 2;
+  }
+  return view.buffer;
+}
+async function predict(config, callback) {
+  const {createPiperPhonemize} = await import('data:text/javascript;base64,dmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CnZhciBfX3RvQ29tbW9uSlMgPSAoZnJvbSkgPT4gewogIGNvbnN0IG1vZHVsZUNhY2hlID0gX190b0NvbW1vbkpTLm1vZHVsZUNhY2hlID8/PSBuZXcgV2Vha01hcDsKICB2YXIgY2FjaGVkID0gbW9kdWxlQ2FjaGUuZ2V0KGZyb20pOwogIGlmIChjYWNoZWQpCiAgICByZXR1cm4gY2FjaGVkOwogIHZhciB0byA9IF9fZGVmUHJvcCh7fSwgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogIHZhciBkZXNjID0geyBlbnVtZXJhYmxlOiBmYWxzZSB9OwogIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKQogICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpKQogICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7CiAgICAgICAgICBnZXQ6ICgpID0+IGZyb21ba2V5XSwKICAgICAgICAgIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlCiAgICAgICAgfSk7CiAgfQogIG1vZHVsZUNhY2hlLnNldChmcm9tLCB0byk7CiAgcmV0dXJuIHRvOwp9Owp2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICBmb3IgKHZhciBuYW1lIGluIGFsbCkKICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsKICAgICAgZ2V0OiBhbGxbbmFtZV0sCiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgc2V0OiAobmV3VmFsdWUpID0+IGFsbFtuYW1lXSA9ICgpID0+IG5ld1ZhbHVlCiAgICB9KTsKfTsKdmFyIF9fZXNtID0gKGZuLCByZXMpID0+ICgpID0+IChmbiAmJiAocmVzID0gZm4oZm4gPSAwKSksIHJlcyk7CnZhciBfX3JlcXVpcmUgPSAoKHgpID0+IHR5cGVvZiByZXF1aXJlICE9PSAidW5kZWZpbmVkIiA/IHJlcXVpcmUgOiB0eXBlb2YgUHJveHkgIT09ICJ1bmRlZmluZWQiID8gbmV3IFByb3h5KHgsIHsKICBnZXQ6IChhLCBiKSA9PiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IGEpW2JdCn0pIDogeCkoZnVuY3Rpb24oeCkgewogIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIpCiAgICByZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIHRocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicgKyB4ICsgJyIgaXMgbm90IHN1cHBvcnRlZCcpOwp9KTsKCi8vIG5vZGU6cGF0aAp2YXIgZXhwb3J0c19wYXRoID0ge307Cl9fZXhwb3J0KGV4cG9ydHNfcGF0aCwgewogIGRlZmF1bHQ6ICgpID0+IHsKICAgIHsKICAgICAgcmV0dXJuIHE7CiAgICB9CiAgfQp9KTsKdmFyIEwsIGIsIHosIEQsIFQsIFIsIF8sIEUsIEMsIEEsIHksIGgsIG0sIHE7CnZhciBpbml0X3BhdGggPSBfX2VzbSgoKSA9PiB7CiAgTCA9IE9iamVjdC5jcmVhdGU7CiAgYiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB6ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICBEID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgVCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICBSID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICBfID0gKGYsIGUpID0+ICgpID0+IChlIHx8IGYoKGUgPSB7IGV4cG9ydHM6IHt9IH0pLmV4cG9ydHMsIGUpLCBlLmV4cG9ydHMpOwogIEUgPSAoZiwgZSkgPT4gewogICAgZm9yICh2YXIgciBpbiBlKQogICAgICBiKGYsIHIsIHsgZ2V0OiBlW3JdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgQyA9IChmLCBlLCByLCBsKSA9PiB7CiAgICBpZiAoZSAmJiB0eXBlb2YgZSA9PSAib2JqZWN0IiB8fCB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iKQogICAgICBmb3IgKGxldCBpIG9mIEQoZSkpCiAgICAgICAgIVIuY2FsbChmLCBpKSAmJiBpICE9PSByICYmIGIoZiwgaSwgeyBnZXQ6ICgpID0+IGVbaV0sIGVudW1lcmFibGU6ICEobCA9IHooZSwgaSkpIHx8IGwuZW51bWVyYWJsZSB9KTsKICAgIHJldHVybiBmOwogIH07CiAgQSA9IChmLCBlLCByKSA9PiAoQyhmLCBlLCAiZGVmYXVsdCIpLCByICYmIEMociwgZSwgImRlZmF1bHQiKSk7CiAgeSA9IChmLCBlLCByKSA9PiAociA9IGYgIT0gbnVsbCA/IEwoVChmKSkgOiB7fSwgQyhlIHx8ICFmIHx8ICFmLl9fZXNNb2R1bGUgPyBiKHIsICJkZWZhdWx0IiwgeyB2YWx1ZTogZiwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHIsIGYpKTsKICBoID0gXygoRiwgUykgPT4gewogICAgZnVuY3Rpb24gYyhmKSB7CiAgICAgIGlmICh0eXBlb2YgZiAhPSAic3RyaW5nIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICIgKyBKU09OLnN0cmluZ2lmeShmKSk7CiAgICB9CiAgICBmdW5jdGlvbiB3KGYsIGUpIHsKICAgICAgZm9yICh2YXIgciA9ICIiLCBsID0gMCwgaSA9IC0xLCBzID0gMCwgbiwgdCA9IDA7dCA8PSBmLmxlbmd0aDsgKyt0KSB7CiAgICAgICAgaWYgKHQgPCBmLmxlbmd0aCkKICAgICAgICAgIG4gPSBmLmNoYXJDb2RlQXQodCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAobiA9PT0gNDcpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgbiA9IDQ3OwogICAgICAgIH0KICAgICAgICBpZiAobiA9PT0gNDcpIHsKICAgICAgICAgIGlmICghKGkgPT09IHQgLSAxIHx8IHMgPT09IDEpKQogICAgICAgICAgICBpZiAoaSAhPT0gdCAtIDEgJiYgcyA9PT0gMikgewogICAgICAgICAgICAgIGlmIChyLmxlbmd0aCA8IDIgfHwgbCAhPT0gMiB8fCByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKSAhPT0gNDYgfHwgci5jaGFyQ29kZUF0KHIubGVuZ3RoIC0gMikgIT09IDQ2KSB7CiAgICAgICAgICAgICAgICBpZiAoci5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICAgIHZhciBhID0gci5sYXN0SW5kZXhPZigiLyIpOwogICAgICAgICAgICAgICAgICBpZiAoYSAhPT0gci5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYSA9PT0gLTEgPyAociA9ICIiLCBsID0gMCkgOiAociA9IHIuc2xpY2UoMCwgYSksIGwgPSByLmxlbmd0aCAtIDEgLSByLmxhc3RJbmRleE9mKCIvIikpLCBpID0gdCwgcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci5sZW5ndGggPT09IDIgfHwgci5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgciA9ICIiLCBsID0gMCwgaSA9IHQsIHMgPSAwOwogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZSAmJiAoci5sZW5ndGggPiAwID8gciArPSAiLy4uIiA6IHIgPSAiLi4iLCBsID0gMik7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgIHIubGVuZ3RoID4gMCA/IHIgKz0gIi8iICsgZi5zbGljZShpICsgMSwgdCkgOiByID0gZi5zbGljZShpICsgMSwgdCksIGwgPSB0IC0gaSAtIDE7CiAgICAgICAgICBpID0gdCwgcyA9IDA7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBuID09PSA0NiAmJiBzICE9PSAtMSA/ICsrcyA6IHMgPSAtMTsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGZ1bmN0aW9uIEooZiwgZSkgewogICAgICB2YXIgciA9IGUuZGlyIHx8IGUucm9vdCwgbCA9IGUuYmFzZSB8fCAoZS5uYW1lIHx8ICIiKSArIChlLmV4dCB8fCAiIik7CiAgICAgIHJldHVybiByID8gciA9PT0gZS5yb290ID8gciArIGwgOiByICsgZiArIGwgOiBsOwogICAgfQogICAgdmFyIGcgPSB7IHJlc29sdmU6IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBlID0gIiIsIHIgPSBmYWxzZSwgbCwgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO2kgPj0gLTEgJiYgIXI7IGktLSkgewogICAgICAgIHZhciBzOwogICAgICAgIGkgPj0gMCA/IHMgPSBhcmd1bWVudHNbaV0gOiAobCA9PT0gdW5kZWZpbmVkICYmIChsID0gcHJvY2Vzcy5jd2QoKSksIHMgPSBsKSwgYyhzKSwgcy5sZW5ndGggIT09IDAgJiYgKGUgPSBzICsgIi8iICsgZSwgciA9IHMuY2hhckNvZGVBdCgwKSA9PT0gNDcpOwogICAgICB9CiAgICAgIHJldHVybiBlID0gdyhlLCAhciksIHIgPyBlLmxlbmd0aCA+IDAgPyAiLyIgKyBlIDogIi8iIDogZS5sZW5ndGggPiAwID8gZSA6ICIuIjsKICAgIH0sIG5vcm1hbGl6ZTogZnVuY3Rpb24oZSkgewogICAgICBpZiAoYyhlKSwgZS5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuICIuIjsKICAgICAgdmFyIHIgPSBlLmNoYXJDb2RlQXQoMCkgPT09IDQ3LCBsID0gZS5jaGFyQ29kZUF0KGUubGVuZ3RoIC0gMSkgPT09IDQ3OwogICAgICByZXR1cm4gZSA9IHcoZSwgIXIpLCBlLmxlbmd0aCA9PT0gMCAmJiAhciAmJiAoZSA9ICIuIiksIGUubGVuZ3RoID4gMCAmJiBsICYmIChlICs9ICIvIiksIHIgPyAiLyIgKyBlIDogZTsKICAgIH0sIGlzQWJzb2x1dGU6IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGMoZSksIGUubGVuZ3RoID4gMCAmJiBlLmNoYXJDb2RlQXQoMCkgPT09IDQ3OwogICAgfSwgam9pbjogZnVuY3Rpb24oKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiLiI7CiAgICAgIGZvciAodmFyIGUsIHIgPSAwO3IgPCBhcmd1bWVudHMubGVuZ3RoOyArK3IpIHsKICAgICAgICB2YXIgbCA9IGFyZ3VtZW50c1tyXTsKICAgICAgICBjKGwpLCBsLmxlbmd0aCA+IDAgJiYgKGUgPT09IHVuZGVmaW5lZCA/IGUgPSBsIDogZSArPSAiLyIgKyBsKTsKICAgICAgfQogICAgICByZXR1cm4gZSA9PT0gdW5kZWZpbmVkID8gIi4iIDogZy5ub3JtYWxpemUoZSk7CiAgICB9LCByZWxhdGl2ZTogZnVuY3Rpb24oZSwgcikgewogICAgICBpZiAoYyhlKSwgYyhyKSwgZSA9PT0gciB8fCAoZSA9IGcucmVzb2x2ZShlKSwgciA9IGcucmVzb2x2ZShyKSwgZSA9PT0gcikpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBmb3IgKHZhciBsID0gMTtsIDwgZS5sZW5ndGggJiYgZS5jaGFyQ29kZUF0KGwpID09PSA0NzsgKytsKQogICAgICAgIDsKICAgICAgZm9yICh2YXIgaSA9IGUubGVuZ3RoLCBzID0gaSAtIGwsIG4gPSAxO24gPCByLmxlbmd0aCAmJiByLmNoYXJDb2RlQXQobikgPT09IDQ3OyArK24pCiAgICAgICAgOwogICAgICBmb3IgKHZhciB0ID0gci5sZW5ndGgsIGEgPSB0IC0gbiwgdiA9IHMgPCBhID8gcyA6IGEsIHUgPSAtMSwgbyA9IDA7byA8PSB2OyArK28pIHsKICAgICAgICBpZiAobyA9PT0gdikgewogICAgICAgICAgaWYgKGEgPiB2KSB7CiAgICAgICAgICAgIGlmIChyLmNoYXJDb2RlQXQobiArIG8pID09PSA0NykKICAgICAgICAgICAgICByZXR1cm4gci5zbGljZShuICsgbyArIDEpOwogICAgICAgICAgICBpZiAobyA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm4gci5zbGljZShuICsgbyk7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcyA+IHYgJiYgKGUuY2hhckNvZGVBdChsICsgbykgPT09IDQ3ID8gdSA9IG8gOiBvID09PSAwICYmICh1ID0gMCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZhciBrID0gZS5jaGFyQ29kZUF0KGwgKyBvKSwgUCA9IHIuY2hhckNvZGVBdChuICsgbyk7CiAgICAgICAgaWYgKGsgIT09IFApCiAgICAgICAgICBicmVhazsKICAgICAgICBrID09PSA0NyAmJiAodSA9IG8pOwogICAgICB9CiAgICAgIHZhciBkID0gIiI7CiAgICAgIGZvciAobyA9IGwgKyB1ICsgMTtvIDw9IGk7ICsrbykKICAgICAgICAobyA9PT0gaSB8fCBlLmNoYXJDb2RlQXQobykgPT09IDQ3KSAmJiAoZC5sZW5ndGggPT09IDAgPyBkICs9ICIuLiIgOiBkICs9ICIvLi4iKTsKICAgICAgcmV0dXJuIGQubGVuZ3RoID4gMCA/IGQgKyByLnNsaWNlKG4gKyB1KSA6IChuICs9IHUsIHIuY2hhckNvZGVBdChuKSA9PT0gNDcgJiYgKytuLCByLnNsaWNlKG4pKTsKICAgIH0sIF9tYWtlTG9uZzogZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZTsKICAgIH0sIGRpcm5hbWU6IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGMoZSksIGUubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiLiI7CiAgICAgIGZvciAodmFyIHIgPSBlLmNoYXJDb2RlQXQoMCksIGwgPSByID09PSA0NywgaSA9IC0xLCBzID0gdHJ1ZSwgbiA9IGUubGVuZ3RoIC0gMTtuID49IDE7IC0tbikKICAgICAgICBpZiAociA9IGUuY2hhckNvZGVBdChuKSwgciA9PT0gNDcpIHsKICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICBpID0gbjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBzID0gZmFsc2U7CiAgICAgIHJldHVybiBpID09PSAtMSA/IGwgPyAiLyIgOiAiLiIgOiBsICYmIGkgPT09IDEgPyAiLy8iIDogZS5zbGljZSgwLCBpKTsKICAgIH0sIGJhc2VuYW1lOiBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmIChyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIgIT0gInN0cmluZyIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImV4dCIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpOwogICAgICBjKGUpOwogICAgICB2YXIgbCA9IDAsIGkgPSAtMSwgcyA9IHRydWUsIG47CiAgICAgIGlmIChyICE9PSB1bmRlZmluZWQgJiYgci5sZW5ndGggPiAwICYmIHIubGVuZ3RoIDw9IGUubGVuZ3RoKSB7CiAgICAgICAgaWYgKHIubGVuZ3RoID09PSBlLmxlbmd0aCAmJiByID09PSBlKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIHZhciB0ID0gci5sZW5ndGggLSAxLCBhID0gLTE7CiAgICAgICAgZm9yIChuID0gZS5sZW5ndGggLSAxO24gPj0gMDsgLS1uKSB7CiAgICAgICAgICB2YXIgdiA9IGUuY2hhckNvZGVBdChuKTsKICAgICAgICAgIGlmICh2ID09PSA0NykgewogICAgICAgICAgICBpZiAoIXMpIHsKICAgICAgICAgICAgICBsID0gbiArIDE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBhID09PSAtMSAmJiAocyA9IGZhbHNlLCBhID0gbiArIDEpLCB0ID49IDAgJiYgKHYgPT09IHIuY2hhckNvZGVBdCh0KSA/IC0tdCA9PT0gLTEgJiYgKGkgPSBuKSA6ICh0ID0gLTEsIGkgPSBhKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsID09PSBpID8gaSA9IGEgOiBpID09PSAtMSAmJiAoaSA9IGUubGVuZ3RoKSwgZS5zbGljZShsLCBpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKG4gPSBlLmxlbmd0aCAtIDE7biA+PSAwOyAtLW4pCiAgICAgICAgICBpZiAoZS5jaGFyQ29kZUF0KG4pID09PSA0NykgewogICAgICAgICAgICBpZiAoIXMpIHsKICAgICAgICAgICAgICBsID0gbiArIDE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBpID09PSAtMSAmJiAocyA9IGZhbHNlLCBpID0gbiArIDEpOwogICAgICAgIHJldHVybiBpID09PSAtMSA/ICIiIDogZS5zbGljZShsLCBpKTsKICAgICAgfQogICAgfSwgZXh0bmFtZTogZnVuY3Rpb24oZSkgewogICAgICBjKGUpOwogICAgICBmb3IgKHZhciByID0gLTEsIGwgPSAwLCBpID0gLTEsIHMgPSB0cnVlLCBuID0gMCwgdCA9IGUubGVuZ3RoIC0gMTt0ID49IDA7IC0tdCkgewogICAgICAgIHZhciBhID0gZS5jaGFyQ29kZUF0KHQpOwogICAgICAgIGlmIChhID09PSA0NykgewogICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgIGwgPSB0ICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaSA9PT0gLTEgJiYgKHMgPSBmYWxzZSwgaSA9IHQgKyAxKSwgYSA9PT0gNDYgPyByID09PSAtMSA/IHIgPSB0IDogbiAhPT0gMSAmJiAobiA9IDEpIDogciAhPT0gLTEgJiYgKG4gPSAtMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHIgPT09IC0xIHx8IGkgPT09IC0xIHx8IG4gPT09IDAgfHwgbiA9PT0gMSAmJiByID09PSBpIC0gMSAmJiByID09PSBsICsgMSA/ICIiIDogZS5zbGljZShyLCBpKTsKICAgIH0sIGZvcm1hdDogZnVuY3Rpb24oZSkgewogICAgICBpZiAoZSA9PT0gbnVsbCB8fCB0eXBlb2YgZSAhPSAib2JqZWN0IikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlKTsKICAgICAgcmV0dXJuIEooIi8iLCBlKTsKICAgIH0sIHBhcnNlOiBmdW5jdGlvbihlKSB7CiAgICAgIGMoZSk7CiAgICAgIHZhciByID0geyByb290OiAiIiwgZGlyOiAiIiwgYmFzZTogIiIsIGV4dDogIiIsIG5hbWU6ICIiIH07CiAgICAgIGlmIChlLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gcjsKICAgICAgdmFyIGwgPSBlLmNoYXJDb2RlQXQoMCksIGkgPSBsID09PSA0NywgczsKICAgICAgaSA/IChyLnJvb3QgPSAiLyIsIHMgPSAxKSA6IHMgPSAwOwogICAgICBmb3IgKHZhciBuID0gLTEsIHQgPSAwLCBhID0gLTEsIHYgPSB0cnVlLCB1ID0gZS5sZW5ndGggLSAxLCBvID0gMDt1ID49IHM7IC0tdSkgewogICAgICAgIGlmIChsID0gZS5jaGFyQ29kZUF0KHUpLCBsID09PSA0NykgewogICAgICAgICAgaWYgKCF2KSB7CiAgICAgICAgICAgIHQgPSB1ICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgYSA9PT0gLTEgJiYgKHYgPSBmYWxzZSwgYSA9IHUgKyAxKSwgbCA9PT0gNDYgPyBuID09PSAtMSA/IG4gPSB1IDogbyAhPT0gMSAmJiAobyA9IDEpIDogbiAhPT0gLTEgJiYgKG8gPSAtMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IC0xIHx8IGEgPT09IC0xIHx8IG8gPT09IDAgfHwgbyA9PT0gMSAmJiBuID09PSBhIC0gMSAmJiBuID09PSB0ICsgMSA/IGEgIT09IC0xICYmICh0ID09PSAwICYmIGkgPyByLmJhc2UgPSByLm5hbWUgPSBlLnNsaWNlKDEsIGEpIDogci5iYXNlID0gci5uYW1lID0gZS5zbGljZSh0LCBhKSkgOiAodCA9PT0gMCAmJiBpID8gKHIubmFtZSA9IGUuc2xpY2UoMSwgbiksIHIuYmFzZSA9IGUuc2xpY2UoMSwgYSkpIDogKHIubmFtZSA9IGUuc2xpY2UodCwgbiksIHIuYmFzZSA9IGUuc2xpY2UodCwgYSkpLCByLmV4dCA9IGUuc2xpY2UobiwgYSkpLCB0ID4gMCA/IHIuZGlyID0gZS5zbGljZSgwLCB0IC0gMSkgOiBpICYmIChyLmRpciA9ICIvIiksIHI7CiAgICB9LCBzZXA6ICIvIiwgZGVsaW1pdGVyOiAiOiIsIHdpbjMyOiBudWxsLCBwb3NpeDogbnVsbCB9OwogICAgZy5wb3NpeCA9IGc7CiAgICBTLmV4cG9ydHMgPSBnOwogIH0pOwogIG0gPSB7fTsKICBFKG0sIHsgZGVmYXVsdDogKCkgPT4gcSB9KTsKICBBKG0sIHkoaCgpKSk7CiAgcSA9IHkoaCgpKTsKfSk7CgovLyBub2RlOmNyeXB0bwp2YXIgZXhwb3J0c19jcnlwdG8gPSB7fTsKX19leHBvcnQoZXhwb3J0c19jcnlwdG8sIHsKICB3ZWJjcnlwdG86ICgpID0+IHsKICAgIHsKICAgICAgcmV0dXJuIGN3OwogICAgfQogIH0sCiAgdGltaW5nU2FmZUVxdWFsOiAoKSA9PiB7CiAgICB7CiAgICAgIHJldHVybiB4MDsKICAgIH0KICB9LAogIHNjcnlwdFN5bmM6ICgpID0+IHsKICAgIHsKICAgICAgcmV0dXJuIElkOwogICAgfQogIH0sCiAgc2NyeXB0OiAoKSA9PiB7CiAgICB7CiAgICAgIHJldHVybiBUZDsKICAgIH0KICB9LAogIHJhbmRvbVVVSUQ6ICgpID0+IHsKICAgIHsKICAgICAgcmV0dXJuIGx3OwogICAgfQogIH0sCiAgZ2V0UmFuZG9tVmFsdWVzOiAoKSA9PiB7CiAgICB7CiAgICAgIHJldHVybiB1dzsKICAgIH0KICB9LAogIGdldEN1cnZlczogKCkgPT4gewogICAgewogICAgICByZXR1cm4gZHc7CiAgICB9CiAgfSwKICBkZWZhdWx0OiAoKSA9PiB7CiAgICB7CiAgICAgIHJldHVybiBXcTsKICAgIH0KICB9LAogIERFRkFVTFRfRU5DT0RJTkc6ICgpID0+IHsKICAgIHsKICAgICAgcmV0dXJuIEdhOwogICAgfQogIH0KfSk7CnZhciBkdywgcHcsIFhhLCB2dywgYncsIG13LCBndywgUjAsIFQyLCBKYSwgWWEsIG90LCBybiwgdXIsIE5kLCBEZCwgVXQsIFRlLCBvbiwgSWUsIGtpLCBXMCwgJGYsIHBjLCBaMCwgc24sIFYwLCBHMCwgSjAsIGhuLCBjbywgSmYsIHBvLCBRZiwgdm8sIFBjLCBPYywgdGgsIHBoLCBRYywgbnAsIGFwLCBiaCwgQW8sIEJvLCBwbiwgX3AsIEVwLCBnaCwgcXAsIHloLCBPcCwga28sIFR0LCBHciwgTm8sIEp0LCBwYSwgUmgsIHByLCBZXywgT2ksIEZpLCBVaSwgazEsIHluLCBWbywgR28sIFoxLCBYbywgRmgsIGJhLCBKaCwgRHYsIFFyLCBmdSwgb3UsIG9zLCBlYiwgY3UsIGxiLCBidSwgdmYsIFM3LCBkYiwgeWksIGJmLCB3YiwgbXUsIHd1LCBNdSwgRWIsIF91LCB4dSwgRXUsIEF1LCBVYiwgSXUsIFR1LCBhciwgdnMsIGt1LCBZYiwgUWIsIGVtLCBpbSwgbm0sIHlmLCBvbSwgdW0sIGRtLCBwbSwgYm0sIFB1LCBPdSwgRnUsIHdzLCBBYSwgRW0sIFd1LCBqdSwgQmEsIERtLCBGbSwgRXMsIEhtLCBWbSwgamksIFl1LCBZbSwgWG0sIEFzLCB0bCwgb2wsIHJnLCBhZywgaGcsIGhsLCBwZywgZGwsIGtuLCBjbCwgYmwsIExuLCBEcywgTGcsIERnLCB5bCwgSWwsIFlnLCB0MiwgaTIsIFdzLCBLcywgczIsIHJpLCBObCwgb3IsIE9hLCBiMiwgeTIsIF8yLCBQbCwgQ3IsIFRmLCBDbCwgTjIsIEZsLCBGMiwgV2wsIFoyLCBWMiwgUTIsIHR5LCBlMCwgbnksIHQwLCB1eSwgZHksIHZ5LCB5eSwgeHksIEV5LCBJeSwgbzAsIHRkLCBoMCwgdTAsIEtmLCBkMCwgYzAsIG5kLCBIeSwgb2QsIGhkLCBKeSwgZGQsIHIzLCBuMywgbzMsIGNkLCBkMywgcDMsIHYzLCBtMywgSGEsIGJkLCBfMywgQTMsIGszLCBOMywgUDMsIF9kLCB4ZCwgdzAsIEVkLCBqMywgWTMsIFgzLCBvdywgcWQsIFh0LCB6cSwgR2EsIHV3LCBsdywgSHEsIHgwLCBJZCwgVGQsIGN3LCBXcTsKdmFyIGluaXRfY3J5cHRvID0gX19lc20oKCkgPT4gewogIGR3ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gSHE7CiAgfTsKICBwdyA9IE9iamVjdC5jcmVhdGU7CiAgWGEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdncgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogIGJ3ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgbXcgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CiAgZ3cgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogIFIwID0gKHQsIGUpID0+ICgpID0+ICh0ICYmIChlID0gdCh0ID0gMCkpLCBlKTsKICBUMiA9ICh0LCBlKSA9PiAoKSA9PiAoZSB8fCB0KChlID0geyBleHBvcnRzOiB7fSB9KS5leHBvcnRzLCBlKSwgZS5leHBvcnRzKTsKICBKYSA9ICh0LCBlKSA9PiB7CiAgICBmb3IgKHZhciByIGluIGUpCiAgICAgIFhhKHQsIHIsIHsgZ2V0OiBlW3JdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgWWEgPSAodCwgZSwgciwgbykgPT4gewogICAgaWYgKGUgJiYgdHlwZW9mIGUgPT0gIm9iamVjdCIgfHwgdHlwZW9mIGUgPT0gImZ1bmN0aW9uIikKICAgICAgZm9yIChsZXQgZiBvZiBidyhlKSkKICAgICAgICAhZ3cuY2FsbCh0LCBmKSAmJiBmICE9PSByICYmIFhhKHQsIGYsIHsgZ2V0OiAoKSA9PiBlW2ZdLCBlbnVtZXJhYmxlOiAhKG8gPSB2dyhlLCBmKSkgfHwgby5lbnVtZXJhYmxlIH0pOwogICAgcmV0dXJuIHQ7CiAgfTsKICBvdCA9ICh0LCBlLCByKSA9PiAoWWEodCwgZSwgImRlZmF1bHQiKSwgciAmJiBZYShyLCBlLCAiZGVmYXVsdCIpKTsKICBybiA9ICh0LCBlLCByKSA9PiAociA9IHQgIT0gbnVsbCA/IHB3KG13KHQpKSA6IHt9LCBZYShlIHx8ICF0IHx8ICF0Ll9fZXNNb2R1bGUgPyBYYShyLCAiZGVmYXVsdCIsIHsgdmFsdWU6IHQsIGVudW1lcmFibGU6IHRydWUgfSkgOiByLCB0KSk7CiAgdXIgPSAodCkgPT4gWWEoWGEoe30sICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KSwgdCk7CiAgTmQgPSBUMigoUWEpID0+IHsKICAgIFFhLmJ5dGVMZW5ndGggPSB3dzsKICAgIFFhLnRvQnl0ZUFycmF5ID0gX3c7CiAgICBRYS5mcm9tQnl0ZUFycmF5ID0gRXc7CiAgICB2YXIganIgPSBbXSwgbHIgPSBbXSwgeXcgPSB0eXBlb2YgVWludDhBcnJheSA8ICJ1IiA/IFVpbnQ4QXJyYXkgOiBBcnJheSwgQjAgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgICBmb3IgKG5uID0gMCwga2QgPSBCMC5sZW5ndGg7bm4gPCBrZDsgKytubikKICAgICAganJbbm5dID0gQjBbbm5dLCBscltCMC5jaGFyQ29kZUF0KG5uKV0gPSBubjsKICAgIHZhciBubiwga2Q7CiAgICBsclsiLSIuY2hhckNvZGVBdCgwKV0gPSA2MjsKICAgIGxyWyJfIi5jaGFyQ29kZUF0KDApXSA9IDYzOwogICAgZnVuY3Rpb24gTGQodCkgewogICAgICB2YXIgZSA9IHQubGVuZ3RoOwogICAgICBpZiAoZSAlIDQgPiAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpOwogICAgICB2YXIgciA9IHQuaW5kZXhPZigiPSIpOwogICAgICByID09PSAtMSAmJiAociA9IGUpOwogICAgICB2YXIgbyA9IHIgPT09IGUgPyAwIDogNCAtIHIgJSA0OwogICAgICByZXR1cm4gW3IsIG9dOwogICAgfQogICAgZnVuY3Rpb24gd3codCkgewogICAgICB2YXIgZSA9IExkKHQpLCByID0gZVswXSwgbyA9IGVbMV07CiAgICAgIHJldHVybiAociArIG8pICogMyAvIDQgLSBvOwogICAgfQogICAgZnVuY3Rpb24gTXcodCwgZSwgcikgewogICAgICByZXR1cm4gKGUgKyByKSAqIDMgLyA0IC0gcjsKICAgIH0KICAgIGZ1bmN0aW9uIF93KHQpIHsKICAgICAgdmFyIGUsIHIgPSBMZCh0KSwgbyA9IHJbMF0sIGYgPSByWzFdLCBwID0gbmV3IHl3KE13KHQsIG8sIGYpKSwgbTIgPSAwLCB5MiA9IGYgPiAwID8gbyAtIDQgOiBvLCBNOwogICAgICBmb3IgKE0gPSAwO00gPCB5MjsgTSArPSA0KQogICAgICAgIGUgPSBsclt0LmNoYXJDb2RlQXQoTSldIDw8IDE4IHwgbHJbdC5jaGFyQ29kZUF0KE0gKyAxKV0gPDwgMTIgfCBsclt0LmNoYXJDb2RlQXQoTSArIDIpXSA8PCA2IHwgbHJbdC5jaGFyQ29kZUF0KE0gKyAzKV0sIHBbbTIrK10gPSBlID4+IDE2ICYgMjU1LCBwW20yKytdID0gZSA+PiA4ICYgMjU1LCBwW20yKytdID0gZSAmIDI1NTsKICAgICAgcmV0dXJuIGYgPT09IDIgJiYgKGUgPSBsclt0LmNoYXJDb2RlQXQoTSldIDw8IDIgfCBsclt0LmNoYXJDb2RlQXQoTSArIDEpXSA+PiA0LCBwW20yKytdID0gZSAmIDI1NSksIGYgPT09IDEgJiYgKGUgPSBsclt0LmNoYXJDb2RlQXQoTSldIDw8IDEwIHwgbHJbdC5jaGFyQ29kZUF0KE0gKyAxKV0gPDwgNCB8IGxyW3QuY2hhckNvZGVBdChNICsgMildID4+IDIsIHBbbTIrK10gPSBlID4+IDggJiAyNTUsIHBbbTIrK10gPSBlICYgMjU1KSwgcDsKICAgIH0KICAgIGZ1bmN0aW9uIHh3KHQpIHsKICAgICAgcmV0dXJuIGpyW3QgPj4gMTggJiA2M10gKyBqclt0ID4+IDEyICYgNjNdICsganJbdCA+PiA2ICYgNjNdICsganJbdCAmIDYzXTsKICAgIH0KICAgIGZ1bmN0aW9uIFN3KHQsIGUsIHIpIHsKICAgICAgZm9yICh2YXIgbywgZiA9IFtdLCBwID0gZTtwIDwgcjsgcCArPSAzKQogICAgICAgIG8gPSAodFtwXSA8PCAxNiAmIDE2NzExNjgwKSArICh0W3AgKyAxXSA8PCA4ICYgNjUyODApICsgKHRbcCArIDJdICYgMjU1KSwgZi5wdXNoKHh3KG8pKTsKICAgICAgcmV0dXJuIGYuam9pbigiIik7CiAgICB9CiAgICBmdW5jdGlvbiBFdyh0KSB7CiAgICAgIGZvciAodmFyIGUsIHIgPSB0Lmxlbmd0aCwgbyA9IHIgJSAzLCBmID0gW10sIHAgPSAxNjM4MywgbTIgPSAwLCB5MiA9IHIgLSBvO20yIDwgeTI7IG0yICs9IHApCiAgICAgICAgZi5wdXNoKFN3KHQsIG0yLCBtMiArIHAgPiB5MiA/IHkyIDogbTIgKyBwKSk7CiAgICAgIHJldHVybiBvID09PSAxID8gKGUgPSB0W3IgLSAxXSwgZi5wdXNoKGpyW2UgPj4gMl0gKyBqcltlIDw8IDQgJiA2M10gKyAiPT0iKSkgOiBvID09PSAyICYmIChlID0gKHRbciAtIDJdIDw8IDgpICsgdFtyIC0gMV0sIGYucHVzaChqcltlID4+IDEwXSArIGpyW2UgPj4gNCAmIDYzXSArIGpyW2UgPDwgMiAmIDYzXSArICI9IikpLCBmLmpvaW4oIiIpOwogICAgfQogIH0pOwogIERkID0gVDIoKHEwKSA9PiB7CiAgICBxMC5yZWFkID0gZnVuY3Rpb24odCwgZSwgciwgbywgZikgewogICAgICB2YXIgcCwgbTIsIHkyID0gZiAqIDggLSBvIC0gMSwgTSA9ICgxIDw8IHkyKSAtIDEsIHggPSBNID4+IDEsIFMgPSAtNywgRTIgPSByID8gZiAtIDEgOiAwLCBCID0gciA/IC0xIDogMSwgcTIgPSB0W2UgKyBFMl07CiAgICAgIGZvciAoRTIgKz0gQiwgcCA9IHEyICYgKDEgPDwgLVMpIC0gMSwgcTIgPj49IC1TLCBTICs9IHkyO1MgPiAwOyBwID0gcCAqIDI1NiArIHRbZSArIEUyXSwgRTIgKz0gQiwgUyAtPSA4KQogICAgICAgIDsKICAgICAgZm9yIChtMiA9IHAgJiAoMSA8PCAtUykgLSAxLCBwID4+PSAtUywgUyArPSBvO1MgPiAwOyBtMiA9IG0yICogMjU2ICsgdFtlICsgRTJdLCBFMiArPSBCLCBTIC09IDgpCiAgICAgICAgOwogICAgICBpZiAocCA9PT0gMCkKICAgICAgICBwID0gMSAtIHg7CiAgICAgIGVsc2UgewogICAgICAgIGlmIChwID09PSBNKQogICAgICAgICAgcmV0dXJuIG0yID8gTmFOIDogKHEyID8gLTEgOiAxKSAqICgxIC8gMCk7CiAgICAgICAgbTIgPSBtMiArIE1hdGgucG93KDIsIG8pLCBwID0gcCAtIHg7CiAgICAgIH0KICAgICAgcmV0dXJuIChxMiA/IC0xIDogMSkgKiBtMiAqIE1hdGgucG93KDIsIHAgLSBvKTsKICAgIH07CiAgICBxMC53cml0ZSA9IGZ1bmN0aW9uKHQsIGUsIHIsIG8sIGYsIHApIHsKICAgICAgdmFyIG0yLCB5MiwgTSwgeCA9IHAgKiA4IC0gZiAtIDEsIFMgPSAoMSA8PCB4KSAtIDEsIEUyID0gUyA+PiAxLCBCID0gZiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDAsIHEyID0gbyA/IDAgOiBwIC0gMSwgTDIgPSBvID8gMSA6IC0xLCBnZSA9IGUgPCAwIHx8IGUgPT09IDAgJiYgMSAvIGUgPCAwID8gMSA6IDA7CiAgICAgIGZvciAoZSA9IE1hdGguYWJzKGUpLCBpc05hTihlKSB8fCBlID09PSAxIC8gMCA/ICh5MiA9IGlzTmFOKGUpID8gMSA6IDAsIG0yID0gUykgOiAobTIgPSBNYXRoLmZsb29yKE1hdGgubG9nKGUpIC8gTWF0aC5MTjIpLCBlICogKE0gPSBNYXRoLnBvdygyLCAtbTIpKSA8IDEgJiYgKG0yLS0sIE0gKj0gMiksIG0yICsgRTIgPj0gMSA/IGUgKz0gQiAvIE0gOiBlICs9IEIgKiBNYXRoLnBvdygyLCAxIC0gRTIpLCBlICogTSA+PSAyICYmIChtMisrLCBNIC89IDIpLCBtMiArIEUyID49IFMgPyAoeTIgPSAwLCBtMiA9IFMpIDogbTIgKyBFMiA+PSAxID8gKHkyID0gKGUgKiBNIC0gMSkgKiBNYXRoLnBvdygyLCBmKSwgbTIgPSBtMiArIEUyKSA6ICh5MiA9IGUgKiBNYXRoLnBvdygyLCBFMiAtIDEpICogTWF0aC5wb3coMiwgZiksIG0yID0gMCkpO2YgPj0gODsgdFtyICsgcTJdID0geTIgJiAyNTUsIHEyICs9IEwyLCB5MiAvPSAyNTYsIGYgLT0gOCkKICAgICAgICA7CiAgICAgIGZvciAobTIgPSBtMiA8PCBmIHwgeTIsIHggKz0gZjt4ID4gMDsgdFtyICsgcTJdID0gbTIgJiAyNTUsIHEyICs9IEwyLCBtMiAvPSAyNTYsIHggLT0gOCkKICAgICAgICA7CiAgICAgIHRbciArIHEyIC0gTDJdIHw9IGdlICogMTI4OwogICAgfTsKICB9KTsKICBVdCA9IFQyKChYbikgPT4gewogICAgdmFyIEkwID0gTmQoKSwgR24gPSBEZCgpLCBQZCA9IHR5cGVvZiBTeW1ib2wgPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PSAiZnVuY3Rpb24iID8gU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKSA6IG51bGw7CiAgICBYbi5CdWZmZXIgPSBtZTsKICAgIFhuLlNsb3dCdWZmZXIgPSBUdzsKICAgIFhuLklOU1BFQ1RfTUFYX0JZVEVTID0gNTA7CiAgICB2YXIgZW8gPSAyMTQ3NDgzNjQ3OwogICAgWG4ua01heExlbmd0aCA9IGVvOwogICAgbWUuVFlQRURfQVJSQVlfU1VQUE9SVCA9IEF3KCk7CiAgICAhbWUuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSA8ICJ1IiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PSAiZnVuY3Rpb24iICYmIGNvbnNvbGUuZXJyb3IoIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LiIpOwogICAgZnVuY3Rpb24gQXcoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgbGV0IHQgPSBuZXcgVWludDhBcnJheSgxKSwgZSA9IHsgZm9vOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiA0MjsKICAgICAgICB9IH07CiAgICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLCBVaW50OEFycmF5LnByb3RvdHlwZSksIE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBlKSwgdC5mb28oKSA9PT0gNDI7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLnByb3RvdHlwZSwgInBhcmVudCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKCEhbWUuaXNCdWZmZXIodGhpcykpCiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZS5wcm90b3R5cGUsICJvZmZzZXQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICghIW1lLmlzQnVmZmVyKHRoaXMpKQogICAgICAgIHJldHVybiB0aGlzLmJ5dGVPZmZzZXQ7CiAgICB9IH0pOwogICAgZnVuY3Rpb24gbGkodCkgewogICAgICBpZiAodCA+IGVvKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicgKyB0ICsgJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICJzaXplIicpOwogICAgICBsZXQgZSA9IG5ldyBVaW50OEFycmF5KHQpOwogICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsIG1lLnByb3RvdHlwZSksIGU7CiAgICB9CiAgICBmdW5jdGlvbiBtZSh0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgdCA9PSAibnVtYmVyIikgewogICAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIikKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpOwogICAgICAgIHJldHVybiBOMCh0KTsKICAgICAgfQogICAgICByZXR1cm4gVWQodCwgZSwgcik7CiAgICB9CiAgICBtZS5wb29sU2l6ZSA9IDgxOTI7CiAgICBmdW5jdGlvbiBVZCh0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgdCA9PSAic3RyaW5nIikKICAgICAgICByZXR1cm4gQncodCwgZSk7CiAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodCkpCiAgICAgICAgcmV0dXJuIHF3KHQpOwogICAgICBpZiAodCA9PSBudWxsKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIgKyB0eXBlb2YgdCk7CiAgICAgIGlmIChacih0LCBBcnJheUJ1ZmZlcikgfHwgdCAmJiBacih0LmJ1ZmZlciwgQXJyYXlCdWZmZXIpIHx8IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA8ICJ1IiAmJiAoWnIodCwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IHQgJiYgWnIodC5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpCiAgICAgICAgcmV0dXJuIGswKHQsIGUsIHIpOwogICAgICBpZiAodHlwZW9mIHQgPT0gIm51bWJlciIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7CiAgICAgIGxldCBvID0gdC52YWx1ZU9mICYmIHQudmFsdWVPZigpOwogICAgICBpZiAobyAhPSBudWxsICYmIG8gIT09IHQpCiAgICAgICAgcmV0dXJuIG1lLmZyb20obywgZSwgcik7CiAgICAgIGxldCBmID0gSXcodCk7CiAgICAgIGlmIChmKQogICAgICAgIHJldHVybiBmOwogICAgICBpZiAodHlwZW9mIFN5bWJvbCA8ICJ1IiAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJiB0eXBlb2YgdFtTeW1ib2wudG9QcmltaXRpdmVdID09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuIG1lLmZyb20odFtTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSwgZSwgcik7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIgKyB0eXBlb2YgdCk7CiAgICB9CiAgICBtZS5mcm9tID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICByZXR1cm4gVWQodCwgZSwgcik7CiAgICB9OwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG1lLnByb3RvdHlwZSwgVWludDhBcnJheS5wcm90b3R5cGUpOwogICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG1lLCBVaW50OEFycmF5KTsKICAgIGZ1bmN0aW9uIHpkKHQpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7CiAgICAgIGlmICh0IDwgMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlICInICsgdCArICciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKTsKICAgIH0KICAgIGZ1bmN0aW9uIFJ3KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHpkKHQpLCB0IDw9IDAgPyBsaSh0KSA6IGUgIT09IHVuZGVmaW5lZCA/IHR5cGVvZiByID09ICJzdHJpbmciID8gbGkodCkuZmlsbChlLCByKSA6IGxpKHQpLmZpbGwoZSkgOiBsaSh0KTsKICAgIH0KICAgIG1lLmFsbG9jID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICByZXR1cm4gUncodCwgZSwgcik7CiAgICB9OwogICAgZnVuY3Rpb24gTjAodCkgewogICAgICByZXR1cm4gemQodCksIGxpKHQgPCAwID8gMCA6IEQwKHQpIHwgMCk7CiAgICB9CiAgICBtZS5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIE4wKHQpOwogICAgfTsKICAgIG1lLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIE4wKHQpOwogICAgfTsKICAgIGZ1bmN0aW9uIEJ3KHQsIGUpIHsKICAgICAgaWYgKCh0eXBlb2YgZSAhPSAic3RyaW5nIiB8fCBlID09PSAiIikgJiYgKGUgPSAidXRmOCIpLCAhbWUuaXNFbmNvZGluZyhlKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZSk7CiAgICAgIGxldCByID0gSGQodCwgZSkgfCAwLCBvID0gbGkociksIGYgPSBvLndyaXRlKHQsIGUpOwogICAgICByZXR1cm4gZiAhPT0gciAmJiAobyA9IG8uc2xpY2UoMCwgZikpLCBvOwogICAgfQogICAgZnVuY3Rpb24gVDAodCkgewogICAgICBsZXQgZSA9IHQubGVuZ3RoIDwgMCA/IDAgOiBEMCh0Lmxlbmd0aCkgfCAwLCByID0gbGkoZSk7CiAgICAgIGZvciAobGV0IG8gPSAwO28gPCBlOyBvICs9IDEpCiAgICAgICAgcltvXSA9IHRbb10gJiAyNTU7CiAgICAgIHJldHVybiByOwogICAgfQogICAgZnVuY3Rpb24gcXcodCkgewogICAgICBpZiAoWnIodCwgVWludDhBcnJheSkpIHsKICAgICAgICBsZXQgZSA9IG5ldyBVaW50OEFycmF5KHQpOwogICAgICAgIHJldHVybiBrMChlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0LCBlLmJ5dGVMZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBUMCh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGswKHQsIGUsIHIpIHsKICAgICAgaWYgKGUgPCAwIHx8IHQuYnl0ZUxlbmd0aCA8IGUpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJvZmZzZXQiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpOwogICAgICBpZiAodC5ieXRlTGVuZ3RoIDwgZSArIChyIHx8IDApKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcibGVuZ3RoIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTsKICAgICAgbGV0IG87CiAgICAgIHJldHVybiBlID09PSB1bmRlZmluZWQgJiYgciA9PT0gdW5kZWZpbmVkID8gbyA9IG5ldyBVaW50OEFycmF5KHQpIDogciA9PT0gdW5kZWZpbmVkID8gbyA9IG5ldyBVaW50OEFycmF5KHQsIGUpIDogbyA9IG5ldyBVaW50OEFycmF5KHQsIGUsIHIpLCBPYmplY3Quc2V0UHJvdG90eXBlT2YobywgbWUucHJvdG90eXBlKSwgbzsKICAgIH0KICAgIGZ1bmN0aW9uIEl3KHQpIHsKICAgICAgaWYgKG1lLmlzQnVmZmVyKHQpKSB7CiAgICAgICAgbGV0IGUgPSBEMCh0Lmxlbmd0aCkgfCAwLCByID0gbGkoZSk7CiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID09PSAwIHx8IHQuY29weShyLCAwLCAwLCBlKSwgcjsKICAgICAgfQogICAgICBpZiAodC5sZW5ndGggIT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gdHlwZW9mIHQubGVuZ3RoICE9ICJudW1iZXIiIHx8IEMwKHQubGVuZ3RoKSA/IGxpKDApIDogVDAodCk7CiAgICAgIGlmICh0LnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkodC5kYXRhKSkKICAgICAgICByZXR1cm4gVDAodC5kYXRhKTsKICAgIH0KICAgIGZ1bmN0aW9uIEQwKHQpIHsKICAgICAgaWYgKHQgPj0gZW8pCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiICsgZW8udG9TdHJpbmcoMTYpICsgIiBieXRlcyIpOwogICAgICByZXR1cm4gdCB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiBUdyh0KSB7CiAgICAgIHJldHVybiArdCAhPSB0ICYmICh0ID0gMCksIG1lLmFsbG9jKCt0KTsKICAgIH0KICAgIG1lLmlzQnVmZmVyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSAhPSBudWxsICYmIGUuX2lzQnVmZmVyID09PSB0cnVlICYmIGUgIT09IG1lLnByb3RvdHlwZTsKICAgIH07CiAgICBtZS5jb21wYXJlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBpZiAoWnIoZSwgVWludDhBcnJheSkgJiYgKGUgPSBtZS5mcm9tKGUsIGUub2Zmc2V0LCBlLmJ5dGVMZW5ndGgpKSwgWnIociwgVWludDhBcnJheSkgJiYgKHIgPSBtZS5mcm9tKHIsIHIub2Zmc2V0LCByLmJ5dGVMZW5ndGgpKSwgIW1lLmlzQnVmZmVyKGUpIHx8ICFtZS5pc0J1ZmZlcihyKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImJ1ZjEiLCAiYnVmMiIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTsKICAgICAgaWYgKGUgPT09IHIpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCBvID0gZS5sZW5ndGgsIGYgPSByLmxlbmd0aDsKICAgICAgZm9yIChsZXQgcCA9IDAsIG0yID0gTWF0aC5taW4obywgZik7cCA8IG0yOyArK3ApCiAgICAgICAgaWYgKGVbcF0gIT09IHJbcF0pIHsKICAgICAgICAgIG8gPSBlW3BdLCBmID0gcltwXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcmV0dXJuIG8gPCBmID8gLTEgOiBmIDwgbyA/IDEgOiAwOwogICAgfTsKICAgIG1lLmlzRW5jb2RpbmcgPSBmdW5jdGlvbihlKSB7CiAgICAgIHN3aXRjaCAoU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgICBjYXNlICJoZXgiOgogICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgIGNhc2UgInV0Zi04IjoKICAgICAgICBjYXNlICJhc2NpaSI6CiAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgICBtZS5jb25jYXQgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgIGlmIChlLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gbWUuYWxsb2MoMCk7CiAgICAgIGxldCBvOwogICAgICBpZiAociA9PT0gdW5kZWZpbmVkKQogICAgICAgIGZvciAociA9IDAsIG8gPSAwO28gPCBlLmxlbmd0aDsgKytvKQogICAgICAgICAgciArPSBlW29dLmxlbmd0aDsKICAgICAgbGV0IGYgPSBtZS5hbGxvY1Vuc2FmZShyKSwgcCA9IDA7CiAgICAgIGZvciAobyA9IDA7byA8IGUubGVuZ3RoOyArK28pIHsKICAgICAgICBsZXQgbTIgPSBlW29dOwogICAgICAgIGlmIChacihtMiwgVWludDhBcnJheSkpCiAgICAgICAgICBwICsgbTIubGVuZ3RoID4gZi5sZW5ndGggPyAobWUuaXNCdWZmZXIobTIpIHx8IChtMiA9IG1lLmZyb20obTIpKSwgbTIuY29weShmLCBwKSkgOiBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChmLCBtMiwgcCk7CiAgICAgICAgZWxzZSBpZiAobWUuaXNCdWZmZXIobTIpKQogICAgICAgICAgbTIuY29weShmLCBwKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgICAgcCArPSBtMi5sZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIGY7CiAgICB9OwogICAgZnVuY3Rpb24gSGQodCwgZSkgewogICAgICBpZiAobWUuaXNCdWZmZXIodCkpCiAgICAgICAgcmV0dXJuIHQubGVuZ3RoOwogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHQpIHx8IFpyKHQsIEFycmF5QnVmZmVyKSkKICAgICAgICByZXR1cm4gdC5ieXRlTGVuZ3RoOwogICAgICBpZiAodHlwZW9mIHQgIT0gInN0cmluZyIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdCk7CiAgICAgIGxldCByID0gdC5sZW5ndGgsIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWU7CiAgICAgIGlmICghbyAmJiByID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgICBsZXQgZiA9IGZhbHNlOwogICAgICBmb3IgKDs7ICkKICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gTDAodCkubGVuZ3RoOwogICAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgICAgcmV0dXJuIHIgKiAyOwogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIHIgPj4+IDE7CiAgICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgICAgICByZXR1cm4gWGQodCkubGVuZ3RoOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGYpCiAgICAgICAgICAgICAgcmV0dXJuIG8gPyAtMSA6IEwwKHQpLmxlbmd0aDsKICAgICAgICAgICAgZSA9ICgiIiArIGUpLnRvTG93ZXJDYXNlKCksIGYgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIG1lLmJ5dGVMZW5ndGggPSBIZDsKICAgIGZ1bmN0aW9uIGt3KHQsIGUsIHIpIHsKICAgICAgbGV0IG8gPSBmYWxzZTsKICAgICAgaWYgKChlID09PSB1bmRlZmluZWQgfHwgZSA8IDApICYmIChlID0gMCksIGUgPiB0aGlzLmxlbmd0aCB8fCAoKHIgPT09IHVuZGVmaW5lZCB8fCByID4gdGhpcy5sZW5ndGgpICYmIChyID0gdGhpcy5sZW5ndGgpLCByIDw9IDApIHx8IChyID4+Pj0gMCwgZSA+Pj49IDAsIHIgPD0gZSkpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBmb3IgKHQgfHwgKHQgPSAidXRmOCIpOzsgKQogICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIEh3KHRoaXMsIGUsIHIpOwogICAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgICAgIHJldHVybiBLZCh0aGlzLCBlLCByKTsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgICAgcmV0dXJuIFV3KHRoaXMsIGUsIHIpOwogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiB6dyh0aGlzLCBlLCByKTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBPdyh0aGlzLCBlLCByKTsKICAgICAgICAgIGNhc2UgInVjczIiOgogICAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICAgIHJldHVybiBXdyh0aGlzLCBlLCByKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmIChvKQogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIgKyB0KTsKICAgICAgICAgICAgdCA9ICh0ICsgIiIpLnRvTG93ZXJDYXNlKCksIG8gPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIG1lLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlOwogICAgZnVuY3Rpb24gZm4odCwgZSwgcikgewogICAgICBsZXQgbyA9IHRbZV07CiAgICAgIHRbZV0gPSB0W3JdLCB0W3JdID0gbzsKICAgIH0KICAgIG1lLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbigpIHsKICAgICAgbGV0IGUgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKGUgJSAyICE9PSAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpOwogICAgICBmb3IgKGxldCByID0gMDtyIDwgZTsgciArPSAyKQogICAgICAgIGZuKHRoaXMsIHIsIHIgKyAxKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgbWUucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoZSAlIDQgIT09IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7CiAgICAgIGZvciAobGV0IHIgPSAwO3IgPCBlOyByICs9IDQpCiAgICAgICAgZm4odGhpcywgciwgciArIDMpLCBmbih0aGlzLCByICsgMSwgciArIDIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBtZS5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCBlID0gdGhpcy5sZW5ndGg7CiAgICAgIGlmIChlICUgOCAhPT0gMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTsKICAgICAgZm9yIChsZXQgciA9IDA7ciA8IGU7IHIgKz0gOCkKICAgICAgICBmbih0aGlzLCByLCByICsgNyksIGZuKHRoaXMsIHIgKyAxLCByICsgNiksIGZuKHRoaXMsIHIgKyAyLCByICsgNSksIGZuKHRoaXMsIHIgKyAzLCByICsgNCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMubGVuZ3RoOwogICAgICByZXR1cm4gZSA9PT0gMCA/ICIiIDogYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IEtkKHRoaXMsIDAsIGUpIDoga3cuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBtZS5wcm90b3R5cGUudG9TdHJpbmc7CiAgICBtZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAoIW1lLmlzQnVmZmVyKGUpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTsKICAgICAgcmV0dXJuIHRoaXMgPT09IGUgPyB0cnVlIDogbWUuY29tcGFyZSh0aGlzLCBlKSA9PT0gMDsKICAgIH07CiAgICBtZS5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9ICIiLCByID0gWG4uSU5TUEVDVF9NQVhfQllURVM7CiAgICAgIHJldHVybiBlID0gdGhpcy50b1N0cmluZygiaGV4IiwgMCwgcikucmVwbGFjZSgvKC57Mn0pL2csICIkMSAiKS50cmltKCksIHRoaXMubGVuZ3RoID4gciAmJiAoZSArPSAiIC4uLiAiKSwgIjxCdWZmZXIgIiArIGUgKyAiPiI7CiAgICB9OwogICAgUGQgJiYgKG1lLnByb3RvdHlwZVtQZF0gPSBtZS5wcm90b3R5cGUuaW5zcGVjdCk7CiAgICBtZS5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYsIHApIHsKICAgICAgaWYgKFpyKGUsIFVpbnQ4QXJyYXkpICYmIChlID0gbWUuZnJvbShlLCBlLm9mZnNldCwgZS5ieXRlTGVuZ3RoKSksICFtZS5pc0J1ZmZlcihlKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInRhcmdldCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheS4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGUpOwogICAgICBpZiAociA9PT0gdW5kZWZpbmVkICYmIChyID0gMCksIG8gPT09IHVuZGVmaW5lZCAmJiAobyA9IGUgPyBlLmxlbmd0aCA6IDApLCBmID09PSB1bmRlZmluZWQgJiYgKGYgPSAwKSwgcCA9PT0gdW5kZWZpbmVkICYmIChwID0gdGhpcy5sZW5ndGgpLCByIDwgMCB8fCBvID4gZS5sZW5ndGggfHwgZiA8IDAgfHwgcCA+IHRoaXMubGVuZ3RoKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTsKICAgICAgaWYgKGYgPj0gcCAmJiByID49IG8pCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGlmIChmID49IHApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZiAociA+PSBvKQogICAgICAgIHJldHVybiAxOwogICAgICBpZiAociA+Pj49IDAsIG8gPj4+PSAwLCBmID4+Pj0gMCwgcCA+Pj49IDAsIHRoaXMgPT09IGUpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCBtMiA9IHAgLSBmLCB5MiA9IG8gLSByLCBNID0gTWF0aC5taW4obTIsIHkyKSwgeCA9IHRoaXMuc2xpY2UoZiwgcCksIFMgPSBlLnNsaWNlKHIsIG8pOwogICAgICBmb3IgKGxldCBFMiA9IDA7RTIgPCBNOyArK0UyKQogICAgICAgIGlmICh4W0UyXSAhPT0gU1tFMl0pIHsKICAgICAgICAgIG0yID0geFtFMl0sIHkyID0gU1tFMl07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIHJldHVybiBtMiA8IHkyID8gLTEgOiB5MiA8IG0yID8gMSA6IDA7CiAgICB9OwogICAgZnVuY3Rpb24gV2QodCwgZSwgciwgbywgZikgewogICAgICBpZiAodC5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZiAodHlwZW9mIHIgPT0gInN0cmluZyIgPyAobyA9IHIsIHIgPSAwKSA6IHIgPiAyMTQ3NDgzNjQ3ID8gciA9IDIxNDc0ODM2NDcgOiByIDwgLTIxNDc0ODM2NDggJiYgKHIgPSAtMjE0NzQ4MzY0OCksIHIgPSArciwgQzAocikgJiYgKHIgPSBmID8gMCA6IHQubGVuZ3RoIC0gMSksIHIgPCAwICYmIChyID0gdC5sZW5ndGggKyByKSwgciA+PSB0Lmxlbmd0aCkgewogICAgICAgIGlmIChmKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHIgPSB0Lmxlbmd0aCAtIDE7CiAgICAgIH0gZWxzZSBpZiAociA8IDApCiAgICAgICAgaWYgKGYpCiAgICAgICAgICByID0gMDsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IG1lLmZyb20oZSwgbykpLCBtZS5pc0J1ZmZlcihlKSkKICAgICAgICByZXR1cm4gZS5sZW5ndGggPT09IDAgPyAtMSA6IENkKHQsIGUsIHIsIG8sIGYpOwogICAgICBpZiAodHlwZW9mIGUgPT0gIm51bWJlciIpCiAgICAgICAgcmV0dXJuIGUgPSBlICYgMjU1LCB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PSAiZnVuY3Rpb24iID8gZiA/IFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LCBlLCByKSA6IFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCwgZSwgcikgOiBDZCh0LCBbZV0sIHIsIG8sIGYpOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKTsKICAgIH0KICAgIGZ1bmN0aW9uIENkKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgbGV0IHAgPSAxLCBtMiA9IHQubGVuZ3RoLCB5MiA9IGUubGVuZ3RoOwogICAgICBpZiAobyAhPT0gdW5kZWZpbmVkICYmIChvID0gU3RyaW5nKG8pLnRvTG93ZXJDYXNlKCksIG8gPT09ICJ1Y3MyIiB8fCBvID09PSAidWNzLTIiIHx8IG8gPT09ICJ1dGYxNmxlIiB8fCBvID09PSAidXRmLTE2bGUiKSkgewogICAgICAgIGlmICh0Lmxlbmd0aCA8IDIgfHwgZS5sZW5ndGggPCAyKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIHAgPSAyLCBtMiAvPSAyLCB5MiAvPSAyLCByIC89IDI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gTShTLCBFMikgewogICAgICAgIHJldHVybiBwID09PSAxID8gU1tFMl0gOiBTLnJlYWRVSW50MTZCRShFMiAqIHApOwogICAgICB9CiAgICAgIGxldCB4OwogICAgICBpZiAoZikgewogICAgICAgIGxldCBTID0gLTE7CiAgICAgICAgZm9yICh4ID0gcjt4IDwgbTI7IHgrKykKICAgICAgICAgIGlmIChNKHQsIHgpID09PSBNKGUsIFMgPT09IC0xID8gMCA6IHggLSBTKSkgewogICAgICAgICAgICBpZiAoUyA9PT0gLTEgJiYgKFMgPSB4KSwgeCAtIFMgKyAxID09PSB5MikKICAgICAgICAgICAgICByZXR1cm4gUyAqIHA7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgUyAhPT0gLTEgJiYgKHggLT0geCAtIFMpLCBTID0gLTE7CiAgICAgIH0gZWxzZQogICAgICAgIGZvciAociArIHkyID4gbTIgJiYgKHIgPSBtMiAtIHkyKSwgeCA9IHI7eCA+PSAwOyB4LS0pIHsKICAgICAgICAgIGxldCBTID0gdHJ1ZTsKICAgICAgICAgIGZvciAobGV0IEUyID0gMDtFMiA8IHkyOyBFMisrKQogICAgICAgICAgICBpZiAoTSh0LCB4ICsgRTIpICE9PSBNKGUsIEUyKSkgewogICAgICAgICAgICAgIFMgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgaWYgKFMpCiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgbWUucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gdGhpcy5pbmRleE9mKGUsIHIsIG8pICE9PSAtMTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIFdkKHRoaXMsIGUsIHIsIG8sIHRydWUpOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIFdkKHRoaXMsIGUsIHIsIG8sIGZhbHNlKTsKICAgIH07CiAgICBmdW5jdGlvbiBMdyh0LCBlLCByLCBvKSB7CiAgICAgIHIgPSBOdW1iZXIocikgfHwgMDsKICAgICAgbGV0IGYgPSB0Lmxlbmd0aCAtIHI7CiAgICAgIG8gPyAobyA9IE51bWJlcihvKSwgbyA+IGYgJiYgKG8gPSBmKSkgOiBvID0gZjsKICAgICAgbGV0IHAgPSBlLmxlbmd0aDsKICAgICAgbyA+IHAgLyAyICYmIChvID0gcCAvIDIpOwogICAgICBsZXQgbTI7CiAgICAgIGZvciAobTIgPSAwO20yIDwgbzsgKyttMikgewogICAgICAgIGxldCB5MiA9IHBhcnNlSW50KGUuc3Vic3RyKG0yICogMiwgMiksIDE2KTsKICAgICAgICBpZiAoQzAoeTIpKQogICAgICAgICAgcmV0dXJuIG0yOwogICAgICAgIHRbciArIG0yXSA9IHkyOwogICAgICB9CiAgICAgIHJldHVybiBtMjsKICAgIH0KICAgIGZ1bmN0aW9uIE53KHQsIGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIHRvKEwwKGUsIHQubGVuZ3RoIC0gciksIHQsIHIsIG8pOwogICAgfQogICAgZnVuY3Rpb24gRHcodCwgZSwgciwgbykgewogICAgICByZXR1cm4gdG8oVncoZSksIHQsIHIsIG8pOwogICAgfQogICAgZnVuY3Rpb24gUHcodCwgZSwgciwgbykgewogICAgICByZXR1cm4gdG8oWGQoZSksIHQsIHIsIG8pOwogICAgfQogICAgZnVuY3Rpb24gQ3codCwgZSwgciwgbykgewogICAgICByZXR1cm4gdG8oJHcoZSwgdC5sZW5ndGggLSByKSwgdCwgciwgbyk7CiAgICB9CiAgICBtZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpCiAgICAgICAgZiA9ICJ1dGY4IiwgbyA9IHRoaXMubGVuZ3RoLCByID0gMDsKICAgICAgZWxzZSBpZiAobyA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiByID09ICJzdHJpbmciKQogICAgICAgIGYgPSByLCBvID0gdGhpcy5sZW5ndGgsIHIgPSAwOwogICAgICBlbHNlIGlmIChpc0Zpbml0ZShyKSkKICAgICAgICByID0gciA+Pj4gMCwgaXNGaW5pdGUobykgPyAobyA9IG8gPj4+IDAsIGYgPT09IHVuZGVmaW5lZCAmJiAoZiA9ICJ1dGY4IikpIDogKGYgPSBvLCBvID0gdW5kZWZpbmVkKTsKICAgICAgZWxzZQogICAgICAgIHRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTsKICAgICAgbGV0IHAgPSB0aGlzLmxlbmd0aCAtIHI7CiAgICAgIGlmICgobyA9PT0gdW5kZWZpbmVkIHx8IG8gPiBwKSAmJiAobyA9IHApLCBlLmxlbmd0aCA+IDAgJiYgKG8gPCAwIHx8IHIgPCAwKSB8fCByID4gdGhpcy5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7CiAgICAgIGYgfHwgKGYgPSAidXRmOCIpOwogICAgICBsZXQgbTIgPSBmYWxzZTsKICAgICAgZm9yICg7OyApCiAgICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgICBjYXNlICJoZXgiOgogICAgICAgICAgICByZXR1cm4gTHcodGhpcywgZSwgciwgbyk7CiAgICAgICAgICBjYXNlICJ1dGY4IjoKICAgICAgICAgIGNhc2UgInV0Zi04IjoKICAgICAgICAgICAgcmV0dXJuIE53KHRoaXMsIGUsIHIsIG8pOwogICAgICAgICAgY2FzZSAiYXNjaWkiOgogICAgICAgICAgY2FzZSAibGF0aW4xIjoKICAgICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgICAgIHJldHVybiBEdyh0aGlzLCBlLCByLCBvKTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiBQdyh0aGlzLCBlLCByLCBvKTsKICAgICAgICAgIGNhc2UgInVjczIiOgogICAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICAgIHJldHVybiBDdyh0aGlzLCBlLCByLCBvKTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmIChtMikKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgZik7CiAgICAgICAgICAgIGYgPSAoIiIgKyBmKS50b0xvd2VyQ2FzZSgpLCBtMiA9IHRydWU7CiAgICAgICAgfQogICAgfTsKICAgIG1lLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsgdHlwZTogIkJ1ZmZlciIsIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKSB9OwogICAgfTsKICAgIGZ1bmN0aW9uIE93KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPT09IDAgJiYgciA9PT0gdC5sZW5ndGggPyBJMC5mcm9tQnl0ZUFycmF5KHQpIDogSTAuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsIHIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIEtkKHQsIGUsIHIpIHsKICAgICAgciA9IE1hdGgubWluKHQubGVuZ3RoLCByKTsKICAgICAgbGV0IG8gPSBbXSwgZiA9IGU7CiAgICAgIGZvciAoO2YgPCByOyApIHsKICAgICAgICBsZXQgcCA9IHRbZl0sIG0yID0gbnVsbCwgeTIgPSBwID4gMjM5ID8gNCA6IHAgPiAyMjMgPyAzIDogcCA+IDE5MSA/IDIgOiAxOwogICAgICAgIGlmIChmICsgeTIgPD0gcikgewogICAgICAgICAgbGV0IE0sIHgsIFMsIEUyOwogICAgICAgICAgc3dpdGNoICh5MikgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgcCA8IDEyOCAmJiAobTIgPSBwKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIE0gPSB0W2YgKyAxXSwgKE0gJiAxOTIpID09PSAxMjggJiYgKEUyID0gKHAgJiAzMSkgPDwgNiB8IE0gJiA2MywgRTIgPiAxMjcgJiYgKG0yID0gRTIpKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIE0gPSB0W2YgKyAxXSwgeCA9IHRbZiArIDJdLCAoTSAmIDE5MikgPT09IDEyOCAmJiAoeCAmIDE5MikgPT09IDEyOCAmJiAoRTIgPSAocCAmIDE1KSA8PCAxMiB8IChNICYgNjMpIDw8IDYgfCB4ICYgNjMsIEUyID4gMjA0NyAmJiAoRTIgPCA1NTI5NiB8fCBFMiA+IDU3MzQzKSAmJiAobTIgPSBFMikpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgTSA9IHRbZiArIDFdLCB4ID0gdFtmICsgMl0sIFMgPSB0W2YgKyAzXSwgKE0gJiAxOTIpID09PSAxMjggJiYgKHggJiAxOTIpID09PSAxMjggJiYgKFMgJiAxOTIpID09PSAxMjggJiYgKEUyID0gKHAgJiAxNSkgPDwgMTggfCAoTSAmIDYzKSA8PCAxMiB8ICh4ICYgNjMpIDw8IDYgfCBTICYgNjMsIEUyID4gNjU1MzUgJiYgRTIgPCAxMTE0MTEyICYmIChtMiA9IEUyKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG0yID09PSBudWxsID8gKG0yID0gNjU1MzMsIHkyID0gMSkgOiBtMiA+IDY1NTM1ICYmIChtMiAtPSA2NTUzNiwgby5wdXNoKG0yID4+PiAxMCAmIDEwMjMgfCA1NTI5NiksIG0yID0gNTYzMjAgfCBtMiAmIDEwMjMpLCBvLnB1c2gobTIpLCBmICs9IHkyOwogICAgICB9CiAgICAgIHJldHVybiBGdyhvKTsKICAgIH0KICAgIHZhciBPZCA9IDQwOTY7CiAgICBmdW5jdGlvbiBGdyh0KSB7CiAgICAgIGxldCBlID0gdC5sZW5ndGg7CiAgICAgIGlmIChlIDw9IE9kKQogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgdCk7CiAgICAgIGxldCByID0gIiIsIG8gPSAwOwogICAgICBmb3IgKDtvIDwgZTsgKQogICAgICAgIHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHQuc2xpY2UobywgbyArPSBPZCkpOwogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGZ1bmN0aW9uIFV3KHQsIGUsIHIpIHsKICAgICAgbGV0IG8gPSAiIjsKICAgICAgciA9IE1hdGgubWluKHQubGVuZ3RoLCByKTsKICAgICAgZm9yIChsZXQgZiA9IGU7ZiA8IHI7ICsrZikKICAgICAgICBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodFtmXSAmIDEyNyk7CiAgICAgIHJldHVybiBvOwogICAgfQogICAgZnVuY3Rpb24gencodCwgZSwgcikgewogICAgICBsZXQgbyA9ICIiOwogICAgICByID0gTWF0aC5taW4odC5sZW5ndGgsIHIpOwogICAgICBmb3IgKGxldCBmID0gZTtmIDwgcjsgKytmKQogICAgICAgIG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0W2ZdKTsKICAgICAgcmV0dXJuIG87CiAgICB9CiAgICBmdW5jdGlvbiBIdyh0LCBlLCByKSB7CiAgICAgIGxldCBvID0gdC5sZW5ndGg7CiAgICAgICghZSB8fCBlIDwgMCkgJiYgKGUgPSAwKSwgKCFyIHx8IHIgPCAwIHx8IHIgPiBvKSAmJiAociA9IG8pOwogICAgICBsZXQgZiA9ICIiOwogICAgICBmb3IgKGxldCBwID0gZTtwIDwgcjsgKytwKQogICAgICAgIGYgKz0gR3dbdFtwXV07CiAgICAgIHJldHVybiBmOwogICAgfQogICAgZnVuY3Rpb24gV3codCwgZSwgcikgewogICAgICBsZXQgbyA9IHQuc2xpY2UoZSwgciksIGYgPSAiIjsKICAgICAgZm9yIChsZXQgcCA9IDA7cCA8IG8ubGVuZ3RoIC0gMTsgcCArPSAyKQogICAgICAgIGYgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShvW3BdICsgb1twICsgMV0gKiAyNTYpOwogICAgICByZXR1cm4gZjsKICAgIH0KICAgIG1lLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgbGV0IG8gPSB0aGlzLmxlbmd0aDsKICAgICAgZSA9IH5+ZSwgciA9IHIgPT09IHVuZGVmaW5lZCA/IG8gOiB+fnIsIGUgPCAwID8gKGUgKz0gbywgZSA8IDAgJiYgKGUgPSAwKSkgOiBlID4gbyAmJiAoZSA9IG8pLCByIDwgMCA/IChyICs9IG8sIHIgPCAwICYmIChyID0gMCkpIDogciA+IG8gJiYgKHIgPSBvKSwgciA8IGUgJiYgKHIgPSBlKTsKICAgICAgbGV0IGYgPSB0aGlzLnN1YmFycmF5KGUsIHIpOwogICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGYsIG1lLnByb3RvdHlwZSksIGY7CiAgICB9OwogICAgZnVuY3Rpb24gRHQodCwgZSwgcikgewogICAgICBpZiAodCAlIDEgIT09IDAgfHwgdCA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpOwogICAgICBpZiAodCArIGUgPiByKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIik7CiAgICB9CiAgICBtZS5wcm90b3R5cGUucmVhZFVpbnRMRSA9IG1lLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBlID0gZSA+Pj4gMCwgciA9IHIgPj4+IDAsIG8gfHwgRHQoZSwgciwgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgZiA9IHRoaXNbZV0sIHAgPSAxLCBtMiA9IDA7CiAgICAgIGZvciAoOysrbTIgPCByICYmIChwICo9IDI1Nik7ICkKICAgICAgICBmICs9IHRoaXNbZSArIG0yXSAqIHA7CiAgICAgIHJldHVybiBmOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkVWludEJFID0gbWUucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIGUgPSBlID4+PiAwLCByID0gciA+Pj4gMCwgbyB8fCBEdChlLCByLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCBmID0gdGhpc1tlICsgLS1yXSwgcCA9IDE7CiAgICAgIGZvciAoO3IgPiAwICYmIChwICo9IDI1Nik7ICkKICAgICAgICBmICs9IHRoaXNbZSArIC0tcl0gKiBwOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgICBtZS5wcm90b3R5cGUucmVhZFVpbnQ4ID0gbWUucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPSBlID4+PiAwLCByIHx8IER0KGUsIDEsIHRoaXMubGVuZ3RoKSwgdGhpc1tlXTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUucmVhZFVpbnQxNkxFID0gbWUucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPSBlID4+PiAwLCByIHx8IER0KGUsIDIsIHRoaXMubGVuZ3RoKSwgdGhpc1tlXSB8IHRoaXNbZSArIDFdIDw8IDg7CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9IG1lLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBlID0gZSA+Pj4gMCwgciB8fCBEdChlLCAyLCB0aGlzLmxlbmd0aCksIHRoaXNbZV0gPDwgOCB8IHRoaXNbZSArIDFdOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkVWludDMyTEUgPSBtZS5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgNCwgdGhpcy5sZW5ndGgpLCAodGhpc1tlXSB8IHRoaXNbZSArIDFdIDw8IDggfCB0aGlzW2UgKyAyXSA8PCAxNikgKyB0aGlzW2UgKyAzXSAqIDE2Nzc3MjE2OwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkVWludDMyQkUgPSBtZS5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgNCwgdGhpcy5sZW5ndGgpLCB0aGlzW2VdICogMTY3NzcyMTYgKyAodGhpc1tlICsgMV0gPDwgMTYgfCB0aGlzW2UgKyAyXSA8PCA4IHwgdGhpc1tlICsgM10pOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUgPSBUaShmdW5jdGlvbihlKSB7CiAgICAgIGUgPSBlID4+PiAwLCBZbihlLCAib2Zmc2V0Iik7CiAgICAgIGxldCByID0gdGhpc1tlXSwgbyA9IHRoaXNbZSArIDddOwogICAgICAociA9PT0gdW5kZWZpbmVkIHx8IG8gPT09IHVuZGVmaW5lZCkgJiYgVmYoZSwgdGhpcy5sZW5ndGggLSA4KTsKICAgICAgbGV0IGYgPSByICsgdGhpc1srK2VdICogMiAqKiA4ICsgdGhpc1srK2VdICogMiAqKiAxNiArIHRoaXNbKytlXSAqIDIgKiogMjQsIHAgPSB0aGlzWysrZV0gKyB0aGlzWysrZV0gKiAyICoqIDggKyB0aGlzWysrZV0gKiAyICoqIDE2ICsgbyAqIDIgKiogMjQ7CiAgICAgIHJldHVybiBCaWdJbnQoZikgKyAoQmlnSW50KHApIDw8IEJpZ0ludCgzMikpOwogICAgfSk7CiAgICBtZS5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFID0gVGkoZnVuY3Rpb24oZSkgewogICAgICBlID0gZSA+Pj4gMCwgWW4oZSwgIm9mZnNldCIpOwogICAgICBsZXQgciA9IHRoaXNbZV0sIG8gPSB0aGlzW2UgKyA3XTsKICAgICAgKHIgPT09IHVuZGVmaW5lZCB8fCBvID09PSB1bmRlZmluZWQpICYmIFZmKGUsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIGxldCBmID0gciAqIDIgKiogMjQgKyB0aGlzWysrZV0gKiAyICoqIDE2ICsgdGhpc1srK2VdICogMiAqKiA4ICsgdGhpc1srK2VdLCBwID0gdGhpc1srK2VdICogMiAqKiAyNCArIHRoaXNbKytlXSAqIDIgKiogMTYgKyB0aGlzWysrZV0gKiAyICoqIDggKyBvOwogICAgICByZXR1cm4gKEJpZ0ludChmKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChwKTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgZSA9IGUgPj4+IDAsIHIgPSByID4+PiAwLCBvIHx8IER0KGUsIHIsIHRoaXMubGVuZ3RoKTsKICAgICAgbGV0IGYgPSB0aGlzW2VdLCBwID0gMSwgbTIgPSAwOwogICAgICBmb3IgKDsrK20yIDwgciAmJiAocCAqPSAyNTYpOyApCiAgICAgICAgZiArPSB0aGlzW2UgKyBtMl0gKiBwOwogICAgICByZXR1cm4gcCAqPSAxMjgsIGYgPj0gcCAmJiAoZiAtPSBNYXRoLnBvdygyLCA4ICogcikpLCBmOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIGUgPSBlID4+PiAwLCByID0gciA+Pj4gMCwgbyB8fCBEdChlLCByLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCBmID0gciwgcCA9IDEsIG0yID0gdGhpc1tlICsgLS1mXTsKICAgICAgZm9yICg7ZiA+IDAgJiYgKHAgKj0gMjU2KTsgKQogICAgICAgIG0yICs9IHRoaXNbZSArIC0tZl0gKiBwOwogICAgICByZXR1cm4gcCAqPSAxMjgsIG0yID49IHAgJiYgKG0yIC09IE1hdGgucG93KDIsIDggKiByKSksIG0yOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPSBlID4+PiAwLCByIHx8IER0KGUsIDEsIHRoaXMubGVuZ3RoKSwgdGhpc1tlXSAmIDEyOCA/ICgyNTUgLSB0aGlzW2VdICsgMSkgKiAtMSA6IHRoaXNbZV07CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24oZSwgcikgewogICAgICBlID0gZSA+Pj4gMCwgciB8fCBEdChlLCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCBvID0gdGhpc1tlXSB8IHRoaXNbZSArIDFdIDw8IDg7CiAgICAgIHJldHVybiBvICYgMzI3NjggPyBvIHwgNDI5NDkwMTc2MCA6IG87CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24oZSwgcikgewogICAgICBlID0gZSA+Pj4gMCwgciB8fCBEdChlLCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIGxldCBvID0gdGhpc1tlICsgMV0gfCB0aGlzW2VdIDw8IDg7CiAgICAgIHJldHVybiBvICYgMzI3NjggPyBvIHwgNDI5NDkwMTc2MCA6IG87CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgNCwgdGhpcy5sZW5ndGgpLCB0aGlzW2VdIHwgdGhpc1tlICsgMV0gPDwgOCB8IHRoaXNbZSArIDJdIDw8IDE2IHwgdGhpc1tlICsgM10gPDwgMjQ7CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgNCwgdGhpcy5sZW5ndGgpLCB0aGlzW2VdIDw8IDI0IHwgdGhpc1tlICsgMV0gPDwgMTYgfCB0aGlzW2UgKyAyXSA8PCA4IHwgdGhpc1tlICsgM107CiAgICB9OwogICAgbWUucHJvdG90eXBlLnJlYWRCaWdJbnQ2NExFID0gVGkoZnVuY3Rpb24oZSkgewogICAgICBlID0gZSA+Pj4gMCwgWW4oZSwgIm9mZnNldCIpOwogICAgICBsZXQgciA9IHRoaXNbZV0sIG8gPSB0aGlzW2UgKyA3XTsKICAgICAgKHIgPT09IHVuZGVmaW5lZCB8fCBvID09PSB1bmRlZmluZWQpICYmIFZmKGUsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIGxldCBmID0gdGhpc1tlICsgNF0gKyB0aGlzW2UgKyA1XSAqIDIgKiogOCArIHRoaXNbZSArIDZdICogMiAqKiAxNiArIChvIDw8IDI0KTsKICAgICAgcmV0dXJuIChCaWdJbnQoZikgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQociArIHRoaXNbKytlXSAqIDIgKiogOCArIHRoaXNbKytlXSAqIDIgKiogMTYgKyB0aGlzWysrZV0gKiAyICoqIDI0KTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFID0gVGkoZnVuY3Rpb24oZSkgewogICAgICBlID0gZSA+Pj4gMCwgWW4oZSwgIm9mZnNldCIpOwogICAgICBsZXQgciA9IHRoaXNbZV0sIG8gPSB0aGlzW2UgKyA3XTsKICAgICAgKHIgPT09IHVuZGVmaW5lZCB8fCBvID09PSB1bmRlZmluZWQpICYmIFZmKGUsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIGxldCBmID0gKHIgPDwgMjQpICsgdGhpc1srK2VdICogMiAqKiAxNiArIHRoaXNbKytlXSAqIDIgKiogOCArIHRoaXNbKytlXTsKICAgICAgcmV0dXJuIChCaWdJbnQoZikgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQodGhpc1srK2VdICogMiAqKiAyNCArIHRoaXNbKytlXSAqIDIgKiogMTYgKyB0aGlzWysrZV0gKiAyICoqIDggKyBvKTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgNCwgdGhpcy5sZW5ndGgpLCBHbi5yZWFkKHRoaXMsIGUsIHRydWUsIDIzLCA0KTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBlID0gZSA+Pj4gMCwgciB8fCBEdChlLCA0LCB0aGlzLmxlbmd0aCksIEduLnJlYWQodGhpcywgZSwgZmFsc2UsIDIzLCA0KTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgOCwgdGhpcy5sZW5ndGgpLCBHbi5yZWFkKHRoaXMsIGUsIHRydWUsIDUyLCA4KTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IGUgPj4+IDAsIHIgfHwgRHQoZSwgOCwgdGhpcy5sZW5ndGgpLCBHbi5yZWFkKHRoaXMsIGUsIGZhbHNlLCA1MiwgOCk7CiAgICB9OwogICAgZnVuY3Rpb24gZXIodCwgZSwgciwgbywgZiwgcCkgewogICAgICBpZiAoIW1lLmlzQnVmZmVyKHQpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTsKICAgICAgaWYgKGUgPiBmIHx8IGUgPCBwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTsKICAgICAgaWYgKHIgKyBvID4gdC5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpOwogICAgfQogICAgbWUucHJvdG90eXBlLndyaXRlVWludExFID0gbWUucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICBpZiAoZSA9ICtlLCByID0gciA+Pj4gMCwgbyA9IG8gPj4+IDAsICFmKSB7CiAgICAgICAgbGV0IHkyID0gTWF0aC5wb3coMiwgOCAqIG8pIC0gMTsKICAgICAgICBlcih0aGlzLCBlLCByLCBvLCB5MiwgMCk7CiAgICAgIH0KICAgICAgbGV0IHAgPSAxLCBtMiA9IDA7CiAgICAgIGZvciAodGhpc1tyXSA9IGUgJiAyNTU7KyttMiA8IG8gJiYgKHAgKj0gMjU2KTsgKQogICAgICAgIHRoaXNbciArIG0yXSA9IGUgLyBwICYgMjU1OwogICAgICByZXR1cm4gciArIG87CiAgICB9OwogICAgbWUucHJvdG90eXBlLndyaXRlVWludEJFID0gbWUucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICBpZiAoZSA9ICtlLCByID0gciA+Pj4gMCwgbyA9IG8gPj4+IDAsICFmKSB7CiAgICAgICAgbGV0IHkyID0gTWF0aC5wb3coMiwgOCAqIG8pIC0gMTsKICAgICAgICBlcih0aGlzLCBlLCByLCBvLCB5MiwgMCk7CiAgICAgIH0KICAgICAgbGV0IHAgPSBvIC0gMSwgbTIgPSAxOwogICAgICBmb3IgKHRoaXNbciArIHBdID0gZSAmIDI1NTstLXAgPj0gMCAmJiAobTIgKj0gMjU2KTsgKQogICAgICAgIHRoaXNbciArIHBdID0gZSAvIG0yICYgMjU1OwogICAgICByZXR1cm4gciArIG87CiAgICB9OwogICAgbWUucHJvdG90eXBlLndyaXRlVWludDggPSBtZS5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIGUgPSArZSwgciA9IHIgPj4+IDAsIG8gfHwgZXIodGhpcywgZSwgciwgMSwgMjU1LCAwKSwgdGhpc1tyXSA9IGUgJiAyNTUsIHIgKyAxOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFID0gbWUucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiBlID0gK2UsIHIgPSByID4+PiAwLCBvIHx8IGVyKHRoaXMsIGUsIHIsIDIsIDY1NTM1LCAwKSwgdGhpc1tyXSA9IGUgJiAyNTUsIHRoaXNbciArIDFdID0gZSA+Pj4gOCwgciArIDI7CiAgICB9OwogICAgbWUucHJvdG90eXBlLndyaXRlVWludDE2QkUgPSBtZS5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIGUgPSArZSwgciA9IHIgPj4+IDAsIG8gfHwgZXIodGhpcywgZSwgciwgMiwgNjU1MzUsIDApLCB0aGlzW3JdID0gZSA+Pj4gOCwgdGhpc1tyICsgMV0gPSBlICYgMjU1LCByICsgMjsKICAgIH07CiAgICBtZS5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9IG1lLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gZSA9ICtlLCByID0gciA+Pj4gMCwgbyB8fCBlcih0aGlzLCBlLCByLCA0LCA0Mjk0OTY3Mjk1LCAwKSwgdGhpc1tyICsgM10gPSBlID4+PiAyNCwgdGhpc1tyICsgMl0gPSBlID4+PiAxNiwgdGhpc1tyICsgMV0gPSBlID4+PiA4LCB0aGlzW3JdID0gZSAmIDI1NSwgciArIDQ7CiAgICB9OwogICAgbWUucHJvdG90eXBlLndyaXRlVWludDMyQkUgPSBtZS5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIGUgPSArZSwgciA9IHIgPj4+IDAsIG8gfHwgZXIodGhpcywgZSwgciwgNCwgNDI5NDk2NzI5NSwgMCksIHRoaXNbcl0gPSBlID4+PiAyNCwgdGhpc1tyICsgMV0gPSBlID4+PiAxNiwgdGhpc1tyICsgMl0gPSBlID4+PiA4LCB0aGlzW3IgKyAzXSA9IGUgJiAyNTUsIHIgKyA0OwogICAgfTsKICAgIGZ1bmN0aW9uIGpkKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgWWQoZSwgbywgZiwgdCwgciwgNyk7CiAgICAgIGxldCBwID0gTnVtYmVyKGUgJiBCaWdJbnQoNDI5NDk2NzI5NSkpOwogICAgICB0W3IrK10gPSBwLCBwID0gcCA+PiA4LCB0W3IrK10gPSBwLCBwID0gcCA+PiA4LCB0W3IrK10gPSBwLCBwID0gcCA+PiA4LCB0W3IrK10gPSBwOwogICAgICBsZXQgbTIgPSBOdW1iZXIoZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDQyOTQ5NjcyOTUpKTsKICAgICAgcmV0dXJuIHRbcisrXSA9IG0yLCBtMiA9IG0yID4+IDgsIHRbcisrXSA9IG0yLCBtMiA9IG0yID4+IDgsIHRbcisrXSA9IG0yLCBtMiA9IG0yID4+IDgsIHRbcisrXSA9IG0yLCByOwogICAgfQogICAgZnVuY3Rpb24gWmQodCwgZSwgciwgbywgZikgewogICAgICBZZChlLCBvLCBmLCB0LCByLCA3KTsKICAgICAgbGV0IHAgPSBOdW1iZXIoZSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIHRbciArIDddID0gcCwgcCA9IHAgPj4gOCwgdFtyICsgNl0gPSBwLCBwID0gcCA+PiA4LCB0W3IgKyA1XSA9IHAsIHAgPSBwID4+IDgsIHRbciArIDRdID0gcDsKICAgICAgbGV0IG0yID0gTnVtYmVyKGUgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIHJldHVybiB0W3IgKyAzXSA9IG0yLCBtMiA9IG0yID4+IDgsIHRbciArIDJdID0gbTIsIG0yID0gbTIgPj4gOCwgdFtyICsgMV0gPSBtMiwgbTIgPSBtMiA+PiA4LCB0W3JdID0gbTIsIHIgKyA4OwogICAgfQogICAgbWUucHJvdG90eXBlLndyaXRlQmlnVUludDY0TEUgPSBUaShmdW5jdGlvbihlLCByID0gMCkgewogICAgICByZXR1cm4gamQodGhpcywgZSwgciwgQmlnSW50KDApLCBCaWdJbnQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUgPSBUaShmdW5jdGlvbihlLCByID0gMCkgewogICAgICByZXR1cm4gWmQodGhpcywgZSwgciwgQmlnSW50KDApLCBCaWdJbnQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIGlmIChlID0gK2UsIHIgPSByID4+PiAwLCAhZikgewogICAgICAgIGxldCBNID0gTWF0aC5wb3coMiwgOCAqIG8gLSAxKTsKICAgICAgICBlcih0aGlzLCBlLCByLCBvLCBNIC0gMSwgLU0pOwogICAgICB9CiAgICAgIGxldCBwID0gMCwgbTIgPSAxLCB5MiA9IDA7CiAgICAgIGZvciAodGhpc1tyXSA9IGUgJiAyNTU7KytwIDwgbyAmJiAobTIgKj0gMjU2KTsgKQogICAgICAgIGUgPCAwICYmIHkyID09PSAwICYmIHRoaXNbciArIHAgLSAxXSAhPT0gMCAmJiAoeTIgPSAxKSwgdGhpc1tyICsgcF0gPSAoZSAvIG0yID4+IDApIC0geTIgJiAyNTU7CiAgICAgIHJldHVybiByICsgbzsKICAgIH07CiAgICBtZS5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgaWYgKGUgPSArZSwgciA9IHIgPj4+IDAsICFmKSB7CiAgICAgICAgbGV0IE0gPSBNYXRoLnBvdygyLCA4ICogbyAtIDEpOwogICAgICAgIGVyKHRoaXMsIGUsIHIsIG8sIE0gLSAxLCAtTSk7CiAgICAgIH0KICAgICAgbGV0IHAgPSBvIC0gMSwgbTIgPSAxLCB5MiA9IDA7CiAgICAgIGZvciAodGhpc1tyICsgcF0gPSBlICYgMjU1Oy0tcCA+PSAwICYmIChtMiAqPSAyNTYpOyApCiAgICAgICAgZSA8IDAgJiYgeTIgPT09IDAgJiYgdGhpc1tyICsgcCArIDFdICE9PSAwICYmICh5MiA9IDEpLCB0aGlzW3IgKyBwXSA9IChlIC8gbTIgPj4gMCkgLSB5MiAmIDI1NTsKICAgICAgcmV0dXJuIHIgKyBvOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiBlID0gK2UsIHIgPSByID4+PiAwLCBvIHx8IGVyKHRoaXMsIGUsIHIsIDEsIDEyNywgLTEyOCksIGUgPCAwICYmIChlID0gMjU1ICsgZSArIDEpLCB0aGlzW3JdID0gZSAmIDI1NSwgciArIDE7CiAgICB9OwogICAgbWUucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIGUgPSArZSwgciA9IHIgPj4+IDAsIG8gfHwgZXIodGhpcywgZSwgciwgMiwgMzI3NjcsIC0zMjc2OCksIHRoaXNbcl0gPSBlICYgMjU1LCB0aGlzW3IgKyAxXSA9IGUgPj4+IDgsIHIgKyAyOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiBlID0gK2UsIHIgPSByID4+PiAwLCBvIHx8IGVyKHRoaXMsIGUsIHIsIDIsIDMyNzY3LCAtMzI3NjgpLCB0aGlzW3JdID0gZSA+Pj4gOCwgdGhpc1tyICsgMV0gPSBlICYgMjU1LCByICsgMjsKICAgIH07CiAgICBtZS5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gZSA9ICtlLCByID0gciA+Pj4gMCwgbyB8fCBlcih0aGlzLCBlLCByLCA0LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OCksIHRoaXNbcl0gPSBlICYgMjU1LCB0aGlzW3IgKyAxXSA9IGUgPj4+IDgsIHRoaXNbciArIDJdID0gZSA+Pj4gMTYsIHRoaXNbciArIDNdID0gZSA+Pj4gMjQsIHIgKyA0OwogICAgfTsKICAgIG1lLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiBlID0gK2UsIHIgPSByID4+PiAwLCBvIHx8IGVyKHRoaXMsIGUsIHIsIDQsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNjQ4KSwgZSA8IDAgJiYgKGUgPSA0Mjk0OTY3Mjk1ICsgZSArIDEpLCB0aGlzW3JdID0gZSA+Pj4gMjQsIHRoaXNbciArIDFdID0gZSA+Pj4gMTYsIHRoaXNbciArIDJdID0gZSA+Pj4gOCwgdGhpc1tyICsgM10gPSBlICYgMjU1LCByICsgNDsKICAgIH07CiAgICBtZS5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gVGkoZnVuY3Rpb24oZSwgciA9IDApIHsKICAgICAgcmV0dXJuIGpkKHRoaXMsIGUsIHIsIC1CaWdJbnQoIjB4ODAwMDAwMDAwMDAwMDAwMCIpLCBCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pOwogICAgbWUucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IFRpKGZ1bmN0aW9uKGUsIHIgPSAwKSB7CiAgICAgIHJldHVybiBaZCh0aGlzLCBlLCByLCAtQmlnSW50KCIweDgwMDAwMDAwMDAwMDAwMDAiKSwgQmlnSW50KCIweDdmZmZmZmZmZmZmZmZmZmYiKSk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIFZkKHQsIGUsIHIsIG8sIGYsIHApIHsKICAgICAgaWYgKHIgKyBvID4gdC5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICBpZiAociA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpOwogICAgfQogICAgZnVuY3Rpb24gJGQodCwgZSwgciwgbywgZikgewogICAgICByZXR1cm4gZSA9ICtlLCByID0gciA+Pj4gMCwgZiB8fCBWZCh0LCBlLCByLCA0LCAzNDAyODIzNDY2Mzg1Mjg4NjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC0zNDAyODIzNDY2Mzg1Mjg4NjAwMDAwMDAwMDAwMDAwMDAwMDAwMDApLCBHbi53cml0ZSh0LCBlLCByLCBvLCAyMywgNCksIHIgKyA0OwogICAgfQogICAgbWUucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuICRkKHRoaXMsIGUsIHIsIHRydWUsIG8pOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiAkZCh0aGlzLCBlLCByLCBmYWxzZSwgbyk7CiAgICB9OwogICAgZnVuY3Rpb24gR2QodCwgZSwgciwgbywgZikgewogICAgICByZXR1cm4gZSA9ICtlLCByID0gciA+Pj4gMCwgZiB8fCBWZCh0LCBlLCByLCA4LCAxNzk3NjkzMTM0ODYyMzE1NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC0xNzk3NjkzMTM0ODYyMzE1NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDApLCBHbi53cml0ZSh0LCBlLCByLCBvLCA1MiwgOCksIHIgKyA4OwogICAgfQogICAgbWUucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiBHZCh0aGlzLCBlLCByLCB0cnVlLCBvKTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIEdkKHRoaXMsIGUsIHIsIGZhbHNlLCBvKTsKICAgIH07CiAgICBtZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgaWYgKCFtZS5pc0J1ZmZlcihlKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXIiKTsKICAgICAgaWYgKG8gfHwgKG8gPSAwKSwgIWYgJiYgZiAhPT0gMCAmJiAoZiA9IHRoaXMubGVuZ3RoKSwgciA+PSBlLmxlbmd0aCAmJiAociA9IGUubGVuZ3RoKSwgciB8fCAociA9IDApLCBmID4gMCAmJiBmIDwgbyAmJiAoZiA9IG8pLCBmID09PSBvIHx8IGUubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgICBpZiAociA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTsKICAgICAgaWYgKG8gPCAwIHx8IG8gPj0gdGhpcy5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICBpZiAoZiA8IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7CiAgICAgIGYgPiB0aGlzLmxlbmd0aCAmJiAoZiA9IHRoaXMubGVuZ3RoKSwgZS5sZW5ndGggLSByIDwgZiAtIG8gJiYgKGYgPSBlLmxlbmd0aCAtIHIgKyBvKTsKICAgICAgbGV0IHAgPSBmIC0gbzsKICAgICAgcmV0dXJuIHRoaXMgPT09IGUgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT0gImZ1bmN0aW9uIiA/IHRoaXMuY29weVdpdGhpbihyLCBvLCBmKSA6IFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsIHRoaXMuc3ViYXJyYXkobywgZiksIHIpLCBwOwogICAgfTsKICAgIG1lLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICBpZiAodHlwZW9mIGUgPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAodHlwZW9mIHIgPT0gInN0cmluZyIgPyAoZiA9IHIsIHIgPSAwLCBvID0gdGhpcy5sZW5ndGgpIDogdHlwZW9mIG8gPT0gInN0cmluZyIgJiYgKGYgPSBvLCBvID0gdGhpcy5sZW5ndGgpLCBmICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGYgIT0gInN0cmluZyIpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7CiAgICAgICAgaWYgKHR5cGVvZiBmID09ICJzdHJpbmciICYmICFtZS5pc0VuY29kaW5nKGYpKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGYpOwogICAgICAgIGlmIChlLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgbGV0IG0yID0gZS5jaGFyQ29kZUF0KDApOwogICAgICAgICAgKGYgPT09ICJ1dGY4IiAmJiBtMiA8IDEyOCB8fCBmID09PSAibGF0aW4xIikgJiYgKGUgPSBtMik7CiAgICAgICAgfQogICAgICB9IGVsc2UKICAgICAgICB0eXBlb2YgZSA9PSAibnVtYmVyIiA/IGUgPSBlICYgMjU1IDogdHlwZW9mIGUgPT0gImJvb2xlYW4iICYmIChlID0gTnVtYmVyKGUpKTsKICAgICAgaWYgKHIgPCAwIHx8IHRoaXMubGVuZ3RoIDwgciB8fCB0aGlzLmxlbmd0aCA8IG8pCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpOwogICAgICBpZiAobyA8PSByKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICByID0gciA+Pj4gMCwgbyA9IG8gPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogbyA+Pj4gMCwgZSB8fCAoZSA9IDApOwogICAgICBsZXQgcDsKICAgICAgaWYgKHR5cGVvZiBlID09ICJudW1iZXIiKQogICAgICAgIGZvciAocCA9IHI7cCA8IG87ICsrcCkKICAgICAgICAgIHRoaXNbcF0gPSBlOwogICAgICBlbHNlIHsKICAgICAgICBsZXQgbTIgPSBtZS5pc0J1ZmZlcihlKSA/IGUgOiBtZS5mcm9tKGUsIGYpLCB5MiA9IG0yLmxlbmd0aDsKICAgICAgICBpZiAoeTIgPT09IDApCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgIicgKyBlICsgJyIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgInZhbHVlIicpOwogICAgICAgIGZvciAocCA9IDA7cCA8IG8gLSByOyArK3ApCiAgICAgICAgICB0aGlzW3AgKyByXSA9IG0yW3AgJSB5Ml07CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgdmFyICRuID0ge307CiAgICBmdW5jdGlvbiBQMCh0LCBlLCByKSB7CiAgICAgICRuW3RdID0gY2xhc3MgZXh0ZW5kcyByIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAibWVzc2FnZSIsIHsgdmFsdWU6IGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KSwgdGhpcy5uYW1lID0gYCR7dGhpcy5uYW1lfSBbJHt0fV1gLCB0aGlzLnN0YWNrLCBkZWxldGUgdGhpcy5uYW1lOwogICAgICAgIH0KICAgICAgICBnZXQgY29kZSgpIHsKICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgICAgICBzZXQgY29kZShmKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgImNvZGUiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IGYsIHdyaXRhYmxlOiB0cnVlIH0pOwogICAgICAgIH0KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3R9XTogJHt0aGlzLm1lc3NhZ2V9YDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBQMCgiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTIiwgZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gdCA/IGAke3R9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2AgOiAiQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcyI7CiAgICB9LCBSYW5nZUVycm9yKTsKICAgIFAwKCJFUlJfSU5WQUxJRF9BUkdfVFlQRSIsIGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIGBUaGUgIiR7dH0iIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgZX1gOwogICAgfSwgVHlwZUVycm9yKTsKICAgIFAwKCJFUlJfT1VUX09GX1JBTkdFIiwgZnVuY3Rpb24odCwgZSwgcikgewogICAgICBsZXQgbyA9IGBUaGUgdmFsdWUgb2YgIiR7dH0iIGlzIG91dCBvZiByYW5nZS5gLCBmID0gcjsKICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocikgJiYgTWF0aC5hYnMocikgPiAyICoqIDMyID8gZiA9IEZkKFN0cmluZyhyKSkgOiB0eXBlb2YgciA9PSAiYmlnaW50IiAmJiAoZiA9IFN0cmluZyhyKSwgKHIgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCByIDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpICYmIChmID0gRmQoZikpLCBmICs9ICJuIiksIG8gKz0gYCBJdCBtdXN0IGJlICR7ZX0uIFJlY2VpdmVkICR7Zn1gLCBvOwogICAgfSwgUmFuZ2VFcnJvcik7CiAgICBmdW5jdGlvbiBGZCh0KSB7CiAgICAgIGxldCBlID0gIiIsIHIgPSB0Lmxlbmd0aCwgbyA9IHRbMF0gPT09ICItIiA/IDEgOiAwOwogICAgICBmb3IgKDtyID49IG8gKyA0OyByIC09IDMpCiAgICAgICAgZSA9IGBfJHt0LnNsaWNlKHIgLSAzLCByKX0ke2V9YDsKICAgICAgcmV0dXJuIGAke3Quc2xpY2UoMCwgcil9JHtlfWA7CiAgICB9CiAgICBmdW5jdGlvbiBLdyh0LCBlLCByKSB7CiAgICAgIFluKGUsICJvZmZzZXQiKSwgKHRbZV0gPT09IHVuZGVmaW5lZCB8fCB0W2UgKyByXSA9PT0gdW5kZWZpbmVkKSAmJiBWZihlLCB0Lmxlbmd0aCAtIChyICsgMSkpOwogICAgfQogICAgZnVuY3Rpb24gWWQodCwgZSwgciwgbywgZiwgcCkgewogICAgICBpZiAodCA+IHIgfHwgdCA8IGUpIHsKICAgICAgICBsZXQgbTIgPSB0eXBlb2YgZSA9PSAiYmlnaW50IiA/ICJuIiA6ICIiLCB5MjsKICAgICAgICB0aHJvdyBwID4gMyA/IGUgPT09IDAgfHwgZSA9PT0gQmlnSW50KDApID8geTIgPSBgPj0gMCR7bTJ9IGFuZCA8IDIke20yfSAqKiAkeyhwICsgMSkgKiA4fSR7bTJ9YCA6IHkyID0gYD49IC0oMiR7bTJ9ICoqICR7KHAgKyAxKSAqIDggLSAxfSR7bTJ9KSBhbmQgPCAyICoqICR7KHAgKyAxKSAqIDggLSAxfSR7bTJ9YCA6IHkyID0gYD49ICR7ZX0ke20yfSBhbmQgPD0gJHtyfSR7bTJ9YCwgbmV3ICRuLkVSUl9PVVRfT0ZfUkFOR0UoInZhbHVlIiwgeTIsIHQpOwogICAgICB9CiAgICAgIEt3KG8sIGYsIHApOwogICAgfQogICAgZnVuY3Rpb24gWW4odCwgZSkgewogICAgICBpZiAodHlwZW9mIHQgIT0gIm51bWJlciIpCiAgICAgICAgdGhyb3cgbmV3ICRuLkVSUl9JTlZBTElEX0FSR19UWVBFKGUsICJudW1iZXIiLCB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIFZmKHQsIGUsIHIpIHsKICAgICAgdGhyb3cgTWF0aC5mbG9vcih0KSAhPT0gdCA/IChZbih0LCByKSwgbmV3ICRuLkVSUl9PVVRfT0ZfUkFOR0UociB8fCAib2Zmc2V0IiwgImFuIGludGVnZXIiLCB0KSkgOiBlIDwgMCA/IG5ldyAkbi5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMgOiBuZXcgJG4uRVJSX09VVF9PRl9SQU5HRShyIHx8ICJvZmZzZXQiLCBgPj0gJHtyID8gMSA6IDB9IGFuZCA8PSAke2V9YCwgdCk7CiAgICB9CiAgICB2YXIgancgPSAvW14rLzAtOUEtWmEtei1fXS9nOwogICAgZnVuY3Rpb24gWncodCkgewogICAgICBpZiAodCA9IHQuc3BsaXQoIj0iKVswXSwgdCA9IHQudHJpbSgpLnJlcGxhY2UoancsICIiKSwgdC5sZW5ndGggPCAyKQogICAgICAgIHJldHVybiAiIjsKICAgICAgZm9yICg7dC5sZW5ndGggJSA0ICE9PSAwOyApCiAgICAgICAgdCA9IHQgKyAiPSI7CiAgICAgIHJldHVybiB0OwogICAgfQogICAgZnVuY3Rpb24gTDAodCwgZSkgewogICAgICBlID0gZSB8fCAxIC8gMDsKICAgICAgbGV0IHIsIG8gPSB0Lmxlbmd0aCwgZiA9IG51bGwsIHAgPSBbXTsKICAgICAgZm9yIChsZXQgbTIgPSAwO20yIDwgbzsgKyttMikgewogICAgICAgIGlmIChyID0gdC5jaGFyQ29kZUF0KG0yKSwgciA+IDU1Mjk1ICYmIHIgPCA1NzM0NCkgewogICAgICAgICAgaWYgKCFmKSB7CiAgICAgICAgICAgIGlmIChyID4gNTYzMTkpIHsKICAgICAgICAgICAgICAoZSAtPSAzKSA+IC0xICYmIHAucHVzaCgyMzksIDE5MSwgMTg5KTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChtMiArIDEgPT09IG8pIHsKICAgICAgICAgICAgICAoZSAtPSAzKSA+IC0xICYmIHAucHVzaCgyMzksIDE5MSwgMTg5KTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmID0gcjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAociA8IDU2MzIwKSB7CiAgICAgICAgICAgIChlIC09IDMpID4gLTEgJiYgcC5wdXNoKDIzOSwgMTkxLCAxODkpLCBmID0gcjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICByID0gKGYgLSA1NTI5NiA8PCAxMCB8IHIgLSA1NjMyMCkgKyA2NTUzNjsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGYgJiYgKGUgLT0gMykgPiAtMSAmJiBwLnB1c2goMjM5LCAxOTEsIDE4OSk7CiAgICAgICAgaWYgKGYgPSBudWxsLCByIDwgMTI4KSB7CiAgICAgICAgICBpZiAoKGUgLT0gMSkgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIHAucHVzaChyKTsKICAgICAgICB9IGVsc2UgaWYgKHIgPCAyMDQ4KSB7CiAgICAgICAgICBpZiAoKGUgLT0gMikgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIHAucHVzaChyID4+IDYgfCAxOTIsIHIgJiA2MyB8IDEyOCk7CiAgICAgICAgfSBlbHNlIGlmIChyIDwgNjU1MzYpIHsKICAgICAgICAgIGlmICgoZSAtPSAzKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgcC5wdXNoKHIgPj4gMTIgfCAyMjQsIHIgPj4gNiAmIDYzIHwgMTI4LCByICYgNjMgfCAxMjgpOwogICAgICAgIH0gZWxzZSBpZiAociA8IDExMTQxMTIpIHsKICAgICAgICAgIGlmICgoZSAtPSA0KSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgcC5wdXNoKHIgPj4gMTggfCAyNDAsIHIgPj4gMTIgJiA2MyB8IDEyOCwgciA+PiA2ICYgNjMgfCAxMjgsIHIgJiA2MyB8IDEyOCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpOwogICAgICB9CiAgICAgIHJldHVybiBwOwogICAgfQogICAgZnVuY3Rpb24gVncodCkgewogICAgICBsZXQgZSA9IFtdOwogICAgICBmb3IgKGxldCByID0gMDtyIDwgdC5sZW5ndGg7ICsrcikKICAgICAgICBlLnB1c2godC5jaGFyQ29kZUF0KHIpICYgMjU1KTsKICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBmdW5jdGlvbiAkdyh0LCBlKSB7CiAgICAgIGxldCByLCBvLCBmLCBwID0gW107CiAgICAgIGZvciAobGV0IG0yID0gMDttMiA8IHQubGVuZ3RoICYmICEoKGUgLT0gMikgPCAwKTsgKyttMikKICAgICAgICByID0gdC5jaGFyQ29kZUF0KG0yKSwgbyA9IHIgPj4gOCwgZiA9IHIgJSAyNTYsIHAucHVzaChmKSwgcC5wdXNoKG8pOwogICAgICByZXR1cm4gcDsKICAgIH0KICAgIGZ1bmN0aW9uIFhkKHQpIHsKICAgICAgcmV0dXJuIEkwLnRvQnl0ZUFycmF5KFp3KHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRvKHQsIGUsIHIsIG8pIHsKICAgICAgbGV0IGY7CiAgICAgIGZvciAoZiA9IDA7ZiA8IG8gJiYgIShmICsgciA+PSBlLmxlbmd0aCB8fCBmID49IHQubGVuZ3RoKTsgKytmKQogICAgICAgIGVbZiArIHJdID0gdFtmXTsKICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICBmdW5jdGlvbiBacih0LCBlKSB7CiAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgZSB8fCB0ICE9IG51bGwgJiYgdC5jb25zdHJ1Y3RvciAhPSBudWxsICYmIHQuY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIHQuY29uc3RydWN0b3IubmFtZSA9PT0gZS5uYW1lOwogICAgfQogICAgZnVuY3Rpb24gQzAodCkgewogICAgICByZXR1cm4gdCAhPT0gdDsKICAgIH0KICAgIHZhciBHdyA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgdCA9ICIwMTIzNDU2Nzg5YWJjZGVmIiwgZSA9IG5ldyBBcnJheSgyNTYpOwogICAgICBmb3IgKGxldCByID0gMDtyIDwgMTY7ICsrcikgewogICAgICAgIGxldCBvID0gciAqIDE2OwogICAgICAgIGZvciAobGV0IGYgPSAwO2YgPCAxNjsgKytmKQogICAgICAgICAgZVtvICsgZl0gPSB0W3JdICsgdFtmXTsKICAgICAgfQogICAgICByZXR1cm4gZTsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIFRpKHQpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgPiAidSIgPyBZdyA6IHQ7CiAgICB9CiAgICBmdW5jdGlvbiBZdygpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaWdJbnQgbm90IHN1cHBvcnRlZCIpOwogICAgfQogIH0pOwogIFRlID0gVDIoKE8wLCBRZCkgPT4gewogICAgdmFyIHJvID0gVXQoKSwgVnIgPSByby5CdWZmZXI7CiAgICBmdW5jdGlvbiBKZCh0LCBlKSB7CiAgICAgIGZvciAodmFyIHIgaW4gdCkKICAgICAgICBlW3JdID0gdFtyXTsKICAgIH0KICAgIFZyLmZyb20gJiYgVnIuYWxsb2MgJiYgVnIuYWxsb2NVbnNhZmUgJiYgVnIuYWxsb2NVbnNhZmVTbG93ID8gUWQuZXhwb3J0cyA9IHJvIDogKEpkKHJvLCBPMCksIE8wLkJ1ZmZlciA9IGFuKTsKICAgIGZ1bmN0aW9uIGFuKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIFZyKHQsIGUsIHIpOwogICAgfQogICAgYW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShWci5wcm90b3R5cGUpOwogICAgSmQoVnIsIGFuKTsKICAgIGFuLmZyb20gPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgdCA9PSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpOwogICAgICByZXR1cm4gVnIodCwgZSwgcik7CiAgICB9OwogICAgYW4uYWxsb2MgPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7CiAgICAgIHZhciBvID0gVnIodCk7CiAgICAgIHJldHVybiBlICE9PSB1bmRlZmluZWQgPyB0eXBlb2YgciA9PSAic3RyaW5nIiA/IG8uZmlsbChlLCByKSA6IG8uZmlsbChlKSA6IG8uZmlsbCgwKSwgbzsKICAgIH07CiAgICBhbi5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTsKICAgICAgcmV0dXJuIFZyKHQpOwogICAgfTsKICAgIGFuLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTsKICAgICAgcmV0dXJuIHJvLlNsb3dCdWZmZXIodCk7CiAgICB9OwogIH0pOwogIG9uID0gVDIoKEdxLCBVMCkgPT4gewogICAgdmFyIEYwID0gNjU1MzYsIFh3ID0gNDI5NDk2NzI5NTsKICAgIGZ1bmN0aW9uIEp3KCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuClVzZSBDaHJvbWUsIEZpcmVmb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTFgKTsKICAgIH0KICAgIHZhciBRdyA9IFRlKCkuQnVmZmVyLCBpbyA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvOwogICAgaW8gJiYgaW8uZ2V0UmFuZG9tVmFsdWVzID8gVTAuZXhwb3J0cyA9IGU2IDogVTAuZXhwb3J0cyA9IEp3OwogICAgZnVuY3Rpb24gZTYodCwgZSkgewogICAgICBpZiAodCA+IFh3KQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7CiAgICAgIHZhciByID0gUXcuYWxsb2NVbnNhZmUodCk7CiAgICAgIGlmICh0ID4gMCkKICAgICAgICBpZiAodCA+IEYwKQogICAgICAgICAgZm9yICh2YXIgbyA9IDA7byA8IHQ7IG8gKz0gRjApCiAgICAgICAgICAgIGlvLmdldFJhbmRvbVZhbHVlcyhyLnNsaWNlKG8sIG8gKyBGMCkpOwogICAgICAgIGVsc2UKICAgICAgICAgIGlvLmdldFJhbmRvbVZhbHVlcyhyKTsKICAgICAgcmV0dXJuIHR5cGVvZiBlID09ICJmdW5jdGlvbiIgPyBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkgewogICAgICAgIGUobnVsbCwgcik7CiAgICAgIH0pIDogcjsKICAgIH0KICB9KTsKICBJZSA9IFQyKChZcSwgejApID0+IHsKICAgIHR5cGVvZiBPYmplY3QuY3JlYXRlID09ICJmdW5jdGlvbiIgPyB6MC5leHBvcnRzID0gZnVuY3Rpb24oZSwgcikgewogICAgICByICYmIChlLnN1cGVyXyA9IHIsIGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogZSwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KSk7CiAgICB9IDogejAuZXhwb3J0cyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgaWYgKHIpIHsKICAgICAgICBlLnN1cGVyXyA9IHI7CiAgICAgICAgdmFyIG8gPSBmdW5jdGlvbigpIHsKICAgICAgICB9OwogICAgICAgIG8ucHJvdG90eXBlID0gci5wcm90b3R5cGUsIGUucHJvdG90eXBlID0gbmV3IG8sIGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZTsKICAgICAgfQogICAgfTsKICB9KTsKICBraSA9IFQyKChYcSwgSDApID0+IHsKICAgIHZhciBKbiA9IHR5cGVvZiBSZWZsZWN0ID09ICJvYmplY3QiID8gUmVmbGVjdCA6IG51bGwsIGVjID0gSm4gJiYgdHlwZW9mIEpuLmFwcGx5ID09ICJmdW5jdGlvbiIgPyBKbi5hcHBseSA6IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGUsIHIsIG8pOwogICAgfSwgbm87CiAgICBKbiAmJiB0eXBlb2YgSm4ub3duS2V5cyA9PSAiZnVuY3Rpb24iID8gbm8gPSBKbi5vd25LZXlzIDogT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IG5vID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpOwogICAgfSA6IG5vID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSk7CiAgICB9OwogICAgZnVuY3Rpb24gdDYodCkgewogICAgICBjb25zb2xlICYmIGNvbnNvbGUud2FybiAmJiBjb25zb2xlLndhcm4odCk7CiAgICB9CiAgICB2YXIgcmMgPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSAhPT0gZTsKICAgIH07CiAgICBmdW5jdGlvbiBGZSgpIHsKICAgICAgRmUuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgSDAuZXhwb3J0cyA9IEZlOwogICAgSDAuZXhwb3J0cy5vbmNlID0gZjY7CiAgICBGZS5FdmVudEVtaXR0ZXIgPSBGZTsKICAgIEZlLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRmUucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7CiAgICBGZS5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDsKICAgIHZhciB0YyA9IDEwOwogICAgZnVuY3Rpb24gZm8odCkgewogICAgICBpZiAodHlwZW9mIHQgIT0gImZ1bmN0aW9uIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB0KTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGZSwgImRlZmF1bHRNYXhMaXN0ZW5lcnMiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0YzsKICAgIH0sIHNldDogZnVuY3Rpb24odCkgewogICAgICBpZiAodHlwZW9mIHQgIT0gIm51bWJlciIgfHwgdCA8IDAgfHwgcmModCkpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIHQgKyAiLiIpOwogICAgICB0YyA9IHQ7CiAgICB9IH0pOwogICAgRmUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykgJiYgKHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuX2V2ZW50c0NvdW50ID0gMCksIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7CiAgICB9OwogICAgRmUucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHR5cGVvZiBlICE9ICJudW1iZXIiIHx8IGUgPCAwIHx8IHJjKGUpKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBlICsgIi4iKTsKICAgICAgcmV0dXJuIHRoaXMuX21heExpc3RlbmVycyA9IGUsIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gaWModCkgewogICAgICByZXR1cm4gdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQgPyBGZS5kZWZhdWx0TWF4TGlzdGVuZXJzIDogdC5fbWF4TGlzdGVuZXJzOwogICAgfQogICAgRmUucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gaWModGhpcyk7CiAgICB9OwogICAgRmUucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihlKSB7CiAgICAgIGZvciAodmFyIHIgPSBbXSwgbyA9IDE7byA8IGFyZ3VtZW50cy5sZW5ndGg7IG8rKykKICAgICAgICByLnB1c2goYXJndW1lbnRzW29dKTsKICAgICAgdmFyIGYgPSBlID09PSAiZXJyb3IiLCBwID0gdGhpcy5fZXZlbnRzOwogICAgICBpZiAocCAhPT0gdW5kZWZpbmVkKQogICAgICAgIGYgPSBmICYmIHAuZXJyb3IgPT09IHVuZGVmaW5lZDsKICAgICAgZWxzZSBpZiAoIWYpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoZikgewogICAgICAgIHZhciBtMjsKICAgICAgICBpZiAoci5sZW5ndGggPiAwICYmIChtMiA9IHJbMF0pLCBtMiBpbnN0YW5jZW9mIEVycm9yKQogICAgICAgICAgdGhyb3cgbTI7CiAgICAgICAgdmFyIHkyID0gbmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIiArIChtMiA/ICIgKCIgKyBtMi5tZXNzYWdlICsgIikiIDogIiIpKTsKICAgICAgICB0aHJvdyB5Mi5jb250ZXh0ID0gbTIsIHkyOwogICAgICB9CiAgICAgIHZhciBNID0gcFtlXTsKICAgICAgaWYgKE0gPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIGlmICh0eXBlb2YgTSA9PSAiZnVuY3Rpb24iKQogICAgICAgIGVjKE0sIHRoaXMsIHIpOwogICAgICBlbHNlCiAgICAgICAgZm9yICh2YXIgeCA9IE0ubGVuZ3RoLCBTID0gc2MoTSwgeCksIG8gPSAwO28gPCB4OyArK28pCiAgICAgICAgICBlYyhTW29dLCB0aGlzLCByKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgZnVuY3Rpb24gbmModCwgZSwgciwgbykgewogICAgICB2YXIgZiwgcCwgbTI7CiAgICAgIGlmIChmbyhyKSwgcCA9IHQuX2V2ZW50cywgcCA9PT0gdW5kZWZpbmVkID8gKHAgPSB0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpLCB0Ll9ldmVudHNDb3VudCA9IDApIDogKHAubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCAmJiAodC5lbWl0KCJuZXdMaXN0ZW5lciIsIGUsIHIubGlzdGVuZXIgPyByLmxpc3RlbmVyIDogciksIHAgPSB0Ll9ldmVudHMpLCBtMiA9IHBbZV0pLCBtMiA9PT0gdW5kZWZpbmVkKQogICAgICAgIG0yID0gcFtlXSA9IHIsICsrdC5fZXZlbnRzQ291bnQ7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBtMiA9PSAiZnVuY3Rpb24iID8gbTIgPSBwW2VdID0gbyA/IFtyLCBtMl0gOiBbbTIsIHJdIDogbyA/IG0yLnVuc2hpZnQocikgOiBtMi5wdXNoKHIpLCBmID0gaWModCksIGYgPiAwICYmIG0yLmxlbmd0aCA+IGYgJiYgIW0yLndhcm5lZCkgewogICAgICAgIG0yLndhcm5lZCA9IHRydWU7CiAgICAgICAgdmFyIHkyID0gbmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIgKyBtMi5sZW5ndGggKyAiICIgKyBTdHJpbmcoZSkgKyAiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTsKICAgICAgICB5Mi5uYW1lID0gIk1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsIHkyLmVtaXR0ZXIgPSB0LCB5Mi50eXBlID0gZSwgeTIuY291bnQgPSBtMi5sZW5ndGgsIHQ2KHkyKTsKICAgICAgfQogICAgICByZXR1cm4gdDsKICAgIH0KICAgIEZlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIG5jKHRoaXMsIGUsIHIsIGZhbHNlKTsKICAgIH07CiAgICBGZS5wcm90b3R5cGUub24gPSBGZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI7CiAgICBGZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gbmModGhpcywgZSwgciwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gcjYoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkKICAgICAgICByZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbiksIHRoaXMuZmlyZWQgPSB0cnVlLCBhcmd1bWVudHMubGVuZ3RoID09PSAwID8gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KSA6IHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICB9CiAgICBmdW5jdGlvbiBmYyh0LCBlLCByKSB7CiAgICAgIHZhciBvID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHQsIHR5cGU6IGUsIGxpc3RlbmVyOiByIH0sIGYgPSByNi5iaW5kKG8pOwogICAgICByZXR1cm4gZi5saXN0ZW5lciA9IHIsIG8ud3JhcEZuID0gZiwgZjsKICAgIH0KICAgIEZlLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZm8ociksIHRoaXMub24oZSwgZmModGhpcywgZSwgcikpLCB0aGlzOwogICAgfTsKICAgIEZlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZm8ociksIHRoaXMucHJlcGVuZExpc3RlbmVyKGUsIGZjKHRoaXMsIGUsIHIpKSwgdGhpczsKICAgIH07CiAgICBGZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHZhciBvLCBmLCBwLCBtMiwgeTI7CiAgICAgIGlmIChmbyhyKSwgZiA9IHRoaXMuX2V2ZW50cywgZiA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBpZiAobyA9IGZbZV0sIG8gPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgaWYgKG8gPT09IHIgfHwgby5saXN0ZW5lciA9PT0gcikKICAgICAgICAtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwID8gdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKSA6IChkZWxldGUgZltlXSwgZi5yZW1vdmVMaXN0ZW5lciAmJiB0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIiwgZSwgby5saXN0ZW5lciB8fCByKSk7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBvICE9ICJmdW5jdGlvbiIpIHsKICAgICAgICBmb3IgKHAgPSAtMSwgbTIgPSBvLmxlbmd0aCAtIDE7bTIgPj0gMDsgbTItLSkKICAgICAgICAgIGlmIChvW20yXSA9PT0gciB8fCBvW20yXS5saXN0ZW5lciA9PT0gcikgewogICAgICAgICAgICB5MiA9IG9bbTJdLmxpc3RlbmVyLCBwID0gbTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGlmIChwIDwgMCkKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIHAgPT09IDAgPyBvLnNoaWZ0KCkgOiBpNihvLCBwKSwgby5sZW5ndGggPT09IDEgJiYgKGZbZV0gPSBvWzBdKSwgZi5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLCBlLCB5MiB8fCByKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBGZS5wcm90b3R5cGUub2ZmID0gRmUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwogICAgRmUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIsIG8sIGY7CiAgICAgIGlmIChvID0gdGhpcy5fZXZlbnRzLCBvID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGlmIChvLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDAgPyAodGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwKSA6IG9bZV0gIT09IHVuZGVmaW5lZCAmJiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCA/IHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCkgOiBkZWxldGUgb1tlXSksIHRoaXM7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdmFyIHAgPSBPYmplY3Qua2V5cyhvKSwgbTI7CiAgICAgICAgZm9yIChmID0gMDtmIDwgcC5sZW5ndGg7ICsrZikKICAgICAgICAgIG0yID0gcFtmXSwgbTIgIT09ICJyZW1vdmVMaXN0ZW5lciIgJiYgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMobTIpOwogICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSwgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwLCB0aGlzOwogICAgICB9CiAgICAgIGlmIChyID0gb1tlXSwgdHlwZW9mIHIgPT0gImZ1bmN0aW9uIikKICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKGUsIHIpOwogICAgICBlbHNlIGlmIChyICE9PSB1bmRlZmluZWQpCiAgICAgICAgZm9yIChmID0gci5sZW5ndGggLSAxO2YgPj0gMDsgZi0tKQogICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcihlLCByW2ZdKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gYWModCwgZSwgcikgewogICAgICB2YXIgbyA9IHQuX2V2ZW50czsKICAgICAgaWYgKG8gPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gW107CiAgICAgIHZhciBmID0gb1tlXTsKICAgICAgcmV0dXJuIGYgPT09IHVuZGVmaW5lZCA/IFtdIDogdHlwZW9mIGYgPT0gImZ1bmN0aW9uIiA/IHIgPyBbZi5saXN0ZW5lciB8fCBmXSA6IFtmXSA6IHIgPyBuNihmKSA6IHNjKGYsIGYubGVuZ3RoKTsKICAgIH0KICAgIEZlLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBhYyh0aGlzLCBlLCB0cnVlKTsKICAgIH07CiAgICBGZS5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gYWModGhpcywgZSwgZmFsc2UpOwogICAgfTsKICAgIEZlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50ID09ICJmdW5jdGlvbiIgPyB0Lmxpc3RlbmVyQ291bnQoZSkgOiBvYy5jYWxsKHQsIGUpOwogICAgfTsKICAgIEZlLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gb2M7CiAgICBmdW5jdGlvbiBvYyh0KSB7CiAgICAgIHZhciBlID0gdGhpcy5fZXZlbnRzOwogICAgICBpZiAoZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFyIHIgPSBlW3RdOwogICAgICAgIGlmICh0eXBlb2YgciA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgaWYgKHIgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIHJldHVybiByLmxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIEZlLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBubyh0aGlzLl9ldmVudHMpIDogW107CiAgICB9OwogICAgZnVuY3Rpb24gc2ModCwgZSkgewogICAgICBmb3IgKHZhciByID0gbmV3IEFycmF5KGUpLCBvID0gMDtvIDwgZTsgKytvKQogICAgICAgIHJbb10gPSB0W29dOwogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGZ1bmN0aW9uIGk2KHQsIGUpIHsKICAgICAgZm9yICg7ZSArIDEgPCB0Lmxlbmd0aDsgZSsrKQogICAgICAgIHRbZV0gPSB0W2UgKyAxXTsKICAgICAgdC5wb3AoKTsKICAgIH0KICAgIGZ1bmN0aW9uIG42KHQpIHsKICAgICAgZm9yICh2YXIgZSA9IG5ldyBBcnJheSh0Lmxlbmd0aCksIHIgPSAwO3IgPCBlLmxlbmd0aDsgKytyKQogICAgICAgIGVbcl0gPSB0W3JdLmxpc3RlbmVyIHx8IHRbcl07CiAgICAgIHJldHVybiBlOwogICAgfQogICAgZnVuY3Rpb24gZjYodCwgZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ociwgbykgewogICAgICAgIGZ1bmN0aW9uIGYobTIpIHsKICAgICAgICAgIHQucmVtb3ZlTGlzdGVuZXIoZSwgcCksIG8obTIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgdHlwZW9mIHQucmVtb3ZlTGlzdGVuZXIgPT0gImZ1bmN0aW9uIiAmJiB0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIGYpLCByKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICAgICAgfQogICAgICAgIGhjKHQsIGUsIHAsIHsgb25jZTogdHJ1ZSB9KSwgZSAhPT0gImVycm9yIiAmJiBhNih0LCBmLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gYTYodCwgZSwgcikgewogICAgICB0eXBlb2YgdC5vbiA9PSAiZnVuY3Rpb24iICYmIGhjKHQsICJlcnJvciIsIGUsIHIpOwogICAgfQogICAgZnVuY3Rpb24gaGModCwgZSwgciwgbykgewogICAgICBpZiAodHlwZW9mIHQub24gPT0gImZ1bmN0aW9uIikKICAgICAgICBvLm9uY2UgPyB0Lm9uY2UoZSwgcikgOiB0Lm9uKGUsIHIpOwogICAgICBlbHNlIGlmICh0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKGUsIGZ1bmN0aW9uIGYocCkgewogICAgICAgICAgby5vbmNlICYmIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCBmKSwgcihwKTsKICAgICAgICB9KTsKICAgICAgZWxzZQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiZW1pdHRlciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHQpOwogICAgfQogIH0pOwogIFcwID0gVDIoKEpxLCB1YykgPT4gewogICAgdWMuZXhwb3J0cyA9IGtpKCkuRXZlbnRFbWl0dGVyOwogIH0pOwogICRmID0gVDIoKCkgPT4gewogIH0pOwogIHBjID0gVDIoKHRJLCBjYykgPT4gewogICAgZnVuY3Rpb24gbGModCwgZSkgewogICAgICB2YXIgciA9IE9iamVjdC5rZXlzKHQpOwogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTsKICAgICAgICBlICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24oZikgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZikuZW51bWVyYWJsZTsKICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBvKTsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGZ1bmN0aW9uIG82KHQpIHsKICAgICAgZm9yICh2YXIgZSA9IDE7ZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgewogICAgICAgIHZhciByID0gYXJndW1lbnRzW2VdICE9IG51bGwgPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICBlICUgMiA/IGxjKE9iamVjdChyKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbihvKSB7CiAgICAgICAgICBzNih0LCBvLCByW29dKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogbGMoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uKG8pIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBvLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIG8pKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdDsKICAgIH0KICAgIGZ1bmN0aW9uIHM2KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIGUgaW4gdCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7IHZhbHVlOiByLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pIDogdFtlXSA9IHIsIHQ7CiAgICB9CiAgICBmdW5jdGlvbiBoNih0LCBlKSB7CiAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBlKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRjKHQsIGUpIHsKICAgICAgZm9yICh2YXIgciA9IDA7ciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICB2YXIgbyA9IGVbcl07CiAgICAgICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8IGZhbHNlLCBvLmNvbmZpZ3VyYWJsZSA9IHRydWUsICJ2YWx1ZSIgaW4gbyAmJiAoby53cml0YWJsZSA9IHRydWUpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgby5rZXksIG8pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB1Nih0LCBlLCByKSB7CiAgICAgIHJldHVybiBlICYmIGRjKHQucHJvdG90eXBlLCBlKSwgciAmJiBkYyh0LCByKSwgdDsKICAgIH0KICAgIHZhciBsNiA9IFV0KCksIGFvID0gbDYuQnVmZmVyLCBkNiA9ICRmKCksIEswID0gZDYuaW5zcGVjdCwgYzYgPSBLMCAmJiBLMC5jdXN0b20gfHwgImluc3BlY3QiOwogICAgZnVuY3Rpb24gcDYodCwgZSwgcikgewogICAgICBhby5wcm90b3R5cGUuY29weS5jYWxsKHQsIGUsIHIpOwogICAgfQogICAgY2MuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgIGg2KHRoaXMsIHQpLCB0aGlzLmhlYWQgPSBudWxsLCB0aGlzLnRhaWwgPSBudWxsLCB0aGlzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHU2KHQsIFt7IGtleTogInB1c2giLCB2YWx1ZTogZnVuY3Rpb24ocikgewogICAgICAgIHZhciBvID0geyBkYXRhOiByLCBuZXh0OiBudWxsIH07CiAgICAgICAgdGhpcy5sZW5ndGggPiAwID8gdGhpcy50YWlsLm5leHQgPSBvIDogdGhpcy5oZWFkID0gbywgdGhpcy50YWlsID0gbywgKyt0aGlzLmxlbmd0aDsKICAgICAgfSB9LCB7IGtleTogInVuc2hpZnQiLCB2YWx1ZTogZnVuY3Rpb24ocikgewogICAgICAgIHZhciBvID0geyBkYXRhOiByLCBuZXh0OiB0aGlzLmhlYWQgfTsKICAgICAgICB0aGlzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy50YWlsID0gbyksIHRoaXMuaGVhZCA9IG8sICsrdGhpcy5sZW5ndGg7CiAgICAgIH0gfSwgeyBrZXk6ICJzaGlmdCIsIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHZhciByID0gdGhpcy5oZWFkLmRhdGE7CiAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgPyB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsIDogdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQsIC0tdGhpcy5sZW5ndGgsIHI7CiAgICAgICAgfQogICAgICB9IH0sIHsga2V5OiAiY2xlYXIiLCB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbCwgdGhpcy5sZW5ndGggPSAwOwogICAgICB9IH0sIHsga2V5OiAiam9pbiIsIHZhbHVlOiBmdW5jdGlvbihyKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGZvciAodmFyIG8gPSB0aGlzLmhlYWQsIGYgPSAiIiArIG8uZGF0YTtvID0gby5uZXh0OyApCiAgICAgICAgICBmICs9IHIgKyBvLmRhdGE7CiAgICAgICAgcmV0dXJuIGY7CiAgICAgIH0gfSwgeyBrZXk6ICJjb25jYXQiLCB2YWx1ZTogZnVuY3Rpb24ocikgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiBhby5hbGxvYygwKTsKICAgICAgICBmb3IgKHZhciBvID0gYW8uYWxsb2NVbnNhZmUociA+Pj4gMCksIGYgPSB0aGlzLmhlYWQsIHAgPSAwO2Y7ICkKICAgICAgICAgIHA2KGYuZGF0YSwgbywgcCksIHAgKz0gZi5kYXRhLmxlbmd0aCwgZiA9IGYubmV4dDsKICAgICAgICByZXR1cm4gbzsKICAgICAgfSB9LCB7IGtleTogImNvbnN1bWUiLCB2YWx1ZTogZnVuY3Rpb24ociwgbykgewogICAgICAgIHZhciBmOwogICAgICAgIHJldHVybiByIDwgdGhpcy5oZWFkLmRhdGEubGVuZ3RoID8gKGYgPSB0aGlzLmhlYWQuZGF0YS5zbGljZSgwLCByKSwgdGhpcy5oZWFkLmRhdGEgPSB0aGlzLmhlYWQuZGF0YS5zbGljZShyKSkgOiByID09PSB0aGlzLmhlYWQuZGF0YS5sZW5ndGggPyBmID0gdGhpcy5zaGlmdCgpIDogZiA9IG8gPyB0aGlzLl9nZXRTdHJpbmcocikgOiB0aGlzLl9nZXRCdWZmZXIociksIGY7CiAgICAgIH0gfSwgeyBrZXk6ICJmaXJzdCIsIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7CiAgICAgIH0gfSwgeyBrZXk6ICJfZ2V0U3RyaW5nIiwgdmFsdWU6IGZ1bmN0aW9uKHIpIHsKICAgICAgICB2YXIgbyA9IHRoaXMuaGVhZCwgZiA9IDEsIHAgPSBvLmRhdGE7CiAgICAgICAgZm9yIChyIC09IHAubGVuZ3RoO28gPSBvLm5leHQ7ICkgewogICAgICAgICAgdmFyIG0yID0gby5kYXRhLCB5MiA9IHIgPiBtMi5sZW5ndGggPyBtMi5sZW5ndGggOiByOwogICAgICAgICAgaWYgKHkyID09PSBtMi5sZW5ndGggPyBwICs9IG0yIDogcCArPSBtMi5zbGljZSgwLCByKSwgciAtPSB5MiwgciA9PT0gMCkgewogICAgICAgICAgICB5MiA9PT0gbTIubGVuZ3RoID8gKCsrZiwgby5uZXh0ID8gdGhpcy5oZWFkID0gby5uZXh0IDogdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbCkgOiAodGhpcy5oZWFkID0gbywgby5kYXRhID0gbTIuc2xpY2UoeTIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICArK2Y7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCAtPSBmLCBwOwogICAgICB9IH0sIHsga2V5OiAiX2dldEJ1ZmZlciIsIHZhbHVlOiBmdW5jdGlvbihyKSB7CiAgICAgICAgdmFyIG8gPSBhby5hbGxvY1Vuc2FmZShyKSwgZiA9IHRoaXMuaGVhZCwgcCA9IDE7CiAgICAgICAgZm9yIChmLmRhdGEuY29weShvKSwgciAtPSBmLmRhdGEubGVuZ3RoO2YgPSBmLm5leHQ7ICkgewogICAgICAgICAgdmFyIG0yID0gZi5kYXRhLCB5MiA9IHIgPiBtMi5sZW5ndGggPyBtMi5sZW5ndGggOiByOwogICAgICAgICAgaWYgKG0yLmNvcHkobywgby5sZW5ndGggLSByLCAwLCB5MiksIHIgLT0geTIsIHIgPT09IDApIHsKICAgICAgICAgICAgeTIgPT09IG0yLmxlbmd0aCA/ICgrK3AsIGYubmV4dCA/IHRoaXMuaGVhZCA9IGYubmV4dCA6IHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGwpIDogKHRoaXMuaGVhZCA9IGYsIGYuZGF0YSA9IG0yLnNsaWNlKHkyKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggLT0gcCwgbzsKICAgICAgfSB9LCB7IGtleTogYzYsIHZhbHVlOiBmdW5jdGlvbihyLCBvKSB7CiAgICAgICAgcmV0dXJuIEswKHRoaXMsIG82KHt9LCBvLCB7IGRlcHRoOiAwLCBjdXN0b21JbnNwZWN0OiBmYWxzZSB9KSk7CiAgICAgIH0gfV0pLCB0OwogICAgfSgpOwogIH0pOwogIFowID0gVDIoKHJJLCBiYykgPT4gewogICAgZnVuY3Rpb24gdjYodCwgZSkgewogICAgICB2YXIgciA9IHRoaXMsIG8gPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLCBmID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgICAgcmV0dXJuIG8gfHwgZiA/IChlID8gZSh0KSA6IHQgJiYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCB8fCAodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlLCBwcm9jZXNzLm5leHRUaWNrKGowLCB0aGlzLCB0KSkgOiBwcm9jZXNzLm5leHRUaWNrKGowLCB0aGlzLCB0KSksIHRoaXMpIDogKHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZSksIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZSksIHRoaXMuX2Rlc3Ryb3kodCB8fCBudWxsLCBmdW5jdGlvbihwKSB7CiAgICAgICAgIWUgJiYgcCA/IHIuX3dyaXRhYmxlU3RhdGUgPyByLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA/IHByb2Nlc3MubmV4dFRpY2sob28sIHIpIDogKHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZSwgcHJvY2Vzcy5uZXh0VGljayh2YywgciwgcCkpIDogcHJvY2Vzcy5uZXh0VGljayh2YywgciwgcCkgOiBlID8gKHByb2Nlc3MubmV4dFRpY2sob28sIHIpLCBlKHApKSA6IHByb2Nlc3MubmV4dFRpY2sob28sIHIpOwogICAgICB9KSwgdGhpcyk7CiAgICB9CiAgICBmdW5jdGlvbiB2Yyh0LCBlKSB7CiAgICAgIGowKHQsIGUpLCBvbyh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIG9vKHQpIHsKICAgICAgdC5fd3JpdGFibGVTdGF0ZSAmJiAhdC5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2UgfHwgdC5fcmVhZGFibGVTdGF0ZSAmJiAhdC5fcmVhZGFibGVTdGF0ZS5lbWl0Q2xvc2UgfHwgdC5lbWl0KCJjbG9zZSIpOwogICAgfQogICAgZnVuY3Rpb24gYjYoKSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2UsIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZyA9IGZhbHNlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2UsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IGZhbHNlKSwgdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiAodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlLCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IGZhbHNlLCB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkID0gZmFsc2UsIHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPSBmYWxzZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlLCB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGowKHQsIGUpIHsKICAgICAgdC5lbWl0KCJlcnJvciIsIGUpOwogICAgfQogICAgZnVuY3Rpb24gbTYodCwgZSkgewogICAgICB2YXIgeyBfcmVhZGFibGVTdGF0ZTogciwgX3dyaXRhYmxlU3RhdGU6IG8gfSA9IHQ7CiAgICAgIHIgJiYgci5hdXRvRGVzdHJveSB8fCBvICYmIG8uYXV0b0Rlc3Ryb3kgPyB0LmRlc3Ryb3koZSkgOiB0LmVtaXQoImVycm9yIiwgZSk7CiAgICB9CiAgICBiYy5leHBvcnRzID0geyBkZXN0cm95OiB2NiwgdW5kZXN0cm95OiBiNiwgZXJyb3JPckRlc3Ryb3k6IG02IH07CiAgfSk7CiAgc24gPSBUMigoaUksIHljKSA9PiB7CiAgICBmdW5jdGlvbiBnNih0LCBlKSB7CiAgICAgIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgdC5fX3Byb3RvX18gPSBlOwogICAgfQogICAgdmFyIGdjID0ge307CiAgICBmdW5jdGlvbiBkcih0LCBlLCByKSB7CiAgICAgIHIgfHwgKHIgPSBFcnJvcik7CiAgICAgIGZ1bmN0aW9uIG8ocCwgbTIsIHkyKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09ICJzdHJpbmciID8gZSA6IGUocCwgbTIsIHkyKTsKICAgICAgfQogICAgICB2YXIgZiA9IGZ1bmN0aW9uKHApIHsKICAgICAgICBnNihtMiwgcCk7CiAgICAgICAgZnVuY3Rpb24gbTIoeTIsIE0sIHgpIHsKICAgICAgICAgIHJldHVybiBwLmNhbGwodGhpcywgbyh5MiwgTSwgeCkpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtMjsKICAgICAgfShyKTsKICAgICAgZi5wcm90b3R5cGUubmFtZSA9IHIubmFtZSwgZi5wcm90b3R5cGUuY29kZSA9IHQsIGdjW3RdID0gZjsKICAgIH0KICAgIGZ1bmN0aW9uIG1jKHQsIGUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpIHsKICAgICAgICB2YXIgciA9IHQubGVuZ3RoOwogICAgICAgIHJldHVybiB0ID0gdC5tYXAoZnVuY3Rpb24obykgewogICAgICAgICAgcmV0dXJuIFN0cmluZyhvKTsKICAgICAgICB9KSwgciA+IDIgPyAib25lIG9mICIuY29uY2F0KGUsICIgIikuY29uY2F0KHQuc2xpY2UoMCwgciAtIDEpLmpvaW4oIiwgIiksICIsIG9yICIpICsgdFtyIC0gMV0gOiByID09PSAyID8gIm9uZSBvZiAiLmNvbmNhdChlLCAiICIpLmNvbmNhdCh0WzBdLCAiIG9yICIpLmNvbmNhdCh0WzFdKSA6ICJvZiAiLmNvbmNhdChlLCAiICIpLmNvbmNhdCh0WzBdKTsKICAgICAgfSBlbHNlCiAgICAgICAgcmV0dXJuICJvZiAiLmNvbmNhdChlLCAiICIpLmNvbmNhdChTdHJpbmcodCkpOwogICAgfQogICAgZnVuY3Rpb24geTYodCwgZSwgcikgewogICAgICByZXR1cm4gdC5zdWJzdHIoIXIgfHwgciA8IDAgPyAwIDogK3IsIGUubGVuZ3RoKSA9PT0gZTsKICAgIH0KICAgIGZ1bmN0aW9uIHc2KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIChyID09PSB1bmRlZmluZWQgfHwgciA+IHQubGVuZ3RoKSAmJiAociA9IHQubGVuZ3RoKSwgdC5zdWJzdHJpbmcociAtIGUubGVuZ3RoLCByKSA9PT0gZTsKICAgIH0KICAgIGZ1bmN0aW9uIE02KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHR5cGVvZiByICE9ICJudW1iZXIiICYmIChyID0gMCksIHIgKyBlLmxlbmd0aCA+IHQubGVuZ3RoID8gZmFsc2UgOiB0LmluZGV4T2YoZSwgcikgIT09IC0xOwogICAgfQogICAgZHIoIkVSUl9JTlZBTElEX09QVF9WQUxVRSIsIGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuICdUaGUgdmFsdWUgIicgKyBlICsgJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICInICsgdCArICciJzsKICAgIH0sIFR5cGVFcnJvcik7CiAgICBkcigiRVJSX0lOVkFMSURfQVJHX1RZUEUiLCBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIHZhciBvOwogICAgICB0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiB5NihlLCAibm90ICIpID8gKG8gPSAibXVzdCBub3QgYmUiLCBlID0gZS5yZXBsYWNlKC9ebm90IC8sICIiKSkgOiBvID0gIm11c3QgYmUiOwogICAgICB2YXIgZjsKICAgICAgaWYgKHc2KHQsICIgYXJndW1lbnQiKSkKICAgICAgICBmID0gIlRoZSAiLmNvbmNhdCh0LCAiICIpLmNvbmNhdChvLCAiICIpLmNvbmNhdChtYyhlLCAidHlwZSIpKTsKICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHAgPSBNNih0LCAiLiIpID8gInByb3BlcnR5IiA6ICJhcmd1bWVudCI7CiAgICAgICAgZiA9ICdUaGUgIicuY29uY2F0KHQsICciICcpLmNvbmNhdChwLCAiICIpLmNvbmNhdChvLCAiICIpLmNvbmNhdChtYyhlLCAidHlwZSIpKTsKICAgICAgfQogICAgICByZXR1cm4gZiArPSAiLiBSZWNlaXZlZCB0eXBlICIuY29uY2F0KHR5cGVvZiByKSwgZjsKICAgIH0sIFR5cGVFcnJvcik7CiAgICBkcigiRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRiIsICJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpOwogICAgZHIoIkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEIiwgZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gIlRoZSAiICsgdCArICIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCI7CiAgICB9KTsKICAgIGRyKCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIsICJQcmVtYXR1cmUgY2xvc2UiKTsKICAgIGRyKCJFUlJfU1RSRUFNX0RFU1RST1lFRCIsIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuICJDYW5ub3QgY2FsbCAiICsgdCArICIgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZCI7CiAgICB9KTsKICAgIGRyKCJFUlJfTVVMVElQTEVfQ0FMTEJBQ0siLCAiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIik7CiAgICBkcigiRVJSX1NUUkVBTV9DQU5OT1RfUElQRSIsICJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIik7CiAgICBkcigiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQiLCAid3JpdGUgYWZ0ZXIgZW5kIik7CiAgICBkcigiRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyIsICJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIsIFR5cGVFcnJvcik7CiAgICBkcigiRVJSX1VOS05PV05fRU5DT0RJTkciLCBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAiVW5rbm93biBlbmNvZGluZzogIiArIHQ7CiAgICB9LCBUeXBlRXJyb3IpOwogICAgZHIoIkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQiLCAic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQiKTsKICAgIHljLmV4cG9ydHMuY29kZXMgPSBnYzsKICB9KTsKICBWMCA9IFQyKChuSSwgd2MpID0+IHsKICAgIHZhciBfNiA9IHNuKCkuY29kZXMuRVJSX0lOVkFMSURfT1BUX1ZBTFVFOwogICAgZnVuY3Rpb24geDYodCwgZSwgcikgewogICAgICByZXR1cm4gdC5oaWdoV2F0ZXJNYXJrICE9IG51bGwgPyB0LmhpZ2hXYXRlck1hcmsgOiBlID8gdFtyXSA6IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBTNih0LCBlLCByLCBvKSB7CiAgICAgIHZhciBmID0geDYoZSwgbywgcik7CiAgICAgIGlmIChmICE9IG51bGwpIHsKICAgICAgICBpZiAoIShpc0Zpbml0ZShmKSAmJiBNYXRoLmZsb29yKGYpID09PSBmKSB8fCBmIDwgMCkgewogICAgICAgICAgdmFyIHAgPSBvID8gciA6ICJoaWdoV2F0ZXJNYXJrIjsKICAgICAgICAgIHRocm93IG5ldyBfNihwLCBmKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZik7CiAgICAgIH0KICAgICAgcmV0dXJuIHQub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0OwogICAgfQogICAgd2MuZXhwb3J0cyA9IHsgZ2V0SGlnaFdhdGVyTWFyazogUzYgfTsKICB9KTsKICBHMCA9IFQyKChmSSwgTWMpID0+IHsKICAgIE1jLmV4cG9ydHMgPSBFNjsKICAgIGZ1bmN0aW9uIEU2KHQsIGUpIHsKICAgICAgaWYgKCQwKCJub0RlcHJlY2F0aW9uIikpCiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIHZhciByID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgaWYgKCFyKSB7CiAgICAgICAgICBpZiAoJDAoInRocm93RGVwcmVjYXRpb24iKSkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUpOwogICAgICAgICAgJDAoInRyYWNlRGVwcmVjYXRpb24iKSA/IGNvbnNvbGUudHJhY2UoZSkgOiBjb25zb2xlLndhcm4oZSksIHIgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9CiAgICAgIHJldHVybiBvOwogICAgfQogICAgZnVuY3Rpb24gJDAodCkgewogICAgICB0cnkgewogICAgICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBlID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVt0XTsKICAgICAgcmV0dXJuIGUgPT0gbnVsbCA/IGZhbHNlIDogU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkgPT09ICJ0cnVlIjsKICAgIH0KICB9KTsKICBKMCA9IFQyKChhSSwgUmMpID0+IHsKICAgIFJjLmV4cG9ydHMgPSBodDsKICAgIGZ1bmN0aW9uIHhjKHQpIHsKICAgICAgdmFyIGUgPSB0aGlzOwogICAgICB0aGlzLm5leHQgPSBudWxsLCB0aGlzLmVudHJ5ID0gbnVsbCwgdGhpcy5maW5pc2ggPSBmdW5jdGlvbigpIHsKICAgICAgICBKNihlLCB0KTsKICAgICAgfTsKICAgIH0KICAgIHZhciBRbjsKICAgIGh0LldyaXRhYmxlU3RhdGUgPSBZZjsKICAgIHZhciBBNiA9IHsgZGVwcmVjYXRlOiBHMCgpIH0sIFNjID0gVzAoKSwgaG8gPSBVdCgpLkJ1ZmZlciwgUjYgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbigpIHsKICAgIH07CiAgICBmdW5jdGlvbiBCNih0KSB7CiAgICAgIHJldHVybiBoby5mcm9tKHQpOwogICAgfQogICAgZnVuY3Rpb24gcTYodCkgewogICAgICByZXR1cm4gaG8uaXNCdWZmZXIodCkgfHwgdCBpbnN0YW5jZW9mIFI2OwogICAgfQogICAgdmFyIFgwID0gWjAoKSwgSTYgPSBWMCgpLCBUNiA9IEk2LmdldEhpZ2hXYXRlck1hcmssIExpID0gc24oKS5jb2RlcywgazYgPSBMaS5FUlJfSU5WQUxJRF9BUkdfVFlQRSwgTDYgPSBMaS5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCwgTjYgPSBMaS5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssIEQ2ID0gTGkuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSwgUDYgPSBMaS5FUlJfU1RSRUFNX0RFU1RST1lFRCwgQzYgPSBMaS5FUlJfU1RSRUFNX05VTExfVkFMVUVTLCBPNiA9IExpLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELCBGNiA9IExpLkVSUl9VTktOT1dOX0VOQ09ESU5HLCBlZiA9IFgwLmVycm9yT3JEZXN0cm95OwogICAgSWUoKShodCwgU2MpOwogICAgZnVuY3Rpb24gVTYoKSB7CiAgICB9CiAgICBmdW5jdGlvbiBZZih0LCBlLCByKSB7CiAgICAgIFFuID0gUW4gfHwgaG4oKSwgdCA9IHQgfHwge30sIHR5cGVvZiByICE9ICJib29sZWFuIiAmJiAociA9IGUgaW5zdGFuY2VvZiBRbiksIHRoaXMub2JqZWN0TW9kZSA9ICEhdC5vYmplY3RNb2RlLCByICYmICh0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISF0LndyaXRhYmxlT2JqZWN0TW9kZSksIHRoaXMuaGlnaFdhdGVyTWFyayA9IFQ2KHRoaXMsIHQsICJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLCByKSwgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlLCB0aGlzLm5lZWREcmFpbiA9IGZhbHNlLCB0aGlzLmVuZGluZyA9IGZhbHNlLCB0aGlzLmVuZGVkID0gZmFsc2UsIHRoaXMuZmluaXNoZWQgPSBmYWxzZSwgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgdmFyIG8gPSB0LmRlY29kZVN0cmluZ3MgPT09IGZhbHNlOwogICAgICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbywgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSB0LmRlZmF1bHRFbmNvZGluZyB8fCAidXRmOCIsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy53cml0aW5nID0gZmFsc2UsIHRoaXMuY29ya2VkID0gMCwgdGhpcy5zeW5jID0gdHJ1ZSwgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2UsIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uKGYpIHsKICAgICAgICBWNihlLCBmKTsKICAgICAgfSwgdGhpcy53cml0ZWNiID0gbnVsbCwgdGhpcy53cml0ZWxlbiA9IDAsIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbCwgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbCwgdGhpcy5wZW5kaW5nY2IgPSAwLCB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2UsIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2UsIHRoaXMuZW1pdENsb3NlID0gdC5lbWl0Q2xvc2UgIT09IGZhbHNlLCB0aGlzLmF1dG9EZXN0cm95ID0gISF0LmF1dG9EZXN0cm95LCB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMCwgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgeGModGhpcyk7CiAgICB9CiAgICBZZi5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCwgciA9IFtdO2U7ICkKICAgICAgICByLnB1c2goZSksIGUgPSBlLm5leHQ7CiAgICAgIHJldHVybiByOwogICAgfTsKICAgIChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWWYucHJvdG90eXBlLCAiYnVmZmVyIiwgeyBnZXQ6IEE2LmRlcHJlY2F0ZShmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpOwogICAgICAgIH0sICJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsICJERVAwMDAzIikgfSk7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9KSgpOwogICAgdmFyIHNvOwogICAgdHlwZW9mIFN5bWJvbCA9PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT0gImZ1bmN0aW9uIiA/IChzbyA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaHQsIFN5bWJvbC5oYXNJbnN0YW5jZSwgeyB2YWx1ZTogZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gc28uY2FsbCh0aGlzLCBlKSA/IHRydWUgOiB0aGlzICE9PSBodCA/IGZhbHNlIDogZSAmJiBlLl93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgWWY7CiAgICB9IH0pKSA6IHNvID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gaHQodCkgewogICAgICBRbiA9IFFuIHx8IGhuKCk7CiAgICAgIHZhciBlID0gdGhpcyBpbnN0YW5jZW9mIFFuOwogICAgICBpZiAoIWUgJiYgIXNvLmNhbGwoaHQsIHRoaXMpKQogICAgICAgIHJldHVybiBuZXcgaHQodCk7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgWWYodCwgdGhpcywgZSksIHRoaXMud3JpdGFibGUgPSB0cnVlLCB0ICYmICh0eXBlb2YgdC53cml0ZSA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl93cml0ZSA9IHQud3JpdGUpLCB0eXBlb2YgdC53cml0ZXYgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fd3JpdGV2ID0gdC53cml0ZXYpLCB0eXBlb2YgdC5kZXN0cm95ID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX2Rlc3Ryb3kgPSB0LmRlc3Ryb3kpLCB0eXBlb2YgdC5maW5hbCA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9maW5hbCA9IHQuZmluYWwpKSwgU2MuY2FsbCh0aGlzKTsKICAgIH0KICAgIGh0LnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7CiAgICAgIGVmKHRoaXMsIG5ldyBENik7CiAgICB9OwogICAgZnVuY3Rpb24gejYodCwgZSkgewogICAgICB2YXIgciA9IG5ldyBPNjsKICAgICAgZWYodCwgciksIHByb2Nlc3MubmV4dFRpY2soZSwgcik7CiAgICB9CiAgICBmdW5jdGlvbiBINih0LCBlLCByLCBvKSB7CiAgICAgIHZhciBmOwogICAgICByZXR1cm4gciA9PT0gbnVsbCA/IGYgPSBuZXcgQzYgOiB0eXBlb2YgciAhPSAic3RyaW5nIiAmJiAhZS5vYmplY3RNb2RlICYmIChmID0gbmV3IGs2KCJjaHVuayIsIFsic3RyaW5nIiwgIkJ1ZmZlciJdLCByKSksIGYgPyAoZWYodCwgZiksIHByb2Nlc3MubmV4dFRpY2sobywgZiksIGZhbHNlKSA6IHRydWU7CiAgICB9CiAgICBodC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIHZhciBvID0gdGhpcy5fd3JpdGFibGVTdGF0ZSwgZiA9IGZhbHNlLCBwID0gIW8ub2JqZWN0TW9kZSAmJiBxNih0KTsKICAgICAgcmV0dXJuIHAgJiYgIWhvLmlzQnVmZmVyKHQpICYmICh0ID0gQjYodCkpLCB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iICYmIChyID0gZSwgZSA9IG51bGwpLCBwID8gZSA9ICJidWZmZXIiIDogZSB8fCAoZSA9IG8uZGVmYXVsdEVuY29kaW5nKSwgdHlwZW9mIHIgIT0gImZ1bmN0aW9uIiAmJiAociA9IFU2KSwgby5lbmRpbmcgPyB6Nih0aGlzLCByKSA6IChwIHx8IEg2KHRoaXMsIG8sIHQsIHIpKSAmJiAoby5wZW5kaW5nY2IrKywgZiA9IEs2KHRoaXMsIG8sIHAsIHQsIGUsIHIpKSwgZjsKICAgIH07CiAgICBodC5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrOwogICAgfTsKICAgIGh0LnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICB0LmNvcmtlZCAmJiAodC5jb3JrZWQtLSwgIXQud3JpdGluZyAmJiAhdC5jb3JrZWQgJiYgIXQuYnVmZmVyUHJvY2Vzc2luZyAmJiB0LmJ1ZmZlcmVkUmVxdWVzdCAmJiBFYyh0aGlzLCB0KSk7CiAgICB9OwogICAgaHQucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHR5cGVvZiBlID09ICJzdHJpbmciICYmIChlID0gZS50b0xvd2VyQ2FzZSgpKSwgIShbImhleCIsICJ1dGY4IiwgInV0Zi04IiwgImFzY2lpIiwgImJpbmFyeSIsICJiYXNlNjQiLCAidWNzMiIsICJ1Y3MtMiIsICJ1dGYxNmxlIiwgInV0Zi0xNmxlIiwgInJhdyJdLmluZGV4T2YoKGUgKyAiIikudG9Mb3dlckNhc2UoKSkgPiAtMSkpCiAgICAgICAgdGhyb3cgbmV3IEY2KGUpOwogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlLCB0aGlzOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShodC5wcm90b3R5cGUsICJ3cml0YWJsZUJ1ZmZlciIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7CiAgICB9IH0pOwogICAgZnVuY3Rpb24gVzYodCwgZSwgcikgewogICAgICByZXR1cm4gIXQub2JqZWN0TW9kZSAmJiB0LmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBlID09ICJzdHJpbmciICYmIChlID0gaG8uZnJvbShlLCByKSksIGU7CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaHQucHJvdG90eXBlLCAid3JpdGFibGVIaWdoV2F0ZXJNYXJrIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyazsKICAgIH0gfSk7CiAgICBmdW5jdGlvbiBLNih0LCBlLCByLCBvLCBmLCBwKSB7CiAgICAgIGlmICghcikgewogICAgICAgIHZhciBtMiA9IFc2KGUsIG8sIGYpOwogICAgICAgIG8gIT09IG0yICYmIChyID0gdHJ1ZSwgZiA9ICJidWZmZXIiLCBvID0gbTIpOwogICAgICB9CiAgICAgIHZhciB5MiA9IGUub2JqZWN0TW9kZSA/IDEgOiBvLmxlbmd0aDsKICAgICAgZS5sZW5ndGggKz0geTI7CiAgICAgIHZhciBNID0gZS5sZW5ndGggPCBlLmhpZ2hXYXRlck1hcms7CiAgICAgIGlmIChNIHx8IChlLm5lZWREcmFpbiA9IHRydWUpLCBlLndyaXRpbmcgfHwgZS5jb3JrZWQpIHsKICAgICAgICB2YXIgeCA9IGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDsKICAgICAgICBlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7IGNodW5rOiBvLCBlbmNvZGluZzogZiwgaXNCdWY6IHIsIGNhbGxiYWNrOiBwLCBuZXh0OiBudWxsIH0sIHggPyB4Lm5leHQgPSBlLmxhc3RCdWZmZXJlZFJlcXVlc3QgOiBlLmJ1ZmZlcmVkUmVxdWVzdCA9IGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCwgZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxOwogICAgICB9IGVsc2UKICAgICAgICBZMCh0LCBlLCBmYWxzZSwgeTIsIG8sIGYsIHApOwogICAgICByZXR1cm4gTTsKICAgIH0KICAgIGZ1bmN0aW9uIFkwKHQsIGUsIHIsIG8sIGYsIHAsIG0yKSB7CiAgICAgIGUud3JpdGVsZW4gPSBvLCBlLndyaXRlY2IgPSBtMiwgZS53cml0aW5nID0gdHJ1ZSwgZS5zeW5jID0gdHJ1ZSwgZS5kZXN0cm95ZWQgPyBlLm9ud3JpdGUobmV3IFA2KCJ3cml0ZSIpKSA6IHIgPyB0Ll93cml0ZXYoZiwgZS5vbndyaXRlKSA6IHQuX3dyaXRlKGYsIHAsIGUub253cml0ZSksIGUuc3luYyA9IGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gajYodCwgZSwgciwgbywgZikgewogICAgICAtLWUucGVuZGluZ2NiLCByID8gKHByb2Nlc3MubmV4dFRpY2soZiwgbyksIHByb2Nlc3MubmV4dFRpY2soR2YsIHQsIGUpLCB0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWUsIGVmKHQsIG8pKSA6IChmKG8pLCB0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWUsIGVmKHQsIG8pLCBHZih0LCBlKSk7CiAgICB9CiAgICBmdW5jdGlvbiBaNih0KSB7CiAgICAgIHQud3JpdGluZyA9IGZhbHNlLCB0LndyaXRlY2IgPSBudWxsLCB0Lmxlbmd0aCAtPSB0LndyaXRlbGVuLCB0LndyaXRlbGVuID0gMDsKICAgIH0KICAgIGZ1bmN0aW9uIFY2KHQsIGUpIHsKICAgICAgdmFyIHIgPSB0Ll93cml0YWJsZVN0YXRlLCBvID0gci5zeW5jLCBmID0gci53cml0ZWNiOwogICAgICBpZiAodHlwZW9mIGYgIT0gImZ1bmN0aW9uIikKICAgICAgICB0aHJvdyBuZXcgTjY7CiAgICAgIGlmIChaNihyKSwgZSkKICAgICAgICBqNih0LCByLCBvLCBlLCBmKTsKICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHAgPSBBYyhyKSB8fCB0LmRlc3Ryb3llZDsKICAgICAgICAhcCAmJiAhci5jb3JrZWQgJiYgIXIuYnVmZmVyUHJvY2Vzc2luZyAmJiByLmJ1ZmZlcmVkUmVxdWVzdCAmJiBFYyh0LCByKSwgbyA/IHByb2Nlc3MubmV4dFRpY2soX2MsIHQsIHIsIHAsIGYpIDogX2ModCwgciwgcCwgZik7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9jKHQsIGUsIHIsIG8pIHsKICAgICAgciB8fCAkNih0LCBlKSwgZS5wZW5kaW5nY2ItLSwgbygpLCBHZih0LCBlKTsKICAgIH0KICAgIGZ1bmN0aW9uICQ2KHQsIGUpIHsKICAgICAgZS5sZW5ndGggPT09IDAgJiYgZS5uZWVkRHJhaW4gJiYgKGUubmVlZERyYWluID0gZmFsc2UsIHQuZW1pdCgiZHJhaW4iKSk7CiAgICB9CiAgICBmdW5jdGlvbiBFYyh0LCBlKSB7CiAgICAgIGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7CiAgICAgIHZhciByID0gZS5idWZmZXJlZFJlcXVlc3Q7CiAgICAgIGlmICh0Ll93cml0ZXYgJiYgciAmJiByLm5leHQpIHsKICAgICAgICB2YXIgbyA9IGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsIGYgPSBuZXcgQXJyYXkobyksIHAgPSBlLmNvcmtlZFJlcXVlc3RzRnJlZTsKICAgICAgICBwLmVudHJ5ID0gcjsKICAgICAgICBmb3IgKHZhciBtMiA9IDAsIHkyID0gdHJ1ZTtyOyApCiAgICAgICAgICBmW20yXSA9IHIsIHIuaXNCdWYgfHwgKHkyID0gZmFsc2UpLCByID0gci5uZXh0LCBtMiArPSAxOwogICAgICAgIGYuYWxsQnVmZmVycyA9IHkyLCBZMCh0LCBlLCB0cnVlLCBlLmxlbmd0aCwgZiwgIiIsIHAuZmluaXNoKSwgZS5wZW5kaW5nY2IrKywgZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbCwgcC5uZXh0ID8gKGUuY29ya2VkUmVxdWVzdHNGcmVlID0gcC5uZXh0LCBwLm5leHQgPSBudWxsKSA6IGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IHhjKGUpLCBlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKDtyOyApIHsKICAgICAgICAgIHZhciB7IGNodW5rOiBNLCBlbmNvZGluZzogeCwgY2FsbGJhY2s6IFMgfSA9IHIsIEUyID0gZS5vYmplY3RNb2RlID8gMSA6IE0ubGVuZ3RoOwogICAgICAgICAgaWYgKFkwKHQsIGUsIGZhbHNlLCBFMiwgTSwgeCwgUyksIHIgPSByLm5leHQsIGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSwgZS53cml0aW5nKQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgciA9PT0gbnVsbCAmJiAoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbCk7CiAgICAgIH0KICAgICAgZS5idWZmZXJlZFJlcXVlc3QgPSByLCBlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTsKICAgIH0KICAgIGh0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIHIobmV3IEw2KCJfd3JpdGUoKSIpKTsKICAgIH07CiAgICBodC5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7CiAgICBodC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICB2YXIgbyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7CiAgICAgIHJldHVybiB0eXBlb2YgdCA9PSAiZnVuY3Rpb24iID8gKHIgPSB0LCB0ID0gbnVsbCwgZSA9IG51bGwpIDogdHlwZW9mIGUgPT0gImZ1bmN0aW9uIiAmJiAociA9IGUsIGUgPSBudWxsKSwgdCAhPSBudWxsICYmIHRoaXMud3JpdGUodCwgZSksIG8uY29ya2VkICYmIChvLmNvcmtlZCA9IDEsIHRoaXMudW5jb3JrKCkpLCBvLmVuZGluZyB8fCBYNih0aGlzLCBvLCByKSwgdGhpczsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaHQucHJvdG90eXBlLCAid3JpdGFibGVMZW5ndGgiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7CiAgICB9IH0pOwogICAgZnVuY3Rpb24gQWModCkgewogICAgICByZXR1cm4gdC5lbmRpbmcgJiYgdC5sZW5ndGggPT09IDAgJiYgdC5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXQuZmluaXNoZWQgJiYgIXQud3JpdGluZzsKICAgIH0KICAgIGZ1bmN0aW9uIEc2KHQsIGUpIHsKICAgICAgdC5fZmluYWwoZnVuY3Rpb24ocikgewogICAgICAgIGUucGVuZGluZ2NiLS0sIHIgJiYgZWYodCwgciksIGUucHJlZmluaXNoZWQgPSB0cnVlLCB0LmVtaXQoInByZWZpbmlzaCIpLCBHZih0LCBlKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBZNih0LCBlKSB7CiAgICAgICFlLnByZWZpbmlzaGVkICYmICFlLmZpbmFsQ2FsbGVkICYmICh0eXBlb2YgdC5fZmluYWwgPT0gImZ1bmN0aW9uIiAmJiAhZS5kZXN0cm95ZWQgPyAoZS5wZW5kaW5nY2IrKywgZS5maW5hbENhbGxlZCA9IHRydWUsIHByb2Nlc3MubmV4dFRpY2soRzYsIHQsIGUpKSA6IChlLnByZWZpbmlzaGVkID0gdHJ1ZSwgdC5lbWl0KCJwcmVmaW5pc2giKSkpOwogICAgfQogICAgZnVuY3Rpb24gR2YodCwgZSkgewogICAgICB2YXIgciA9IEFjKGUpOwogICAgICBpZiAociAmJiAoWTYodCwgZSksIGUucGVuZGluZ2NiID09PSAwICYmIChlLmZpbmlzaGVkID0gdHJ1ZSwgdC5lbWl0KCJmaW5pc2giKSwgZS5hdXRvRGVzdHJveSkpKSB7CiAgICAgICAgdmFyIG8gPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICAgICghbyB8fCBvLmF1dG9EZXN0cm95ICYmIG8uZW5kRW1pdHRlZCkgJiYgdC5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBmdW5jdGlvbiBYNih0LCBlLCByKSB7CiAgICAgIGUuZW5kaW5nID0gdHJ1ZSwgR2YodCwgZSksIHIgJiYgKGUuZmluaXNoZWQgPyBwcm9jZXNzLm5leHRUaWNrKHIpIDogdC5vbmNlKCJmaW5pc2giLCByKSksIGUuZW5kZWQgPSB0cnVlLCB0LndyaXRhYmxlID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBKNih0LCBlLCByKSB7CiAgICAgIHZhciBvID0gdC5lbnRyeTsKICAgICAgZm9yICh0LmVudHJ5ID0gbnVsbDtvOyApIHsKICAgICAgICB2YXIgZiA9IG8uY2FsbGJhY2s7CiAgICAgICAgZS5wZW5kaW5nY2ItLSwgZihyKSwgbyA9IG8ubmV4dDsKICAgICAgfQogICAgICBlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gdDsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShodC5wcm90b3R5cGUsICJkZXN0cm95ZWQiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgIH0sIHNldDogZnVuY3Rpb24oZSkgewogICAgICAhdGhpcy5fd3JpdGFibGVTdGF0ZSB8fCAodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBlKTsKICAgIH0gfSk7CiAgICBodC5wcm90b3R5cGUuZGVzdHJveSA9IFgwLmRlc3Ryb3k7CiAgICBodC5wcm90b3R5cGUuX3VuZGVzdHJveSA9IFgwLnVuZGVzdHJveTsKICAgIGh0LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgZSh0KTsKICAgIH07CiAgfSk7CiAgaG4gPSBUMigob0ksIHFjKSA9PiB7CiAgICB2YXIgUTYgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlID0gW107CiAgICAgIGZvciAodmFyIHIgaW4gdCkKICAgICAgICBlLnB1c2gocik7CiAgICAgIHJldHVybiBlOwogICAgfTsKICAgIHFjLmV4cG9ydHMgPSAkcjsKICAgIHZhciBCYyA9IHRoKCksIGVoID0gSjAoKTsKICAgIEllKCkoJHIsIEJjKTsKICAgIGZvciAoUTAgPSBRNihlaC5wcm90b3R5cGUpLCB1byA9IDA7dW8gPCBRMC5sZW5ndGg7IHVvKyspCiAgICAgIGxvID0gUTBbdW9dLCAkci5wcm90b3R5cGVbbG9dIHx8ICgkci5wcm90b3R5cGVbbG9dID0gZWgucHJvdG90eXBlW2xvXSk7CiAgICB2YXIgUTAsIGxvLCB1bzsKICAgIGZ1bmN0aW9uICRyKHQpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mICRyKSkKICAgICAgICByZXR1cm4gbmV3ICRyKHQpOwogICAgICBCYy5jYWxsKHRoaXMsIHQpLCBlaC5jYWxsKHRoaXMsIHQpLCB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlLCB0ICYmICh0LnJlYWRhYmxlID09PSBmYWxzZSAmJiAodGhpcy5yZWFkYWJsZSA9IGZhbHNlKSwgdC53cml0YWJsZSA9PT0gZmFsc2UgJiYgKHRoaXMud3JpdGFibGUgPSBmYWxzZSksIHQuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UgJiYgKHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlLCB0aGlzLm9uY2UoImVuZCIsIGVNKSkpOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCRyLnByb3RvdHlwZSwgIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCRyLnByb3RvdHlwZSwgIndyaXRhYmxlQnVmZmVyIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoJHIucHJvdG90eXBlLCAid3JpdGFibGVMZW5ndGgiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGg7CiAgICB9IH0pOwogICAgZnVuY3Rpb24gZU0oKSB7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgfHwgcHJvY2Vzcy5uZXh0VGljayh0TSwgdGhpcyk7CiAgICB9CiAgICBmdW5jdGlvbiB0TSh0KSB7CiAgICAgIHQuZW5kKCk7CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoJHIucHJvdG90eXBlLCAiZGVzdHJveWVkIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkOwogICAgfSwgc2V0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBlKTsKICAgIH0gfSk7CiAgfSk7CiAgY28gPSBUMigoVGMpID0+IHsKICAgIHZhciBpaCA9IFRlKCkuQnVmZmVyLCBJYyA9IGloLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24odCkgewogICAgICBzd2l0Y2ggKHQgPSAiIiArIHQsIHQgJiYgdC50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICBjYXNlICJ1dGY4IjoKICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgY2FzZSAiYXNjaWkiOgogICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgIGNhc2UgInJhdyI6CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gck0odCkgewogICAgICBpZiAoIXQpCiAgICAgICAgcmV0dXJuICJ1dGY4IjsKICAgICAgZm9yICh2YXIgZTs7ICkKICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gInV0ZjgiOwogICAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgICAgcmV0dXJuICJ1dGYxNmxlIjsKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gImxhdGluMSI7CiAgICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgICAgY2FzZSAiYXNjaWkiOgogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHQgPSAoIiIgKyB0KS50b0xvd2VyQ2FzZSgpLCBlID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBpTSh0KSB7CiAgICAgIHZhciBlID0gck0odCk7CiAgICAgIGlmICh0eXBlb2YgZSAhPSAic3RyaW5nIiAmJiAoaWguaXNFbmNvZGluZyA9PT0gSWMgfHwgIUljKHQpKSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIgKyB0KTsKICAgICAgcmV0dXJuIGUgfHwgdDsKICAgIH0KICAgIFRjLlN0cmluZ0RlY29kZXIgPSBYZjsKICAgIGZ1bmN0aW9uIFhmKHQpIHsKICAgICAgdGhpcy5lbmNvZGluZyA9IGlNKHQpOwogICAgICB2YXIgZTsKICAgICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7CiAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICB0aGlzLnRleHQgPSBoTSwgdGhpcy5lbmQgPSB1TSwgZSA9IDQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ1dGY4IjoKICAgICAgICAgIHRoaXMuZmlsbExhc3QgPSBhTSwgZSA9IDQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJiYXNlNjQiOgogICAgICAgICAgdGhpcy50ZXh0ID0gbE0sIHRoaXMuZW5kID0gZE0sIGUgPSAzOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRoaXMud3JpdGUgPSBjTSwgdGhpcy5lbmQgPSBwTTsKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmxhc3ROZWVkID0gMCwgdGhpcy5sYXN0VG90YWwgPSAwLCB0aGlzLmxhc3RDaGFyID0gaWguYWxsb2NVbnNhZmUoZSk7CiAgICB9CiAgICBYZi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIGlmICh0Lmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gIiI7CiAgICAgIHZhciBlLCByOwogICAgICBpZiAodGhpcy5sYXN0TmVlZCkgewogICAgICAgIGlmIChlID0gdGhpcy5maWxsTGFzdCh0KSwgZSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIHIgPSB0aGlzLmxhc3ROZWVkLCB0aGlzLmxhc3ROZWVkID0gMDsKICAgICAgfSBlbHNlCiAgICAgICAgciA9IDA7CiAgICAgIHJldHVybiByIDwgdC5sZW5ndGggPyBlID8gZSArIHRoaXMudGV4dCh0LCByKSA6IHRoaXMudGV4dCh0LCByKSA6IGUgfHwgIiI7CiAgICB9OwogICAgWGYucHJvdG90eXBlLmVuZCA9IHNNOwogICAgWGYucHJvdG90eXBlLnRleHQgPSBvTTsKICAgIFhmLnByb3RvdHlwZS5maWxsTGFzdCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgaWYgKHRoaXMubGFzdE5lZWQgPD0gdC5sZW5ndGgpCiAgICAgICAgcmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpLCB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTsKICAgICAgdC5jb3B5KHRoaXMubGFzdENoYXIsIHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgMCwgdC5sZW5ndGgpLCB0aGlzLmxhc3ROZWVkIC09IHQubGVuZ3RoOwogICAgfTsKICAgIGZ1bmN0aW9uIHJoKHQpIHsKICAgICAgcmV0dXJuIHQgPD0gMTI3ID8gMCA6IHQgPj4gNSA9PT0gNiA/IDIgOiB0ID4+IDQgPT09IDE0ID8gMyA6IHQgPj4gMyA9PT0gMzAgPyA0IDogdCA+PiA2ID09PSAyID8gLTEgOiAtMjsKICAgIH0KICAgIGZ1bmN0aW9uIG5NKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSBlLmxlbmd0aCAtIDE7CiAgICAgIGlmIChvIDwgcikKICAgICAgICByZXR1cm4gMDsKICAgICAgdmFyIGYgPSByaChlW29dKTsKICAgICAgcmV0dXJuIGYgPj0gMCA/IChmID4gMCAmJiAodC5sYXN0TmVlZCA9IGYgLSAxKSwgZikgOiAtLW8gPCByIHx8IGYgPT09IC0yID8gMCA6IChmID0gcmgoZVtvXSksIGYgPj0gMCA/IChmID4gMCAmJiAodC5sYXN0TmVlZCA9IGYgLSAyKSwgZikgOiAtLW8gPCByIHx8IGYgPT09IC0yID8gMCA6IChmID0gcmgoZVtvXSksIGYgPj0gMCA/IChmID4gMCAmJiAoZiA9PT0gMiA/IGYgPSAwIDogdC5sYXN0TmVlZCA9IGYgLSAzKSwgZikgOiAwKSk7CiAgICB9CiAgICBmdW5jdGlvbiBmTSh0LCBlLCByKSB7CiAgICAgIGlmICgoZVswXSAmIDE5MikgIT09IDEyOCkKICAgICAgICByZXR1cm4gdC5sYXN0TmVlZCA9IDAsICJcdUZGRkQiOwogICAgICBpZiAodC5sYXN0TmVlZCA+IDEgJiYgZS5sZW5ndGggPiAxKSB7CiAgICAgICAgaWYgKChlWzFdICYgMTkyKSAhPT0gMTI4KQogICAgICAgICAgcmV0dXJuIHQubGFzdE5lZWQgPSAxLCAiXHVGRkZEIjsKICAgICAgICBpZiAodC5sYXN0TmVlZCA+IDIgJiYgZS5sZW5ndGggPiAyICYmIChlWzJdICYgMTkyKSAhPT0gMTI4KQogICAgICAgICAgcmV0dXJuIHQubGFzdE5lZWQgPSAyLCAiXHVGRkZEIjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYU0odCkgewogICAgICB2YXIgZSA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCwgciA9IGZNKHRoaXMsIHQsIGUpOwogICAgICBpZiAociAhPT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiByOwogICAgICBpZiAodGhpcy5sYXN0TmVlZCA8PSB0Lmxlbmd0aCkKICAgICAgICByZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsIGUsIDAsIHRoaXMubGFzdE5lZWQpLCB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTsKICAgICAgdC5jb3B5KHRoaXMubGFzdENoYXIsIGUsIDAsIHQubGVuZ3RoKSwgdGhpcy5sYXN0TmVlZCAtPSB0Lmxlbmd0aDsKICAgIH0KICAgIGZ1bmN0aW9uIG9NKHQsIGUpIHsKICAgICAgdmFyIHIgPSBuTSh0aGlzLCB0LCBlKTsKICAgICAgaWYgKCF0aGlzLmxhc3ROZWVkKQogICAgICAgIHJldHVybiB0LnRvU3RyaW5nKCJ1dGY4IiwgZSk7CiAgICAgIHRoaXMubGFzdFRvdGFsID0gcjsKICAgICAgdmFyIG8gPSB0Lmxlbmd0aCAtIChyIC0gdGhpcy5sYXN0TmVlZCk7CiAgICAgIHJldHVybiB0LmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgbyksIHQudG9TdHJpbmcoInV0ZjgiLCBlLCBvKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNNKHQpIHsKICAgICAgdmFyIGUgPSB0ICYmIHQubGVuZ3RoID8gdGhpcy53cml0ZSh0KSA6ICIiOwogICAgICByZXR1cm4gdGhpcy5sYXN0TmVlZCA/IGUgKyAiXHVGRkZEIiA6IGU7CiAgICB9CiAgICBmdW5jdGlvbiBoTSh0LCBlKSB7CiAgICAgIGlmICgodC5sZW5ndGggLSBlKSAlIDIgPT09IDApIHsKICAgICAgICB2YXIgciA9IHQudG9TdHJpbmcoInV0ZjE2bGUiLCBlKTsKICAgICAgICBpZiAocikgewogICAgICAgICAgdmFyIG8gPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTsKICAgICAgICAgIGlmIChvID49IDU1Mjk2ICYmIG8gPD0gNTYzMTkpCiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3ROZWVkID0gMiwgdGhpcy5sYXN0VG90YWwgPSA0LCB0aGlzLmxhc3RDaGFyWzBdID0gdFt0Lmxlbmd0aCAtIDJdLCB0aGlzLmxhc3RDaGFyWzFdID0gdFt0Lmxlbmd0aCAtIDFdLCByLnNsaWNlKDAsIC0xKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHI7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMubGFzdE5lZWQgPSAxLCB0aGlzLmxhc3RUb3RhbCA9IDIsIHRoaXMubGFzdENoYXJbMF0gPSB0W3QubGVuZ3RoIC0gMV0sIHQudG9TdHJpbmcoInV0ZjE2bGUiLCBlLCB0Lmxlbmd0aCAtIDEpOwogICAgfQogICAgZnVuY3Rpb24gdU0odCkgewogICAgICB2YXIgZSA9IHQgJiYgdC5sZW5ndGggPyB0aGlzLndyaXRlKHQpIDogIiI7CiAgICAgIGlmICh0aGlzLmxhc3ROZWVkKSB7CiAgICAgICAgdmFyIHIgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7CiAgICAgICAgcmV0dXJuIGUgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJ1dGYxNmxlIiwgMCwgcik7CiAgICAgIH0KICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBmdW5jdGlvbiBsTSh0LCBlKSB7CiAgICAgIHZhciByID0gKHQubGVuZ3RoIC0gZSkgJSAzOwogICAgICByZXR1cm4gciA9PT0gMCA/IHQudG9TdHJpbmcoImJhc2U2NCIsIGUpIDogKHRoaXMubGFzdE5lZWQgPSAzIC0gciwgdGhpcy5sYXN0VG90YWwgPSAzLCByID09PSAxID8gdGhpcy5sYXN0Q2hhclswXSA9IHRbdC5sZW5ndGggLSAxXSA6ICh0aGlzLmxhc3RDaGFyWzBdID0gdFt0Lmxlbmd0aCAtIDJdLCB0aGlzLmxhc3RDaGFyWzFdID0gdFt0Lmxlbmd0aCAtIDFdKSwgdC50b1N0cmluZygiYmFzZTY0IiwgZSwgdC5sZW5ndGggLSByKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkTSh0KSB7CiAgICAgIHZhciBlID0gdCAmJiB0Lmxlbmd0aCA/IHRoaXMud3JpdGUodCkgOiAiIjsKICAgICAgcmV0dXJuIHRoaXMubGFzdE5lZWQgPyBlICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwgMCwgMyAtIHRoaXMubGFzdE5lZWQpIDogZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNNKHQpIHsKICAgICAgcmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7CiAgICB9CiAgICBmdW5jdGlvbiBwTSh0KSB7CiAgICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID8gdGhpcy53cml0ZSh0KSA6ICIiOwogICAgfQogIH0pOwogIEpmID0ge307CiAgSmEoSmYsIHsgU3RyaW5nRGVjb2RlcjogKCkgPT4gcG8uU3RyaW5nRGVjb2RlciwgZGVmYXVsdDogKCkgPT4gcG8uU3RyaW5nRGVjb2RlciB9KTsKICBRZiA9IFIwKCgpID0+IHsKICAgIHBvID0gcm4oY28oKSk7CiAgfSk7CiAgdm8gPSBUMigoaEksIE5jKSA9PiB7CiAgICB2YXIga2MgPSBzbigpLmNvZGVzLkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFOwogICAgZnVuY3Rpb24gdk0odCkgewogICAgICB2YXIgZSA9IGZhbHNlOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICBlID0gdHJ1ZTsKICAgICAgICAgIGZvciAodmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoLCBvID0gbmV3IEFycmF5KHIpLCBmID0gMDtmIDwgcjsgZisrKQogICAgICAgICAgICBvW2ZdID0gYXJndW1lbnRzW2ZdOwogICAgICAgICAgdC5hcHBseSh0aGlzLCBvKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBiTSgpIHsKICAgIH0KICAgIGZ1bmN0aW9uIG1NKHQpIHsKICAgICAgcmV0dXJuIHQuc2V0SGVhZGVyICYmIHR5cGVvZiB0LmFib3J0ID09ICJmdW5jdGlvbiI7CiAgICB9CiAgICBmdW5jdGlvbiBMYyh0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAiZnVuY3Rpb24iKQogICAgICAgIHJldHVybiBMYyh0LCBudWxsLCBlKTsKICAgICAgZSB8fCAoZSA9IHt9KSwgciA9IHZNKHIgfHwgYk0pOwogICAgICB2YXIgbyA9IGUucmVhZGFibGUgfHwgZS5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgdC5yZWFkYWJsZSwgZiA9IGUud3JpdGFibGUgfHwgZS53cml0YWJsZSAhPT0gZmFsc2UgJiYgdC53cml0YWJsZSwgcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHQud3JpdGFibGUgfHwgeTIoKTsKICAgICAgfSwgbTIgPSB0Ll93cml0YWJsZVN0YXRlICYmIHQuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQsIHkyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZiA9IGZhbHNlLCBtMiA9IHRydWUsIG8gfHwgci5jYWxsKHQpOwogICAgICB9LCBNID0gdC5fcmVhZGFibGVTdGF0ZSAmJiB0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsIHggPSBmdW5jdGlvbigpIHsKICAgICAgICBvID0gZmFsc2UsIE0gPSB0cnVlLCBmIHx8IHIuY2FsbCh0KTsKICAgICAgfSwgUyA9IGZ1bmN0aW9uKEwyKSB7CiAgICAgICAgci5jYWxsKHQsIEwyKTsKICAgICAgfSwgRTIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgTDI7CiAgICAgICAgaWYgKG8gJiYgIU0pCiAgICAgICAgICByZXR1cm4gKCF0Ll9yZWFkYWJsZVN0YXRlIHx8ICF0Ll9yZWFkYWJsZVN0YXRlLmVuZGVkKSAmJiAoTDIgPSBuZXcga2MpLCByLmNhbGwodCwgTDIpOwogICAgICAgIGlmIChmICYmICFtMikKICAgICAgICAgIHJldHVybiAoIXQuX3dyaXRhYmxlU3RhdGUgfHwgIXQuX3dyaXRhYmxlU3RhdGUuZW5kZWQpICYmIChMMiA9IG5ldyBrYyksIHIuY2FsbCh0LCBMMik7CiAgICAgIH0sIEIgPSBmdW5jdGlvbigpIHsKICAgICAgICB0LnJlcS5vbigiZmluaXNoIiwgeTIpOwogICAgICB9OwogICAgICByZXR1cm4gbU0odCkgPyAodC5vbigiY29tcGxldGUiLCB5MiksIHQub24oImFib3J0IiwgRTIpLCB0LnJlcSA/IEIoKSA6IHQub24oInJlcXVlc3QiLCBCKSkgOiBmICYmICF0Ll93cml0YWJsZVN0YXRlICYmICh0Lm9uKCJlbmQiLCBwKSwgdC5vbigiY2xvc2UiLCBwKSksIHQub24oImVuZCIsIHgpLCB0Lm9uKCJmaW5pc2giLCB5MiksIGUuZXJyb3IgIT09IGZhbHNlICYmIHQub24oImVycm9yIiwgUyksIHQub24oImNsb3NlIiwgRTIpLCBmdW5jdGlvbigpIHsKICAgICAgICB0LnJlbW92ZUxpc3RlbmVyKCJjb21wbGV0ZSIsIHkyKSwgdC5yZW1vdmVMaXN0ZW5lcigiYWJvcnQiLCBFMiksIHQucmVtb3ZlTGlzdGVuZXIoInJlcXVlc3QiLCBCKSwgdC5yZXEgJiYgdC5yZXEucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIHkyKSwgdC5yZW1vdmVMaXN0ZW5lcigiZW5kIiwgcCksIHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgcCksIHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIHkyKSwgdC5yZW1vdmVMaXN0ZW5lcigiZW5kIiwgeCksIHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgUyksIHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgRTIpOwogICAgICB9OwogICAgfQogICAgTmMuZXhwb3J0cyA9IExjOwogIH0pOwogIFBjID0gVDIoKHVJLCBEYykgPT4gewogICAgdmFyIGJvOwogICAgZnVuY3Rpb24gTmkodCwgZSwgcikgewogICAgICByZXR1cm4gZSBpbiB0ID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsgdmFsdWU6IHIsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSkgOiB0W2VdID0gciwgdDsKICAgIH0KICAgIHZhciBnTSA9IHZvKCksIERpID0gU3ltYm9sKCJsYXN0UmVzb2x2ZSIpLCB1biA9IFN5bWJvbCgibGFzdFJlamVjdCIpLCBlYSA9IFN5bWJvbCgiZXJyb3IiKSwgbW8gPSBTeW1ib2woImVuZGVkIiksIGxuID0gU3ltYm9sKCJsYXN0UHJvbWlzZSIpLCBuaCA9IFN5bWJvbCgiaGFuZGxlUHJvbWlzZSIpLCBkbiA9IFN5bWJvbCgic3RyZWFtIik7CiAgICBmdW5jdGlvbiBQaSh0LCBlKSB7CiAgICAgIHJldHVybiB7IHZhbHVlOiB0LCBkb25lOiBlIH07CiAgICB9CiAgICBmdW5jdGlvbiB5TSh0KSB7CiAgICAgIHZhciBlID0gdFtEaV07CiAgICAgIGlmIChlICE9PSBudWxsKSB7CiAgICAgICAgdmFyIHIgPSB0W2RuXS5yZWFkKCk7CiAgICAgICAgciAhPT0gbnVsbCAmJiAodFtsbl0gPSBudWxsLCB0W0RpXSA9IG51bGwsIHRbdW5dID0gbnVsbCwgZShQaShyLCBmYWxzZSkpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gd00odCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKHlNLCB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIE1NKHQsIGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHIsIG8pIHsKICAgICAgICB0LnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoZVttb10pIHsKICAgICAgICAgICAgcihQaSh1bmRlZmluZWQsIHRydWUpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgZVtuaF0ociwgbyk7CiAgICAgICAgfSwgbyk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgX00gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24oKSB7CiAgICB9KSwgeE0gPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoKGJvID0geyBnZXQgc3RyZWFtKCkgewogICAgICByZXR1cm4gdGhpc1tkbl07CiAgICB9LCBuZXh0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUgPSB0aGlzLCByID0gdGhpc1tlYV07CiAgICAgIGlmIChyICE9PSBudWxsKQogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyKTsKICAgICAgaWYgKHRoaXNbbW9dKQogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoUGkodW5kZWZpbmVkLCB0cnVlKSk7CiAgICAgIGlmICh0aGlzW2RuXS5kZXN0cm95ZWQpCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG0yLCB5MikgewogICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgZVtlYV0gPyB5MihlW2VhXSkgOiBtMihQaSh1bmRlZmluZWQsIHRydWUpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB2YXIgbyA9IHRoaXNbbG5dLCBmOwogICAgICBpZiAobykKICAgICAgICBmID0gbmV3IFByb21pc2UoTU0obywgdGhpcykpOwogICAgICBlbHNlIHsKICAgICAgICB2YXIgcCA9IHRoaXNbZG5dLnJlYWQoKTsKICAgICAgICBpZiAocCAhPT0gbnVsbCkKICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoUGkocCwgZmFsc2UpKTsKICAgICAgICBmID0gbmV3IFByb21pc2UodGhpc1tuaF0pOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzW2xuXSA9IGYsIGY7CiAgICB9IH0sIE5pKGJvLCBTeW1ib2wuYXN5bmNJdGVyYXRvciwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSksIE5pKGJvLCAicmV0dXJuIiwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpczsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsIG8pIHsKICAgICAgICBlW2RuXS5kZXN0cm95KG51bGwsIGZ1bmN0aW9uKGYpIHsKICAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgIG8oZik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHIoUGkodW5kZWZpbmVkLCB0cnVlKSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSksIGJvKSwgX00pLCBTTSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIsIG8gPSBPYmplY3QuY3JlYXRlKHhNLCAociA9IHt9LCBOaShyLCBkbiwgeyB2YWx1ZTogZSwgd3JpdGFibGU6IHRydWUgfSksIE5pKHIsIERpLCB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9KSwgTmkociwgdW4sIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlIH0pLCBOaShyLCBlYSwgeyB2YWx1ZTogbnVsbCwgd3JpdGFibGU6IHRydWUgfSksIE5pKHIsIG1vLCB7IHZhbHVlOiBlLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsIHdyaXRhYmxlOiB0cnVlIH0pLCBOaShyLCBuaCwgeyB2YWx1ZTogZnVuY3Rpb24ocCwgbTIpIHsKICAgICAgICB2YXIgeTIgPSBvW2RuXS5yZWFkKCk7CiAgICAgICAgeTIgPyAob1tsbl0gPSBudWxsLCBvW0RpXSA9IG51bGwsIG9bdW5dID0gbnVsbCwgcChQaSh5MiwgZmFsc2UpKSkgOiAob1tEaV0gPSBwLCBvW3VuXSA9IG0yKTsKICAgICAgfSwgd3JpdGFibGU6IHRydWUgfSksIHIpKTsKICAgICAgcmV0dXJuIG9bbG5dID0gbnVsbCwgZ00oZSwgZnVuY3Rpb24oZikgewogICAgICAgIGlmIChmICYmIGYuY29kZSAhPT0gIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFIikgewogICAgICAgICAgdmFyIHAgPSBvW3VuXTsKICAgICAgICAgIHAgIT09IG51bGwgJiYgKG9bbG5dID0gbnVsbCwgb1tEaV0gPSBudWxsLCBvW3VuXSA9IG51bGwsIHAoZikpLCBvW2VhXSA9IGY7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBtMiA9IG9bRGldOwogICAgICAgIG0yICE9PSBudWxsICYmIChvW2xuXSA9IG51bGwsIG9bRGldID0gbnVsbCwgb1t1bl0gPSBudWxsLCBtMihQaSh1bmRlZmluZWQsIHRydWUpKSksIG9bbW9dID0gdHJ1ZTsKICAgICAgfSksIGUub24oInJlYWRhYmxlIiwgd00uYmluZChudWxsLCBvKSksIG87CiAgICB9OwogICAgRGMuZXhwb3J0cyA9IFNNOwogIH0pOwogIE9jID0gVDIoKGxJLCBDYykgPT4gewogICAgQ2MuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlciIpOwogICAgfTsKICB9KTsKICB0aCA9IFQyKChjSSwgJGMpID0+IHsKICAgICRjLmV4cG9ydHMgPSBDZTsKICAgIHZhciB0ZjsKICAgIENlLlJlYWRhYmxlU3RhdGUgPSBIYzsKICAgIHZhciBkSSA9IGtpKCkuRXZlbnRFbWl0dGVyLCB6YyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUubGlzdGVuZXJzKHIpLmxlbmd0aDsKICAgIH0sIHJhID0gVzAoKSwgZ28gPSBVdCgpLkJ1ZmZlciwgRU0gPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbigpIHsKICAgIH07CiAgICBmdW5jdGlvbiBBTSh0KSB7CiAgICAgIHJldHVybiBnby5mcm9tKHQpOwogICAgfQogICAgZnVuY3Rpb24gUk0odCkgewogICAgICByZXR1cm4gZ28uaXNCdWZmZXIodCkgfHwgdCBpbnN0YW5jZW9mIEVNOwogICAgfQogICAgdmFyIGZoID0gJGYoKSwgTmU7CiAgICBmaCAmJiBmaC5kZWJ1Z2xvZyA/IE5lID0gZmguZGVidWdsb2coInN0cmVhbSIpIDogTmUgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICB2YXIgQk0gPSBwYygpLCBkaCA9IFowKCksIHFNID0gVjAoKSwgSU0gPSBxTS5nZXRIaWdoV2F0ZXJNYXJrLCB5byA9IHNuKCkuY29kZXMsIFRNID0geW8uRVJSX0lOVkFMSURfQVJHX1RZUEUsIGtNID0geW8uRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRiwgTE0gPSB5by5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCwgTk0gPSB5by5FUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5ULCByZiwgYWgsIG9oOwogICAgSWUoKShDZSwgcmEpOwogICAgdmFyIHRhID0gZGguZXJyb3JPckRlc3Ryb3ksIHNoID0gWyJlcnJvciIsICJjbG9zZSIsICJkZXN0cm95IiwgInBhdXNlIiwgInJlc3VtZSJdOwogICAgZnVuY3Rpb24gRE0odCwgZSwgcikgewogICAgICBpZiAodHlwZW9mIHQucHJlcGVuZExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUsIHIpOwogICAgICAhdC5fZXZlbnRzIHx8ICF0Ll9ldmVudHNbZV0gPyB0Lm9uKGUsIHIpIDogQXJyYXkuaXNBcnJheSh0Ll9ldmVudHNbZV0pID8gdC5fZXZlbnRzW2VdLnVuc2hpZnQocikgOiB0Ll9ldmVudHNbZV0gPSBbciwgdC5fZXZlbnRzW2VdXTsKICAgIH0KICAgIGZ1bmN0aW9uIEhjKHQsIGUsIHIpIHsKICAgICAgdGYgPSB0ZiB8fCBobigpLCB0ID0gdCB8fCB7fSwgdHlwZW9mIHIgIT0gImJvb2xlYW4iICYmIChyID0gZSBpbnN0YW5jZW9mIHRmKSwgdGhpcy5vYmplY3RNb2RlID0gISF0Lm9iamVjdE1vZGUsIHIgJiYgKHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIXQucmVhZGFibGVPYmplY3RNb2RlKSwgdGhpcy5oaWdoV2F0ZXJNYXJrID0gSU0odGhpcywgdCwgInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsIHIpLCB0aGlzLmJ1ZmZlciA9IG5ldyBCTSwgdGhpcy5sZW5ndGggPSAwLCB0aGlzLnBpcGVzID0gbnVsbCwgdGhpcy5waXBlc0NvdW50ID0gMCwgdGhpcy5mbG93aW5nID0gbnVsbCwgdGhpcy5lbmRlZCA9IGZhbHNlLCB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZSwgdGhpcy5yZWFkaW5nID0gZmFsc2UsIHRoaXMuc3luYyA9IHRydWUsIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2UsIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2UsIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZSwgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZSwgdGhpcy5wYXVzZWQgPSB0cnVlLCB0aGlzLmVtaXRDbG9zZSA9IHQuZW1pdENsb3NlICE9PSBmYWxzZSwgdGhpcy5hdXRvRGVzdHJveSA9ICEhdC5hdXRvRGVzdHJveSwgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZSwgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSB0LmRlZmF1bHRFbmNvZGluZyB8fCAidXRmOCIsIHRoaXMuYXdhaXREcmFpbiA9IDAsIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZSwgdGhpcy5kZWNvZGVyID0gbnVsbCwgdGhpcy5lbmNvZGluZyA9IG51bGwsIHQuZW5jb2RpbmcgJiYgKHJmIHx8IChyZiA9IChRZigpLCB1cihKZikpLlN0cmluZ0RlY29kZXIpLCB0aGlzLmRlY29kZXIgPSBuZXcgcmYodC5lbmNvZGluZyksIHRoaXMuZW5jb2RpbmcgPSB0LmVuY29kaW5nKTsKICAgIH0KICAgIGZ1bmN0aW9uIENlKHQpIHsKICAgICAgaWYgKHRmID0gdGYgfHwgaG4oKSwgISh0aGlzIGluc3RhbmNlb2YgQ2UpKQogICAgICAgIHJldHVybiBuZXcgQ2UodCk7CiAgICAgIHZhciBlID0gdGhpcyBpbnN0YW5jZW9mIHRmOwogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IEhjKHQsIHRoaXMsIGUpLCB0aGlzLnJlYWRhYmxlID0gdHJ1ZSwgdCAmJiAodHlwZW9mIHQucmVhZCA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9yZWFkID0gdC5yZWFkKSwgdHlwZW9mIHQuZGVzdHJveSA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9kZXN0cm95ID0gdC5kZXN0cm95KSksIHJhLmNhbGwodGhpcyk7CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2UucHJvdG90eXBlLCAiZGVzdHJveWVkIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7CiAgICB9LCBzZXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUgfHwgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gZSk7CiAgICB9IH0pOwogICAgQ2UucHJvdG90eXBlLmRlc3Ryb3kgPSBkaC5kZXN0cm95OwogICAgQ2UucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkaC51bmRlc3Ryb3k7CiAgICBDZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGUodCk7CiAgICB9OwogICAgQ2UucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHZhciByID0gdGhpcy5fcmVhZGFibGVTdGF0ZSwgbzsKICAgICAgcmV0dXJuIHIub2JqZWN0TW9kZSA/IG8gPSB0cnVlIDogdHlwZW9mIHQgPT0gInN0cmluZyIgJiYgKGUgPSBlIHx8IHIuZGVmYXVsdEVuY29kaW5nLCBlICE9PSByLmVuY29kaW5nICYmICh0ID0gZ28uZnJvbSh0LCBlKSwgZSA9ICIiKSwgbyA9IHRydWUpLCBXYyh0aGlzLCB0LCBlLCBmYWxzZSwgbyk7CiAgICB9OwogICAgQ2UucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBXYyh0aGlzLCB0LCBudWxsLCB0cnVlLCBmYWxzZSk7CiAgICB9OwogICAgZnVuY3Rpb24gV2ModCwgZSwgciwgbywgZikgewogICAgICBOZSgicmVhZGFibGVBZGRDaHVuayIsIGUpOwogICAgICB2YXIgcCA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIGlmIChlID09PSBudWxsKQogICAgICAgIHAucmVhZGluZyA9IGZhbHNlLCBPTSh0LCBwKTsKICAgICAgZWxzZSB7CiAgICAgICAgdmFyIG0yOwogICAgICAgIGlmIChmIHx8IChtMiA9IFBNKHAsIGUpKSwgbTIpCiAgICAgICAgICB0YSh0LCBtMik7CiAgICAgICAgZWxzZSBpZiAocC5vYmplY3RNb2RlIHx8IGUgJiYgZS5sZW5ndGggPiAwKQogICAgICAgICAgaWYgKHR5cGVvZiBlICE9ICJzdHJpbmciICYmICFwLm9iamVjdE1vZGUgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpICE9PSBnby5wcm90b3R5cGUgJiYgKGUgPSBBTShlKSksIG8pCiAgICAgICAgICAgIHAuZW5kRW1pdHRlZCA/IHRhKHQsIG5ldyBOTSkgOiBoaCh0LCBwLCBlLCB0cnVlKTsKICAgICAgICAgIGVsc2UgaWYgKHAuZW5kZWQpCiAgICAgICAgICAgIHRhKHQsIG5ldyBrTSk7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHAuZGVzdHJveWVkKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgcC5yZWFkaW5nID0gZmFsc2UsIHAuZGVjb2RlciAmJiAhciA/IChlID0gcC5kZWNvZGVyLndyaXRlKGUpLCBwLm9iamVjdE1vZGUgfHwgZS5sZW5ndGggIT09IDAgPyBoaCh0LCBwLCBlLCBmYWxzZSkgOiBsaCh0LCBwKSkgOiBoaCh0LCBwLCBlLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgbyB8fCAocC5yZWFkaW5nID0gZmFsc2UsIGxoKHQsIHApKTsKICAgICAgfQogICAgICByZXR1cm4gIXAuZW5kZWQgJiYgKHAubGVuZ3RoIDwgcC5oaWdoV2F0ZXJNYXJrIHx8IHAubGVuZ3RoID09PSAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhoKHQsIGUsIHIsIG8pIHsKICAgICAgZS5mbG93aW5nICYmIGUubGVuZ3RoID09PSAwICYmICFlLnN5bmMgPyAoZS5hd2FpdERyYWluID0gMCwgdC5lbWl0KCJkYXRhIiwgcikpIDogKGUubGVuZ3RoICs9IGUub2JqZWN0TW9kZSA/IDEgOiByLmxlbmd0aCwgbyA/IGUuYnVmZmVyLnVuc2hpZnQocikgOiBlLmJ1ZmZlci5wdXNoKHIpLCBlLm5lZWRSZWFkYWJsZSAmJiB3byh0KSksIGxoKHQsIGUpOwogICAgfQogICAgZnVuY3Rpb24gUE0odCwgZSkgewogICAgICB2YXIgcjsKICAgICAgcmV0dXJuICFSTShlKSAmJiB0eXBlb2YgZSAhPSAic3RyaW5nIiAmJiBlICE9PSB1bmRlZmluZWQgJiYgIXQub2JqZWN0TW9kZSAmJiAociA9IG5ldyBUTSgiY2h1bmsiLCBbInN0cmluZyIsICJCdWZmZXIiLCAiVWludDhBcnJheSJdLCBlKSksIHI7CiAgICB9CiAgICBDZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7CiAgICB9OwogICAgQ2UucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24odCkgewogICAgICByZiB8fCAocmYgPSAoUWYoKSwgdXIoSmYpKS5TdHJpbmdEZWNvZGVyKTsKICAgICAgdmFyIGUgPSBuZXcgcmYodCk7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IGUsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIuZW5jb2Rpbmc7CiAgICAgIGZvciAodmFyIHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5oZWFkLCBvID0gIiI7ciAhPT0gbnVsbDsgKQogICAgICAgIG8gKz0gZS53cml0ZShyLmRhdGEpLCByID0gci5uZXh0OwogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuY2xlYXIoKSwgbyAhPT0gIiIgJiYgdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChvKSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBvLmxlbmd0aCwgdGhpczsKICAgIH07CiAgICB2YXIgRmMgPSAxMDczNzQxODI0OwogICAgZnVuY3Rpb24gQ00odCkgewogICAgICByZXR1cm4gdCA+PSBGYyA/IHQgPSBGYyA6ICh0LS0sIHQgfD0gdCA+Pj4gMSwgdCB8PSB0ID4+PiAyLCB0IHw9IHQgPj4+IDQsIHQgfD0gdCA+Pj4gOCwgdCB8PSB0ID4+PiAxNiwgdCsrKSwgdDsKICAgIH0KICAgIGZ1bmN0aW9uIFVjKHQsIGUpIHsKICAgICAgcmV0dXJuIHQgPD0gMCB8fCBlLmxlbmd0aCA9PT0gMCAmJiBlLmVuZGVkID8gMCA6IGUub2JqZWN0TW9kZSA/IDEgOiB0ICE9PSB0ID8gZS5mbG93aW5nICYmIGUubGVuZ3RoID8gZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aCA6IGUubGVuZ3RoIDogKHQgPiBlLmhpZ2hXYXRlck1hcmsgJiYgKGUuaGlnaFdhdGVyTWFyayA9IENNKHQpKSwgdCA8PSBlLmxlbmd0aCA/IHQgOiBlLmVuZGVkID8gZS5sZW5ndGggOiAoZS5uZWVkUmVhZGFibGUgPSB0cnVlLCAwKSk7CiAgICB9CiAgICBDZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgTmUoInJlYWQiLCB0KSwgdCA9IHBhcnNlSW50KHQsIDEwKTsKICAgICAgdmFyIGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLCByID0gdDsKICAgICAgaWYgKHQgIT09IDAgJiYgKGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2UpLCB0ID09PSAwICYmIGUubmVlZFJlYWRhYmxlICYmICgoZS5oaWdoV2F0ZXJNYXJrICE9PSAwID8gZS5sZW5ndGggPj0gZS5oaWdoV2F0ZXJNYXJrIDogZS5sZW5ndGggPiAwKSB8fCBlLmVuZGVkKSkKICAgICAgICByZXR1cm4gTmUoInJlYWQ6IGVtaXRSZWFkYWJsZSIsIGUubGVuZ3RoLCBlLmVuZGVkKSwgZS5sZW5ndGggPT09IDAgJiYgZS5lbmRlZCA/IHVoKHRoaXMpIDogd28odGhpcyksIG51bGw7CiAgICAgIGlmICh0ID0gVWModCwgZSksIHQgPT09IDAgJiYgZS5lbmRlZCkKICAgICAgICByZXR1cm4gZS5sZW5ndGggPT09IDAgJiYgdWgodGhpcyksIG51bGw7CiAgICAgIHZhciBvID0gZS5uZWVkUmVhZGFibGU7CiAgICAgIE5lKCJuZWVkIHJlYWRhYmxlIiwgbyksIChlLmxlbmd0aCA9PT0gMCB8fCBlLmxlbmd0aCAtIHQgPCBlLmhpZ2hXYXRlck1hcmspICYmIChvID0gdHJ1ZSwgTmUoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIiwgbykpLCBlLmVuZGVkIHx8IGUucmVhZGluZyA/IChvID0gZmFsc2UsIE5lKCJyZWFkaW5nIG9yIGVuZGVkIiwgbykpIDogbyAmJiAoTmUoImRvIHJlYWQiKSwgZS5yZWFkaW5nID0gdHJ1ZSwgZS5zeW5jID0gdHJ1ZSwgZS5sZW5ndGggPT09IDAgJiYgKGUubmVlZFJlYWRhYmxlID0gdHJ1ZSksIHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSwgZS5zeW5jID0gZmFsc2UsIGUucmVhZGluZyB8fCAodCA9IFVjKHIsIGUpKSk7CiAgICAgIHZhciBmOwogICAgICByZXR1cm4gdCA+IDAgPyBmID0gWmModCwgZSkgOiBmID0gbnVsbCwgZiA9PT0gbnVsbCA/IChlLm5lZWRSZWFkYWJsZSA9IGUubGVuZ3RoIDw9IGUuaGlnaFdhdGVyTWFyaywgdCA9IDApIDogKGUubGVuZ3RoIC09IHQsIGUuYXdhaXREcmFpbiA9IDApLCBlLmxlbmd0aCA9PT0gMCAmJiAoZS5lbmRlZCB8fCAoZS5uZWVkUmVhZGFibGUgPSB0cnVlKSwgciAhPT0gdCAmJiBlLmVuZGVkICYmIHVoKHRoaXMpKSwgZiAhPT0gbnVsbCAmJiB0aGlzLmVtaXQoImRhdGEiLCBmKSwgZjsKICAgIH07CiAgICBmdW5jdGlvbiBPTSh0LCBlKSB7CiAgICAgIGlmIChOZSgib25Fb2ZDaHVuayIpLCAhZS5lbmRlZCkgewogICAgICAgIGlmIChlLmRlY29kZXIpIHsKICAgICAgICAgIHZhciByID0gZS5kZWNvZGVyLmVuZCgpOwogICAgICAgICAgciAmJiByLmxlbmd0aCAmJiAoZS5idWZmZXIucHVzaChyKSwgZS5sZW5ndGggKz0gZS5vYmplY3RNb2RlID8gMSA6IHIubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZS5lbmRlZCA9IHRydWUsIGUuc3luYyA/IHdvKHQpIDogKGUubmVlZFJlYWRhYmxlID0gZmFsc2UsIGUuZW1pdHRlZFJlYWRhYmxlIHx8IChlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWUsIEtjKHQpKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHdvKHQpIHsKICAgICAgdmFyIGUgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBOZSgiZW1pdFJlYWRhYmxlIiwgZS5uZWVkUmVhZGFibGUsIGUuZW1pdHRlZFJlYWRhYmxlKSwgZS5uZWVkUmVhZGFibGUgPSBmYWxzZSwgZS5lbWl0dGVkUmVhZGFibGUgfHwgKE5lKCJlbWl0UmVhZGFibGUiLCBlLmZsb3dpbmcpLCBlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWUsIHByb2Nlc3MubmV4dFRpY2soS2MsIHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIEtjKHQpIHsKICAgICAgdmFyIGUgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBOZSgiZW1pdFJlYWRhYmxlXyIsIGUuZGVzdHJveWVkLCBlLmxlbmd0aCwgZS5lbmRlZCksICFlLmRlc3Ryb3llZCAmJiAoZS5sZW5ndGggfHwgZS5lbmRlZCkgJiYgKHQuZW1pdCgicmVhZGFibGUiKSwgZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZSksIGUubmVlZFJlYWRhYmxlID0gIWUuZmxvd2luZyAmJiAhZS5lbmRlZCAmJiBlLmxlbmd0aCA8PSBlLmhpZ2hXYXRlck1hcmssIGNoKHQpOwogICAgfQogICAgZnVuY3Rpb24gbGgodCwgZSkgewogICAgICBlLnJlYWRpbmdNb3JlIHx8IChlLnJlYWRpbmdNb3JlID0gdHJ1ZSwgcHJvY2Vzcy5uZXh0VGljayhGTSwgdCwgZSkpOwogICAgfQogICAgZnVuY3Rpb24gRk0odCwgZSkgewogICAgICBmb3IgKDshZS5yZWFkaW5nICYmICFlLmVuZGVkICYmIChlLmxlbmd0aCA8IGUuaGlnaFdhdGVyTWFyayB8fCBlLmZsb3dpbmcgJiYgZS5sZW5ndGggPT09IDApOyApIHsKICAgICAgICB2YXIgciA9IGUubGVuZ3RoOwogICAgICAgIGlmIChOZSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSwgdC5yZWFkKDApLCByID09PSBlLmxlbmd0aCkKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGUucmVhZGluZ01vcmUgPSBmYWxzZTsKICAgIH0KICAgIENlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGEodGhpcywgbmV3IExNKCJfcmVhZCgpIikpOwogICAgfTsKICAgIENlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IHRoaXMsIG8gPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICBzd2l0Y2ggKG8ucGlwZXNDb3VudCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIG8ucGlwZXMgPSB0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgby5waXBlcyA9IFtvLnBpcGVzLCB0XTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBvLnBpcGVzLnB1c2godCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBvLnBpcGVzQ291bnQgKz0gMSwgTmUoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsIG8ucGlwZXNDb3VudCwgZSk7CiAgICAgIHZhciBmID0gKCFlIHx8IGUuZW5kICE9PSBmYWxzZSkgJiYgdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgdCAhPT0gcHJvY2Vzcy5zdGRlcnIsIHAgPSBmID8geTIgOiBnZTsKICAgICAgby5lbmRFbWl0dGVkID8gcHJvY2Vzcy5uZXh0VGljayhwKSA6IHIub25jZSgiZW5kIiwgcCksIHQub24oInVucGlwZSIsIG0yKTsKICAgICAgZnVuY3Rpb24gbTIoX2UsIE4pIHsKICAgICAgICBOZSgib251bnBpcGUiKSwgX2UgPT09IHIgJiYgTiAmJiBOLmhhc1VucGlwZWQgPT09IGZhbHNlICYmIChOLmhhc1VucGlwZWQgPSB0cnVlLCBTKCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHkyKCkgewogICAgICAgIE5lKCJvbmVuZCIpLCB0LmVuZCgpOwogICAgICB9CiAgICAgIHZhciBNID0gVU0ocik7CiAgICAgIHQub24oImRyYWluIiwgTSk7CiAgICAgIHZhciB4ID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIFMoKSB7CiAgICAgICAgTmUoImNsZWFudXAiKSwgdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCBxMiksIHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIEwyKSwgdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLCBNKSwgdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBCKSwgdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIiwgbTIpLCByLnJlbW92ZUxpc3RlbmVyKCJlbmQiLCB5MiksIHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsIGdlKSwgci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsIEUyKSwgeCA9IHRydWUsIG8uYXdhaXREcmFpbiAmJiAoIXQuX3dyaXRhYmxlU3RhdGUgfHwgdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pICYmIE0oKTsKICAgICAgfQogICAgICByLm9uKCJkYXRhIiwgRTIpOwogICAgICBmdW5jdGlvbiBFMihfZSkgewogICAgICAgIE5lKCJvbmRhdGEiKTsKICAgICAgICB2YXIgTiA9IHQud3JpdGUoX2UpOwogICAgICAgIE5lKCJkZXN0LndyaXRlIiwgTiksIE4gPT09IGZhbHNlICYmICgoby5waXBlc0NvdW50ID09PSAxICYmIG8ucGlwZXMgPT09IHQgfHwgby5waXBlc0NvdW50ID4gMSAmJiBWYyhvLnBpcGVzLCB0KSAhPT0gLTEpICYmICF4ICYmIChOZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIiwgby5hd2FpdERyYWluKSwgby5hd2FpdERyYWluKyspLCByLnBhdXNlKCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEIoX2UpIHsKICAgICAgICBOZSgib25lcnJvciIsIF9lKSwgZ2UoKSwgdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBCKSwgemModCwgImVycm9yIikgPT09IDAgJiYgdGEodCwgX2UpOwogICAgICB9CiAgICAgIERNKHQsICJlcnJvciIsIEIpOwogICAgICBmdW5jdGlvbiBxMigpIHsKICAgICAgICB0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCBMMiksIGdlKCk7CiAgICAgIH0KICAgICAgdC5vbmNlKCJjbG9zZSIsIHEyKTsKICAgICAgZnVuY3Rpb24gTDIoKSB7CiAgICAgICAgTmUoIm9uZmluaXNoIiksIHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgcTIpLCBnZSgpOwogICAgICB9CiAgICAgIHQub25jZSgiZmluaXNoIiwgTDIpOwogICAgICBmdW5jdGlvbiBnZSgpIHsKICAgICAgICBOZSgidW5waXBlIiksIHIudW5waXBlKHQpOwogICAgICB9CiAgICAgIHJldHVybiB0LmVtaXQoInBpcGUiLCByKSwgby5mbG93aW5nIHx8IChOZSgicGlwZSByZXN1bWUiKSwgci5yZXN1bWUoKSksIHQ7CiAgICB9OwogICAgZnVuY3Rpb24gVU0odCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHIgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICAgIE5lKCJwaXBlT25EcmFpbiIsIHIuYXdhaXREcmFpbiksIHIuYXdhaXREcmFpbiAmJiByLmF3YWl0RHJhaW4tLSwgci5hd2FpdERyYWluID09PSAwICYmIHpjKHQsICJkYXRhIikgJiYgKHIuZmxvd2luZyA9IHRydWUsIGNoKHQpKTsKICAgICAgfTsKICAgIH0KICAgIENlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlID0gdGhpcy5fcmVhZGFibGVTdGF0ZSwgciA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTsKICAgICAgaWYgKGUucGlwZXNDb3VudCA9PT0gMCkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgaWYgKGUucGlwZXNDb3VudCA9PT0gMSkKICAgICAgICByZXR1cm4gdCAmJiB0ICE9PSBlLnBpcGVzID8gdGhpcyA6ICh0IHx8ICh0ID0gZS5waXBlcyksIGUucGlwZXMgPSBudWxsLCBlLnBpcGVzQ291bnQgPSAwLCBlLmZsb3dpbmcgPSBmYWxzZSwgdCAmJiB0LmVtaXQoInVucGlwZSIsIHRoaXMsIHIpLCB0aGlzKTsKICAgICAgaWYgKCF0KSB7CiAgICAgICAgdmFyIHsgcGlwZXM6IG8sIHBpcGVzQ291bnQ6IGYgfSA9IGU7CiAgICAgICAgZS5waXBlcyA9IG51bGwsIGUucGlwZXNDb3VudCA9IDAsIGUuZmxvd2luZyA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIHAgPSAwO3AgPCBmOyBwKyspCiAgICAgICAgICBvW3BdLmVtaXQoInVucGlwZSIsIHRoaXMsIHsgaGFzVW5waXBlZDogZmFsc2UgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgdmFyIG0yID0gVmMoZS5waXBlcywgdCk7CiAgICAgIHJldHVybiBtMiA9PT0gLTEgPyB0aGlzIDogKGUucGlwZXMuc3BsaWNlKG0yLCAxKSwgZS5waXBlc0NvdW50IC09IDEsIGUucGlwZXNDb3VudCA9PT0gMSAmJiAoZS5waXBlcyA9IGUucGlwZXNbMF0pLCB0LmVtaXQoInVucGlwZSIsIHRoaXMsIHIpLCB0aGlzKTsKICAgIH07CiAgICBDZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHZhciByID0gcmEucHJvdG90eXBlLm9uLmNhbGwodGhpcywgdCwgZSksIG8gPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICByZXR1cm4gdCA9PT0gImRhdGEiID8gKG8ucmVhZGFibGVMaXN0ZW5pbmcgPSB0aGlzLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIikgPiAwLCBvLmZsb3dpbmcgIT09IGZhbHNlICYmIHRoaXMucmVzdW1lKCkpIDogdCA9PT0gInJlYWRhYmxlIiAmJiAhby5lbmRFbWl0dGVkICYmICFvLnJlYWRhYmxlTGlzdGVuaW5nICYmIChvLnJlYWRhYmxlTGlzdGVuaW5nID0gby5uZWVkUmVhZGFibGUgPSB0cnVlLCBvLmZsb3dpbmcgPSBmYWxzZSwgby5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZSwgTmUoIm9uIHJlYWRhYmxlIiwgby5sZW5ndGgsIG8ucmVhZGluZyksIG8ubGVuZ3RoID8gd28odGhpcykgOiBvLnJlYWRpbmcgfHwgcHJvY2Vzcy5uZXh0VGljayh6TSwgdGhpcykpLCByOwogICAgfTsKICAgIENlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IENlLnByb3RvdHlwZS5vbjsKICAgIENlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgdmFyIHIgPSByYS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLCB0LCBlKTsKICAgICAgcmV0dXJuIHQgPT09ICJyZWFkYWJsZSIgJiYgcHJvY2Vzcy5uZXh0VGljayhqYywgdGhpcyksIHI7CiAgICB9OwogICAgQ2UucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIGUgPSByYS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiAodCA9PT0gInJlYWRhYmxlIiB8fCB0ID09PSB1bmRlZmluZWQpICYmIHByb2Nlc3MubmV4dFRpY2soamMsIHRoaXMpLCBlOwogICAgfTsKICAgIGZ1bmN0aW9uIGpjKHQpIHsKICAgICAgdmFyIGUgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBlLnJlYWRhYmxlTGlzdGVuaW5nID0gdC5saXN0ZW5lckNvdW50KCJyZWFkYWJsZSIpID4gMCwgZS5yZXN1bWVTY2hlZHVsZWQgJiYgIWUucGF1c2VkID8gZS5mbG93aW5nID0gdHJ1ZSA6IHQubGlzdGVuZXJDb3VudCgiZGF0YSIpID4gMCAmJiB0LnJlc3VtZSgpOwogICAgfQogICAgZnVuY3Rpb24gek0odCkgewogICAgICBOZSgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksIHQucmVhZCgwKTsKICAgIH0KICAgIENlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICByZXR1cm4gdC5mbG93aW5nIHx8IChOZSgicmVzdW1lIiksIHQuZmxvd2luZyA9ICF0LnJlYWRhYmxlTGlzdGVuaW5nLCBITSh0aGlzLCB0KSksIHQucGF1c2VkID0gZmFsc2UsIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gSE0odCwgZSkgewogICAgICBlLnJlc3VtZVNjaGVkdWxlZCB8fCAoZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlLCBwcm9jZXNzLm5leHRUaWNrKFdNLCB0LCBlKSk7CiAgICB9CiAgICBmdW5jdGlvbiBXTSh0LCBlKSB7CiAgICAgIE5lKCJyZXN1bWUiLCBlLnJlYWRpbmcpLCBlLnJlYWRpbmcgfHwgdC5yZWFkKDApLCBlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlLCB0LmVtaXQoInJlc3VtZSIpLCBjaCh0KSwgZS5mbG93aW5nICYmICFlLnJlYWRpbmcgJiYgdC5yZWFkKDApOwogICAgfQogICAgQ2UucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBOZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIiwgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSAmJiAoTmUoInBhdXNlIiksIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlLCB0aGlzLmVtaXQoInBhdXNlIikpLCB0aGlzLl9yZWFkYWJsZVN0YXRlLnBhdXNlZCA9IHRydWUsIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gY2godCkgewogICAgICB2YXIgZSA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIGZvciAoTmUoImZsb3ciLCBlLmZsb3dpbmcpO2UuZmxvd2luZyAmJiB0LnJlYWQoKSAhPT0gbnVsbDsgKQogICAgICAgIDsKICAgIH0KICAgIENlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IHRoaXMsIHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLCBvID0gZmFsc2U7CiAgICAgIHQub24oImVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChOZSgid3JhcHBlZCBlbmQiKSwgci5kZWNvZGVyICYmICFyLmVuZGVkKSB7CiAgICAgICAgICB2YXIgbTIgPSByLmRlY29kZXIuZW5kKCk7CiAgICAgICAgICBtMiAmJiBtMi5sZW5ndGggJiYgZS5wdXNoKG0yKTsKICAgICAgICB9CiAgICAgICAgZS5wdXNoKG51bGwpOwogICAgICB9KSwgdC5vbigiZGF0YSIsIGZ1bmN0aW9uKG0yKSB7CiAgICAgICAgaWYgKE5lKCJ3cmFwcGVkIGRhdGEiKSwgci5kZWNvZGVyICYmIChtMiA9IHIuZGVjb2Rlci53cml0ZShtMikpLCAhKHIub2JqZWN0TW9kZSAmJiBtMiA9PSBudWxsKSAmJiAhKCFyLm9iamVjdE1vZGUgJiYgKCFtMiB8fCAhbTIubGVuZ3RoKSkpIHsKICAgICAgICAgIHZhciB5MiA9IGUucHVzaChtMik7CiAgICAgICAgICB5MiB8fCAobyA9IHRydWUsIHQucGF1c2UoKSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgZm9yICh2YXIgZiBpbiB0KQogICAgICAgIHRoaXNbZl0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdFtmXSA9PSAiZnVuY3Rpb24iICYmICh0aGlzW2ZdID0gZnVuY3Rpb24oeTIpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRbeTJdLmFwcGx5KHQsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0oZikpOwogICAgICBmb3IgKHZhciBwID0gMDtwIDwgc2gubGVuZ3RoOyBwKyspCiAgICAgICAgdC5vbihzaFtwXSwgdGhpcy5lbWl0LmJpbmQodGhpcywgc2hbcF0pKTsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWQgPSBmdW5jdGlvbihtMikgewogICAgICAgIE5lKCJ3cmFwcGVkIF9yZWFkIiwgbTIpLCBvICYmIChvID0gZmFsc2UsIHQucmVzdW1lKCkpOwogICAgICB9LCB0aGlzOwogICAgfTsKICAgIHR5cGVvZiBTeW1ib2wgPT0gImZ1bmN0aW9uIiAmJiAoQ2UucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gYWggPT09IHVuZGVmaW5lZCAmJiAoYWggPSBQYygpKSwgYWgodGhpcyk7CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDZS5wcm90b3R5cGUsICJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDZS5wcm90b3R5cGUsICJyZWFkYWJsZUJ1ZmZlciIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDZS5wcm90b3R5cGUsICJyZWFkYWJsZUZsb3dpbmciLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nOwogICAgfSwgc2V0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGUpOwogICAgfSB9KTsKICAgIENlLl9mcm9tTGlzdCA9IFpjOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENlLnByb3RvdHlwZSwgInJlYWRhYmxlTGVuZ3RoIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoOwogICAgfSB9KTsKICAgIGZ1bmN0aW9uIFpjKHQsIGUpIHsKICAgICAgaWYgKGUubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiBudWxsOwogICAgICB2YXIgcjsKICAgICAgcmV0dXJuIGUub2JqZWN0TW9kZSA/IHIgPSBlLmJ1ZmZlci5zaGlmdCgpIDogIXQgfHwgdCA+PSBlLmxlbmd0aCA/IChlLmRlY29kZXIgPyByID0gZS5idWZmZXIuam9pbigiIikgOiBlLmJ1ZmZlci5sZW5ndGggPT09IDEgPyByID0gZS5idWZmZXIuZmlyc3QoKSA6IHIgPSBlLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLCBlLmJ1ZmZlci5jbGVhcigpKSA6IHIgPSBlLmJ1ZmZlci5jb25zdW1lKHQsIGUuZGVjb2RlciksIHI7CiAgICB9CiAgICBmdW5jdGlvbiB1aCh0KSB7CiAgICAgIHZhciBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgTmUoImVuZFJlYWRhYmxlIiwgZS5lbmRFbWl0dGVkKSwgZS5lbmRFbWl0dGVkIHx8IChlLmVuZGVkID0gdHJ1ZSwgcHJvY2Vzcy5uZXh0VGljayhLTSwgZSwgdCkpOwogICAgfQogICAgZnVuY3Rpb24gS00odCwgZSkgewogICAgICBpZiAoTmUoImVuZFJlYWRhYmxlTlQiLCB0LmVuZEVtaXR0ZWQsIHQubGVuZ3RoKSwgIXQuZW5kRW1pdHRlZCAmJiB0Lmxlbmd0aCA9PT0gMCAmJiAodC5lbmRFbWl0dGVkID0gdHJ1ZSwgZS5yZWFkYWJsZSA9IGZhbHNlLCBlLmVtaXQoImVuZCIpLCB0LmF1dG9EZXN0cm95KSkgewogICAgICAgIHZhciByID0gZS5fd3JpdGFibGVTdGF0ZTsKICAgICAgICAoIXIgfHwgci5hdXRvRGVzdHJveSAmJiByLmZpbmlzaGVkKSAmJiBlLmRlc3Ryb3koKTsKICAgICAgfQogICAgfQogICAgdHlwZW9mIFN5bWJvbCA9PSAiZnVuY3Rpb24iICYmIChDZS5mcm9tID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gb2ggPT09IHVuZGVmaW5lZCAmJiAob2ggPSBPYygpKSwgb2goQ2UsIHQsIGUpOwogICAgfSk7CiAgICBmdW5jdGlvbiBWYyh0LCBlKSB7CiAgICAgIGZvciAodmFyIHIgPSAwLCBvID0gdC5sZW5ndGg7ciA8IG87IHIrKykKICAgICAgICBpZiAodFtyXSA9PT0gZSkKICAgICAgICAgIHJldHVybiByOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgfSk7CiAgcGggPSBUMigocEksIFljKSA9PiB7CiAgICBZYy5leHBvcnRzID0gZGk7CiAgICB2YXIgTW8gPSBzbigpLmNvZGVzLCBqTSA9IE1vLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELCBaTSA9IE1vLkVSUl9NVUxUSVBMRV9DQUxMQkFDSywgVk0gPSBNby5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLCAkTSA9IE1vLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCwgX28gPSBobigpOwogICAgSWUoKShkaSwgX28pOwogICAgZnVuY3Rpb24gR00odCwgZSkgewogICAgICB2YXIgciA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlOwogICAgICByLnRyYW5zZm9ybWluZyA9IGZhbHNlOwogICAgICB2YXIgbyA9IHIud3JpdGVjYjsKICAgICAgaWYgKG8gPT09IG51bGwpCiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgWk0pOwogICAgICByLndyaXRlY2h1bmsgPSBudWxsLCByLndyaXRlY2IgPSBudWxsLCBlICE9IG51bGwgJiYgdGhpcy5wdXNoKGUpLCBvKHQpOwogICAgICB2YXIgZiA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7CiAgICAgIGYucmVhZGluZyA9IGZhbHNlLCAoZi5uZWVkUmVhZGFibGUgfHwgZi5sZW5ndGggPCBmLmhpZ2hXYXRlck1hcmspICYmIHRoaXMuX3JlYWQoZi5oaWdoV2F0ZXJNYXJrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRpKHQpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGRpKSkKICAgICAgICByZXR1cm4gbmV3IGRpKHQpOwogICAgICBfby5jYWxsKHRoaXMsIHQpLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IHsgYWZ0ZXJUcmFuc2Zvcm06IEdNLmJpbmQodGhpcyksIG5lZWRUcmFuc2Zvcm06IGZhbHNlLCB0cmFuc2Zvcm1pbmc6IGZhbHNlLCB3cml0ZWNiOiBudWxsLCB3cml0ZWNodW5rOiBudWxsLCB3cml0ZWVuY29kaW5nOiBudWxsIH0sIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2UsIHQgJiYgKHR5cGVvZiB0LnRyYW5zZm9ybSA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl90cmFuc2Zvcm0gPSB0LnRyYW5zZm9ybSksIHR5cGVvZiB0LmZsdXNoID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX2ZsdXNoID0gdC5mbHVzaCkpLCB0aGlzLm9uKCJwcmVmaW5pc2giLCBZTSk7CiAgICB9CiAgICBmdW5jdGlvbiBZTSgpIHsKICAgICAgdmFyIHQgPSB0aGlzOwogICAgICB0eXBlb2YgdGhpcy5fZmx1c2ggPT0gImZ1bmN0aW9uIiAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPyB0aGlzLl9mbHVzaChmdW5jdGlvbihlLCByKSB7CiAgICAgICAgR2ModCwgZSwgcik7CiAgICAgIH0pIDogR2ModGhpcywgbnVsbCwgbnVsbCk7CiAgICB9CiAgICBkaS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZSwgX28ucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCB0LCBlKTsKICAgIH07CiAgICBkaS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgcihuZXcgak0oIl90cmFuc2Zvcm0oKSIpKTsKICAgIH07CiAgICBkaS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICB2YXIgbyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlOwogICAgICBpZiAoby53cml0ZWNiID0gciwgby53cml0ZWNodW5rID0gdCwgby53cml0ZWVuY29kaW5nID0gZSwgIW8udHJhbnNmb3JtaW5nKSB7CiAgICAgICAgdmFyIGYgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICAgIChvLm5lZWRUcmFuc2Zvcm0gfHwgZi5uZWVkUmVhZGFibGUgfHwgZi5sZW5ndGggPCBmLmhpZ2hXYXRlck1hcmspICYmIHRoaXMuX3JlYWQoZi5oaWdoV2F0ZXJNYXJrKTsKICAgICAgfQogICAgfTsKICAgIGRpLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIGUgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTsKICAgICAgZS53cml0ZWNodW5rICE9PSBudWxsICYmICFlLnRyYW5zZm9ybWluZyA/IChlLnRyYW5zZm9ybWluZyA9IHRydWUsIHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssIGUud3JpdGVlbmNvZGluZywgZS5hZnRlclRyYW5zZm9ybSkpIDogZS5uZWVkVHJhbnNmb3JtID0gdHJ1ZTsKICAgIH07CiAgICBkaS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIF9vLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIHQsIGZ1bmN0aW9uKHIpIHsKICAgICAgICBlKHIpOwogICAgICB9KTsKICAgIH07CiAgICBmdW5jdGlvbiBHYyh0LCBlLCByKSB7CiAgICAgIGlmIChlKQogICAgICAgIHJldHVybiB0LmVtaXQoImVycm9yIiwgZSk7CiAgICAgIGlmIChyICE9IG51bGwgJiYgdC5wdXNoKHIpLCB0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgJE07CiAgICAgIGlmICh0Ll90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpCiAgICAgICAgdGhyb3cgbmV3IFZNOwogICAgICByZXR1cm4gdC5wdXNoKG51bGwpOwogICAgfQogIH0pOwogIFFjID0gVDIoKHZJLCBKYykgPT4gewogICAgSmMuZXhwb3J0cyA9IGlhOwogICAgdmFyIFhjID0gcGgoKTsKICAgIEllKCkoaWEsIFhjKTsKICAgIGZ1bmN0aW9uIGlhKHQpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGlhKSkKICAgICAgICByZXR1cm4gbmV3IGlhKHQpOwogICAgICBYYy5jYWxsKHRoaXMsIHQpOwogICAgfQogICAgaWEucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIHIobnVsbCwgdCk7CiAgICB9OwogIH0pOwogIG5wID0gVDIoKGJJLCBpcCkgPT4gewogICAgdmFyIHZoOwogICAgZnVuY3Rpb24gWE0odCkgewogICAgICB2YXIgZSA9IGZhbHNlOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgZSB8fCAoZSA9IHRydWUsIHQuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTsKICAgICAgfTsKICAgIH0KICAgIHZhciBycCA9IHNuKCkuY29kZXMsIEpNID0gcnAuRVJSX01JU1NJTkdfQVJHUywgUU0gPSBycC5FUlJfU1RSRUFNX0RFU1RST1lFRDsKICAgIGZ1bmN0aW9uIGVwKHQpIHsKICAgICAgaWYgKHQpCiAgICAgICAgdGhyb3cgdDsKICAgIH0KICAgIGZ1bmN0aW9uIGU0KHQpIHsKICAgICAgcmV0dXJuIHQuc2V0SGVhZGVyICYmIHR5cGVvZiB0LmFib3J0ID09ICJmdW5jdGlvbiI7CiAgICB9CiAgICBmdW5jdGlvbiB0NCh0LCBlLCByLCBvKSB7CiAgICAgIG8gPSBYTShvKTsKICAgICAgdmFyIGYgPSBmYWxzZTsKICAgICAgdC5vbigiY2xvc2UiLCBmdW5jdGlvbigpIHsKICAgICAgICBmID0gdHJ1ZTsKICAgICAgfSksIHZoID09PSB1bmRlZmluZWQgJiYgKHZoID0gdm8oKSksIHZoKHQsIHsgcmVhZGFibGU6IGUsIHdyaXRhYmxlOiByIH0sIGZ1bmN0aW9uKG0yKSB7CiAgICAgICAgaWYgKG0yKQogICAgICAgICAgcmV0dXJuIG8obTIpOwogICAgICAgIGYgPSB0cnVlLCBvKCk7CiAgICAgIH0pOwogICAgICB2YXIgcCA9IGZhbHNlOwogICAgICByZXR1cm4gZnVuY3Rpb24obTIpIHsKICAgICAgICBpZiAoIWYgJiYgIXApIHsKICAgICAgICAgIGlmIChwID0gdHJ1ZSwgZTQodCkpCiAgICAgICAgICAgIHJldHVybiB0LmFib3J0KCk7CiAgICAgICAgICBpZiAodHlwZW9mIHQuZGVzdHJveSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICByZXR1cm4gdC5kZXN0cm95KCk7CiAgICAgICAgICBvKG0yIHx8IG5ldyBRTSgicGlwZSIpKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB0cCh0KSB7CiAgICAgIHQoKTsKICAgIH0KICAgIGZ1bmN0aW9uIHI0KHQsIGUpIHsKICAgICAgcmV0dXJuIHQucGlwZShlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGk0KHQpIHsKICAgICAgcmV0dXJuICF0Lmxlbmd0aCB8fCB0eXBlb2YgdFt0Lmxlbmd0aCAtIDFdICE9ICJmdW5jdGlvbiIgPyBlcCA6IHQucG9wKCk7CiAgICB9CiAgICBmdW5jdGlvbiBuNCgpIHsKICAgICAgZm9yICh2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGgsIGUgPSBuZXcgQXJyYXkodCksIHIgPSAwO3IgPCB0OyByKyspCiAgICAgICAgZVtyXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgdmFyIG8gPSBpNChlKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZVswXSkgJiYgKGUgPSBlWzBdKSwgZS5sZW5ndGggPCAyKQogICAgICAgIHRocm93IG5ldyBKTSgic3RyZWFtcyIpOwogICAgICB2YXIgZiwgcCA9IGUubWFwKGZ1bmN0aW9uKG0yLCB5MikgewogICAgICAgIHZhciBNID0geTIgPCBlLmxlbmd0aCAtIDEsIHggPSB5MiA+IDA7CiAgICAgICAgcmV0dXJuIHQ0KG0yLCBNLCB4LCBmdW5jdGlvbihTKSB7CiAgICAgICAgICBmIHx8IChmID0gUyksIFMgJiYgcC5mb3JFYWNoKHRwKSwgIU0gJiYgKHAuZm9yRWFjaCh0cCksIG8oZikpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuIGUucmVkdWNlKHI0KTsKICAgIH0KICAgIGlwLmV4cG9ydHMgPSBuNDsKICB9KTsKICBhcCA9IFQyKChjciwgZnApID0+IHsKICAgIGNyID0gZnAuZXhwb3J0cyA9IHRoKCk7CiAgICBjci5TdHJlYW0gPSBjcjsKICAgIGNyLlJlYWRhYmxlID0gY3I7CiAgICBjci5Xcml0YWJsZSA9IEowKCk7CiAgICBjci5EdXBsZXggPSBobigpOwogICAgY3IuVHJhbnNmb3JtID0gcGgoKTsKICAgIGNyLlBhc3NUaHJvdWdoID0gUWMoKTsKICAgIGNyLmZpbmlzaGVkID0gdm8oKTsKICAgIGNyLnBpcGVsaW5lID0gbnAoKTsKICB9KTsKICBiaCA9IFQyKChtSSwgc3ApID0+IHsKICAgIHZhciB4byA9IFRlKCkuQnVmZmVyLCBvcCA9IGFwKCkuVHJhbnNmb3JtLCBmNCA9IEllKCk7CiAgICBmdW5jdGlvbiBhNCh0LCBlKSB7CiAgICAgIGlmICgheG8uaXNCdWZmZXIodCkgJiYgdHlwZW9mIHQgIT0gInN0cmluZyIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlICsgIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgYnVmZmVyIik7CiAgICB9CiAgICBmdW5jdGlvbiBDaSh0KSB7CiAgICAgIG9wLmNhbGwodGhpcyksIHRoaXMuX2Jsb2NrID0geG8uYWxsb2NVbnNhZmUodCksIHRoaXMuX2Jsb2NrU2l6ZSA9IHQsIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gMCwgdGhpcy5fbGVuZ3RoID0gWzAsIDAsIDAsIDBdLCB0aGlzLl9maW5hbGl6ZWQgPSBmYWxzZTsKICAgIH0KICAgIGY0KENpLCBvcCk7CiAgICBDaS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSBudWxsOwogICAgICB0cnkgewogICAgICAgIHRoaXMudXBkYXRlKHQsIGUpOwogICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgbyA9IGY7CiAgICAgIH0KICAgICAgcihvKTsKICAgIH07CiAgICBDaS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5wdXNoKHRoaXMuZGlnZXN0KCkpOwogICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgZSA9IHI7CiAgICAgIH0KICAgICAgdChlKTsKICAgIH07CiAgICBDaS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24odCwgZSkgewogICAgICBpZiAoYTQodCwgIkRhdGEiKSwgdGhpcy5fZmluYWxpemVkKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiRGlnZXN0IGFscmVhZHkgY2FsbGVkIik7CiAgICAgIHhvLmlzQnVmZmVyKHQpIHx8ICh0ID0geG8uZnJvbSh0LCBlKSk7CiAgICAgIGZvciAodmFyIHIgPSB0aGlzLl9ibG9jaywgbyA9IDA7dGhpcy5fYmxvY2tPZmZzZXQgKyB0Lmxlbmd0aCAtIG8gPj0gdGhpcy5fYmxvY2tTaXplOyApIHsKICAgICAgICBmb3IgKHZhciBmID0gdGhpcy5fYmxvY2tPZmZzZXQ7ZiA8IHRoaXMuX2Jsb2NrU2l6ZTsgKQogICAgICAgICAgcltmKytdID0gdFtvKytdOwogICAgICAgIHRoaXMuX3VwZGF0ZSgpLCB0aGlzLl9ibG9ja09mZnNldCA9IDA7CiAgICAgIH0KICAgICAgZm9yICg7byA8IHQubGVuZ3RoOyApCiAgICAgICAgclt0aGlzLl9ibG9ja09mZnNldCsrXSA9IHRbbysrXTsKICAgICAgZm9yICh2YXIgcCA9IDAsIG0yID0gdC5sZW5ndGggKiA4O20yID4gMDsgKytwKQogICAgICAgIHRoaXMuX2xlbmd0aFtwXSArPSBtMiwgbTIgPSB0aGlzLl9sZW5ndGhbcF0gLyA0Mjk0OTY3Mjk2IHwgMCwgbTIgPiAwICYmICh0aGlzLl9sZW5ndGhbcF0gLT0gNDI5NDk2NzI5NiAqIG0yKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgQ2kucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgfTsKICAgIENpLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbih0KSB7CiAgICAgIGlmICh0aGlzLl9maW5hbGl6ZWQpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJEaWdlc3QgYWxyZWFkeSBjYWxsZWQiKTsKICAgICAgdGhpcy5fZmluYWxpemVkID0gdHJ1ZTsKICAgICAgdmFyIGUgPSB0aGlzLl9kaWdlc3QoKTsKICAgICAgdCAhPT0gdW5kZWZpbmVkICYmIChlID0gZS50b1N0cmluZyh0KSksIHRoaXMuX2Jsb2NrLmZpbGwoMCksIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gMDsKICAgICAgZm9yICh2YXIgciA9IDA7ciA8IDQ7ICsrcikKICAgICAgICB0aGlzLl9sZW5ndGhbcl0gPSAwOwogICAgICByZXR1cm4gZTsKICAgIH07CiAgICBDaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIl9kaWdlc3QgaXMgbm90IGltcGxlbWVudGVkIik7CiAgICB9OwogICAgc3AuZXhwb3J0cyA9IENpOwogIH0pOwogIEFvID0gVDIoKGdJLCB1cCkgPT4gewogICAgdmFyIG80ID0gSWUoKSwgaHAgPSBiaCgpLCBzNCA9IFRlKCkuQnVmZmVyLCBoNCA9IG5ldyBBcnJheSgxNik7CiAgICBmdW5jdGlvbiBTbygpIHsKICAgICAgaHAuY2FsbCh0aGlzLCA2NCksIHRoaXMuX2EgPSAxNzMyNTg0MTkzLCB0aGlzLl9iID0gNDAyMzIzMzQxNywgdGhpcy5fYyA9IDI1NjIzODMxMDIsIHRoaXMuX2QgPSAyNzE3MzM4Nzg7CiAgICB9CiAgICBvNChTbywgaHApOwogICAgU28ucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgdCA9IGg0LCBlID0gMDtlIDwgMTY7ICsrZSkKICAgICAgICB0W2VdID0gdGhpcy5fYmxvY2sucmVhZEludDMyTEUoZSAqIDQpOwogICAgICB2YXIgciA9IHRoaXMuX2EsIG8gPSB0aGlzLl9iLCBmID0gdGhpcy5fYywgcCA9IHRoaXMuX2Q7CiAgICAgIHIgPSBqdChyLCBvLCBmLCBwLCB0WzBdLCAzNjE0MDkwMzYwLCA3KSwgcCA9IGp0KHAsIHIsIG8sIGYsIHRbMV0sIDM5MDU0MDI3MTAsIDEyKSwgZiA9IGp0KGYsIHAsIHIsIG8sIHRbMl0sIDYwNjEwNTgxOSwgMTcpLCBvID0ganQobywgZiwgcCwgciwgdFszXSwgMzI1MDQ0MTk2NiwgMjIpLCByID0ganQociwgbywgZiwgcCwgdFs0XSwgNDExODU0ODM5OSwgNyksIHAgPSBqdChwLCByLCBvLCBmLCB0WzVdLCAxMjAwMDgwNDI2LCAxMiksIGYgPSBqdChmLCBwLCByLCBvLCB0WzZdLCAyODIxNzM1OTU1LCAxNyksIG8gPSBqdChvLCBmLCBwLCByLCB0WzddLCA0MjQ5MjYxMzEzLCAyMiksIHIgPSBqdChyLCBvLCBmLCBwLCB0WzhdLCAxNzcwMDM1NDE2LCA3KSwgcCA9IGp0KHAsIHIsIG8sIGYsIHRbOV0sIDIzMzY1NTI4NzksIDEyKSwgZiA9IGp0KGYsIHAsIHIsIG8sIHRbMTBdLCA0Mjk0OTI1MjMzLCAxNyksIG8gPSBqdChvLCBmLCBwLCByLCB0WzExXSwgMjMwNDU2MzEzNCwgMjIpLCByID0ganQociwgbywgZiwgcCwgdFsxMl0sIDE4MDQ2MDM2ODIsIDcpLCBwID0ganQocCwgciwgbywgZiwgdFsxM10sIDQyNTQ2MjYxOTUsIDEyKSwgZiA9IGp0KGYsIHAsIHIsIG8sIHRbMTRdLCAyNzkyOTY1MDA2LCAxNyksIG8gPSBqdChvLCBmLCBwLCByLCB0WzE1XSwgMTIzNjUzNTMyOSwgMjIpLCByID0gWnQociwgbywgZiwgcCwgdFsxXSwgNDEyOTE3MDc4NiwgNSksIHAgPSBadChwLCByLCBvLCBmLCB0WzZdLCAzMjI1NDY1NjY0LCA5KSwgZiA9IFp0KGYsIHAsIHIsIG8sIHRbMTFdLCA2NDM3MTc3MTMsIDE0KSwgbyA9IFp0KG8sIGYsIHAsIHIsIHRbMF0sIDM5MjEwNjk5OTQsIDIwKSwgciA9IFp0KHIsIG8sIGYsIHAsIHRbNV0sIDM1OTM0MDg2MDUsIDUpLCBwID0gWnQocCwgciwgbywgZiwgdFsxMF0sIDM4MDE2MDgzLCA5KSwgZiA9IFp0KGYsIHAsIHIsIG8sIHRbMTVdLCAzNjM0NDg4OTYxLCAxNCksIG8gPSBadChvLCBmLCBwLCByLCB0WzRdLCAzODg5NDI5NDQ4LCAyMCksIHIgPSBadChyLCBvLCBmLCBwLCB0WzldLCA1Njg0NDY0MzgsIDUpLCBwID0gWnQocCwgciwgbywgZiwgdFsxNF0sIDMyNzUxNjM2MDYsIDkpLCBmID0gWnQoZiwgcCwgciwgbywgdFszXSwgNDEwNzYwMzMzNSwgMTQpLCBvID0gWnQobywgZiwgcCwgciwgdFs4XSwgMTE2MzUzMTUwMSwgMjApLCByID0gWnQociwgbywgZiwgcCwgdFsxM10sIDI4NTAyODU4MjksIDUpLCBwID0gWnQocCwgciwgbywgZiwgdFsyXSwgNDI0MzU2MzUxMiwgOSksIGYgPSBadChmLCBwLCByLCBvLCB0WzddLCAxNzM1MzI4NDczLCAxNCksIG8gPSBadChvLCBmLCBwLCByLCB0WzEyXSwgMjM2ODM1OTU2MiwgMjApLCByID0gVnQociwgbywgZiwgcCwgdFs1XSwgNDI5NDU4ODczOCwgNCksIHAgPSBWdChwLCByLCBvLCBmLCB0WzhdLCAyMjcyMzkyODMzLCAxMSksIGYgPSBWdChmLCBwLCByLCBvLCB0WzExXSwgMTgzOTAzMDU2MiwgMTYpLCBvID0gVnQobywgZiwgcCwgciwgdFsxNF0sIDQyNTk2NTc3NDAsIDIzKSwgciA9IFZ0KHIsIG8sIGYsIHAsIHRbMV0sIDI3NjM5NzUyMzYsIDQpLCBwID0gVnQocCwgciwgbywgZiwgdFs0XSwgMTI3Mjg5MzM1MywgMTEpLCBmID0gVnQoZiwgcCwgciwgbywgdFs3XSwgNDEzOTQ2OTY2NCwgMTYpLCBvID0gVnQobywgZiwgcCwgciwgdFsxMF0sIDMyMDAyMzY2NTYsIDIzKSwgciA9IFZ0KHIsIG8sIGYsIHAsIHRbMTNdLCA2ODEyNzkxNzQsIDQpLCBwID0gVnQocCwgciwgbywgZiwgdFswXSwgMzkzNjQzMDA3NCwgMTEpLCBmID0gVnQoZiwgcCwgciwgbywgdFszXSwgMzU3MjQ0NTMxNywgMTYpLCBvID0gVnQobywgZiwgcCwgciwgdFs2XSwgNzYwMjkxODksIDIzKSwgciA9IFZ0KHIsIG8sIGYsIHAsIHRbOV0sIDM2NTQ2MDI4MDksIDQpLCBwID0gVnQocCwgciwgbywgZiwgdFsxMl0sIDM4NzMxNTE0NjEsIDExKSwgZiA9IFZ0KGYsIHAsIHIsIG8sIHRbMTVdLCA1MzA3NDI1MjAsIDE2KSwgbyA9IFZ0KG8sIGYsIHAsIHIsIHRbMl0sIDMyOTk2Mjg2NDUsIDIzKSwgciA9ICR0KHIsIG8sIGYsIHAsIHRbMF0sIDQwOTYzMzY0NTIsIDYpLCBwID0gJHQocCwgciwgbywgZiwgdFs3XSwgMTEyNjg5MTQxNSwgMTApLCBmID0gJHQoZiwgcCwgciwgbywgdFsxNF0sIDI4Nzg2MTIzOTEsIDE1KSwgbyA9ICR0KG8sIGYsIHAsIHIsIHRbNV0sIDQyMzc1MzMyNDEsIDIxKSwgciA9ICR0KHIsIG8sIGYsIHAsIHRbMTJdLCAxNzAwNDg1NTcxLCA2KSwgcCA9ICR0KHAsIHIsIG8sIGYsIHRbM10sIDIzOTk5ODA2OTAsIDEwKSwgZiA9ICR0KGYsIHAsIHIsIG8sIHRbMTBdLCA0MjkzOTE1NzczLCAxNSksIG8gPSAkdChvLCBmLCBwLCByLCB0WzFdLCAyMjQwMDQ0NDk3LCAyMSksIHIgPSAkdChyLCBvLCBmLCBwLCB0WzhdLCAxODczMzEzMzU5LCA2KSwgcCA9ICR0KHAsIHIsIG8sIGYsIHRbMTVdLCA0MjY0MzU1NTUyLCAxMCksIGYgPSAkdChmLCBwLCByLCBvLCB0WzZdLCAyNzM0NzY4OTE2LCAxNSksIG8gPSAkdChvLCBmLCBwLCByLCB0WzEzXSwgMTMwOTE1MTY0OSwgMjEpLCByID0gJHQociwgbywgZiwgcCwgdFs0XSwgNDE0OTQ0NDIyNiwgNiksIHAgPSAkdChwLCByLCBvLCBmLCB0WzExXSwgMzE3NDc1NjkxNywgMTApLCBmID0gJHQoZiwgcCwgciwgbywgdFsyXSwgNzE4Nzg3MjU5LCAxNSksIG8gPSAkdChvLCBmLCBwLCByLCB0WzldLCAzOTUxNDgxNzQ1LCAyMSksIHRoaXMuX2EgPSB0aGlzLl9hICsgciB8IDAsIHRoaXMuX2IgPSB0aGlzLl9iICsgbyB8IDAsIHRoaXMuX2MgPSB0aGlzLl9jICsgZiB8IDAsIHRoaXMuX2QgPSB0aGlzLl9kICsgcCB8IDA7CiAgICB9OwogICAgU28ucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5fYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK10gPSAxMjgsIHRoaXMuX2Jsb2NrT2Zmc2V0ID4gNTYgJiYgKHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDY0KSwgdGhpcy5fdXBkYXRlKCksIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gMCksIHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDU2KSwgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMF0sIDU2KSwgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMV0sIDYwKSwgdGhpcy5fdXBkYXRlKCk7CiAgICAgIHZhciB0ID0gczQuYWxsb2NVbnNhZmUoMTYpOwogICAgICByZXR1cm4gdC53cml0ZUludDMyTEUodGhpcy5fYSwgMCksIHQud3JpdGVJbnQzMkxFKHRoaXMuX2IsIDQpLCB0LndyaXRlSW50MzJMRSh0aGlzLl9jLCA4KSwgdC53cml0ZUludDMyTEUodGhpcy5fZCwgMTIpLCB0OwogICAgfTsKICAgIGZ1bmN0aW9uIEVvKHQsIGUpIHsKICAgICAgcmV0dXJuIHQgPDwgZSB8IHQgPj4+IDMyIC0gZTsKICAgIH0KICAgIGZ1bmN0aW9uIGp0KHQsIGUsIHIsIG8sIGYsIHAsIG0yKSB7CiAgICAgIHJldHVybiBFbyh0ICsgKGUgJiByIHwgfmUgJiBvKSArIGYgKyBwIHwgMCwgbTIpICsgZSB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiBadCh0LCBlLCByLCBvLCBmLCBwLCBtMikgewogICAgICByZXR1cm4gRW8odCArIChlICYgbyB8IHIgJiB+bykgKyBmICsgcCB8IDAsIG0yKSArIGUgfCAwOwogICAgfQogICAgZnVuY3Rpb24gVnQodCwgZSwgciwgbywgZiwgcCwgbTIpIHsKICAgICAgcmV0dXJuIEVvKHQgKyAoZSBeIHIgXiBvKSArIGYgKyBwIHwgMCwgbTIpICsgZSB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiAkdCh0LCBlLCByLCBvLCBmLCBwLCBtMikgewogICAgICByZXR1cm4gRW8odCArIChyIF4gKGUgfCB+bykpICsgZiArIHAgfCAwLCBtMikgKyBlIHwgMDsKICAgIH0KICAgIHVwLmV4cG9ydHMgPSBTbzsKICB9KTsKICBCbyA9IFQyKCh5SSwgbXApID0+IHsKICAgIHZhciBtaCA9IFV0KCkuQnVmZmVyLCB1NCA9IEllKCksIGJwID0gYmgoKSwgbDQgPSBuZXcgQXJyYXkoMTYpLCBuYSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LCAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLCAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLCA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXSwgZmEgPSBbNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMiwgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMiwgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMywgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCwgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMV0sIGFhID0gWzExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCwgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLCAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMiwgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XSwgb2EgPSBbOCwgOSwgOSwgMTEsIDEzLCAxNSwgMTUsIDUsIDcsIDcsIDgsIDExLCAxNCwgMTQsIDEyLCA2LCA5LCAxMywgMTUsIDcsIDEyLCA4LCA5LCAxMSwgNywgNywgMTIsIDcsIDYsIDE1LCAxMywgMTEsIDksIDcsIDE1LCAxMSwgOCwgNiwgNiwgMTQsIDEyLCAxMywgNSwgMTQsIDEzLCAxMywgNywgNSwgMTUsIDUsIDgsIDExLCAxNCwgMTQsIDYsIDE0LCA2LCA5LCAxMiwgOSwgMTIsIDUsIDE1LCA4LCA4LCA1LCAxMiwgOSwgMTIsIDUsIDE0LCA2LCA4LCAxMywgNiwgNSwgMTUsIDEzLCAxMSwgMTFdLCBzYSA9IFswLCAxNTE4NTAwMjQ5LCAxODU5Nzc1MzkzLCAyNDAwOTU5NzA4LCAyODQwODUzODM4XSwgaGEgPSBbMTM1MjgyOTkyNiwgMTU0ODYwMzY4NCwgMTgzNjA3MjY5MSwgMjA1Mzk5NDIxNywgMF07CiAgICBmdW5jdGlvbiBSbygpIHsKICAgICAgYnAuY2FsbCh0aGlzLCA2NCksIHRoaXMuX2EgPSAxNzMyNTg0MTkzLCB0aGlzLl9iID0gNDAyMzIzMzQxNywgdGhpcy5fYyA9IDI1NjIzODMxMDIsIHRoaXMuX2QgPSAyNzE3MzM4NzgsIHRoaXMuX2UgPSAzMjg1Mzc3NTIwOwogICAgfQogICAgdTQoUm8sIGJwKTsKICAgIFJvLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIHQgPSBsNCwgZSA9IDA7ZSA8IDE2OyArK2UpCiAgICAgICAgdFtlXSA9IHRoaXMuX2Jsb2NrLnJlYWRJbnQzMkxFKGUgKiA0KTsKICAgICAgZm9yICh2YXIgciA9IHRoaXMuX2EgfCAwLCBvID0gdGhpcy5fYiB8IDAsIGYgPSB0aGlzLl9jIHwgMCwgcCA9IHRoaXMuX2QgfCAwLCBtMiA9IHRoaXMuX2UgfCAwLCB5MiA9IHRoaXMuX2EgfCAwLCBNID0gdGhpcy5fYiB8IDAsIHggPSB0aGlzLl9jIHwgMCwgUyA9IHRoaXMuX2QgfCAwLCBFMiA9IHRoaXMuX2UgfCAwLCBCID0gMDtCIDwgODA7IEIgKz0gMSkgewogICAgICAgIHZhciBxMiwgTDI7CiAgICAgICAgQiA8IDE2ID8gKHEyID0gbHAociwgbywgZiwgcCwgbTIsIHRbbmFbQl1dLCBzYVswXSwgYWFbQl0pLCBMMiA9IHZwKHkyLCBNLCB4LCBTLCBFMiwgdFtmYVtCXV0sIGhhWzBdLCBvYVtCXSkpIDogQiA8IDMyID8gKHEyID0gZHAociwgbywgZiwgcCwgbTIsIHRbbmFbQl1dLCBzYVsxXSwgYWFbQl0pLCBMMiA9IHBwKHkyLCBNLCB4LCBTLCBFMiwgdFtmYVtCXV0sIGhhWzFdLCBvYVtCXSkpIDogQiA8IDQ4ID8gKHEyID0gY3AociwgbywgZiwgcCwgbTIsIHRbbmFbQl1dLCBzYVsyXSwgYWFbQl0pLCBMMiA9IGNwKHkyLCBNLCB4LCBTLCBFMiwgdFtmYVtCXV0sIGhhWzJdLCBvYVtCXSkpIDogQiA8IDY0ID8gKHEyID0gcHAociwgbywgZiwgcCwgbTIsIHRbbmFbQl1dLCBzYVszXSwgYWFbQl0pLCBMMiA9IGRwKHkyLCBNLCB4LCBTLCBFMiwgdFtmYVtCXV0sIGhhWzNdLCBvYVtCXSkpIDogKHEyID0gdnAociwgbywgZiwgcCwgbTIsIHRbbmFbQl1dLCBzYVs0XSwgYWFbQl0pLCBMMiA9IGxwKHkyLCBNLCB4LCBTLCBFMiwgdFtmYVtCXV0sIGhhWzRdLCBvYVtCXSkpLCByID0gbTIsIG0yID0gcCwgcCA9IGNuKGYsIDEwKSwgZiA9IG8sIG8gPSBxMiwgeTIgPSBFMiwgRTIgPSBTLCBTID0gY24oeCwgMTApLCB4ID0gTSwgTSA9IEwyOwogICAgICB9CiAgICAgIHZhciBnZSA9IHRoaXMuX2IgKyBmICsgUyB8IDA7CiAgICAgIHRoaXMuX2IgPSB0aGlzLl9jICsgcCArIEUyIHwgMCwgdGhpcy5fYyA9IHRoaXMuX2QgKyBtMiArIHkyIHwgMCwgdGhpcy5fZCA9IHRoaXMuX2UgKyByICsgTSB8IDAsIHRoaXMuX2UgPSB0aGlzLl9hICsgbyArIHggfCAwLCB0aGlzLl9hID0gZ2U7CiAgICB9OwogICAgUm8ucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5fYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK10gPSAxMjgsIHRoaXMuX2Jsb2NrT2Zmc2V0ID4gNTYgJiYgKHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDY0KSwgdGhpcy5fdXBkYXRlKCksIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gMCksIHRoaXMuX2Jsb2NrLmZpbGwoMCwgdGhpcy5fYmxvY2tPZmZzZXQsIDU2KSwgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMF0sIDU2KSwgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMV0sIDYwKSwgdGhpcy5fdXBkYXRlKCk7CiAgICAgIHZhciB0ID0gbWguYWxsb2MgPyBtaC5hbGxvYygyMCkgOiBuZXcgbWgoMjApOwogICAgICByZXR1cm4gdC53cml0ZUludDMyTEUodGhpcy5fYSwgMCksIHQud3JpdGVJbnQzMkxFKHRoaXMuX2IsIDQpLCB0LndyaXRlSW50MzJMRSh0aGlzLl9jLCA4KSwgdC53cml0ZUludDMyTEUodGhpcy5fZCwgMTIpLCB0LndyaXRlSW50MzJMRSh0aGlzLl9lLCAxNiksIHQ7CiAgICB9OwogICAgZnVuY3Rpb24gY24odCwgZSkgewogICAgICByZXR1cm4gdCA8PCBlIHwgdCA+Pj4gMzIgLSBlOwogICAgfQogICAgZnVuY3Rpb24gbHAodCwgZSwgciwgbywgZiwgcCwgbTIsIHkyKSB7CiAgICAgIHJldHVybiBjbih0ICsgKGUgXiByIF4gbykgKyBwICsgbTIgfCAwLCB5MikgKyBmIHwgMDsKICAgIH0KICAgIGZ1bmN0aW9uIGRwKHQsIGUsIHIsIG8sIGYsIHAsIG0yLCB5MikgewogICAgICByZXR1cm4gY24odCArIChlICYgciB8IH5lICYgbykgKyBwICsgbTIgfCAwLCB5MikgKyBmIHwgMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNwKHQsIGUsIHIsIG8sIGYsIHAsIG0yLCB5MikgewogICAgICByZXR1cm4gY24odCArICgoZSB8IH5yKSBeIG8pICsgcCArIG0yIHwgMCwgeTIpICsgZiB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiBwcCh0LCBlLCByLCBvLCBmLCBwLCBtMiwgeTIpIHsKICAgICAgcmV0dXJuIGNuKHQgKyAoZSAmIG8gfCByICYgfm8pICsgcCArIG0yIHwgMCwgeTIpICsgZiB8IDA7CiAgICB9CiAgICBmdW5jdGlvbiB2cCh0LCBlLCByLCBvLCBmLCBwLCBtMiwgeTIpIHsKICAgICAgcmV0dXJuIGNuKHQgKyAoZSBeIChyIHwgfm8pKSArIHAgKyBtMiB8IDAsIHkyKSArIGYgfCAwOwogICAgfQogICAgbXAuZXhwb3J0cyA9IFJvOwogIH0pOwogIHBuID0gVDIoKHdJLCB5cCkgPT4gewogICAgdmFyIGdwID0gVGUoKS5CdWZmZXI7CiAgICBmdW5jdGlvbiBxbyh0LCBlKSB7CiAgICAgIHRoaXMuX2Jsb2NrID0gZ3AuYWxsb2ModCksIHRoaXMuX2ZpbmFsU2l6ZSA9IGUsIHRoaXMuX2Jsb2NrU2l6ZSA9IHQsIHRoaXMuX2xlbiA9IDA7CiAgICB9CiAgICBxby5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24odCwgZSkgewogICAgICB0eXBlb2YgdCA9PSAic3RyaW5nIiAmJiAoZSA9IGUgfHwgInV0ZjgiLCB0ID0gZ3AuZnJvbSh0LCBlKSk7CiAgICAgIGZvciAodmFyIHIgPSB0aGlzLl9ibG9jaywgbyA9IHRoaXMuX2Jsb2NrU2l6ZSwgZiA9IHQubGVuZ3RoLCBwID0gdGhpcy5fbGVuLCBtMiA9IDA7bTIgPCBmOyApIHsKICAgICAgICBmb3IgKHZhciB5MiA9IHAgJSBvLCBNID0gTWF0aC5taW4oZiAtIG0yLCBvIC0geTIpLCB4ID0gMDt4IDwgTTsgeCsrKQogICAgICAgICAgclt5MiArIHhdID0gdFttMiArIHhdOwogICAgICAgIHAgKz0gTSwgbTIgKz0gTSwgcCAlIG8gPT09IDAgJiYgdGhpcy5fdXBkYXRlKHIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9sZW4gKz0gZiwgdGhpczsKICAgIH07CiAgICBxby5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IHRoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZTsKICAgICAgdGhpcy5fYmxvY2tbZV0gPSAxMjgsIHRoaXMuX2Jsb2NrLmZpbGwoMCwgZSArIDEpLCBlID49IHRoaXMuX2ZpbmFsU2l6ZSAmJiAodGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKSwgdGhpcy5fYmxvY2suZmlsbCgwKSk7CiAgICAgIHZhciByID0gdGhpcy5fbGVuICogODsKICAgICAgaWYgKHIgPD0gNDI5NDk2NzI5NSkKICAgICAgICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHIsIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpOwogICAgICBlbHNlIHsKICAgICAgICB2YXIgbyA9IChyICYgNDI5NDk2NzI5NSkgPj4+IDAsIGYgPSAociAtIG8pIC8gNDI5NDk2NzI5NjsKICAgICAgICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGYsIHRoaXMuX2Jsb2NrU2l6ZSAtIDgpLCB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKG8sIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpOwogICAgICB9CiAgICAgIHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayk7CiAgICAgIHZhciBwID0gdGhpcy5faGFzaCgpOwogICAgICByZXR1cm4gdCA/IHAudG9TdHJpbmcodCkgOiBwOwogICAgfTsKICAgIHFvLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIik7CiAgICB9OwogICAgeXAuZXhwb3J0cyA9IHFvOwogIH0pOwogIF9wID0gVDIoKE1JLCBNcCkgPT4gewogICAgdmFyIGQ0ID0gSWUoKSwgd3AgPSBwbigpLCBjNCA9IFRlKCkuQnVmZmVyLCBwNCA9IFsxNTE4NTAwMjQ5LCAxODU5Nzc1MzkzLCAtMTg5NDAwNzU4OCwgLTg5OTQ5NzUxNF0sIHY0ID0gbmV3IEFycmF5KDgwKTsKICAgIGZ1bmN0aW9uIHVhKCkgewogICAgICB0aGlzLmluaXQoKSwgdGhpcy5fdyA9IHY0LCB3cC5jYWxsKHRoaXMsIDY0LCA1Nik7CiAgICB9CiAgICBkNCh1YSwgd3ApOwogICAgdWEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2EgPSAxNzMyNTg0MTkzLCB0aGlzLl9iID0gNDAyMzIzMzQxNywgdGhpcy5fYyA9IDI1NjIzODMxMDIsIHRoaXMuX2QgPSAyNzE3MzM4NzgsIHRoaXMuX2UgPSAzMjg1Mzc3NTIwLCB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIGI0KHQpIHsKICAgICAgcmV0dXJuIHQgPDwgNSB8IHQgPj4+IDI3OwogICAgfQogICAgZnVuY3Rpb24gbTQodCkgewogICAgICByZXR1cm4gdCA8PCAzMCB8IHQgPj4+IDI7CiAgICB9CiAgICBmdW5jdGlvbiBnNCh0LCBlLCByLCBvKSB7CiAgICAgIHJldHVybiB0ID09PSAwID8gZSAmIHIgfCB+ZSAmIG8gOiB0ID09PSAyID8gZSAmIHIgfCBlICYgbyB8IHIgJiBvIDogZSBeIHIgXiBvOwogICAgfQogICAgdWEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzLl93LCByID0gdGhpcy5fYSB8IDAsIG8gPSB0aGlzLl9iIHwgMCwgZiA9IHRoaXMuX2MgfCAwLCBwID0gdGhpcy5fZCB8IDAsIG0yID0gdGhpcy5fZSB8IDAsIHkyID0gMDt5MiA8IDE2OyArK3kyKQogICAgICAgIGVbeTJdID0gdC5yZWFkSW50MzJCRSh5MiAqIDQpOwogICAgICBmb3IgKDt5MiA8IDgwOyArK3kyKQogICAgICAgIGVbeTJdID0gZVt5MiAtIDNdIF4gZVt5MiAtIDhdIF4gZVt5MiAtIDE0XSBeIGVbeTIgLSAxNl07CiAgICAgIGZvciAodmFyIE0gPSAwO00gPCA4MDsgKytNKSB7CiAgICAgICAgdmFyIHggPSB+fihNIC8gMjApLCBTID0gYjQocikgKyBnNCh4LCBvLCBmLCBwKSArIG0yICsgZVtNXSArIHA0W3hdIHwgMDsKICAgICAgICBtMiA9IHAsIHAgPSBmLCBmID0gbTQobyksIG8gPSByLCByID0gUzsKICAgICAgfQogICAgICB0aGlzLl9hID0gciArIHRoaXMuX2EgfCAwLCB0aGlzLl9iID0gbyArIHRoaXMuX2IgfCAwLCB0aGlzLl9jID0gZiArIHRoaXMuX2MgfCAwLCB0aGlzLl9kID0gcCArIHRoaXMuX2QgfCAwLCB0aGlzLl9lID0gbTIgKyB0aGlzLl9lIHwgMDsKICAgIH07CiAgICB1YS5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSBjNC5hbGxvY1Vuc2FmZSgyMCk7CiAgICAgIHJldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hIHwgMCwgMCksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2IgfCAwLCA0KSwgdC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpLCB0LndyaXRlSW50MzJCRSh0aGlzLl9kIHwgMCwgMTIpLCB0LndyaXRlSW50MzJCRSh0aGlzLl9lIHwgMCwgMTYpLCB0OwogICAgfTsKICAgIE1wLmV4cG9ydHMgPSB1YTsKICB9KTsKICBFcCA9IFQyKChfSSwgU3ApID0+IHsKICAgIHZhciB5NCA9IEllKCksIHhwID0gcG4oKSwgdzQgPSBUZSgpLkJ1ZmZlciwgTTQgPSBbMTUxODUwMDI0OSwgMTg1OTc3NTM5MywgLTE4OTQwMDc1ODgsIC04OTk0OTc1MTRdLCBfNCA9IG5ldyBBcnJheSg4MCk7CiAgICBmdW5jdGlvbiBsYSgpIHsKICAgICAgdGhpcy5pbml0KCksIHRoaXMuX3cgPSBfNCwgeHAuY2FsbCh0aGlzLCA2NCwgNTYpOwogICAgfQogICAgeTQobGEsIHhwKTsKICAgIGxhLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9hID0gMTczMjU4NDE5MywgdGhpcy5fYiA9IDQwMjMyMzM0MTcsIHRoaXMuX2MgPSAyNTYyMzgzMTAyLCB0aGlzLl9kID0gMjcxNzMzODc4LCB0aGlzLl9lID0gMzI4NTM3NzUyMCwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiB4NCh0KSB7CiAgICAgIHJldHVybiB0IDw8IDEgfCB0ID4+PiAzMTsKICAgIH0KICAgIGZ1bmN0aW9uIFM0KHQpIHsKICAgICAgcmV0dXJuIHQgPDwgNSB8IHQgPj4+IDI3OwogICAgfQogICAgZnVuY3Rpb24gRTQodCkgewogICAgICByZXR1cm4gdCA8PCAzMCB8IHQgPj4+IDI7CiAgICB9CiAgICBmdW5jdGlvbiBBNCh0LCBlLCByLCBvKSB7CiAgICAgIHJldHVybiB0ID09PSAwID8gZSAmIHIgfCB+ZSAmIG8gOiB0ID09PSAyID8gZSAmIHIgfCBlICYgbyB8IHIgJiBvIDogZSBeIHIgXiBvOwogICAgfQogICAgbGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzLl93LCByID0gdGhpcy5fYSB8IDAsIG8gPSB0aGlzLl9iIHwgMCwgZiA9IHRoaXMuX2MgfCAwLCBwID0gdGhpcy5fZCB8IDAsIG0yID0gdGhpcy5fZSB8IDAsIHkyID0gMDt5MiA8IDE2OyArK3kyKQogICAgICAgIGVbeTJdID0gdC5yZWFkSW50MzJCRSh5MiAqIDQpOwogICAgICBmb3IgKDt5MiA8IDgwOyArK3kyKQogICAgICAgIGVbeTJdID0geDQoZVt5MiAtIDNdIF4gZVt5MiAtIDhdIF4gZVt5MiAtIDE0XSBeIGVbeTIgLSAxNl0pOwogICAgICBmb3IgKHZhciBNID0gMDtNIDwgODA7ICsrTSkgewogICAgICAgIHZhciB4ID0gfn4oTSAvIDIwKSwgUyA9IFM0KHIpICsgQTQoeCwgbywgZiwgcCkgKyBtMiArIGVbTV0gKyBNNFt4XSB8IDA7CiAgICAgICAgbTIgPSBwLCBwID0gZiwgZiA9IEU0KG8pLCBvID0gciwgciA9IFM7CiAgICAgIH0KICAgICAgdGhpcy5fYSA9IHIgKyB0aGlzLl9hIHwgMCwgdGhpcy5fYiA9IG8gKyB0aGlzLl9iIHwgMCwgdGhpcy5fYyA9IGYgKyB0aGlzLl9jIHwgMCwgdGhpcy5fZCA9IHAgKyB0aGlzLl9kIHwgMCwgdGhpcy5fZSA9IG0yICsgdGhpcy5fZSB8IDA7CiAgICB9OwogICAgbGEucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ID0gdzQuYWxsb2NVbnNhZmUoMjApOwogICAgICByZXR1cm4gdC53cml0ZUludDMyQkUodGhpcy5fYSB8IDAsIDApLCB0LndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNCksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2MgfCAwLCA4KSwgdC53cml0ZUludDMyQkUodGhpcy5fZCB8IDAsIDEyKSwgdC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KSwgdDsKICAgIH07CiAgICBTcC5leHBvcnRzID0gbGE7CiAgfSk7CiAgZ2ggPSBUMigoeEksIFJwKSA9PiB7CiAgICB2YXIgUjQgPSBJZSgpLCBBcCA9IHBuKCksIEI0ID0gVGUoKS5CdWZmZXIsIHE0ID0gWzExMTYzNTI0MDgsIDE4OTk0NDc0NDEsIDMwNDkzMjM0NzEsIDM5MjEwMDk1NzMsIDk2MTk4NzE2MywgMTUwODk3MDk5MywgMjQ1MzYzNTc0OCwgMjg3MDc2MzIyMSwgMzYyNDM4MTA4MCwgMzEwNTk4NDAxLCA2MDcyMjUyNzgsIDE0MjY4ODE5ODcsIDE5MjUwNzgzODgsIDIxNjIwNzgyMDYsIDI2MTQ4ODgxMDMsIDMyNDgyMjI1ODAsIDM4MzUzOTA0MDEsIDQwMjIyMjQ3NzQsIDI2NDM0NzA3OCwgNjA0ODA3NjI4LCA3NzAyNTU5ODMsIDEyNDkxNTAxMjIsIDE1NTUwODE2OTIsIDE5OTYwNjQ5ODYsIDI1NTQyMjA4ODIsIDI4MjE4MzQzNDksIDI5NTI5OTY4MDgsIDMyMTAzMTM2NzEsIDMzMzY1NzE4OTEsIDM1ODQ1Mjg3MTEsIDExMzkyNjk5MywgMzM4MjQxODk1LCA2NjYzMDcyMDUsIDc3MzUyOTkxMiwgMTI5NDc1NzM3MiwgMTM5NjE4MjI5MSwgMTY5NTE4MzcwMCwgMTk4NjY2MTA1MSwgMjE3NzAyNjM1MCwgMjQ1Njk1NjAzNywgMjczMDQ4NTkyMSwgMjgyMDMwMjQxMSwgMzI1OTczMDgwMCwgMzM0NTc2NDc3MSwgMzUxNjA2NTgxNywgMzYwMDM1MjgwNCwgNDA5NDU3MTkwOSwgMjc1NDIzMzQ0LCA0MzAyMjc3MzQsIDUwNjk0ODYxNiwgNjU5MDYwNTU2LCA4ODM5OTc4NzcsIDk1ODEzOTU3MSwgMTMyMjgyMjIxOCwgMTUzNzAwMjA2MywgMTc0Nzg3Mzc3OSwgMTk1NTU2MjIyMiwgMjAyNDEwNDgxNSwgMjIyNzczMDQ1MiwgMjM2MTg1MjQyNCwgMjQyODQzNjQ3NCwgMjc1NjczNDE4NywgMzIwNDAzMTQ3OSwgMzMyOTMyNTI5OF0sIEk0ID0gbmV3IEFycmF5KDY0KTsKICAgIGZ1bmN0aW9uIGRhKCkgewogICAgICB0aGlzLmluaXQoKSwgdGhpcy5fdyA9IEk0LCBBcC5jYWxsKHRoaXMsIDY0LCA1Nik7CiAgICB9CiAgICBSNChkYSwgQXApOwogICAgZGEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2EgPSAxNzc5MDMzNzAzLCB0aGlzLl9iID0gMzE0NDEzNDI3NywgdGhpcy5fYyA9IDEwMTM5MDQyNDIsIHRoaXMuX2QgPSAyNzczNDgwNzYyLCB0aGlzLl9lID0gMTM1OTg5MzExOSwgdGhpcy5fZiA9IDI2MDA4MjI5MjQsIHRoaXMuX2cgPSA1Mjg3MzQ2MzUsIHRoaXMuX2ggPSAxNTQxNDU5MjI1LCB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIFQ0KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHIgXiB0ICYgKGUgXiByKTsKICAgIH0KICAgIGZ1bmN0aW9uIGs0KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQgJiBlIHwgciAmICh0IHwgZSk7CiAgICB9CiAgICBmdW5jdGlvbiBMNCh0KSB7CiAgICAgIHJldHVybiAodCA+Pj4gMiB8IHQgPDwgMzApIF4gKHQgPj4+IDEzIHwgdCA8PCAxOSkgXiAodCA+Pj4gMjIgfCB0IDw8IDEwKTsKICAgIH0KICAgIGZ1bmN0aW9uIE40KHQpIHsKICAgICAgcmV0dXJuICh0ID4+PiA2IHwgdCA8PCAyNikgXiAodCA+Pj4gMTEgfCB0IDw8IDIxKSBeICh0ID4+PiAyNSB8IHQgPDwgNyk7CiAgICB9CiAgICBmdW5jdGlvbiBENCh0KSB7CiAgICAgIHJldHVybiAodCA+Pj4gNyB8IHQgPDwgMjUpIF4gKHQgPj4+IDE4IHwgdCA8PCAxNCkgXiB0ID4+PiAzOwogICAgfQogICAgZnVuY3Rpb24gUDQodCkgewogICAgICByZXR1cm4gKHQgPj4+IDE3IHwgdCA8PCAxNSkgXiAodCA+Pj4gMTkgfCB0IDw8IDEzKSBeIHQgPj4+IDEwOwogICAgfQogICAgZGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzLl93LCByID0gdGhpcy5fYSB8IDAsIG8gPSB0aGlzLl9iIHwgMCwgZiA9IHRoaXMuX2MgfCAwLCBwID0gdGhpcy5fZCB8IDAsIG0yID0gdGhpcy5fZSB8IDAsIHkyID0gdGhpcy5fZiB8IDAsIE0gPSB0aGlzLl9nIHwgMCwgeCA9IHRoaXMuX2ggfCAwLCBTID0gMDtTIDwgMTY7ICsrUykKICAgICAgICBlW1NdID0gdC5yZWFkSW50MzJCRShTICogNCk7CiAgICAgIGZvciAoO1MgPCA2NDsgKytTKQogICAgICAgIGVbU10gPSBQNChlW1MgLSAyXSkgKyBlW1MgLSA3XSArIEQ0KGVbUyAtIDE1XSkgKyBlW1MgLSAxNl0gfCAwOwogICAgICBmb3IgKHZhciBFMiA9IDA7RTIgPCA2NDsgKytFMikgewogICAgICAgIHZhciBCID0geCArIE40KG0yKSArIFQ0KG0yLCB5MiwgTSkgKyBxNFtFMl0gKyBlW0UyXSB8IDAsIHEyID0gTDQocikgKyBrNChyLCBvLCBmKSB8IDA7CiAgICAgICAgeCA9IE0sIE0gPSB5MiwgeTIgPSBtMiwgbTIgPSBwICsgQiB8IDAsIHAgPSBmLCBmID0gbywgbyA9IHIsIHIgPSBCICsgcTIgfCAwOwogICAgICB9CiAgICAgIHRoaXMuX2EgPSByICsgdGhpcy5fYSB8IDAsIHRoaXMuX2IgPSBvICsgdGhpcy5fYiB8IDAsIHRoaXMuX2MgPSBmICsgdGhpcy5fYyB8IDAsIHRoaXMuX2QgPSBwICsgdGhpcy5fZCB8IDAsIHRoaXMuX2UgPSBtMiArIHRoaXMuX2UgfCAwLCB0aGlzLl9mID0geTIgKyB0aGlzLl9mIHwgMCwgdGhpcy5fZyA9IE0gKyB0aGlzLl9nIHwgMCwgdGhpcy5faCA9IHggKyB0aGlzLl9oIHwgMDsKICAgIH07CiAgICBkYS5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSBCNC5hbGxvY1Vuc2FmZSgzMik7CiAgICAgIHJldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKSwgdC53cml0ZUludDMyQkUodGhpcy5fYiwgNCksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpLCB0LndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMiksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsIDE2KSwgdC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApLCB0LndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNCksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2gsIDI4KSwgdDsKICAgIH07CiAgICBScC5leHBvcnRzID0gZGE7CiAgfSk7CiAgcXAgPSBUMigoU0ksIEJwKSA9PiB7CiAgICB2YXIgQzQgPSBJZSgpLCBPNCA9IGdoKCksIEY0ID0gcG4oKSwgVTQgPSBUZSgpLkJ1ZmZlciwgejQgPSBuZXcgQXJyYXkoNjQpOwogICAgZnVuY3Rpb24gSW8oKSB7CiAgICAgIHRoaXMuaW5pdCgpLCB0aGlzLl93ID0gejQsIEY0LmNhbGwodGhpcywgNjQsIDU2KTsKICAgIH0KICAgIEM0KElvLCBPNCk7CiAgICBJby5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fYSA9IDMyMzgzNzEwMzIsIHRoaXMuX2IgPSA5MTQxNTA2NjMsIHRoaXMuX2MgPSA4MTI3MDI5OTksIHRoaXMuX2QgPSA0MTQ0OTEyNjk3LCB0aGlzLl9lID0gNDI5MDc3NTg1NywgdGhpcy5fZiA9IDE3NTA2MDMwMjUsIHRoaXMuX2cgPSAxNjk0MDc2ODM5LCB0aGlzLl9oID0gMzIwNDA3NTQyOCwgdGhpczsKICAgIH07CiAgICBJby5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSBVNC5hbGxvY1Vuc2FmZSgyOCk7CiAgICAgIHJldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hLCAwKSwgdC53cml0ZUludDMyQkUodGhpcy5fYiwgNCksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpLCB0LndyaXRlSW50MzJCRSh0aGlzLl9kLCAxMiksIHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsIDE2KSwgdC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApLCB0LndyaXRlSW50MzJCRSh0aGlzLl9nLCAyNCksIHQ7CiAgICB9OwogICAgQnAuZXhwb3J0cyA9IElvOwogIH0pOwogIHloID0gVDIoKEVJLCBQcCkgPT4gewogICAgdmFyIEg0ID0gSWUoKSwgRHAgPSBwbigpLCBXNCA9IFRlKCkuQnVmZmVyLCBJcCA9IFsxMTE2MzUyNDA4LCAzNjA5NzY3NDU4LCAxODk5NDQ3NDQxLCA2MDI4OTE3MjUsIDMwNDkzMjM0NzEsIDM5NjQ0ODQzOTksIDM5MjEwMDk1NzMsIDIxNzMyOTU1NDgsIDk2MTk4NzE2MywgNDA4MTYyODQ3MiwgMTUwODk3MDk5MywgMzA1MzgzNDI2NSwgMjQ1MzYzNTc0OCwgMjkzNzY3MTU3OSwgMjg3MDc2MzIyMSwgMzY2NDYwOTU2MCwgMzYyNDM4MTA4MCwgMjczNDg4MzM5NCwgMzEwNTk4NDAxLCAxMTY0OTk2NTQyLCA2MDcyMjUyNzgsIDEzMjM2MTA3NjQsIDE0MjY4ODE5ODcsIDM1OTAzMDQ5OTQsIDE5MjUwNzgzODgsIDQwNjgxODIzODMsIDIxNjIwNzgyMDYsIDk5MTMzNjExMywgMjYxNDg4ODEwMywgNjMzODAzMzE3LCAzMjQ4MjIyNTgwLCAzNDc5Nzc0ODY4LCAzODM1MzkwNDAxLCAyNjY2NjEzNDU4LCA0MDIyMjI0Nzc0LCA5NDQ3MTExMzksIDI2NDM0NzA3OCwgMjM0MTI2Mjc3MywgNjA0ODA3NjI4LCAyMDA3ODAwOTMzLCA3NzAyNTU5ODMsIDE0OTU5OTA5MDEsIDEyNDkxNTAxMjIsIDE4NTY0MzEyMzUsIDE1NTUwODE2OTIsIDMxNzUyMTgxMzIsIDE5OTYwNjQ5ODYsIDIxOTg5NTA4MzcsIDI1NTQyMjA4ODIsIDM5OTk3MTkzMzksIDI4MjE4MzQzNDksIDc2Njc4NDAxNiwgMjk1Mjk5NjgwOCwgMjU2NjU5NDg3OSwgMzIxMDMxMzY3MSwgMzIwMzMzNzk1NiwgMzMzNjU3MTg5MSwgMTAzNDQ1NzAyNiwgMzU4NDUyODcxMSwgMjQ2Njk0ODkwMSwgMTEzOTI2OTkzLCAzNzU4MzI2MzgzLCAzMzgyNDE4OTUsIDE2ODcxNzkzNiwgNjY2MzA3MjA1LCAxMTg4MTc5OTY0LCA3NzM1Mjk5MTIsIDE1NDYwNDU3MzQsIDEyOTQ3NTczNzIsIDE1MjI4MDU0ODUsIDEzOTYxODIyOTEsIDI2NDM4MzM4MjMsIDE2OTUxODM3MDAsIDIzNDM1MjczOTAsIDE5ODY2NjEwNTEsIDEwMTQ0Nzc0ODAsIDIxNzcwMjYzNTAsIDEyMDY3NTkxNDIsIDI0NTY5NTYwMzcsIDM0NDA3NzYyNywgMjczMDQ4NTkyMSwgMTI5MDg2MzQ2MCwgMjgyMDMwMjQxMSwgMzE1ODQ1NDI3MywgMzI1OTczMDgwMCwgMzUwNTk1MjY1NywgMzM0NTc2NDc3MSwgMTA2MjE3MDA4LCAzNTE2MDY1ODE3LCAzNjA2MDA4MzQ0LCAzNjAwMzUyODA0LCAxNDMyNzI1Nzc2LCA0MDk0NTcxOTA5LCAxNDY3MDMxNTk0LCAyNzU0MjMzNDQsIDg1MTE2OTcyMCwgNDMwMjI3NzM0LCAzMTAwODIzNzUyLCA1MDY5NDg2MTYsIDEzNjMyNTgxOTUsIDY1OTA2MDU1NiwgMzc1MDY4NTU5MywgODgzOTk3ODc3LCAzNzg1MDUwMjgwLCA5NTgxMzk1NzEsIDMzMTgzMDc0MjcsIDEzMjI4MjIyMTgsIDM4MTI3MjM0MDMsIDE1MzcwMDIwNjMsIDIwMDMwMzQ5OTUsIDE3NDc4NzM3NzksIDM2MDIwMzY4OTksIDE5NTU1NjIyMjIsIDE1NzU5OTAwMTIsIDIwMjQxMDQ4MTUsIDExMjU1OTI5MjgsIDIyMjc3MzA0NTIsIDI3MTY5MDQzMDYsIDIzNjE4NTI0MjQsIDQ0Mjc3NjA0NCwgMjQyODQzNjQ3NCwgNTkzNjk4MzQ0LCAyNzU2NzM0MTg3LCAzNzMzMTEwMjQ5LCAzMjA0MDMxNDc5LCAyOTk5MzUxNTczLCAzMzI5MzI1Mjk4LCAzODE1OTIwNDI3LCAzMzkxNTY5NjE0LCAzOTI4MzgzOTAwLCAzNTE1MjY3MjcxLCA1NjYyODA3MTEsIDM5NDAxODc2MDYsIDM0NTQwNjk1MzQsIDQxMTg2MzAyNzEsIDQwMDAyMzk5OTIsIDExNjQxODQ3NCwgMTkxNDEzODU1NCwgMTc0MjkyNDIxLCAyNzMxMDU1MjcwLCAyODkzODAzNTYsIDMyMDM5OTMwMDYsIDQ2MDM5MzI2OSwgMzIwNjIwMzE1LCA2ODU0NzE3MzMsIDU4NzQ5NjgzNiwgODUyMTQyOTcxLCAxMDg2NzkyODUxLCAxMDE3MDM2Mjk4LCAzNjU1NDMxMDAsIDExMjYwMDA1ODAsIDI2MTgyOTc2NzYsIDEyODgwMzM0NzAsIDM0MDk4NTUxNTgsIDE1MDE1MDU5NDgsIDQyMzQ1MDk4NjYsIDE2MDcxNjc5MTUsIDk4NzE2NzQ2OCwgMTgxNjQwMjMxNiwgMTI0NjE4OTU5MV0sIEs0ID0gbmV3IEFycmF5KDE2MCk7CiAgICBmdW5jdGlvbiBjYSgpIHsKICAgICAgdGhpcy5pbml0KCksIHRoaXMuX3cgPSBLNCwgRHAuY2FsbCh0aGlzLCAxMjgsIDExMik7CiAgICB9CiAgICBINChjYSwgRHApOwogICAgY2EucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FoID0gMTc3OTAzMzcwMywgdGhpcy5fYmggPSAzMTQ0MTM0Mjc3LCB0aGlzLl9jaCA9IDEwMTM5MDQyNDIsIHRoaXMuX2RoID0gMjc3MzQ4MDc2MiwgdGhpcy5fZWggPSAxMzU5ODkzMTE5LCB0aGlzLl9maCA9IDI2MDA4MjI5MjQsIHRoaXMuX2doID0gNTI4NzM0NjM1LCB0aGlzLl9oaCA9IDE1NDE0NTkyMjUsIHRoaXMuX2FsID0gNDA4OTIzNTcyMCwgdGhpcy5fYmwgPSAyMjI3ODczNTk1LCB0aGlzLl9jbCA9IDQyNzExNzU3MjMsIHRoaXMuX2RsID0gMTU5NTc1MDEyOSwgdGhpcy5fZWwgPSAyOTE3NTY1MTM3LCB0aGlzLl9mbCA9IDcyNTUxMTE5OSwgdGhpcy5fZ2wgPSA0MjE1Mzg5NTQ3LCB0aGlzLl9obCA9IDMyNzAzMzIwOSwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiBUcCh0LCBlLCByKSB7CiAgICAgIHJldHVybiByIF4gdCAmIChlIF4gcik7CiAgICB9CiAgICBmdW5jdGlvbiBrcCh0LCBlLCByKSB7CiAgICAgIHJldHVybiB0ICYgZSB8IHIgJiAodCB8IGUpOwogICAgfQogICAgZnVuY3Rpb24gTHAodCwgZSkgewogICAgICByZXR1cm4gKHQgPj4+IDI4IHwgZSA8PCA0KSBeIChlID4+PiAyIHwgdCA8PCAzMCkgXiAoZSA+Pj4gNyB8IHQgPDwgMjUpOwogICAgfQogICAgZnVuY3Rpb24gTnAodCwgZSkgewogICAgICByZXR1cm4gKHQgPj4+IDE0IHwgZSA8PCAxOCkgXiAodCA+Pj4gMTggfCBlIDw8IDE0KSBeIChlID4+PiA5IHwgdCA8PCAyMyk7CiAgICB9CiAgICBmdW5jdGlvbiBqNCh0LCBlKSB7CiAgICAgIHJldHVybiAodCA+Pj4gMSB8IGUgPDwgMzEpIF4gKHQgPj4+IDggfCBlIDw8IDI0KSBeIHQgPj4+IDc7CiAgICB9CiAgICBmdW5jdGlvbiBaNCh0LCBlKSB7CiAgICAgIHJldHVybiAodCA+Pj4gMSB8IGUgPDwgMzEpIF4gKHQgPj4+IDggfCBlIDw8IDI0KSBeICh0ID4+PiA3IHwgZSA8PCAyNSk7CiAgICB9CiAgICBmdW5jdGlvbiBWNCh0LCBlKSB7CiAgICAgIHJldHVybiAodCA+Pj4gMTkgfCBlIDw8IDEzKSBeIChlID4+PiAyOSB8IHQgPDwgMykgXiB0ID4+PiA2OwogICAgfQogICAgZnVuY3Rpb24gJDQodCwgZSkgewogICAgICByZXR1cm4gKHQgPj4+IDE5IHwgZSA8PCAxMykgXiAoZSA+Pj4gMjkgfCB0IDw8IDMpIF4gKHQgPj4+IDYgfCBlIDw8IDI2KTsKICAgIH0KICAgIGZ1bmN0aW9uIFB0KHQsIGUpIHsKICAgICAgcmV0dXJuIHQgPj4+IDAgPCBlID4+PiAwID8gMSA6IDA7CiAgICB9CiAgICBjYS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgZm9yICh2YXIgZSA9IHRoaXMuX3csIHIgPSB0aGlzLl9haCB8IDAsIG8gPSB0aGlzLl9iaCB8IDAsIGYgPSB0aGlzLl9jaCB8IDAsIHAgPSB0aGlzLl9kaCB8IDAsIG0yID0gdGhpcy5fZWggfCAwLCB5MiA9IHRoaXMuX2ZoIHwgMCwgTSA9IHRoaXMuX2doIHwgMCwgeCA9IHRoaXMuX2hoIHwgMCwgUyA9IHRoaXMuX2FsIHwgMCwgRTIgPSB0aGlzLl9ibCB8IDAsIEIgPSB0aGlzLl9jbCB8IDAsIHEyID0gdGhpcy5fZGwgfCAwLCBMMiA9IHRoaXMuX2VsIHwgMCwgZ2UgPSB0aGlzLl9mbCB8IDAsIF9lID0gdGhpcy5fZ2wgfCAwLCBOID0gdGhpcy5faGwgfCAwLCB3ZSA9IDA7d2UgPCAzMjsgd2UgKz0gMikKICAgICAgICBlW3dlXSA9IHQucmVhZEludDMyQkUod2UgKiA0KSwgZVt3ZSArIDFdID0gdC5yZWFkSW50MzJCRSh3ZSAqIDQgKyA0KTsKICAgICAgZm9yICg7d2UgPCAxNjA7IHdlICs9IDIpIHsKICAgICAgICB2YXIgeWUgPSBlW3dlIC0gMzBdLCB4ZSA9IGVbd2UgLSAxNSAqIDIgKyAxXSwgUmUgPSBqNCh5ZSwgeGUpLCBFZSA9IFo0KHhlLCB5ZSk7CiAgICAgICAgeWUgPSBlW3dlIC0gMiAqIDJdLCB4ZSA9IGVbd2UgLSAyICogMiArIDFdOwogICAgICAgIHZhciBBZSA9IFY0KHllLCB4ZSksIFAgPSAkNCh4ZSwgeWUpLCBTZSA9IGVbd2UgLSA3ICogMl0sIHYgPSBlW3dlIC0gNyAqIDIgKyAxXSwgaSA9IGVbd2UgLSAxNiAqIDJdLCBhID0gZVt3ZSAtIDE2ICogMiArIDFdLCBoMiA9IEVlICsgdiB8IDAsIHMgPSBSZSArIFNlICsgUHQoaDIsIEVlKSB8IDA7CiAgICAgICAgaDIgPSBoMiArIFAgfCAwLCBzID0gcyArIEFlICsgUHQoaDIsIFApIHwgMCwgaDIgPSBoMiArIGEgfCAwLCBzID0gcyArIGkgKyBQdChoMiwgYSkgfCAwLCBlW3dlXSA9IHMsIGVbd2UgKyAxXSA9IGgyOwogICAgICB9CiAgICAgIGZvciAodmFyIHUgPSAwO3UgPCAxNjA7IHUgKz0gMikgewogICAgICAgIHMgPSBlW3VdLCBoMiA9IGVbdSArIDFdOwogICAgICAgIHZhciBjID0ga3AociwgbywgZiksIGIyID0ga3AoUywgRTIsIEIpLCBsID0gTHAociwgUyksIG4gPSBMcChTLCByKSwgZCA9IE5wKG0yLCBMMiksIHcgPSBOcChMMiwgbTIpLCBnID0gSXBbdV0sIF8yID0gSXBbdSArIDFdLCBBMiA9IFRwKG0yLCB5MiwgTSksIFIyID0gVHAoTDIsIGdlLCBfZSksIEkgPSBOICsgdyB8IDAsIE1lID0geCArIGQgKyBQdChJLCBOKSB8IDA7CiAgICAgICAgSSA9IEkgKyBSMiB8IDAsIE1lID0gTWUgKyBBMiArIFB0KEksIFIyKSB8IDAsIEkgPSBJICsgXzIgfCAwLCBNZSA9IE1lICsgZyArIFB0KEksIF8yKSB8IDAsIEkgPSBJICsgaDIgfCAwLCBNZSA9IE1lICsgcyArIFB0KEksIGgyKSB8IDA7CiAgICAgICAgdmFyIGsgPSBuICsgYjIgfCAwLCBEMiA9IGwgKyBjICsgUHQoaywgbikgfCAwOwogICAgICAgIHggPSBNLCBOID0gX2UsIE0gPSB5MiwgX2UgPSBnZSwgeTIgPSBtMiwgZ2UgPSBMMiwgTDIgPSBxMiArIEkgfCAwLCBtMiA9IHAgKyBNZSArIFB0KEwyLCBxMikgfCAwLCBwID0gZiwgcTIgPSBCLCBmID0gbywgQiA9IEUyLCBvID0gciwgRTIgPSBTLCBTID0gSSArIGsgfCAwLCByID0gTWUgKyBEMiArIFB0KFMsIEkpIHwgMDsKICAgICAgfQogICAgICB0aGlzLl9hbCA9IHRoaXMuX2FsICsgUyB8IDAsIHRoaXMuX2JsID0gdGhpcy5fYmwgKyBFMiB8IDAsIHRoaXMuX2NsID0gdGhpcy5fY2wgKyBCIHwgMCwgdGhpcy5fZGwgPSB0aGlzLl9kbCArIHEyIHwgMCwgdGhpcy5fZWwgPSB0aGlzLl9lbCArIEwyIHwgMCwgdGhpcy5fZmwgPSB0aGlzLl9mbCArIGdlIHwgMCwgdGhpcy5fZ2wgPSB0aGlzLl9nbCArIF9lIHwgMCwgdGhpcy5faGwgPSB0aGlzLl9obCArIE4gfCAwLCB0aGlzLl9haCA9IHRoaXMuX2FoICsgciArIFB0KHRoaXMuX2FsLCBTKSB8IDAsIHRoaXMuX2JoID0gdGhpcy5fYmggKyBvICsgUHQodGhpcy5fYmwsIEUyKSB8IDAsIHRoaXMuX2NoID0gdGhpcy5fY2ggKyBmICsgUHQodGhpcy5fY2wsIEIpIHwgMCwgdGhpcy5fZGggPSB0aGlzLl9kaCArIHAgKyBQdCh0aGlzLl9kbCwgcTIpIHwgMCwgdGhpcy5fZWggPSB0aGlzLl9laCArIG0yICsgUHQodGhpcy5fZWwsIEwyKSB8IDAsIHRoaXMuX2ZoID0gdGhpcy5fZmggKyB5MiArIFB0KHRoaXMuX2ZsLCBnZSkgfCAwLCB0aGlzLl9naCA9IHRoaXMuX2doICsgTSArIFB0KHRoaXMuX2dsLCBfZSkgfCAwLCB0aGlzLl9oaCA9IHRoaXMuX2hoICsgeCArIFB0KHRoaXMuX2hsLCBOKSB8IDA7CiAgICB9OwogICAgY2EucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ID0gVzQuYWxsb2NVbnNhZmUoNjQpOwogICAgICBmdW5jdGlvbiBlKHIsIG8sIGYpIHsKICAgICAgICB0LndyaXRlSW50MzJCRShyLCBmKSwgdC53cml0ZUludDMyQkUobywgZiArIDQpOwogICAgICB9CiAgICAgIHJldHVybiBlKHRoaXMuX2FoLCB0aGlzLl9hbCwgMCksIGUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KSwgZSh0aGlzLl9jaCwgdGhpcy5fY2wsIDE2KSwgZSh0aGlzLl9kaCwgdGhpcy5fZGwsIDI0KSwgZSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKSwgZSh0aGlzLl9maCwgdGhpcy5fZmwsIDQwKSwgZSh0aGlzLl9naCwgdGhpcy5fZ2wsIDQ4KSwgZSh0aGlzLl9oaCwgdGhpcy5faGwsIDU2KSwgdDsKICAgIH07CiAgICBQcC5leHBvcnRzID0gY2E7CiAgfSk7CiAgT3AgPSBUMigoQUksIENwKSA9PiB7CiAgICB2YXIgRzQgPSBJZSgpLCBZNCA9IHloKCksIFg0ID0gcG4oKSwgSjQgPSBUZSgpLkJ1ZmZlciwgUTQgPSBuZXcgQXJyYXkoMTYwKTsKICAgIGZ1bmN0aW9uIFRvKCkgewogICAgICB0aGlzLmluaXQoKSwgdGhpcy5fdyA9IFE0LCBYNC5jYWxsKHRoaXMsIDEyOCwgMTEyKTsKICAgIH0KICAgIEc0KFRvLCBZNCk7CiAgICBUby5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fYWggPSAzNDE4MDcwMzY1LCB0aGlzLl9iaCA9IDE2NTQyNzAyNTAsIHRoaXMuX2NoID0gMjQzODUyOTM3MCwgdGhpcy5fZGggPSAzNTU0NjIzNjAsIHRoaXMuX2VoID0gMTczMTQwNTQxNSwgdGhpcy5fZmggPSAyMzk0MTgwMjMxLCB0aGlzLl9naCA9IDM2NzUwMDg1MjUsIHRoaXMuX2hoID0gMTIwMzA2MjgxMywgdGhpcy5fYWwgPSAzMjM4MzcxMDMyLCB0aGlzLl9ibCA9IDkxNDE1MDY2MywgdGhpcy5fY2wgPSA4MTI3MDI5OTksIHRoaXMuX2RsID0gNDE0NDkxMjY5NywgdGhpcy5fZWwgPSA0MjkwNzc1ODU3LCB0aGlzLl9mbCA9IDE3NTA2MDMwMjUsIHRoaXMuX2dsID0gMTY5NDA3NjgzOSwgdGhpcy5faGwgPSAzMjA0MDc1NDI4LCB0aGlzOwogICAgfTsKICAgIFRvLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdCA9IEo0LmFsbG9jVW5zYWZlKDQ4KTsKICAgICAgZnVuY3Rpb24gZShyLCBvLCBmKSB7CiAgICAgICAgdC53cml0ZUludDMyQkUociwgZiksIHQud3JpdGVJbnQzMkJFKG8sIGYgKyA0KTsKICAgICAgfQogICAgICByZXR1cm4gZSh0aGlzLl9haCwgdGhpcy5fYWwsIDApLCBlKHRoaXMuX2JoLCB0aGlzLl9ibCwgOCksIGUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNiksIGUodGhpcy5fZGgsIHRoaXMuX2RsLCAyNCksIGUodGhpcy5fZWgsIHRoaXMuX2VsLCAzMiksIGUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MCksIHQ7CiAgICB9OwogICAgQ3AuZXhwb3J0cyA9IFRvOwogIH0pOwogIGtvID0gVDIoKGNpLCBGcCkgPT4gewogICAgdmFyIGNpID0gRnAuZXhwb3J0cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZSA9IGUudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIHIgPSBjaVtlXTsKICAgICAgaWYgKCFyKQogICAgICAgIHRocm93IG5ldyBFcnJvcihlICsgIiBpcyBub3Qgc3VwcG9ydGVkICh3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cykiKTsKICAgICAgcmV0dXJuIG5ldyByOwogICAgfTsKICAgIGNpLnNoYSA9IF9wKCk7CiAgICBjaS5zaGExID0gRXAoKTsKICAgIGNpLnNoYTIyNCA9IHFwKCk7CiAgICBjaS5zaGEyNTYgPSBnaCgpOwogICAgY2kuc2hhMzg0ID0gT3AoKTsKICAgIGNpLnNoYTUxMiA9IHloKCk7CiAgfSk7CiAgVHQgPSBUMigoUkksIFVwKSA9PiB7CiAgICBVcC5leHBvcnRzID0geyBBcnJheUlzQXJyYXkodCkgewogICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KTsKICAgIH0sIEFycmF5UHJvdG90eXBlSW5jbHVkZXModCwgZSkgewogICAgICByZXR1cm4gdC5pbmNsdWRlcyhlKTsKICAgIH0sIEFycmF5UHJvdG90eXBlSW5kZXhPZih0LCBlKSB7CiAgICAgIHJldHVybiB0LmluZGV4T2YoZSk7CiAgICB9LCBBcnJheVByb3RvdHlwZUpvaW4odCwgZSkgewogICAgICByZXR1cm4gdC5qb2luKGUpOwogICAgfSwgQXJyYXlQcm90b3R5cGVNYXAodCwgZSkgewogICAgICByZXR1cm4gdC5tYXAoZSk7CiAgICB9LCBBcnJheVByb3RvdHlwZVBvcCh0LCBlKSB7CiAgICAgIHJldHVybiB0LnBvcChlKTsKICAgIH0sIEFycmF5UHJvdG90eXBlUHVzaCh0LCBlKSB7CiAgICAgIHJldHVybiB0LnB1c2goZSk7CiAgICB9LCBBcnJheVByb3RvdHlwZVNsaWNlKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQuc2xpY2UoZSwgcik7CiAgICB9LCBFcnJvciwgRnVuY3Rpb25Qcm90b3R5cGVDYWxsKHQsIGUsIC4uLnIpIHsKICAgICAgcmV0dXJuIHQuY2FsbChlLCAuLi5yKTsKICAgIH0sIEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2UodCwgZSkgewogICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbCh0LCBlKTsKICAgIH0sIE1hdGhGbG9vcjogTWF0aC5mbG9vciwgTnVtYmVyLCBOdW1iZXJJc0ludGVnZXI6IE51bWJlci5pc0ludGVnZXIsIE51bWJlcklzTmFOOiBOdW1iZXIuaXNOYU4sIE51bWJlck1BWF9TQUZFX0lOVEVHRVI6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgTnVtYmVyUGFyc2VJbnQ6IE51bWJlci5wYXJzZUludCwgT2JqZWN0RGVmaW5lUHJvcGVydGllcyh0LCBlKSB7CiAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LCBlKTsKICAgIH0sIE9iamVjdERlZmluZVByb3BlcnR5KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCByKTsKICAgIH0sIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKSB7CiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpOwogICAgfSwgT2JqZWN0S2V5cyh0KSB7CiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KTsKICAgIH0sIE9iamVjdFNldFByb3RvdHlwZU9mKHQsIGUpIHsKICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBlKTsKICAgIH0sIFByb21pc2UsIFByb21pc2VQcm90b3R5cGVDYXRjaCh0LCBlKSB7CiAgICAgIHJldHVybiB0LmNhdGNoKGUpOwogICAgfSwgUHJvbWlzZVByb3RvdHlwZVRoZW4odCwgZSwgcikgewogICAgICByZXR1cm4gdC50aGVuKGUsIHIpOwogICAgfSwgUHJvbWlzZVJlamVjdCh0KSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh0KTsKICAgIH0sIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSwgUmVnRXhwUHJvdG90eXBlVGVzdCh0LCBlKSB7CiAgICAgIHJldHVybiB0LnRlc3QoZSk7CiAgICB9LCBTYWZlU2V0OiBTZXQsIFN0cmluZywgU3RyaW5nUHJvdG90eXBlU2xpY2UodCwgZSwgcikgewogICAgICByZXR1cm4gdC5zbGljZShlLCByKTsKICAgIH0sIFN0cmluZ1Byb3RvdHlwZVRvTG93ZXJDYXNlKHQpIHsKICAgICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTsKICAgIH0sIFN0cmluZ1Byb3RvdHlwZVRvVXBwZXJDYXNlKHQpIHsKICAgICAgcmV0dXJuIHQudG9VcHBlckNhc2UoKTsKICAgIH0sIFN0cmluZ1Byb3RvdHlwZVRyaW0odCkgewogICAgICByZXR1cm4gdC50cmltKCk7CiAgICB9LCBTeW1ib2wsIFN5bWJvbEFzeW5jSXRlcmF0b3I6IFN5bWJvbC5hc3luY0l0ZXJhdG9yLCBTeW1ib2xIYXNJbnN0YW5jZTogU3ltYm9sLmhhc0luc3RhbmNlLCBTeW1ib2xJdGVyYXRvcjogU3ltYm9sLml0ZXJhdG9yLCBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQuc2V0KGUsIHIpOwogICAgfSwgVWludDhBcnJheSB9OwogIH0pOwogIEdyID0gVDIoKEJJLCBNaCkgPT4gewogICAgdmFyIGVfID0gVXQoKSwgdF8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYXN5bmMgZnVuY3Rpb24oKSB7CiAgICB9KS5jb25zdHJ1Y3RvciwgenAgPSBnbG9iYWxUaGlzLkJsb2IgfHwgZV8uQmxvYiwgcl8gPSB0eXBlb2YgenAgPCAidSIgPyBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgenA7CiAgICB9IDogZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LCB3aCA9IGNsYXNzIGV4dGVuZHMgRXJyb3IgewogICAgICBjb25zdHJ1Y3RvcihlKSB7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYW4gQXJyYXksIGdvdCAke3R5cGVvZiBlfWApOwogICAgICAgIGxldCByID0gIiI7CiAgICAgICAgZm9yIChsZXQgbyA9IDA7byA8IGUubGVuZ3RoOyBvKyspCiAgICAgICAgICByICs9IGAgICAgJHtlW29dLnN0YWNrfQpgOwogICAgICAgIHN1cGVyKHIpLCB0aGlzLm5hbWUgPSAiQWdncmVnYXRlRXJyb3IiLCB0aGlzLmVycm9ycyA9IGU7CiAgICAgIH0KICAgIH07CiAgICBNaC5leHBvcnRzID0geyBBZ2dyZWdhdGVFcnJvcjogd2gsIGtFbXB0eU9iamVjdDogT2JqZWN0LmZyZWV6ZSh7fSksIG9uY2UodCkgewogICAgICBsZXQgZSA9IGZhbHNlOwogICAgICByZXR1cm4gZnVuY3Rpb24oLi4ucikgewogICAgICAgIGUgfHwgKGUgPSB0cnVlLCB0LmFwcGx5KHRoaXMsIHIpKTsKICAgICAgfTsKICAgIH0sIGNyZWF0ZURlZmVycmVkUHJvbWlzZTogZnVuY3Rpb24oKSB7CiAgICAgIGxldCB0LCBlOwogICAgICByZXR1cm4geyBwcm9taXNlOiBuZXcgUHJvbWlzZSgobywgZikgPT4gewogICAgICAgIHQgPSBvLCBlID0gZjsKICAgICAgfSksIHJlc29sdmU6IHQsIHJlamVjdDogZSB9OwogICAgfSwgcHJvbWlzaWZ5KHQpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCByKSA9PiB7CiAgICAgICAgdCgobywgLi4uZikgPT4gbyA/IHIobykgOiBlKC4uLmYpKTsKICAgICAgfSk7CiAgICB9LCBkZWJ1Z2xvZygpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICB9OwogICAgfSwgZm9ybWF0KHQsIC4uLmUpIHsKICAgICAgcmV0dXJuIHQucmVwbGFjZSgvJShbc2RpZmpdKS9nLCBmdW5jdGlvbiguLi5bciwgb10pIHsKICAgICAgICBsZXQgZiA9IGUuc2hpZnQoKTsKICAgICAgICByZXR1cm4gbyA9PT0gImYiID8gZi50b0ZpeGVkKDYpIDogbyA9PT0gImoiID8gSlNPTi5zdHJpbmdpZnkoZikgOiBvID09PSAicyIgJiYgdHlwZW9mIGYgPT0gIm9iamVjdCIgPyBgJHtmLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgPyBmLmNvbnN0cnVjdG9yLm5hbWUgOiAiIn0ge31gLnRyaW0oKSA6IGYudG9TdHJpbmcoKTsKICAgICAgfSk7CiAgICB9LCBpbnNwZWN0KHQpIHsKICAgICAgc3dpdGNoICh0eXBlb2YgdCkgewogICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICBpZiAodC5pbmNsdWRlcygiJyIpKQogICAgICAgICAgICBpZiAodC5pbmNsdWRlcygnIicpKSB7CiAgICAgICAgICAgICAgaWYgKCF0LmluY2x1ZGVzKCJgIikgJiYgIXQuaW5jbHVkZXMoIiR7IikpCiAgICAgICAgICAgICAgICByZXR1cm4gYFxgJHt0fVxgYDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgcmV0dXJuIGAiJHt0fSJgOwogICAgICAgICAgcmV0dXJuIGAnJHt0fSdgOwogICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICByZXR1cm4gaXNOYU4odCkgPyAiTmFOIiA6IE9iamVjdC5pcyh0LCAtMCkgPyBTdHJpbmcodCkgOiB0OwogICAgICAgIGNhc2UgImJpZ2ludCI6CiAgICAgICAgICByZXR1cm4gYCR7U3RyaW5nKHQpfW5gOwogICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgIGNhc2UgInVuZGVmaW5lZCI6CiAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpOwogICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICByZXR1cm4gInt9IjsKICAgICAgfQogICAgfSwgdHlwZXM6IHsgaXNBc3luY0Z1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB0XzsKICAgIH0sIGlzQXJyYXlCdWZmZXJWaWV3KHQpIHsKICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KTsKICAgIH0gfSwgaXNCbG9iOiByXyB9OwogICAgTWguZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0gU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpOwogIH0pOwogIE5vID0gVDIoKHFJLCBMbykgPT4gewogICAgdmFyIHsgQWJvcnRDb250cm9sbGVyOiBIcCwgQWJvcnRTaWduYWw6IGlfIH0gPSB0eXBlb2Ygc2VsZiA8ICJ1IiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93IDwgInUiID8gd2luZG93IDogdW5kZWZpbmVkOwogICAgTG8uZXhwb3J0cyA9IEhwOwogICAgTG8uZXhwb3J0cy5BYm9ydFNpZ25hbCA9IGlfOwogICAgTG8uZXhwb3J0cy5kZWZhdWx0ID0gSHA7CiAgfSk7CiAgSnQgPSBUMigoSUksIGpwKSA9PiB7CiAgICB2YXIgeyBmb3JtYXQ6IG5fLCBpbnNwZWN0OiBEbywgQWdncmVnYXRlRXJyb3I6IGZfIH0gPSBHcigpLCBhXyA9IGdsb2JhbFRoaXMuQWdncmVnYXRlRXJyb3IgfHwgZl8sIG9fID0gU3ltYm9sKCJrSXNOb2RlRXJyb3IiKSwgc18gPSBbInN0cmluZyIsICJmdW5jdGlvbiIsICJudW1iZXIiLCAib2JqZWN0IiwgIkZ1bmN0aW9uIiwgIk9iamVjdCIsICJib29sZWFuIiwgImJpZ2ludCIsICJzeW1ib2wiXSwgaF8gPSAvXihbQS1aXVthLXowLTldKikrJC8sIHVfID0gIl9fbm9kZV9pbnRlcm5hbF8iLCBQbyA9IHt9OwogICAgZnVuY3Rpb24gdm4odCwgZSkgewogICAgICBpZiAoIXQpCiAgICAgICAgdGhyb3cgbmV3IFBvLkVSUl9JTlRFUk5BTF9BU1NFUlRJT04oZSk7CiAgICB9CiAgICBmdW5jdGlvbiBXcCh0KSB7CiAgICAgIGxldCBlID0gIiIsIHIgPSB0Lmxlbmd0aCwgbyA9IHRbMF0gPT09ICItIiA/IDEgOiAwOwogICAgICBmb3IgKDtyID49IG8gKyA0OyByIC09IDMpCiAgICAgICAgZSA9IGBfJHt0LnNsaWNlKHIgLSAzLCByKX0ke2V9YDsKICAgICAgcmV0dXJuIGAke3Quc2xpY2UoMCwgcil9JHtlfWA7CiAgICB9CiAgICBmdW5jdGlvbiBsXyh0LCBlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAiZnVuY3Rpb24iKQogICAgICAgIHJldHVybiB2bihlLmxlbmd0aCA8PSByLmxlbmd0aCwgYENvZGU6ICR7dH07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke3IubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7ZS5sZW5ndGh9KS5gKSwgZSguLi5yKTsKICAgICAgbGV0IG8gPSAoZS5tYXRjaCgvJVtkZmlqb09zXS9nKSB8fCBbXSkubGVuZ3RoOwogICAgICByZXR1cm4gdm4obyA9PT0gci5sZW5ndGgsIGBDb2RlOiAke3R9OyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzIGxlbmd0aCAoJHtyLmxlbmd0aH0pIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1aXJlZCBvbmVzICgke299KS5gKSwgci5sZW5ndGggPT09IDAgPyBlIDogbl8oZSwgLi4ucik7CiAgICB9CiAgICBmdW5jdGlvbiB6dCh0LCBlLCByKSB7CiAgICAgIHIgfHwgKHIgPSBFcnJvcik7CgogICAgICBjbGFzcyBvIGV4dGVuZHMgciB7CiAgICAgICAgY29uc3RydWN0b3IoLi4ucCkgewogICAgICAgICAgc3VwZXIobF8odCwgZSwgcCkpOwogICAgICAgIH0KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske3R9XTogJHt0aGlzLm1lc3NhZ2V9YDsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoby5wcm90b3R5cGUsIHsgbmFtZTogeyB2YWx1ZTogci5uYW1lLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LCB0b1N0cmluZzogeyB2YWx1ZSgpIHsKICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHt0fV06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgIH0sIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSksIG8ucHJvdG90eXBlLmNvZGUgPSB0LCBvLnByb3RvdHlwZVtvX10gPSB0cnVlLCBQb1t0XSA9IG87CiAgICB9CiAgICBmdW5jdGlvbiBLcCh0KSB7CiAgICAgIGxldCBlID0gdV8gKyB0Lm5hbWU7CiAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgIm5hbWUiLCB7IHZhbHVlOiBlIH0pLCB0OwogICAgfQogICAgZnVuY3Rpb24gZF8odCwgZSkgewogICAgICBpZiAodCAmJiBlICYmIHQgIT09IGUpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlLmVycm9ycykpCiAgICAgICAgICByZXR1cm4gZS5lcnJvcnMucHVzaCh0KSwgZTsKICAgICAgICBsZXQgciA9IG5ldyBhXyhbZSwgdF0sIGUubWVzc2FnZSk7CiAgICAgICAgcmV0dXJuIHIuY29kZSA9IGUuY29kZSwgcjsKICAgICAgfQogICAgICByZXR1cm4gdCB8fCBlOwogICAgfQogICAgdmFyIF9oID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7CiAgICAgIGNvbnN0cnVjdG9yKGUgPSAiVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCIsIHIgPSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAociAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiByICE9ICJvYmplY3QiKQogICAgICAgICAgdGhyb3cgbmV3IFBvLkVSUl9JTlZBTElEX0FSR19UWVBFKCJvcHRpb25zIiwgIk9iamVjdCIsIHIpOwogICAgICAgIHN1cGVyKGUsIHIpLCB0aGlzLmNvZGUgPSAiQUJPUlRfRVJSIiwgdGhpcy5uYW1lID0gIkFib3J0RXJyb3IiOwogICAgICB9CiAgICB9OwogICAgenQoIkVSUl9BU1NFUlRJT04iLCAiJXMiLCBFcnJvcik7CiAgICB6dCgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLCAodCwgZSwgcikgPT4gewogICAgICB2bih0eXBlb2YgdCA9PSAic3RyaW5nIiwgIiduYW1lJyBtdXN0IGJlIGEgc3RyaW5nIiksIEFycmF5LmlzQXJyYXkoZSkgfHwgKGUgPSBbZV0pOwogICAgICBsZXQgbyA9ICJUaGUgIjsKICAgICAgdC5lbmRzV2l0aCgiIGFyZ3VtZW50IikgPyBvICs9IGAke3R9IGAgOiBvICs9IGAiJHt0fSIgJHt0LmluY2x1ZGVzKCIuIikgPyAicHJvcGVydHkiIDogImFyZ3VtZW50In0gYCwgbyArPSAibXVzdCBiZSAiOwogICAgICBsZXQgZiA9IFtdLCBwID0gW10sIG0yID0gW107CiAgICAgIGZvciAobGV0IE0gb2YgZSkKICAgICAgICB2bih0eXBlb2YgTSA9PSAic3RyaW5nIiwgIkFsbCBleHBlY3RlZCBlbnRyaWVzIGhhdmUgdG8gYmUgb2YgdHlwZSBzdHJpbmciKSwgc18uaW5jbHVkZXMoTSkgPyBmLnB1c2goTS50b0xvd2VyQ2FzZSgpKSA6IGhfLnRlc3QoTSkgPyBwLnB1c2goTSkgOiAodm4oTSAhPT0gIm9iamVjdCIsICdUaGUgdmFsdWUgIm9iamVjdCIgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgIk9iamVjdCInKSwgbTIucHVzaChNKSk7CiAgICAgIGlmIChwLmxlbmd0aCA+IDApIHsKICAgICAgICBsZXQgTSA9IGYuaW5kZXhPZigib2JqZWN0Iik7CiAgICAgICAgTSAhPT0gLTEgJiYgKGYuc3BsaWNlKGYsIE0sIDEpLCBwLnB1c2goIk9iamVjdCIpKTsKICAgICAgfQogICAgICBpZiAoZi5sZW5ndGggPiAwKSB7CiAgICAgICAgc3dpdGNoIChmLmxlbmd0aCkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBvICs9IGBvZiB0eXBlICR7ZlswXX1gOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgbyArPSBgb25lIG9mIHR5cGUgJHtmWzBdfSBvciAke2ZbMV19YDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGxldCBNID0gZi5wb3AoKTsKICAgICAgICAgICAgbyArPSBgb25lIG9mIHR5cGUgJHtmLmpvaW4oIiwgIil9LCBvciAke019YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKHAubGVuZ3RoID4gMCB8fCBtMi5sZW5ndGggPiAwKSAmJiAobyArPSAiIG9yICIpOwogICAgICB9CiAgICAgIGlmIChwLmxlbmd0aCA+IDApIHsKICAgICAgICBzd2l0Y2ggKHAubGVuZ3RoKSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIG8gKz0gYGFuIGluc3RhbmNlIG9mICR7cFswXX1gOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgbyArPSBgYW4gaW5zdGFuY2Ugb2YgJHtwWzBdfSBvciAke3BbMV19YDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGxldCBNID0gcC5wb3AoKTsKICAgICAgICAgICAgbyArPSBgYW4gaW5zdGFuY2Ugb2YgJHtwLmpvaW4oIiwgIil9LCBvciAke019YDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbTIubGVuZ3RoID4gMCAmJiAobyArPSAiIG9yICIpOwogICAgICB9CiAgICAgIHN3aXRjaCAobTIubGVuZ3RoKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgbTJbMF0udG9Mb3dlckNhc2UoKSAhPT0gbTJbMF0gJiYgKG8gKz0gImFuICIpLCBvICs9IGAke20yWzBdfWA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBvICs9IGBvbmUgb2YgJHttMlswXX0gb3IgJHttMlsxXX1gOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgbGV0IE0gPSBtMi5wb3AoKTsKICAgICAgICAgIG8gKz0gYG9uZSBvZiAke20yLmpvaW4oIiwgIil9LCBvciAke019YDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHIgPT0gbnVsbCkKICAgICAgICBvICs9IGAuIFJlY2VpdmVkICR7cn1gOwogICAgICBlbHNlIGlmICh0eXBlb2YgciA9PSAiZnVuY3Rpb24iICYmIHIubmFtZSkKICAgICAgICBvICs9IGAuIFJlY2VpdmVkIGZ1bmN0aW9uICR7ci5uYW1lfWA7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiByID09ICJvYmplY3QiKSB7CiAgICAgICAgdmFyIHkyOwogICAgICAgICh5MiA9IHIuY29uc3RydWN0b3IpICE9PSBudWxsICYmIHkyICE9PSB1bmRlZmluZWQgJiYgeTIubmFtZSA/IG8gKz0gYC4gUmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgJHtyLmNvbnN0cnVjdG9yLm5hbWV9YCA6IG8gKz0gYC4gUmVjZWl2ZWQgJHtEbyhyLCB7IGRlcHRoOiAtMSB9KX1gOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBNID0gRG8ociwgeyBjb2xvcnM6IGZhbHNlIH0pOwogICAgICAgIE0ubGVuZ3RoID4gMjUgJiYgKE0gPSBgJHtNLnNsaWNlKDAsIDI1KX0uLi5gKSwgbyArPSBgLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIHJ9ICgke019KWA7CiAgICAgIH0KICAgICAgcmV0dXJuIG87CiAgICB9LCBUeXBlRXJyb3IpOwogICAgenQoIkVSUl9JTlZBTElEX0FSR19WQUxVRSIsICh0LCBlLCByID0gImlzIGludmFsaWQiKSA9PiB7CiAgICAgIGxldCBvID0gRG8oZSk7CiAgICAgIHJldHVybiBvLmxlbmd0aCA+IDEyOCAmJiAobyA9IG8uc2xpY2UoMCwgMTI4KSArICIuLi4iKSwgYFRoZSAke3QuaW5jbHVkZXMoIi4iKSA/ICJwcm9wZXJ0eSIgOiAiYXJndW1lbnQifSAnJHt0fScgJHtyfS4gUmVjZWl2ZWQgJHtvfWA7CiAgICB9LCBUeXBlRXJyb3IpOwogICAgenQoIkVSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSIsICh0LCBlLCByKSA9PiB7CiAgICAgIHZhciBvOwogICAgICBsZXQgZiA9IHIgIT0gbnVsbCAmJiAobyA9IHIuY29uc3RydWN0b3IpICE9PSBudWxsICYmIG8gIT09IHVuZGVmaW5lZCAmJiBvLm5hbWUgPyBgaW5zdGFuY2Ugb2YgJHtyLmNvbnN0cnVjdG9yLm5hbWV9YCA6IGB0eXBlICR7dHlwZW9mIHJ9YDsKICAgICAgcmV0dXJuIGBFeHBlY3RlZCAke3R9IHRvIGJlIHJldHVybmVkIGZyb20gdGhlICIke2V9IiBmdW5jdGlvbiBidXQgZ290ICR7Zn0uYDsKICAgIH0sIFR5cGVFcnJvcik7CiAgICB6dCgiRVJSX01JU1NJTkdfQVJHUyIsICguLi50KSA9PiB7CiAgICAgIHZuKHQubGVuZ3RoID4gMCwgIkF0IGxlYXN0IG9uZSBhcmcgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIik7CiAgICAgIGxldCBlLCByID0gdC5sZW5ndGg7CiAgICAgIHN3aXRjaCAodCA9IChBcnJheS5pc0FycmF5KHQpID8gdCA6IFt0XSkubWFwKChvKSA9PiBgIiR7b30iYCkuam9pbigiIG9yICIpLCByKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgZSArPSBgVGhlICR7dFswXX0gYXJndW1lbnRgOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgZSArPSBgVGhlICR7dFswXX0gYW5kICR7dFsxXX0gYXJndW1lbnRzYDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGxldCBvID0gdC5wb3AoKTsKICAgICAgICAgICAgZSArPSBgVGhlICR7dC5qb2luKCIsICIpfSwgYW5kICR7b30gYXJndW1lbnRzYDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBgJHtlfSBtdXN0IGJlIHNwZWNpZmllZGA7CiAgICB9LCBUeXBlRXJyb3IpOwogICAgenQoIkVSUl9PVVRfT0ZfUkFOR0UiLCAodCwgZSwgcikgPT4gewogICAgICB2bihlLCAnTWlzc2luZyAicmFuZ2UiIGFyZ3VtZW50Jyk7CiAgICAgIGxldCBvOwogICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihyKSAmJiBNYXRoLmFicyhyKSA+IDIgKiogMzIgPyBvID0gV3AoU3RyaW5nKHIpKSA6IHR5cGVvZiByID09ICJiaWdpbnQiID8gKG8gPSBTdHJpbmcociksIChyID4gMm4gKiogMzJuIHx8IHIgPCAtKDJuICoqIDMybikpICYmIChvID0gV3AobykpLCBvICs9ICJuIikgOiBvID0gRG8ociksIGBUaGUgdmFsdWUgb2YgIiR7dH0iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSAke2V9LiBSZWNlaXZlZCAke299YDsKICAgIH0sIFJhbmdlRXJyb3IpOwogICAgenQoIkVSUl9NVUxUSVBMRV9DQUxMQkFDSyIsICJDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBFcnJvcik7CiAgICB6dCgiRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQiLCAiVGhlICVzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQiLCBFcnJvcik7CiAgICB6dCgiRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEIiwgIkNhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBmaW5pc2hlZCIsIEVycm9yKTsKICAgIHp0KCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFIiwgIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiLCBFcnJvcik7CiAgICB6dCgiRVJSX1NUUkVBTV9ERVNUUk9ZRUQiLCAiQ2Fubm90IGNhbGwgJXMgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZCIsIEVycm9yKTsKICAgIHp0KCJFUlJfU1RSRUFNX05VTExfVkFMVUVTIiwgIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIiwgVHlwZUVycm9yKTsKICAgIHp0KCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIsICJQcmVtYXR1cmUgY2xvc2UiLCBFcnJvcik7CiAgICB6dCgiRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRiIsICJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIsIEVycm9yKTsKICAgIHp0KCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UIiwgInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50IiwgRXJyb3IpOwogICAgenQoIkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EIiwgIndyaXRlIGFmdGVyIGVuZCIsIEVycm9yKTsKICAgIHp0KCJFUlJfVU5LTk9XTl9FTkNPRElORyIsICJVbmtub3duIGVuY29kaW5nOiAlcyIsIFR5cGVFcnJvcik7CiAgICBqcC5leHBvcnRzID0geyBBYm9ydEVycm9yOiBfaCwgYWdncmVnYXRlVHdvRXJyb3JzOiBLcChkXyksIGhpZGVTdGFja0ZyYW1lczogS3AsIGNvZGVzOiBQbyB9OwogIH0pOwogIHBhID0gVDIoKFRJLCBRcCkgPT4gewogICAgdmFyIHsgQXJyYXlJc0FycmF5OiAkcCwgQXJyYXlQcm90b3R5cGVJbmNsdWRlczogR3AsIEFycmF5UHJvdG90eXBlSm9pbjogWXAsIEFycmF5UHJvdG90eXBlTWFwOiBjXywgTnVtYmVySXNJbnRlZ2VyOiBTaCwgTnVtYmVySXNOYU46IHBfLCBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSOiB2XywgTnVtYmVyTUlOX1NBRkVfSU5URUdFUjogYl8sIE51bWJlclBhcnNlSW50OiBtXywgT2JqZWN0UHJvdG90eXBlSGFzT3duUHJvcGVydHk6IGdfLCBSZWdFeHBQcm90b3R5cGVFeGVjOiB5XywgU3RyaW5nOiB3XywgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2U6IE1fLCBTdHJpbmdQcm90b3R5cGVUcmltOiBfXyB9ID0gVHQoKSwgeyBoaWRlU3RhY2tGcmFtZXM6IElyLCBjb2RlczogeyBFUlJfU09DS0VUX0JBRF9QT1JUOiB4XywgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHRyLCBFUlJfSU5WQUxJRF9BUkdfVkFMVUU6IENvLCBFUlJfT1VUX09GX1JBTkdFOiBibiwgRVJSX1VOS05PV05fU0lHTkFMOiBacCB9IH0gPSBKdCgpLCB7IG5vcm1hbGl6ZUVuY29kaW5nOiBTXyB9ID0gR3IoKSwgeyBpc0FzeW5jRnVuY3Rpb246IEVfLCBpc0FycmF5QnVmZmVyVmlldzogQV8gfSA9IEdyKCkudHlwZXMsIFZwID0ge307CiAgICBmdW5jdGlvbiBSXyh0KSB7CiAgICAgIHJldHVybiB0ID09PSAodCB8IDApOwogICAgfQogICAgZnVuY3Rpb24gQl8odCkgewogICAgICByZXR1cm4gdCA9PT0gdCA+Pj4gMDsKICAgIH0KICAgIHZhciBxXyA9IC9eWzAtN10rJC8sIElfID0gIm11c3QgYmUgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBvciBhbiBvY3RhbCBzdHJpbmciOwogICAgZnVuY3Rpb24gVF8odCwgZSwgcikgewogICAgICBpZiAodHlwZW9mIHQgPiAidSIgJiYgKHQgPSByKSwgdHlwZW9mIHQgPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAoeV8ocV8sIHQpID09PSBudWxsKQogICAgICAgICAgdGhyb3cgbmV3IENvKGUsIHQsIElfKTsKICAgICAgICB0ID0gbV8odCwgOCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFhwKHQsIGUpLCB0OwogICAgfQogICAgdmFyIGtfID0gSXIoKHQsIGUsIHIgPSBiXywgbyA9IHZfKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIm51bWJlciIsIHQpOwogICAgICBpZiAoIVNoKHQpKQogICAgICAgIHRocm93IG5ldyBibihlLCAiYW4gaW50ZWdlciIsIHQpOwogICAgICBpZiAodCA8IHIgfHwgdCA+IG8pCiAgICAgICAgdGhyb3cgbmV3IGJuKGUsIGA+PSAke3J9ICYmIDw9ICR7b31gLCB0KTsKICAgIH0pLCBMXyA9IElyKCh0LCBlLCByID0gLTIxNDc0ODM2NDgsIG8gPSAyMTQ3NDgzNjQ3KSA9PiB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIm51bWJlciIsIHQpOwogICAgICBpZiAoIVNoKHQpKQogICAgICAgIHRocm93IG5ldyBibihlLCAiYW4gaW50ZWdlciIsIHQpOwogICAgICBpZiAodCA8IHIgfHwgdCA+IG8pCiAgICAgICAgdGhyb3cgbmV3IGJuKGUsIGA+PSAke3J9ICYmIDw9ICR7b31gLCB0KTsKICAgIH0pLCBYcCA9IElyKCh0LCBlLCByID0gZmFsc2UpID0+IHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyB0cihlLCAibnVtYmVyIiwgdCk7CiAgICAgIGlmICghU2godCkpCiAgICAgICAgdGhyb3cgbmV3IGJuKGUsICJhbiBpbnRlZ2VyIiwgdCk7CiAgICAgIGxldCBvID0gciA/IDEgOiAwLCBmID0gNDI5NDk2NzI5NTsKICAgICAgaWYgKHQgPCBvIHx8IHQgPiBmKQogICAgICAgIHRocm93IG5ldyBibihlLCBgPj0gJHtvfSAmJiA8PSAke2Z9YCwgdCk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIEpwKHQsIGUpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJzdHJpbmciKQogICAgICAgIHRocm93IG5ldyB0cihlLCAic3RyaW5nIiwgdCk7CiAgICB9CiAgICBmdW5jdGlvbiBOXyh0LCBlLCByID0gdW5kZWZpbmVkLCBvKSB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIm51bWJlciIsIHQpOwogICAgICBpZiAociAhPSBudWxsICYmIHQgPCByIHx8IG8gIT0gbnVsbCAmJiB0ID4gbyB8fCAociAhPSBudWxsIHx8IG8gIT0gbnVsbCkgJiYgcF8odCkpCiAgICAgICAgdGhyb3cgbmV3IGJuKGUsIGAke3IgIT0gbnVsbCA/IGA+PSAke3J9YCA6ICIifSR7ciAhPSBudWxsICYmIG8gIT0gbnVsbCA/ICIgJiYgIiA6ICIifSR7byAhPSBudWxsID8gYDw9ICR7b31gIDogIiJ9YCwgdCk7CiAgICB9CiAgICB2YXIgRF8gPSBJcigodCwgZSwgcikgPT4gewogICAgICBpZiAoIUdwKHIsIHQpKSB7CiAgICAgICAgbGV0IG8gPSBZcChjXyhyLCAocCkgPT4gdHlwZW9mIHAgPT0gInN0cmluZyIgPyBgJyR7cH0nYCA6IHdfKHApKSwgIiwgIiksIGYgPSAibXVzdCBiZSBvbmUgb2Y6ICIgKyBvOwogICAgICAgIHRocm93IG5ldyBDbyhlLCB0LCBmKTsKICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbiBQXyh0LCBlKSB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAiYm9vbGVhbiIpCiAgICAgICAgdGhyb3cgbmV3IHRyKGUsICJib29sZWFuIiwgdCk7CiAgICB9CiAgICBmdW5jdGlvbiB4aCh0LCBlLCByKSB7CiAgICAgIHJldHVybiB0ID09IG51bGwgfHwgIWdfKHQsIGUpID8gciA6IHRbZV07CiAgICB9CiAgICB2YXIgQ18gPSBJcigodCwgZSwgciA9IG51bGwpID0+IHsKICAgICAgbGV0IG8gPSB4aChyLCAiYWxsb3dBcnJheSIsIGZhbHNlKSwgZiA9IHhoKHIsICJhbGxvd0Z1bmN0aW9uIiwgZmFsc2UpOwogICAgICBpZiAoIXhoKHIsICJudWxsYWJsZSIsIGZhbHNlKSAmJiB0ID09PSBudWxsIHx8ICFvICYmICRwKHQpIHx8IHR5cGVvZiB0ICE9ICJvYmplY3QiICYmICghZiB8fCB0eXBlb2YgdCAhPSAiZnVuY3Rpb24iKSkKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIk9iamVjdCIsIHQpOwogICAgfSksIE9fID0gSXIoKHQsIGUsIHIgPSAwKSA9PiB7CiAgICAgIGlmICghJHAodCkpCiAgICAgICAgdGhyb3cgbmV3IHRyKGUsICJBcnJheSIsIHQpOwogICAgICBpZiAodC5sZW5ndGggPCByKSB7CiAgICAgICAgbGV0IG8gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke3J9YDsKICAgICAgICB0aHJvdyBuZXcgQ28oZSwgdCwgbyk7CiAgICAgIH0KICAgIH0pOwogICAgZnVuY3Rpb24gRl8odCwgZSA9ICJzaWduYWwiKSB7CiAgICAgIGlmIChKcCh0LCBlKSwgVnBbdF0gPT09IHVuZGVmaW5lZCkKICAgICAgICB0aHJvdyBWcFtNXyh0KV0gIT09IHVuZGVmaW5lZCA/IG5ldyBacCh0ICsgIiAoc2lnbmFscyBtdXN0IHVzZSBhbGwgY2FwaXRhbCBsZXR0ZXJzKSIpIDogbmV3IFpwKHQpOwogICAgfQogICAgdmFyIFVfID0gSXIoKHQsIGUgPSAiYnVmZmVyIikgPT4gewogICAgICBpZiAoIUFfKHQpKQogICAgICAgIHRocm93IG5ldyB0cihlLCBbIkJ1ZmZlciIsICJUeXBlZEFycmF5IiwgIkRhdGFWaWV3Il0sIHQpOwogICAgfSk7CiAgICBmdW5jdGlvbiB6Xyh0LCBlKSB7CiAgICAgIGxldCByID0gU18oZSksIG8gPSB0Lmxlbmd0aDsKICAgICAgaWYgKHIgPT09ICJoZXgiICYmIG8gJSAyICE9PSAwKQogICAgICAgIHRocm93IG5ldyBDbygiZW5jb2RpbmciLCBlLCBgaXMgaW52YWxpZCBmb3IgZGF0YSBvZiBsZW5ndGggJHtvfWApOwogICAgfQogICAgZnVuY3Rpb24gSF8odCwgZSA9ICJQb3J0IiwgciA9IHRydWUpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiICYmIHR5cGVvZiB0ICE9ICJzdHJpbmciIHx8IHR5cGVvZiB0ID09ICJzdHJpbmciICYmIF9fKHQpLmxlbmd0aCA9PT0gMCB8fCArdCAhPT0gK3QgPj4+IDAgfHwgdCA+IDY1NTM1IHx8IHQgPT09IDAgJiYgIXIpCiAgICAgICAgdGhyb3cgbmV3IHhfKGUsIHQsIHIpOwogICAgICByZXR1cm4gdCB8IDA7CiAgICB9CiAgICB2YXIgV18gPSBJcigodCwgZSkgPT4gewogICAgICBpZiAodCAhPT0gdW5kZWZpbmVkICYmICh0ID09PSBudWxsIHx8IHR5cGVvZiB0ICE9ICJvYmplY3QiIHx8ICEoImFib3J0ZWQiIGluIHQpKSkKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIkFib3J0U2lnbmFsIiwgdCk7CiAgICB9KSwgS18gPSBJcigodCwgZSkgPT4gewogICAgICBpZiAodHlwZW9mIHQgIT0gImZ1bmN0aW9uIikKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIkZ1bmN0aW9uIiwgdCk7CiAgICB9KSwgal8gPSBJcigodCwgZSkgPT4gewogICAgICBpZiAodHlwZW9mIHQgIT0gImZ1bmN0aW9uIiB8fCBFXyh0KSkKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgIkZ1bmN0aW9uIiwgdCk7CiAgICB9KSwgWl8gPSBJcigodCwgZSkgPT4gewogICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKQogICAgICAgIHRocm93IG5ldyB0cihlLCAidW5kZWZpbmVkIiwgdCk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIFZfKHQsIGUsIHIpIHsKICAgICAgaWYgKCFHcChyLCB0KSkKICAgICAgICB0aHJvdyBuZXcgdHIoZSwgYCgnJHtZcChyLCAifCIpfScpYCwgdCk7CiAgICB9CiAgICBRcC5leHBvcnRzID0geyBpc0ludDMyOiBSXywgaXNVaW50MzI6IEJfLCBwYXJzZUZpbGVNb2RlOiBUXywgdmFsaWRhdGVBcnJheTogT18sIHZhbGlkYXRlQm9vbGVhbjogUF8sIHZhbGlkYXRlQnVmZmVyOiBVXywgdmFsaWRhdGVFbmNvZGluZzogel8sIHZhbGlkYXRlRnVuY3Rpb246IEtfLCB2YWxpZGF0ZUludDMyOiBMXywgdmFsaWRhdGVJbnRlZ2VyOiBrXywgdmFsaWRhdGVOdW1iZXI6IE5fLCB2YWxpZGF0ZU9iamVjdDogQ18sIHZhbGlkYXRlT25lT2Y6IERfLCB2YWxpZGF0ZVBsYWluRnVuY3Rpb246IGpfLCB2YWxpZGF0ZVBvcnQ6IEhfLCB2YWxpZGF0ZVNpZ25hbE5hbWU6IEZfLCB2YWxpZGF0ZVN0cmluZzogSnAsIHZhbGlkYXRlVWludDMyOiBYcCwgdmFsaWRhdGVVbmRlZmluZWQ6IFpfLCB2YWxpZGF0ZVVuaW9uOiBWXywgdmFsaWRhdGVBYm9ydFNpZ25hbDogV18gfTsKICB9KTsKICBSaCA9IFQyKChrSSwgaTEpID0+IHsKICAgIHZhciBkdCA9IGkxLmV4cG9ydHMgPSB7fSwgWXIsIFhyOwogICAgZnVuY3Rpb24gRWgoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpOwogICAgfQogICAgZnVuY3Rpb24gQWgoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIik7CiAgICB9CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdHlwZW9mIHNldFRpbWVvdXQgPT0gImZ1bmN0aW9uIiA/IFlyID0gc2V0VGltZW91dCA6IFlyID0gRWg7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIFlyID0gRWg7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICB0eXBlb2YgY2xlYXJUaW1lb3V0ID09ICJmdW5jdGlvbiIgPyBYciA9IGNsZWFyVGltZW91dCA6IFhyID0gQWg7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIFhyID0gQWg7CiAgICAgIH0KICAgIH0pKCk7CiAgICBmdW5jdGlvbiBlMSh0KSB7CiAgICAgIGlmIChZciA9PT0gc2V0VGltZW91dCkKICAgICAgICByZXR1cm4gc2V0VGltZW91dCh0LCAwKTsKICAgICAgaWYgKChZciA9PT0gRWggfHwgIVlyKSAmJiBzZXRUaW1lb3V0KQogICAgICAgIHJldHVybiBZciA9IHNldFRpbWVvdXQsIHNldFRpbWVvdXQodCwgMCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIFlyKHQsIDApOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIFlyLmNhbGwobnVsbCwgdCwgMCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICByZXR1cm4gWXIuY2FsbCh0aGlzLCB0LCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uICRfKHQpIHsKICAgICAgaWYgKFhyID09PSBjbGVhclRpbWVvdXQpCiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dCh0KTsKICAgICAgaWYgKChYciA9PT0gQWggfHwgIVhyKSAmJiBjbGVhclRpbWVvdXQpCiAgICAgICAgcmV0dXJuIFhyID0gY2xlYXJUaW1lb3V0LCBjbGVhclRpbWVvdXQodCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIFhyKHQpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIFhyLmNhbGwobnVsbCwgdCk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICByZXR1cm4gWHIuY2FsbCh0aGlzLCB0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBwaSA9IFtdLCBuZiA9IGZhbHNlLCBtbiwgT28gPSAtMTsKICAgIGZ1bmN0aW9uIEdfKCkgewogICAgICAhbmYgfHwgIW1uIHx8IChuZiA9IGZhbHNlLCBtbi5sZW5ndGggPyBwaSA9IG1uLmNvbmNhdChwaSkgOiBPbyA9IC0xLCBwaS5sZW5ndGggJiYgdDEoKSk7CiAgICB9CiAgICBmdW5jdGlvbiB0MSgpIHsKICAgICAgaWYgKCFuZikgewogICAgICAgIHZhciB0ID0gZTEoR18pOwogICAgICAgIG5mID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBlID0gcGkubGVuZ3RoO2U7ICkgewogICAgICAgICAgZm9yIChtbiA9IHBpLCBwaSA9IFtdOysrT28gPCBlOyApCiAgICAgICAgICAgIG1uICYmIG1uW09vXS5ydW4oKTsKICAgICAgICAgIE9vID0gLTEsIGUgPSBwaS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIG1uID0gbnVsbCwgbmYgPSBmYWxzZSwgJF8odCk7CiAgICAgIH0KICAgIH0KICAgIGR0Lm5leHRUaWNrID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkKICAgICAgICBmb3IgKHZhciByID0gMTtyIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKQogICAgICAgICAgZVtyIC0gMV0gPSBhcmd1bWVudHNbcl07CiAgICAgIHBpLnB1c2gobmV3IHIxKHQsIGUpKSwgcGkubGVuZ3RoID09PSAxICYmICFuZiAmJiBlMSh0MSk7CiAgICB9OwogICAgZnVuY3Rpb24gcjEodCwgZSkgewogICAgICB0aGlzLmZ1biA9IHQsIHRoaXMuYXJyYXkgPSBlOwogICAgfQogICAgcjEucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTsKICAgIH07CiAgICBkdC50aXRsZSA9ICJicm93c2VyIjsKICAgIGR0LmJyb3dzZXIgPSB0cnVlOwogICAgZHQuZW52ID0ge307CiAgICBkdC5hcmd2ID0gW107CiAgICBkdC52ZXJzaW9uID0gIiI7CiAgICBkdC52ZXJzaW9ucyA9IHt9OwogICAgZnVuY3Rpb24gdmkoKSB7CiAgICB9CiAgICBkdC5vbiA9IHZpOwogICAgZHQuYWRkTGlzdGVuZXIgPSB2aTsKICAgIGR0Lm9uY2UgPSB2aTsKICAgIGR0Lm9mZiA9IHZpOwogICAgZHQucmVtb3ZlTGlzdGVuZXIgPSB2aTsKICAgIGR0LnJlbW92ZUFsbExpc3RlbmVycyA9IHZpOwogICAgZHQuZW1pdCA9IHZpOwogICAgZHQucHJlcGVuZExpc3RlbmVyID0gdmk7CiAgICBkdC5wcmVwZW5kT25jZUxpc3RlbmVyID0gdmk7CiAgICBkdC5saXN0ZW5lcnMgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBbXTsKICAgIH07CiAgICBkdC5iaW5kaW5nID0gZnVuY3Rpb24odCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICB9OwogICAgZHQuY3dkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAiLyI7CiAgICB9OwogICAgZHQuY2hkaXIgPSBmdW5jdGlvbih0KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICB9OwogICAgZHQudW1hc2sgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9OwogIH0pOwogIHByID0ge307CiAgSmEocHIsIHsgZGVmYXVsdDogKCkgPT4gWV8gfSk7CiAgT2kgPSBSMCgoKSA9PiB7CiAgICBvdChwciwgcm4oUmgoKSkpOwogICAgWV8gPSBybihSaCgpKTsKICB9KTsKICBGaSA9IFQyKChOSSwgdjEpID0+IHsKICAgIHZhciB7IFN5bWJvbDogRm8sIFN5bWJvbEFzeW5jSXRlcmF0b3I6IG4xLCBTeW1ib2xJdGVyYXRvcjogZjEgfSA9IFR0KCksIGExID0gRm8oImtEZXN0cm95ZWQiKSwgbzEgPSBGbygia0lzRXJyb3JlZCIpLCBCaCA9IEZvKCJrSXNSZWFkYWJsZSIpLCBzMSA9IEZvKCJrSXNEaXN0dXJiZWQiKTsKICAgIGZ1bmN0aW9uIFVvKHQsIGUgPSBmYWxzZSkgewogICAgICB2YXIgcjsKICAgICAgcmV0dXJuICEhKHQgJiYgdHlwZW9mIHQucGlwZSA9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiB0Lm9uID09ICJmdW5jdGlvbiIgJiYgKCFlIHx8IHR5cGVvZiB0LnBhdXNlID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHQucmVzdW1lID09ICJmdW5jdGlvbiIpICYmICghdC5fd3JpdGFibGVTdGF0ZSB8fCAoKHIgPSB0Ll9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCByID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByLnJlYWRhYmxlKSAhPT0gZmFsc2UpICYmICghdC5fd3JpdGFibGVTdGF0ZSB8fCB0Ll9yZWFkYWJsZVN0YXRlKSk7CiAgICB9CiAgICBmdW5jdGlvbiB6byh0KSB7CiAgICAgIHZhciBlOwogICAgICByZXR1cm4gISEodCAmJiB0eXBlb2YgdC53cml0ZSA9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiB0Lm9uID09ICJmdW5jdGlvbiIgJiYgKCF0Ll9yZWFkYWJsZVN0YXRlIHx8ICgoZSA9IHQuX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGUud3JpdGFibGUpICE9PSBmYWxzZSkpOwogICAgfQogICAgZnVuY3Rpb24gWF8odCkgewogICAgICByZXR1cm4gISEodCAmJiB0eXBlb2YgdC5waXBlID09ICJmdW5jdGlvbiIgJiYgdC5fcmVhZGFibGVTdGF0ZSAmJiB0eXBlb2YgdC5vbiA9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiB0LndyaXRlID09ICJmdW5jdGlvbiIpOwogICAgfQogICAgZnVuY3Rpb24gZ24odCkgewogICAgICByZXR1cm4gdCAmJiAodC5fcmVhZGFibGVTdGF0ZSB8fCB0Ll93cml0YWJsZVN0YXRlIHx8IHR5cGVvZiB0LndyaXRlID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHQub24gPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgdC5waXBlID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIHQub24gPT0gImZ1bmN0aW9uIik7CiAgICB9CiAgICBmdW5jdGlvbiBKXyh0LCBlKSB7CiAgICAgIHJldHVybiB0ID09IG51bGwgPyBmYWxzZSA6IGUgPT09IHRydWUgPyB0eXBlb2YgdFtuMV0gPT0gImZ1bmN0aW9uIiA6IGUgPT09IGZhbHNlID8gdHlwZW9mIHRbZjFdID09ICJmdW5jdGlvbiIgOiB0eXBlb2YgdFtuMV0gPT0gImZ1bmN0aW9uIiB8fCB0eXBlb2YgdFtmMV0gPT0gImZ1bmN0aW9uIjsKICAgIH0KICAgIGZ1bmN0aW9uIEhvKHQpIHsKICAgICAgaWYgKCFnbih0KSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgbGV0IHsgX3dyaXRhYmxlU3RhdGU6IGUsIF9yZWFkYWJsZVN0YXRlOiByIH0gPSB0LCBvID0gZSB8fCByOwogICAgICByZXR1cm4gISEodC5kZXN0cm95ZWQgfHwgdFthMV0gfHwgbyAhPSBudWxsICYmIG8uZGVzdHJveWVkKTsKICAgIH0KICAgIGZ1bmN0aW9uIGgxKHQpIHsKICAgICAgaWYgKCF6byh0KSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgaWYgKHQud3JpdGFibGVFbmRlZCA9PT0gdHJ1ZSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgbGV0IGUgPSB0Ll93cml0YWJsZVN0YXRlOwogICAgICByZXR1cm4gZSAhPSBudWxsICYmIGUuZXJyb3JlZCA/IGZhbHNlIDogdHlwZW9mIGU/LmVuZGVkICE9ICJib29sZWFuIiA/IG51bGwgOiBlLmVuZGVkOwogICAgfQogICAgZnVuY3Rpb24gUV8odCwgZSkgewogICAgICBpZiAoIXpvKHQpKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBpZiAodC53cml0YWJsZUZpbmlzaGVkID09PSB0cnVlKQogICAgICAgIHJldHVybiB0cnVlOwogICAgICBsZXQgciA9IHQuX3dyaXRhYmxlU3RhdGU7CiAgICAgIHJldHVybiByICE9IG51bGwgJiYgci5lcnJvcmVkID8gZmFsc2UgOiB0eXBlb2Ygcj8uZmluaXNoZWQgIT0gImJvb2xlYW4iID8gbnVsbCA6ICEhKHIuZmluaXNoZWQgfHwgZSA9PT0gZmFsc2UgJiYgci5lbmRlZCA9PT0gdHJ1ZSAmJiByLmxlbmd0aCA9PT0gMCk7CiAgICB9CiAgICBmdW5jdGlvbiBlOCh0KSB7CiAgICAgIGlmICghVW8odCkpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGlmICh0LnJlYWRhYmxlRW5kZWQgPT09IHRydWUpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGxldCBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgcmV0dXJuICFlIHx8IGUuZXJyb3JlZCA/IGZhbHNlIDogdHlwZW9mIGU/LmVuZGVkICE9ICJib29sZWFuIiA/IG51bGwgOiBlLmVuZGVkOwogICAgfQogICAgZnVuY3Rpb24gdTEodCwgZSkgewogICAgICBpZiAoIVVvKHQpKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBsZXQgciA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIHJldHVybiByICE9IG51bGwgJiYgci5lcnJvcmVkID8gZmFsc2UgOiB0eXBlb2Ygcj8uZW5kRW1pdHRlZCAhPSAiYm9vbGVhbiIgPyBudWxsIDogISEoci5lbmRFbWl0dGVkIHx8IGUgPT09IGZhbHNlICYmIHIuZW5kZWQgPT09IHRydWUgJiYgci5sZW5ndGggPT09IDApOwogICAgfQogICAgZnVuY3Rpb24gbDEodCkgewogICAgICByZXR1cm4gdCAmJiB0W0JoXSAhPSBudWxsID8gdFtCaF0gOiB0eXBlb2YgdD8ucmVhZGFibGUgIT0gImJvb2xlYW4iID8gbnVsbCA6IEhvKHQpID8gZmFsc2UgOiBVbyh0KSAmJiB0LnJlYWRhYmxlICYmICF1MSh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGQxKHQpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB0Py53cml0YWJsZSAhPSAiYm9vbGVhbiIgPyBudWxsIDogSG8odCkgPyBmYWxzZSA6IHpvKHQpICYmIHQud3JpdGFibGUgJiYgIWgxKHQpOwogICAgfQogICAgZnVuY3Rpb24gdDgodCwgZSkgewogICAgICByZXR1cm4gZ24odCkgPyBIbyh0KSA/IHRydWUgOiAhKGU/LnJlYWRhYmxlICE9PSBmYWxzZSAmJiBsMSh0KSB8fCBlPy53cml0YWJsZSAhPT0gZmFsc2UgJiYgZDEodCkpIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHI4KHQpIHsKICAgICAgdmFyIGUsIHI7CiAgICAgIHJldHVybiBnbih0KSA/IHQud3JpdGFibGVFcnJvcmVkID8gdC53cml0YWJsZUVycm9yZWQgOiAoZSA9IChyID0gdC5fd3JpdGFibGVTdGF0ZSkgPT09IG51bGwgfHwgciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogci5lcnJvcmVkKSAhPT0gbnVsbCAmJiBlICE9PSB1bmRlZmluZWQgPyBlIDogbnVsbCA6IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBpOCh0KSB7CiAgICAgIHZhciBlLCByOwogICAgICByZXR1cm4gZ24odCkgPyB0LnJlYWRhYmxlRXJyb3JlZCA/IHQucmVhZGFibGVFcnJvcmVkIDogKGUgPSAociA9IHQuX3JlYWRhYmxlU3RhdGUpID09PSBudWxsIHx8IHIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHIuZXJyb3JlZCkgIT09IG51bGwgJiYgZSAhPT0gdW5kZWZpbmVkID8gZSA6IG51bGwgOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gbjgodCkgewogICAgICBpZiAoIWduKHQpKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBpZiAodHlwZW9mIHQuY2xvc2VkID09ICJib29sZWFuIikKICAgICAgICByZXR1cm4gdC5jbG9zZWQ7CiAgICAgIGxldCB7IF93cml0YWJsZVN0YXRlOiBlLCBfcmVhZGFibGVTdGF0ZTogciB9ID0gdDsKICAgICAgcmV0dXJuIHR5cGVvZiBlPy5jbG9zZWQgPT0gImJvb2xlYW4iIHx8IHR5cGVvZiByPy5jbG9zZWQgPT0gImJvb2xlYW4iID8gZT8uY2xvc2VkIHx8IHI/LmNsb3NlZCA6IHR5cGVvZiB0Ll9jbG9zZWQgPT0gImJvb2xlYW4iICYmIGMxKHQpID8gdC5fY2xvc2VkIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIGMxKHQpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB0Ll9jbG9zZWQgPT0gImJvb2xlYW4iICYmIHR5cGVvZiB0Ll9kZWZhdWx0S2VlcEFsaXZlID09ICJib29sZWFuIiAmJiB0eXBlb2YgdC5fcmVtb3ZlZENvbm5lY3Rpb24gPT0gImJvb2xlYW4iICYmIHR5cGVvZiB0Ll9yZW1vdmVkQ29udExlbiA9PSAiYm9vbGVhbiI7CiAgICB9CiAgICBmdW5jdGlvbiBwMSh0KSB7CiAgICAgIHJldHVybiB0eXBlb2YgdC5fc2VudDEwMCA9PSAiYm9vbGVhbiIgJiYgYzEodCk7CiAgICB9CiAgICBmdW5jdGlvbiBmOCh0KSB7CiAgICAgIHZhciBlOwogICAgICByZXR1cm4gdHlwZW9mIHQuX2NvbnN1bWluZyA9PSAiYm9vbGVhbiIgJiYgdHlwZW9mIHQuX2R1bXBlZCA9PSAiYm9vbGVhbiIgJiYgKChlID0gdC5yZXEpID09PSBudWxsIHx8IGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGUudXBncmFkZU9yQ29ubmVjdCkgPT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGZ1bmN0aW9uIGE4KHQpIHsKICAgICAgaWYgKCFnbih0KSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgbGV0IHsgX3dyaXRhYmxlU3RhdGU6IGUsIF9yZWFkYWJsZVN0YXRlOiByIH0gPSB0LCBvID0gZSB8fCByOwogICAgICByZXR1cm4gIW8gJiYgcDEodCkgfHwgISEobyAmJiBvLmF1dG9EZXN0cm95ICYmIG8uZW1pdENsb3NlICYmIG8uY2xvc2VkID09PSBmYWxzZSk7CiAgICB9CiAgICBmdW5jdGlvbiBvOCh0KSB7CiAgICAgIHZhciBlOwogICAgICByZXR1cm4gISEodCAmJiAoKGUgPSB0W3MxXSkgIT09IG51bGwgJiYgZSAhPT0gdW5kZWZpbmVkID8gZSA6IHQucmVhZGFibGVEaWRSZWFkIHx8IHQucmVhZGFibGVBYm9ydGVkKSk7CiAgICB9CiAgICBmdW5jdGlvbiBzOCh0KSB7CiAgICAgIHZhciBlLCByLCBvLCBmLCBwLCBtMiwgeTIsIE0sIHgsIFM7CiAgICAgIHJldHVybiAhISh0ICYmICgoZSA9IChyID0gKG8gPSAoZiA9IChwID0gKG0yID0gdFtvMV0pICE9PSBudWxsICYmIG0yICE9PSB1bmRlZmluZWQgPyBtMiA6IHQucmVhZGFibGVFcnJvcmVkKSAhPT0gbnVsbCAmJiBwICE9PSB1bmRlZmluZWQgPyBwIDogdC53cml0YWJsZUVycm9yZWQpICE9PSBudWxsICYmIGYgIT09IHVuZGVmaW5lZCA/IGYgOiAoeTIgPSB0Ll9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCB5MiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeTIuZXJyb3JFbWl0dGVkKSAhPT0gbnVsbCAmJiBvICE9PSB1bmRlZmluZWQgPyBvIDogKE0gPSB0Ll93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBNID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNLmVycm9yRW1pdHRlZCkgIT09IG51bGwgJiYgciAhPT0gdW5kZWZpbmVkID8gciA6ICh4ID0gdC5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeC5lcnJvcmVkKSAhPT0gbnVsbCAmJiBlICE9PSB1bmRlZmluZWQgPyBlIDogKFMgPSB0Ll93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBTID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTLmVycm9yZWQpKTsKICAgIH0KICAgIHYxLmV4cG9ydHMgPSB7IGtEZXN0cm95ZWQ6IGExLCBpc0Rpc3R1cmJlZDogbzgsIGtJc0Rpc3R1cmJlZDogczEsIGlzRXJyb3JlZDogczgsIGtJc0Vycm9yZWQ6IG8xLCBpc1JlYWRhYmxlOiBsMSwga0lzUmVhZGFibGU6IEJoLCBpc0Nsb3NlZDogbjgsIGlzRGVzdHJveWVkOiBIbywgaXNEdXBsZXhOb2RlU3RyZWFtOiBYXywgaXNGaW5pc2hlZDogdDgsIGlzSXRlcmFibGU6IEpfLCBpc1JlYWRhYmxlTm9kZVN0cmVhbTogVW8sIGlzUmVhZGFibGVFbmRlZDogZTgsIGlzUmVhZGFibGVGaW5pc2hlZDogdTEsIGlzUmVhZGFibGVFcnJvcmVkOiBpOCwgaXNOb2RlU3RyZWFtOiBnbiwgaXNXcml0YWJsZTogZDEsIGlzV3JpdGFibGVOb2RlU3RyZWFtOiB6bywgaXNXcml0YWJsZUVuZGVkOiBoMSwgaXNXcml0YWJsZUZpbmlzaGVkOiBRXywgaXNXcml0YWJsZUVycm9yZWQ6IHI4LCBpc1NlcnZlclJlcXVlc3Q6IGY4LCBpc1NlcnZlclJlc3BvbnNlOiBwMSwgd2lsbEVtaXRDbG9zZTogYTggfTsKICB9KTsKICBVaSA9IFQyKChESSwgSWgpID0+IHsKICAgIHZhciBmZiA9IChPaSgpLCB1cihwcikpLCB7IEFib3J0RXJyb3I6IGg4LCBjb2RlczogdTggfSA9IEp0KCksIHsgRVJSX0lOVkFMSURfQVJHX1RZUEU6IGw4LCBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTogYjEgfSA9IHU4LCB7IGtFbXB0eU9iamVjdDogbTEsIG9uY2U6IGcxIH0gPSBHcigpLCB7IHZhbGlkYXRlQWJvcnRTaWduYWw6IGQ4LCB2YWxpZGF0ZUZ1bmN0aW9uOiBjOCwgdmFsaWRhdGVPYmplY3Q6IHA4IH0gPSBwYSgpLCB7IFByb21pc2U6IHY4IH0gPSBUdCgpLCB7IGlzQ2xvc2VkOiBiOCwgaXNSZWFkYWJsZTogeTEsIGlzUmVhZGFibGVOb2RlU3RyZWFtOiBxaCwgaXNSZWFkYWJsZUZpbmlzaGVkOiB3MSwgaXNSZWFkYWJsZUVycm9yZWQ6IG04LCBpc1dyaXRhYmxlOiBNMSwgaXNXcml0YWJsZU5vZGVTdHJlYW06IF8xLCBpc1dyaXRhYmxlRmluaXNoZWQ6IHgxLCBpc1dyaXRhYmxlRXJyb3JlZDogZzgsIGlzTm9kZVN0cmVhbTogeTgsIHdpbGxFbWl0Q2xvc2U6IHc4IH0gPSBGaSgpOwogICAgZnVuY3Rpb24gTTgodCkgewogICAgICByZXR1cm4gdC5zZXRIZWFkZXIgJiYgdHlwZW9mIHQuYWJvcnQgPT0gImZ1bmN0aW9uIjsKICAgIH0KICAgIHZhciBfOCA9ICgpID0+IHsKICAgIH07CiAgICBmdW5jdGlvbiBTMSh0LCBlLCByKSB7CiAgICAgIHZhciBvLCBmOwogICAgICBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gKHIgPSBlLCBlID0gbTEpIDogZSA9PSBudWxsID8gZSA9IG0xIDogcDgoZSwgIm9wdGlvbnMiKSwgYzgociwgImNhbGxiYWNrIiksIGQ4KGUuc2lnbmFsLCAib3B0aW9ucy5zaWduYWwiKSwgciA9IGcxKHIpOwogICAgICBsZXQgcCA9IChvID0gZS5yZWFkYWJsZSkgIT09IG51bGwgJiYgbyAhPT0gdW5kZWZpbmVkID8gbyA6IHFoKHQpLCBtMiA9IChmID0gZS53cml0YWJsZSkgIT09IG51bGwgJiYgZiAhPT0gdW5kZWZpbmVkID8gZiA6IF8xKHQpOwogICAgICBpZiAoIXk4KHQpKQogICAgICAgIHRocm93IG5ldyBsOCgic3RyZWFtIiwgIlN0cmVhbSIsIHQpOwogICAgICBsZXQgeyBfd3JpdGFibGVTdGF0ZTogeTIsIF9yZWFkYWJsZVN0YXRlOiBNIH0gPSB0LCB4ID0gKCkgPT4gewogICAgICAgIHQud3JpdGFibGUgfHwgQigpOwogICAgICB9LCBTID0gdzgodCkgJiYgcWgodCkgPT09IHAgJiYgXzEodCkgPT09IG0yLCBFMiA9IHgxKHQsIGZhbHNlKSwgQiA9ICgpID0+IHsKICAgICAgICBFMiA9IHRydWUsIHQuZGVzdHJveWVkICYmIChTID0gZmFsc2UpLCAhKFMgJiYgKCF0LnJlYWRhYmxlIHx8IHApKSAmJiAoIXAgfHwgcTIpICYmIHIuY2FsbCh0KTsKICAgICAgfSwgcTIgPSB3MSh0LCBmYWxzZSksIEwyID0gKCkgPT4gewogICAgICAgIHEyID0gdHJ1ZSwgdC5kZXN0cm95ZWQgJiYgKFMgPSBmYWxzZSksICEoUyAmJiAoIXQud3JpdGFibGUgfHwgbTIpKSAmJiAoIW0yIHx8IEUyKSAmJiByLmNhbGwodCk7CiAgICAgIH0sIGdlID0gKHhlKSA9PiB7CiAgICAgICAgci5jYWxsKHQsIHhlKTsKICAgICAgfSwgX2UgPSBiOCh0KSwgTiA9ICgpID0+IHsKICAgICAgICBfZSA9IHRydWU7CiAgICAgICAgbGV0IHhlID0gZzgodCkgfHwgbTgodCk7CiAgICAgICAgaWYgKHhlICYmIHR5cGVvZiB4ZSAhPSAiYm9vbGVhbiIpCiAgICAgICAgICByZXR1cm4gci5jYWxsKHQsIHhlKTsKICAgICAgICBpZiAocCAmJiAhcTIgJiYgcWgodCwgdHJ1ZSkgJiYgIXcxKHQsIGZhbHNlKSkKICAgICAgICAgIHJldHVybiByLmNhbGwodCwgbmV3IGIxKTsKICAgICAgICBpZiAobTIgJiYgIUUyICYmICF4MSh0LCBmYWxzZSkpCiAgICAgICAgICByZXR1cm4gci5jYWxsKHQsIG5ldyBiMSk7CiAgICAgICAgci5jYWxsKHQpOwogICAgICB9LCB3ZSA9ICgpID0+IHsKICAgICAgICB0LnJlcS5vbigiZmluaXNoIiwgQik7CiAgICAgIH07CiAgICAgIE04KHQpID8gKHQub24oImNvbXBsZXRlIiwgQiksIFMgfHwgdC5vbigiYWJvcnQiLCBOKSwgdC5yZXEgPyB3ZSgpIDogdC5vbigicmVxdWVzdCIsIHdlKSkgOiBtMiAmJiAheTIgJiYgKHQub24oImVuZCIsIHgpLCB0Lm9uKCJjbG9zZSIsIHgpKSwgIVMgJiYgdHlwZW9mIHQuYWJvcnRlZCA9PSAiYm9vbGVhbiIgJiYgdC5vbigiYWJvcnRlZCIsIE4pLCB0Lm9uKCJlbmQiLCBMMiksIHQub24oImZpbmlzaCIsIEIpLCBlLmVycm9yICE9PSBmYWxzZSAmJiB0Lm9uKCJlcnJvciIsIGdlKSwgdC5vbigiY2xvc2UiLCBOKSwgX2UgPyBmZi5uZXh0VGljayhOKSA6IHkyICE9IG51bGwgJiYgeTIuZXJyb3JFbWl0dGVkIHx8IE0gIT0gbnVsbCAmJiBNLmVycm9yRW1pdHRlZCA/IFMgfHwgZmYubmV4dFRpY2soTikgOiAoIXAgJiYgKCFTIHx8IHkxKHQpKSAmJiAoRTIgfHwgTTEodCkgPT09IGZhbHNlKSB8fCAhbTIgJiYgKCFTIHx8IE0xKHQpKSAmJiAocTIgfHwgeTEodCkgPT09IGZhbHNlKSB8fCBNICYmIHQucmVxICYmIHQuYWJvcnRlZCkgJiYgZmYubmV4dFRpY2soTik7CiAgICAgIGxldCB5ZSA9ICgpID0+IHsKICAgICAgICByID0gXzgsIHQucmVtb3ZlTGlzdGVuZXIoImFib3J0ZWQiLCBOKSwgdC5yZW1vdmVMaXN0ZW5lcigiY29tcGxldGUiLCBCKSwgdC5yZW1vdmVMaXN0ZW5lcigiYWJvcnQiLCBOKSwgdC5yZW1vdmVMaXN0ZW5lcigicmVxdWVzdCIsIHdlKSwgdC5yZXEgJiYgdC5yZXEucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIEIpLCB0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLCB4KSwgdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCB4KSwgdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIiwgQiksIHQucmVtb3ZlTGlzdGVuZXIoImVuZCIsIEwyKSwgdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBnZSksIHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgTik7CiAgICAgIH07CiAgICAgIGlmIChlLnNpZ25hbCAmJiAhX2UpIHsKICAgICAgICBsZXQgeGUgPSAoKSA9PiB7CiAgICAgICAgICBsZXQgUmUgPSByOwogICAgICAgICAgeWUoKSwgUmUuY2FsbCh0LCBuZXcgaDgodW5kZWZpbmVkLCB7IGNhdXNlOiBlLnNpZ25hbC5yZWFzb24gfSkpOwogICAgICAgIH07CiAgICAgICAgaWYgKGUuc2lnbmFsLmFib3J0ZWQpCiAgICAgICAgICBmZi5uZXh0VGljayh4ZSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBsZXQgUmUgPSByOwogICAgICAgICAgciA9IGcxKCguLi5FZSkgPT4gewogICAgICAgICAgICBlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIHhlKSwgUmUuYXBwbHkodCwgRWUpOwogICAgICAgICAgfSksIGUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwgeGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geWU7CiAgICB9CiAgICBmdW5jdGlvbiB4OCh0LCBlKSB7CiAgICAgIHJldHVybiBuZXcgdjgoKHIsIG8pID0+IHsKICAgICAgICBTMSh0LCBlLCAoZikgPT4gewogICAgICAgICAgZiA/IG8oZikgOiByKCk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgSWguZXhwb3J0cyA9IFMxOwogICAgSWguZXhwb3J0cy5maW5pc2hlZCA9IHg4OwogIH0pOwogIGsxID0gVDIoKFBJLCBMaCkgPT4gewogICAgdmFyIEIxID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgTm8oKS5BYm9ydENvbnRyb2xsZXIsIHsgY29kZXM6IHsgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHZhLCBFUlJfTUlTU0lOR19BUkdTOiBTOCwgRVJSX09VVF9PRl9SQU5HRTogRTggfSwgQWJvcnRFcnJvcjogSnIgfSA9IEp0KCksIHsgdmFsaWRhdGVBYm9ydFNpZ25hbDogYWYsIHZhbGlkYXRlSW50ZWdlcjogQTgsIHZhbGlkYXRlT2JqZWN0OiBvZiB9ID0gcGEoKSwgUjggPSBUdCgpLlN5bWJvbCgia1dlYWsiKSwgeyBmaW5pc2hlZDogQjggfSA9IFVpKCksIHsgQXJyYXlQcm90b3R5cGVQdXNoOiBxOCwgTWF0aEZsb29yOiBJOCwgTnVtYmVyOiBUOCwgTnVtYmVySXNOYU46IGs4LCBQcm9taXNlOiBFMSwgUHJvbWlzZVJlamVjdDogQTEsIFByb21pc2VQcm90b3R5cGVUaGVuOiBMOCwgU3ltYm9sOiBxMSB9ID0gVHQoKSwgV28gPSBxMSgia0VtcHR5IiksIFIxID0gcTEoImtFb2YiKTsKICAgIGZ1bmN0aW9uIEtvKHQsIGUpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgdGhyb3cgbmV3IHZhKCJmbiIsIFsiRnVuY3Rpb24iLCAiQXN5bmNGdW5jdGlvbiJdLCB0KTsKICAgICAgZSAhPSBudWxsICYmIG9mKGUsICJvcHRpb25zIiksIGU/LnNpZ25hbCAhPSBudWxsICYmIGFmKGUuc2lnbmFsLCAib3B0aW9ucy5zaWduYWwiKTsKICAgICAgbGV0IHIgPSAxOwogICAgICByZXR1cm4gZT8uY29uY3VycmVuY3kgIT0gbnVsbCAmJiAociA9IEk4KGUuY29uY3VycmVuY3kpKSwgQTgociwgImNvbmN1cnJlbmN5IiwgMSksIGFzeW5jIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgdmFyIGYsIHA7CiAgICAgICAgbGV0IG0yID0gbmV3IEIxLCB5MiA9IHRoaXMsIE0gPSBbXSwgeCA9IG0yLnNpZ25hbCwgUyA9IHsgc2lnbmFsOiB4IH0sIEUyID0gKCkgPT4gbTIuYWJvcnQoKTsKICAgICAgICBlICE9IG51bGwgJiYgKGYgPSBlLnNpZ25hbCkgIT09IG51bGwgJiYgZiAhPT0gdW5kZWZpbmVkICYmIGYuYWJvcnRlZCAmJiBFMigpLCBlID09IG51bGwgfHwgKHAgPSBlLnNpZ25hbCkgPT09IG51bGwgfHwgcCA9PT0gdW5kZWZpbmVkIHx8IHAuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCBFMik7CiAgICAgICAgbGV0IEIsIHEyLCBMMiA9IGZhbHNlOwogICAgICAgIGZ1bmN0aW9uIGdlKCkgewogICAgICAgICAgTDIgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBhc3luYyBmdW5jdGlvbiBfZSgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciBhd2FpdCAobGV0IHllIG9mIHkyKSB7CiAgICAgICAgICAgICAgdmFyIE47CiAgICAgICAgICAgICAgaWYgKEwyKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGlmICh4LmFib3J0ZWQpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnI7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHllID0gdCh5ZSwgUyk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoeGUpIHsKICAgICAgICAgICAgICAgIHllID0gQTEoeGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB5ZSAhPT0gV28gJiYgKHR5cGVvZiAoKE4gPSB5ZSkgPT09IG51bGwgfHwgTiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTi5jYXRjaCkgPT0gImZ1bmN0aW9uIiAmJiB5ZS5jYXRjaChnZSksIE0ucHVzaCh5ZSksIEIgJiYgKEIoKSwgQiA9IG51bGwpLCAhTDIgJiYgTS5sZW5ndGggJiYgTS5sZW5ndGggPj0gciAmJiBhd2FpdCBuZXcgRTEoKHhlKSA9PiB7CiAgICAgICAgICAgICAgICBxMiA9IHhlOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNLnB1c2goUjEpOwogICAgICAgICAgfSBjYXRjaCAoeWUpIHsKICAgICAgICAgICAgbGV0IHhlID0gQTEoeWUpOwogICAgICAgICAgICBMOCh4ZSwgdW5kZWZpbmVkLCBnZSksIE0ucHVzaCh4ZSk7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB2YXIgd2U7CiAgICAgICAgICAgIEwyID0gdHJ1ZSwgQiAmJiAoQigpLCBCID0gbnVsbCksIGUgPT0gbnVsbCB8fCAod2UgPSBlLnNpZ25hbCkgPT09IG51bGwgfHwgd2UgPT09IHVuZGVmaW5lZCB8fCB3ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIEUyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2UoKTsKICAgICAgICB0cnkgewogICAgICAgICAgZm9yICg7OyApIHsKICAgICAgICAgICAgZm9yICg7TS5sZW5ndGggPiAwOyApIHsKICAgICAgICAgICAgICBsZXQgTiA9IGF3YWl0IE1bMF07CiAgICAgICAgICAgICAgaWYgKE4gPT09IFIxKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIGlmICh4LmFib3J0ZWQpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnI7CiAgICAgICAgICAgICAgTiAhPT0gV28gJiYgKHlpZWxkIE4pLCBNLnNoaWZ0KCksIHEyICYmIChxMigpLCBxMiA9IG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IG5ldyBFMSgoTikgPT4gewogICAgICAgICAgICAgIEIgPSBOOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgbTIuYWJvcnQoKSwgTDIgPSB0cnVlLCBxMiAmJiAocTIoKSwgcTIgPSBudWxsKTsKICAgICAgICB9CiAgICAgIH0uY2FsbCh0aGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIE44KHQgPSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHQgIT0gbnVsbCAmJiBvZih0LCAib3B0aW9ucyIpLCB0Py5zaWduYWwgIT0gbnVsbCAmJiBhZih0LnNpZ25hbCwgIm9wdGlvbnMuc2lnbmFsIiksIGFzeW5jIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgbGV0IHIgPSAwOwogICAgICAgIGZvciBhd2FpdCAobGV0IGYgb2YgdGhpcykgewogICAgICAgICAgdmFyIG87CiAgICAgICAgICBpZiAodCAhPSBudWxsICYmIChvID0gdC5zaWduYWwpICE9PSBudWxsICYmIG8gIT09IHVuZGVmaW5lZCAmJiBvLmFib3J0ZWQpCiAgICAgICAgICAgIHRocm93IG5ldyBKcih7IGNhdXNlOiB0LnNpZ25hbC5yZWFzb24gfSk7CiAgICAgICAgICB5aWVsZCBbcisrLCBmXTsKICAgICAgICB9CiAgICAgIH0uY2FsbCh0aGlzKTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIEkxKHQsIGUgPSB1bmRlZmluZWQpIHsKICAgICAgZm9yIGF3YWl0IChsZXQgciBvZiBraC5jYWxsKHRoaXMsIHQsIGUpKQogICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBEOCh0LCBlID0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAiZnVuY3Rpb24iKQogICAgICAgIHRocm93IG5ldyB2YSgiZm4iLCBbIkZ1bmN0aW9uIiwgIkFzeW5jRnVuY3Rpb24iXSwgdCk7CiAgICAgIHJldHVybiAhYXdhaXQgSTEuY2FsbCh0aGlzLCBhc3luYyAoLi4ucikgPT4gIWF3YWl0IHQoLi4uciksIGUpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gUDgodCwgZSkgewogICAgICBmb3IgYXdhaXQgKGxldCByIG9mIGtoLmNhbGwodGhpcywgdCwgZSkpCiAgICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBDOCh0LCBlKSB7CiAgICAgIGlmICh0eXBlb2YgdCAhPSAiZnVuY3Rpb24iKQogICAgICAgIHRocm93IG5ldyB2YSgiZm4iLCBbIkZ1bmN0aW9uIiwgIkFzeW5jRnVuY3Rpb24iXSwgdCk7CiAgICAgIGFzeW5jIGZ1bmN0aW9uIHIobywgZikgewogICAgICAgIHJldHVybiBhd2FpdCB0KG8sIGYpLCBXbzsKICAgICAgfQogICAgICBmb3IgYXdhaXQgKGxldCBvIG9mIEtvLmNhbGwodGhpcywgciwgZSkpCiAgICAgICAgOwogICAgfQogICAgZnVuY3Rpb24ga2godCwgZSkgewogICAgICBpZiAodHlwZW9mIHQgIT0gImZ1bmN0aW9uIikKICAgICAgICB0aHJvdyBuZXcgdmEoImZuIiwgWyJGdW5jdGlvbiIsICJBc3luY0Z1bmN0aW9uIl0sIHQpOwogICAgICBhc3luYyBmdW5jdGlvbiByKG8sIGYpIHsKICAgICAgICByZXR1cm4gYXdhaXQgdChvLCBmKSA/IG8gOiBXbzsKICAgICAgfQogICAgICByZXR1cm4gS28uY2FsbCh0aGlzLCByLCBlKTsKICAgIH0KICAgIHZhciBUaCA9IGNsYXNzIGV4dGVuZHMgUzggewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigicmVkdWNlIiksIHRoaXMubWVzc2FnZSA9ICJSZWR1Y2Ugb2YgYW4gZW1wdHkgc3RyZWFtIHJlcXVpcmVzIGFuIGluaXRpYWwgdmFsdWUiOwogICAgICB9CiAgICB9OwogICAgYXN5bmMgZnVuY3Rpb24gTzgodCwgZSwgcikgewogICAgICB2YXIgbzsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJmdW5jdGlvbiIpCiAgICAgICAgdGhyb3cgbmV3IHZhKCJyZWR1Y2VyIiwgWyJGdW5jdGlvbiIsICJBc3luY0Z1bmN0aW9uIl0sIHQpOwogICAgICByICE9IG51bGwgJiYgb2YociwgIm9wdGlvbnMiKSwgcj8uc2lnbmFsICE9IG51bGwgJiYgYWYoci5zaWduYWwsICJvcHRpb25zLnNpZ25hbCIpOwogICAgICBsZXQgZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxOwogICAgICBpZiAociAhPSBudWxsICYmIChvID0gci5zaWduYWwpICE9PSBudWxsICYmIG8gIT09IHVuZGVmaW5lZCAmJiBvLmFib3J0ZWQpIHsKICAgICAgICBsZXQgeCA9IG5ldyBKcih1bmRlZmluZWQsIHsgY2F1c2U6IHIuc2lnbmFsLnJlYXNvbiB9KTsKICAgICAgICB0aHJvdyB0aGlzLm9uY2UoImVycm9yIiwgKCkgPT4gewogICAgICAgIH0pLCBhd2FpdCBCOCh0aGlzLmRlc3Ryb3koeCkpLCB4OwogICAgICB9CiAgICAgIGxldCBwID0gbmV3IEIxLCBtMiA9IHAuc2lnbmFsOwogICAgICBpZiAociAhPSBudWxsICYmIHIuc2lnbmFsKSB7CiAgICAgICAgbGV0IHggPSB7IG9uY2U6IHRydWUsIFtSOF06IHRoaXMgfTsKICAgICAgICByLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsICgpID0+IHAuYWJvcnQoKSwgeCk7CiAgICAgIH0KICAgICAgbGV0IHkyID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgZm9yIGF3YWl0IChsZXQgeCBvZiB0aGlzKSB7CiAgICAgICAgICB2YXIgTTsKICAgICAgICAgIGlmICh5MiA9IHRydWUsIHIgIT0gbnVsbCAmJiAoTSA9IHIuc2lnbmFsKSAhPT0gbnVsbCAmJiBNICE9PSB1bmRlZmluZWQgJiYgTS5hYm9ydGVkKQogICAgICAgICAgICB0aHJvdyBuZXcgSnI7CiAgICAgICAgICBmID8gZSA9IGF3YWl0IHQoZSwgeCwgeyBzaWduYWw6IG0yIH0pIDogKGUgPSB4LCBmID0gdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICgheTIgJiYgIWYpCiAgICAgICAgICB0aHJvdyBuZXcgVGg7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgcC5hYm9ydCgpOwogICAgICB9CiAgICAgIHJldHVybiBlOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gRjgodCkgewogICAgICB0ICE9IG51bGwgJiYgb2YodCwgIm9wdGlvbnMiKSwgdD8uc2lnbmFsICE9IG51bGwgJiYgYWYodC5zaWduYWwsICJvcHRpb25zLnNpZ25hbCIpOwogICAgICBsZXQgZSA9IFtdOwogICAgICBmb3IgYXdhaXQgKGxldCBvIG9mIHRoaXMpIHsKICAgICAgICB2YXIgcjsKICAgICAgICBpZiAodCAhPSBudWxsICYmIChyID0gdC5zaWduYWwpICE9PSBudWxsICYmIHIgIT09IHVuZGVmaW5lZCAmJiByLmFib3J0ZWQpCiAgICAgICAgICB0aHJvdyBuZXcgSnIodW5kZWZpbmVkLCB7IGNhdXNlOiB0LnNpZ25hbC5yZWFzb24gfSk7CiAgICAgICAgcTgoZSwgbyk7CiAgICAgIH0KICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBmdW5jdGlvbiBVOCh0LCBlKSB7CiAgICAgIGxldCByID0gS28uY2FsbCh0aGlzLCB0LCBlKTsKICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgZm9yIGF3YWl0IChsZXQgZiBvZiByKQogICAgICAgICAgeWllbGQqIGY7CiAgICAgIH0uY2FsbCh0aGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIFQxKHQpIHsKICAgICAgaWYgKHQgPSBUOCh0KSwgazgodCkpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGlmICh0IDwgMCkKICAgICAgICB0aHJvdyBuZXcgRTgoIm51bWJlciIsICI+PSAwIiwgdCk7CiAgICAgIHJldHVybiB0OwogICAgfQogICAgZnVuY3Rpb24gejgodCwgZSA9IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gZSAhPSBudWxsICYmIG9mKGUsICJvcHRpb25zIiksIGU/LnNpZ25hbCAhPSBudWxsICYmIGFmKGUuc2lnbmFsLCAib3B0aW9ucy5zaWduYWwiKSwgdCA9IFQxKHQpLCBhc3luYyBmdW5jdGlvbiogKCkgewogICAgICAgIHZhciBvOwogICAgICAgIGlmIChlICE9IG51bGwgJiYgKG8gPSBlLnNpZ25hbCkgIT09IG51bGwgJiYgbyAhPT0gdW5kZWZpbmVkICYmIG8uYWJvcnRlZCkKICAgICAgICAgIHRocm93IG5ldyBKcjsKICAgICAgICBmb3IgYXdhaXQgKGxldCBwIG9mIHRoaXMpIHsKICAgICAgICAgIHZhciBmOwogICAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiAoZiA9IGUuc2lnbmFsKSAhPT0gbnVsbCAmJiBmICE9PSB1bmRlZmluZWQgJiYgZi5hYm9ydGVkKQogICAgICAgICAgICB0aHJvdyBuZXcgSnI7CiAgICAgICAgICB0LS0gPD0gMCAmJiAoeWllbGQgcCk7CiAgICAgICAgfQogICAgICB9LmNhbGwodGhpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBIOCh0LCBlID0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBlICE9IG51bGwgJiYgb2YoZSwgIm9wdGlvbnMiKSwgZT8uc2lnbmFsICE9IG51bGwgJiYgYWYoZS5zaWduYWwsICJvcHRpb25zLnNpZ25hbCIpLCB0ID0gVDEodCksIGFzeW5jIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgdmFyIG87CiAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiAobyA9IGUuc2lnbmFsKSAhPT0gbnVsbCAmJiBvICE9PSB1bmRlZmluZWQgJiYgby5hYm9ydGVkKQogICAgICAgICAgdGhyb3cgbmV3IEpyOwogICAgICAgIGZvciBhd2FpdCAobGV0IHAgb2YgdGhpcykgewogICAgICAgICAgdmFyIGY7CiAgICAgICAgICBpZiAoZSAhPSBudWxsICYmIChmID0gZS5zaWduYWwpICE9PSBudWxsICYmIGYgIT09IHVuZGVmaW5lZCAmJiBmLmFib3J0ZWQpCiAgICAgICAgICAgIHRocm93IG5ldyBKcjsKICAgICAgICAgIGlmICh0LS0gPiAwKQogICAgICAgICAgICB5aWVsZCBwOwogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9LmNhbGwodGhpcyk7CiAgICB9CiAgICBMaC5leHBvcnRzLnN0cmVhbVJldHVybmluZ09wZXJhdG9ycyA9IHsgYXNJbmRleGVkUGFpcnM6IE44LCBkcm9wOiB6OCwgZmlsdGVyOiBraCwgZmxhdE1hcDogVTgsIG1hcDogS28sIHRha2U6IEg4IH07CiAgICBMaC5leHBvcnRzLnByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgPSB7IGV2ZXJ5OiBEOCwgZm9yRWFjaDogQzgsIHJlZHVjZTogTzgsIHRvQXJyYXk6IEY4LCBzb21lOiBJMSwgZmluZDogUDggfTsKICB9KTsKICB5biA9IFQyKChDSSwgVTEpID0+IHsKICAgIHZhciB6aSA9IChPaSgpLCB1cihwcikpLCB7IGFnZ3JlZ2F0ZVR3b0Vycm9yczogVzgsIGNvZGVzOiB7IEVSUl9NVUxUSVBMRV9DQUxMQkFDSzogSzggfSwgQWJvcnRFcnJvcjogajggfSA9IEp0KCksIHsgU3ltYm9sOiBEMSB9ID0gVHQoKSwgeyBrRGVzdHJveWVkOiBaOCwgaXNEZXN0cm95ZWQ6IFY4LCBpc0ZpbmlzaGVkOiAkOCwgaXNTZXJ2ZXJSZXF1ZXN0OiBHOCB9ID0gRmkoKSwgUDEgPSBEMSgia0Rlc3Ryb3kiKSwgTmggPSBEMSgia0NvbnN0cnVjdCIpOwogICAgZnVuY3Rpb24gQzEodCwgZSwgcikgewogICAgICB0ICYmICh0LnN0YWNrLCBlICYmICFlLmVycm9yZWQgJiYgKGUuZXJyb3JlZCA9IHQpLCByICYmICFyLmVycm9yZWQgJiYgKHIuZXJyb3JlZCA9IHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIFk4KHQsIGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlLCBvID0gdGhpcy5fd3JpdGFibGVTdGF0ZSwgZiA9IG8gfHwgcjsKICAgICAgcmV0dXJuIG8gJiYgby5kZXN0cm95ZWQgfHwgciAmJiByLmRlc3Ryb3llZCA/ICh0eXBlb2YgZSA9PSAiZnVuY3Rpb24iICYmIGUoKSwgdGhpcykgOiAoQzEodCwgbywgciksIG8gJiYgKG8uZGVzdHJveWVkID0gdHJ1ZSksIHIgJiYgKHIuZGVzdHJveWVkID0gdHJ1ZSksIGYuY29uc3RydWN0ZWQgPyBMMSh0aGlzLCB0LCBlKSA6IHRoaXMub25jZShQMSwgZnVuY3Rpb24ocCkgewogICAgICAgIEwxKHRoaXMsIFc4KHAsIHQpLCBlKTsKICAgICAgfSksIHRoaXMpOwogICAgfQogICAgZnVuY3Rpb24gTDEodCwgZSwgcikgewogICAgICBsZXQgbyA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBmKHApIHsKICAgICAgICBpZiAobykKICAgICAgICAgIHJldHVybjsKICAgICAgICBvID0gdHJ1ZTsKICAgICAgICBsZXQgeyBfcmVhZGFibGVTdGF0ZTogbTIsIF93cml0YWJsZVN0YXRlOiB5MiB9ID0gdDsKICAgICAgICBDMShwLCB5MiwgbTIpLCB5MiAmJiAoeTIuY2xvc2VkID0gdHJ1ZSksIG0yICYmIChtMi5jbG9zZWQgPSB0cnVlKSwgdHlwZW9mIHIgPT0gImZ1bmN0aW9uIiAmJiByKHApLCBwID8gemkubmV4dFRpY2soWDgsIHQsIHApIDogemkubmV4dFRpY2soTzEsIHQpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdC5fZGVzdHJveShlIHx8IG51bGwsIGYpOwogICAgICB9IGNhdGNoIChwKSB7CiAgICAgICAgZihwKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gWDgodCwgZSkgewogICAgICBEaCh0LCBlKSwgTzEodCk7CiAgICB9CiAgICBmdW5jdGlvbiBPMSh0KSB7CiAgICAgIGxldCB7IF9yZWFkYWJsZVN0YXRlOiBlLCBfd3JpdGFibGVTdGF0ZTogciB9ID0gdDsKICAgICAgciAmJiAoci5jbG9zZUVtaXR0ZWQgPSB0cnVlKSwgZSAmJiAoZS5jbG9zZUVtaXR0ZWQgPSB0cnVlKSwgKHIgJiYgci5lbWl0Q2xvc2UgfHwgZSAmJiBlLmVtaXRDbG9zZSkgJiYgdC5lbWl0KCJjbG9zZSIpOwogICAgfQogICAgZnVuY3Rpb24gRGgodCwgZSkgewogICAgICBsZXQgeyBfcmVhZGFibGVTdGF0ZTogciwgX3dyaXRhYmxlU3RhdGU6IG8gfSA9IHQ7CiAgICAgIG8gJiYgby5lcnJvckVtaXR0ZWQgfHwgciAmJiByLmVycm9yRW1pdHRlZCB8fCAobyAmJiAoby5lcnJvckVtaXR0ZWQgPSB0cnVlKSwgciAmJiAoci5lcnJvckVtaXR0ZWQgPSB0cnVlKSwgdC5lbWl0KCJlcnJvciIsIGUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIEo4KCkgewogICAgICBsZXQgdCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUsIGUgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICB0ICYmICh0LmNvbnN0cnVjdGVkID0gdHJ1ZSwgdC5jbG9zZWQgPSBmYWxzZSwgdC5jbG9zZUVtaXR0ZWQgPSBmYWxzZSwgdC5kZXN0cm95ZWQgPSBmYWxzZSwgdC5lcnJvcmVkID0gbnVsbCwgdC5lcnJvckVtaXR0ZWQgPSBmYWxzZSwgdC5yZWFkaW5nID0gZmFsc2UsIHQuZW5kZWQgPSB0LnJlYWRhYmxlID09PSBmYWxzZSwgdC5lbmRFbWl0dGVkID0gdC5yZWFkYWJsZSA9PT0gZmFsc2UpLCBlICYmIChlLmNvbnN0cnVjdGVkID0gdHJ1ZSwgZS5kZXN0cm95ZWQgPSBmYWxzZSwgZS5jbG9zZWQgPSBmYWxzZSwgZS5jbG9zZUVtaXR0ZWQgPSBmYWxzZSwgZS5lcnJvcmVkID0gbnVsbCwgZS5lcnJvckVtaXR0ZWQgPSBmYWxzZSwgZS5maW5hbENhbGxlZCA9IGZhbHNlLCBlLnByZWZpbmlzaGVkID0gZmFsc2UsIGUuZW5kZWQgPSBlLndyaXRhYmxlID09PSBmYWxzZSwgZS5lbmRpbmcgPSBlLndyaXRhYmxlID09PSBmYWxzZSwgZS5maW5pc2hlZCA9IGUud3JpdGFibGUgPT09IGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIFBoKHQsIGUsIHIpIHsKICAgICAgbGV0IHsgX3JlYWRhYmxlU3RhdGU6IG8sIF93cml0YWJsZVN0YXRlOiBmIH0gPSB0OwogICAgICBpZiAoZiAmJiBmLmRlc3Ryb3llZCB8fCBvICYmIG8uZGVzdHJveWVkKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBvICYmIG8uYXV0b0Rlc3Ryb3kgfHwgZiAmJiBmLmF1dG9EZXN0cm95ID8gdC5kZXN0cm95KGUpIDogZSAmJiAoZS5zdGFjaywgZiAmJiAhZi5lcnJvcmVkICYmIChmLmVycm9yZWQgPSBlKSwgbyAmJiAhby5lcnJvcmVkICYmIChvLmVycm9yZWQgPSBlKSwgciA/IHppLm5leHRUaWNrKERoLCB0LCBlKSA6IERoKHQsIGUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIFE4KHQsIGUpIHsKICAgICAgaWYgKHR5cGVvZiB0Ll9jb25zdHJ1Y3QgIT0gImZ1bmN0aW9uIikKICAgICAgICByZXR1cm47CiAgICAgIGxldCB7IF9yZWFkYWJsZVN0YXRlOiByLCBfd3JpdGFibGVTdGF0ZTogbyB9ID0gdDsKICAgICAgciAmJiAoci5jb25zdHJ1Y3RlZCA9IGZhbHNlKSwgbyAmJiAoby5jb25zdHJ1Y3RlZCA9IGZhbHNlKSwgdC5vbmNlKE5oLCBlKSwgISh0Lmxpc3RlbmVyQ291bnQoTmgpID4gMSkgJiYgemkubmV4dFRpY2soZTUsIHQpOwogICAgfQogICAgZnVuY3Rpb24gZTUodCkgewogICAgICBsZXQgZSA9IGZhbHNlOwogICAgICBmdW5jdGlvbiByKG8pIHsKICAgICAgICBpZiAoZSkgewogICAgICAgICAgUGgodCwgbyA/PyBuZXcgSzgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlID0gdHJ1ZTsKICAgICAgICBsZXQgeyBfcmVhZGFibGVTdGF0ZTogZiwgX3dyaXRhYmxlU3RhdGU6IHAgfSA9IHQsIG0yID0gcCB8fCBmOwogICAgICAgIGYgJiYgKGYuY29uc3RydWN0ZWQgPSB0cnVlKSwgcCAmJiAocC5jb25zdHJ1Y3RlZCA9IHRydWUpLCBtMi5kZXN0cm95ZWQgPyB0LmVtaXQoUDEsIG8pIDogbyA/IFBoKHQsIG8sIHRydWUpIDogemkubmV4dFRpY2sodDUsIHQpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdC5fY29uc3RydWN0KHIpOwogICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgcihvKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdDUodCkgewogICAgICB0LmVtaXQoTmgpOwogICAgfQogICAgZnVuY3Rpb24gTjEodCkgewogICAgICByZXR1cm4gdCAmJiB0LnNldEhlYWRlciAmJiB0eXBlb2YgdC5hYm9ydCA9PSAiZnVuY3Rpb24iOwogICAgfQogICAgZnVuY3Rpb24gRjEodCkgewogICAgICB0LmVtaXQoImNsb3NlIik7CiAgICB9CiAgICBmdW5jdGlvbiByNSh0LCBlKSB7CiAgICAgIHQuZW1pdCgiZXJyb3IiLCBlKSwgemkubmV4dFRpY2soRjEsIHQpOwogICAgfQogICAgZnVuY3Rpb24gaTUodCwgZSkgewogICAgICAhdCB8fCBWOCh0KSB8fCAoIWUgJiYgISQ4KHQpICYmIChlID0gbmV3IGo4KSwgRzgodCkgPyAodC5zb2NrZXQgPSBudWxsLCB0LmRlc3Ryb3koZSkpIDogTjEodCkgPyB0LmFib3J0KCkgOiBOMSh0LnJlcSkgPyB0LnJlcS5hYm9ydCgpIDogdHlwZW9mIHQuZGVzdHJveSA9PSAiZnVuY3Rpb24iID8gdC5kZXN0cm95KGUpIDogdHlwZW9mIHQuY2xvc2UgPT0gImZ1bmN0aW9uIiA/IHQuY2xvc2UoKSA6IGUgPyB6aS5uZXh0VGljayhyNSwgdCwgZSkgOiB6aS5uZXh0VGljayhGMSwgdCksIHQuZGVzdHJveWVkIHx8ICh0W1o4XSA9IHRydWUpKTsKICAgIH0KICAgIFUxLmV4cG9ydHMgPSB7IGNvbnN0cnVjdDogUTgsIGRlc3Ryb3llcjogaTUsIGRlc3Ryb3k6IFk4LCB1bmRlc3Ryb3k6IEo4LCBlcnJvck9yRGVzdHJveTogUGggfTsKICB9KTsKICBWbyA9IFQyKChPSSwgSDEpID0+IHsKICAgIHZhciB7IEFycmF5SXNBcnJheTogbjUsIE9iamVjdFNldFByb3RvdHlwZU9mOiB6MSB9ID0gVHQoKSwgeyBFdmVudEVtaXR0ZXI6IGpvIH0gPSBraSgpOwogICAgZnVuY3Rpb24gWm8odCkgewogICAgICBqby5jYWxsKHRoaXMsIHQpOwogICAgfQogICAgejEoWm8ucHJvdG90eXBlLCBqby5wcm90b3R5cGUpOwogICAgejEoWm8sIGpvKTsKICAgIFpvLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24odCwgZSkgewogICAgICBsZXQgciA9IHRoaXM7CiAgICAgIGZ1bmN0aW9uIG8oUykgewogICAgICAgIHQud3JpdGFibGUgJiYgdC53cml0ZShTKSA9PT0gZmFsc2UgJiYgci5wYXVzZSAmJiByLnBhdXNlKCk7CiAgICAgIH0KICAgICAgci5vbigiZGF0YSIsIG8pOwogICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgIHIucmVhZGFibGUgJiYgci5yZXN1bWUgJiYgci5yZXN1bWUoKTsKICAgICAgfQogICAgICB0Lm9uKCJkcmFpbiIsIGYpLCAhdC5faXNTdGRpbyAmJiAoIWUgfHwgZS5lbmQgIT09IGZhbHNlKSAmJiAoci5vbigiZW5kIiwgbTIpLCByLm9uKCJjbG9zZSIsIHkyKSk7CiAgICAgIGxldCBwID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIG0yKCkgewogICAgICAgIHAgfHwgKHAgPSB0cnVlLCB0LmVuZCgpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5MigpIHsKICAgICAgICBwIHx8IChwID0gdHJ1ZSwgdHlwZW9mIHQuZGVzdHJveSA9PSAiZnVuY3Rpb24iICYmIHQuZGVzdHJveSgpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBNKFMpIHsKICAgICAgICB4KCksIGpvLmxpc3RlbmVyQ291bnQodGhpcywgImVycm9yIikgPT09IDAgJiYgdGhpcy5lbWl0KCJlcnJvciIsIFMpOwogICAgICB9CiAgICAgIENoKHIsICJlcnJvciIsIE0pLCBDaCh0LCAiZXJyb3IiLCBNKTsKICAgICAgZnVuY3Rpb24geCgpIHsKICAgICAgICByLnJlbW92ZUxpc3RlbmVyKCJkYXRhIiwgbyksIHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIiwgZiksIHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsIG0yKSwgci5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCB5MiksIHIucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgTSksIHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgTSksIHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHgpLCByLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIHgpLCB0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIHgpOwogICAgICB9CiAgICAgIHJldHVybiByLm9uKCJlbmQiLCB4KSwgci5vbigiY2xvc2UiLCB4KSwgdC5vbigiY2xvc2UiLCB4KSwgdC5lbWl0KCJwaXBlIiwgciksIHQ7CiAgICB9OwogICAgZnVuY3Rpb24gQ2godCwgZSwgcikgewogICAgICBpZiAodHlwZW9mIHQucHJlcGVuZExpc3RlbmVyID09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUsIHIpOwogICAgICAhdC5fZXZlbnRzIHx8ICF0Ll9ldmVudHNbZV0gPyB0Lm9uKGUsIHIpIDogbjUodC5fZXZlbnRzW2VdKSA/IHQuX2V2ZW50c1tlXS51bnNoaWZ0KHIpIDogdC5fZXZlbnRzW2VdID0gW3IsIHQuX2V2ZW50c1tlXV07CiAgICB9CiAgICBIMS5leHBvcnRzID0geyBTdHJlYW06IFpvLCBwcmVwZW5kTGlzdGVuZXI6IENoIH07CiAgfSk7CiAgR28gPSBUMigoRkksICRvKSA9PiB7CiAgICB2YXIgeyBBYm9ydEVycm9yOiBmNSwgY29kZXM6IGE1IH0gPSBKdCgpLCBvNSA9IFVpKCksIHsgRVJSX0lOVkFMSURfQVJHX1RZUEU6IFcxIH0gPSBhNSwgczUgPSAodCwgZSkgPT4gewogICAgICBpZiAodHlwZW9mIHQgIT0gIm9iamVjdCIgfHwgISgiYWJvcnRlZCIgaW4gdCkpCiAgICAgICAgdGhyb3cgbmV3IFcxKGUsICJBYm9ydFNpZ25hbCIsIHQpOwogICAgfTsKICAgIGZ1bmN0aW9uIGg1KHQpIHsKICAgICAgcmV0dXJuICEhKHQgJiYgdHlwZW9mIHQucGlwZSA9PSAiZnVuY3Rpb24iKTsKICAgIH0KICAgICRvLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmIChzNShlLCAic2lnbmFsIiksICFoNShyKSkKICAgICAgICB0aHJvdyBuZXcgVzEoInN0cmVhbSIsICJzdHJlYW0uU3RyZWFtIiwgcik7CiAgICAgIHJldHVybiAkby5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZShlLCByKTsKICAgIH07CiAgICAkby5leHBvcnRzLmFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJvYmplY3QiIHx8ICEoImFib3J0ZWQiIGluIHQpKQogICAgICAgIHJldHVybiBlOwogICAgICBsZXQgciA9ICgpID0+IHsKICAgICAgICBlLmRlc3Ryb3kobmV3IGY1KHVuZGVmaW5lZCwgeyBjYXVzZTogdC5yZWFzb24gfSkpOwogICAgICB9OwogICAgICByZXR1cm4gdC5hYm9ydGVkID8gcigpIDogKHQuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCByKSwgbzUoZSwgKCkgPT4gdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIHIpKSksIGU7CiAgICB9OwogIH0pOwogIFoxID0gVDIoKHpJLCBqMSkgPT4gewogICAgdmFyIHsgU3RyaW5nUHJvdG90eXBlU2xpY2U6IEsxLCBTeW1ib2xJdGVyYXRvcjogdTUsIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQ6IFlvLCBVaW50OEFycmF5OiBsNSB9ID0gVHQoKSwgeyBCdWZmZXI6IE9oIH0gPSBVdCgpLCB7IGluc3BlY3Q6IGQ1IH0gPSBHcigpOwogICAgajEuZXhwb3J0cyA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5oZWFkID0gbnVsbCwgdGhpcy50YWlsID0gbnVsbCwgdGhpcy5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIHB1c2goZSkgewogICAgICAgIGxldCByID0geyBkYXRhOiBlLCBuZXh0OiBudWxsIH07CiAgICAgICAgdGhpcy5sZW5ndGggPiAwID8gdGhpcy50YWlsLm5leHQgPSByIDogdGhpcy5oZWFkID0gciwgdGhpcy50YWlsID0gciwgKyt0aGlzLmxlbmd0aDsKICAgICAgfQogICAgICB1bnNoaWZ0KGUpIHsKICAgICAgICBsZXQgciA9IHsgZGF0YTogZSwgbmV4dDogdGhpcy5oZWFkIH07CiAgICAgICAgdGhpcy5sZW5ndGggPT09IDAgJiYgKHRoaXMudGFpbCA9IHIpLCB0aGlzLmhlYWQgPSByLCArK3RoaXMubGVuZ3RoOwogICAgICB9CiAgICAgIHNoaWZ0KCkgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBsZXQgZSA9IHRoaXMuaGVhZC5kYXRhOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSA/IHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGwgOiB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dCwgLS10aGlzLmxlbmd0aCwgZTsKICAgICAgfQogICAgICBjbGVhcigpIHsKICAgICAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsLCB0aGlzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgam9pbihlKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGxldCByID0gdGhpcy5oZWFkLCBvID0gIiIgKyByLmRhdGE7CiAgICAgICAgZm9yICg7KHIgPSByLm5leHQpICE9PSBudWxsOyApCiAgICAgICAgICBvICs9IGUgKyByLmRhdGE7CiAgICAgICAgcmV0dXJuIG87CiAgICAgIH0KICAgICAgY29uY2F0KGUpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gT2guYWxsb2MoMCk7CiAgICAgICAgbGV0IHIgPSBPaC5hbGxvY1Vuc2FmZShlID4+PiAwKSwgbyA9IHRoaXMuaGVhZCwgZiA9IDA7CiAgICAgICAgZm9yICg7bzsgKQogICAgICAgICAgWW8ociwgby5kYXRhLCBmKSwgZiArPSBvLmRhdGEubGVuZ3RoLCBvID0gby5uZXh0OwogICAgICAgIHJldHVybiByOwogICAgICB9CiAgICAgIGNvbnN1bWUoZSwgcikgewogICAgICAgIGxldCBvID0gdGhpcy5oZWFkLmRhdGE7CiAgICAgICAgaWYgKGUgPCBvLmxlbmd0aCkgewogICAgICAgICAgbGV0IGYgPSBvLnNsaWNlKDAsIGUpOwogICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZC5kYXRhID0gby5zbGljZShlKSwgZjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUgPT09IG8ubGVuZ3RoID8gdGhpcy5zaGlmdCgpIDogciA/IHRoaXMuX2dldFN0cmluZyhlKSA6IHRoaXMuX2dldEJ1ZmZlcihlKTsKICAgICAgfQogICAgICBmaXJzdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGE7CiAgICAgIH0KICAgICAgKlt1NV0oKSB7CiAgICAgICAgZm9yIChsZXQgZSA9IHRoaXMuaGVhZDtlOyBlID0gZS5uZXh0KQogICAgICAgICAgeWllbGQgZS5kYXRhOwogICAgICB9CiAgICAgIF9nZXRTdHJpbmcoZSkgewogICAgICAgIGxldCByID0gIiIsIG8gPSB0aGlzLmhlYWQsIGYgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgIGxldCBwID0gby5kYXRhOwogICAgICAgICAgaWYgKGUgPiBwLmxlbmd0aCkKICAgICAgICAgICAgciArPSBwLCBlIC09IHAubGVuZ3RoOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGUgPT09IHAubGVuZ3RoID8gKHIgKz0gcCwgKytmLCBvLm5leHQgPyB0aGlzLmhlYWQgPSBvLm5leHQgOiB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsKSA6IChyICs9IEsxKHAsIDAsIGUpLCB0aGlzLmhlYWQgPSBvLCBvLmRhdGEgPSBLMShwLCBlKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytmOwogICAgICAgIH0gd2hpbGUgKChvID0gby5uZXh0KSAhPT0gbnVsbCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC09IGYsIHI7CiAgICAgIH0KICAgICAgX2dldEJ1ZmZlcihlKSB7CiAgICAgICAgbGV0IHIgPSBPaC5hbGxvY1Vuc2FmZShlKSwgbyA9IGUsIGYgPSB0aGlzLmhlYWQsIHAgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgIGxldCBtMiA9IGYuZGF0YTsKICAgICAgICAgIGlmIChlID4gbTIubGVuZ3RoKQogICAgICAgICAgICBZbyhyLCBtMiwgbyAtIGUpLCBlIC09IG0yLmxlbmd0aDsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBlID09PSBtMi5sZW5ndGggPyAoWW8ociwgbTIsIG8gLSBlKSwgKytwLCBmLm5leHQgPyB0aGlzLmhlYWQgPSBmLm5leHQgOiB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsKSA6IChZbyhyLCBuZXcgbDUobTIuYnVmZmVyLCBtMi5ieXRlT2Zmc2V0LCBlKSwgbyAtIGUpLCB0aGlzLmhlYWQgPSBmLCBmLmRhdGEgPSBtMi5zbGljZShlKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytwOwogICAgICAgIH0gd2hpbGUgKChmID0gZi5uZXh0KSAhPT0gbnVsbCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC09IHAsIHI7CiAgICAgIH0KICAgICAgW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKGUsIHIpIHsKICAgICAgICByZXR1cm4gZDUodGhpcywgeyAuLi5yLCBkZXB0aDogMCwgY3VzdG9tSW5zcGVjdDogZmFsc2UgfSk7CiAgICAgIH0KICAgIH07CiAgfSk7CiAgWG8gPSBUMigoSEksICQxKSA9PiB7CiAgICB2YXIgeyBNYXRoRmxvb3I6IGM1LCBOdW1iZXJJc0ludGVnZXI6IHA1IH0gPSBUdCgpLCB7IEVSUl9JTlZBTElEX0FSR19WQUxVRTogdjUgfSA9IEp0KCkuY29kZXM7CiAgICBmdW5jdGlvbiBiNSh0LCBlLCByKSB7CiAgICAgIHJldHVybiB0LmhpZ2hXYXRlck1hcmsgIT0gbnVsbCA/IHQuaGlnaFdhdGVyTWFyayA6IGUgPyB0W3JdIDogbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIFYxKHQpIHsKICAgICAgcmV0dXJuIHQgPyAxNiA6IDE2ICogMTAyNDsKICAgIH0KICAgIGZ1bmN0aW9uIG01KHQsIGUsIHIsIG8pIHsKICAgICAgbGV0IGYgPSBiNShlLCBvLCByKTsKICAgICAgaWYgKGYgIT0gbnVsbCkgewogICAgICAgIGlmICghcDUoZikgfHwgZiA8IDApIHsKICAgICAgICAgIGxldCBwID0gbyA/IGBvcHRpb25zLiR7cn1gIDogIm9wdGlvbnMuaGlnaFdhdGVyTWFyayI7CiAgICAgICAgICB0aHJvdyBuZXcgdjUocCwgZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjNShmKTsKICAgICAgfQogICAgICByZXR1cm4gVjEodC5vYmplY3RNb2RlKTsKICAgIH0KICAgICQxLmV4cG9ydHMgPSB7IGdldEhpZ2hXYXRlck1hcms6IG01LCBnZXREZWZhdWx0SGlnaFdhdGVyTWFyazogVjEgfTsKICB9KTsKICBGaCA9IFQyKChXSSwgSjEpID0+IHsKICAgIHZhciBHMSA9IChPaSgpLCB1cihwcikpLCB7IFByb21pc2VQcm90b3R5cGVUaGVuOiBnNSwgU3ltYm9sQXN5bmNJdGVyYXRvcjogWTEsIFN5bWJvbEl0ZXJhdG9yOiBYMSB9ID0gVHQoKSwgeyBCdWZmZXI6IHk1IH0gPSBVdCgpLCB7IEVSUl9JTlZBTElEX0FSR19UWVBFOiB3NSwgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUzogTTUgfSA9IEp0KCkuY29kZXM7CiAgICBmdW5jdGlvbiBfNSh0LCBlLCByKSB7CiAgICAgIGxldCBvOwogICAgICBpZiAodHlwZW9mIGUgPT0gInN0cmluZyIgfHwgZSBpbnN0YW5jZW9mIHk1KQogICAgICAgIHJldHVybiBuZXcgdCh7IG9iamVjdE1vZGU6IHRydWUsIC4uLnIsIHJlYWQoKSB7CiAgICAgICAgICB0aGlzLnB1c2goZSksIHRoaXMucHVzaChudWxsKTsKICAgICAgICB9IH0pOwogICAgICBsZXQgZjsKICAgICAgaWYgKGUgJiYgZVtZMV0pCiAgICAgICAgZiA9IHRydWUsIG8gPSBlW1kxXSgpOwogICAgICBlbHNlIGlmIChlICYmIGVbWDFdKQogICAgICAgIGYgPSBmYWxzZSwgbyA9IGVbWDFdKCk7CiAgICAgIGVsc2UKICAgICAgICB0aHJvdyBuZXcgdzUoIml0ZXJhYmxlIiwgWyJJdGVyYWJsZSJdLCBlKTsKICAgICAgbGV0IHAgPSBuZXcgdCh7IG9iamVjdE1vZGU6IHRydWUsIGhpZ2hXYXRlck1hcms6IDEsIC4uLnIgfSksIG0yID0gZmFsc2U7CiAgICAgIHAuX3JlYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBtMiB8fCAobTIgPSB0cnVlLCBNKCkpOwogICAgICB9LCBwLl9kZXN0cm95ID0gZnVuY3Rpb24oeCwgUykgewogICAgICAgIGc1KHkyKHgpLCAoKSA9PiBHMS5uZXh0VGljayhTLCB4KSwgKEUyKSA9PiBHMS5uZXh0VGljayhTLCBFMiB8fCB4KSk7CiAgICAgIH07CiAgICAgIGFzeW5jIGZ1bmN0aW9uIHkyKHgpIHsKICAgICAgICBsZXQgUyA9IHggIT0gbnVsbCwgRTIgPSB0eXBlb2Ygby50aHJvdyA9PSAiZnVuY3Rpb24iOwogICAgICAgIGlmIChTICYmIEUyKSB7CiAgICAgICAgICBsZXQgeyB2YWx1ZTogQiwgZG9uZTogcTIgfSA9IGF3YWl0IG8udGhyb3coeCk7CiAgICAgICAgICBpZiAoYXdhaXQgQiwgcTIpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBvLnJldHVybiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICBsZXQgeyB2YWx1ZTogQiB9ID0gYXdhaXQgby5yZXR1cm4oKTsKICAgICAgICAgIGF3YWl0IEI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFzeW5jIGZ1bmN0aW9uIE0oKSB7CiAgICAgICAgZm9yICg7OyApIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCB7IHZhbHVlOiB4LCBkb25lOiBTIH0gPSBmID8gYXdhaXQgby5uZXh0KCkgOiBvLm5leHQoKTsKICAgICAgICAgICAgaWYgKFMpCiAgICAgICAgICAgICAgcC5wdXNoKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBsZXQgRTIgPSB4ICYmIHR5cGVvZiB4LnRoZW4gPT0gImZ1bmN0aW9uIiA/IGF3YWl0IHggOiB4OwogICAgICAgICAgICAgIGlmIChFMiA9PT0gbnVsbCkKICAgICAgICAgICAgICAgIHRocm93IG0yID0gZmFsc2UsIG5ldyBNNTsKICAgICAgICAgICAgICBpZiAocC5wdXNoKEUyKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIG0yID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgICAgcC5kZXN0cm95KHgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwOwogICAgfQogICAgSjEuZXhwb3J0cyA9IF81OwogIH0pOwogIGJhID0gVDIoKEtJLCBsdikgPT4gewogICAgdmFyIFRyID0gKE9pKCksIHVyKHByKSksIHsgQXJyYXlQcm90b3R5cGVJbmRleE9mOiB4NSwgTnVtYmVySXNJbnRlZ2VyOiBTNSwgTnVtYmVySXNOYU46IEU1LCBOdW1iZXJQYXJzZUludDogQTUsIE9iamVjdERlZmluZVByb3BlcnRpZXM6IHR2LCBPYmplY3RLZXlzOiBSNSwgT2JqZWN0U2V0UHJvdG90eXBlT2Y6IHJ2LCBQcm9taXNlOiBCNSwgU2FmZVNldDogcTUsIFN5bWJvbEFzeW5jSXRlcmF0b3I6IEk1LCBTeW1ib2w6IFQ1IH0gPSBUdCgpOwogICAgbHYuZXhwb3J0cyA9IExlOwogICAgTGUuUmVhZGFibGVTdGF0ZSA9IGpoOwogICAgdmFyIHsgRXZlbnRFbWl0dGVyOiBrNSB9ID0ga2koKSwgeyBTdHJlYW06IEhpLCBwcmVwZW5kTGlzdGVuZXI6IEw1IH0gPSBWbygpLCB7IEJ1ZmZlcjogVWggfSA9IFV0KCksIHsgYWRkQWJvcnRTaWduYWw6IE41IH0gPSBHbygpLCBENSA9IFVpKCksIFBlID0gR3IoKS5kZWJ1Z2xvZygic3RyZWFtIiwgKHQpID0+IHsKICAgICAgUGUgPSB0OwogICAgfSksIFA1ID0gWjEoKSwgaGYgPSB5bigpLCB7IGdldEhpZ2hXYXRlck1hcms6IEM1LCBnZXREZWZhdWx0SGlnaFdhdGVyTWFyazogTzUgfSA9IFhvKCksIHsgYWdncmVnYXRlVHdvRXJyb3JzOiBRMSwgY29kZXM6IHsgRVJSX0lOVkFMSURfQVJHX1RZUEU6IEY1LCBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRDogVTUsIEVSUl9PVVRfT0ZfUkFOR0U6IHo1LCBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GOiBINSwgRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVDogVzUgfSB9ID0gSnQoKSwgeyB2YWxpZGF0ZU9iamVjdDogSzUgfSA9IHBhKCksIHduID0gVDUoImtQYXVzZWQiKSwgeyBTdHJpbmdEZWNvZGVyOiBpdiB9ID0gY28oKSwgajUgPSBGaCgpOwogICAgcnYoTGUucHJvdG90eXBlLCBIaS5wcm90b3R5cGUpOwogICAgcnYoTGUsIEhpKTsKICAgIHZhciB6aCA9ICgpID0+IHsKICAgIH0sIHsgZXJyb3JPckRlc3Ryb3k6IHNmIH0gPSBoZjsKICAgIGZ1bmN0aW9uIGpoKHQsIGUsIHIpIHsKICAgICAgdHlwZW9mIHIgIT0gImJvb2xlYW4iICYmIChyID0gZSBpbnN0YW5jZW9mIFFyKCkpLCB0aGlzLm9iamVjdE1vZGUgPSAhISh0ICYmIHQub2JqZWN0TW9kZSksIHIgJiYgKHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhISh0ICYmIHQucmVhZGFibGVPYmplY3RNb2RlKSksIHRoaXMuaGlnaFdhdGVyTWFyayA9IHQgPyBDNSh0aGlzLCB0LCAicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwgcikgOiBPNShmYWxzZSksIHRoaXMuYnVmZmVyID0gbmV3IFA1LCB0aGlzLmxlbmd0aCA9IDAsIHRoaXMucGlwZXMgPSBbXSwgdGhpcy5mbG93aW5nID0gbnVsbCwgdGhpcy5lbmRlZCA9IGZhbHNlLCB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZSwgdGhpcy5yZWFkaW5nID0gZmFsc2UsIHRoaXMuY29uc3RydWN0ZWQgPSB0cnVlLCB0aGlzLnN5bmMgPSB0cnVlLCB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlLCB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlLCB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2UsIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2UsIHRoaXNbd25dID0gbnVsbCwgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZSwgdGhpcy5lbWl0Q2xvc2UgPSAhdCB8fCB0LmVtaXRDbG9zZSAhPT0gZmFsc2UsIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhdCB8fCB0LmF1dG9EZXN0cm95ICE9PSBmYWxzZSwgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZSwgdGhpcy5lcnJvcmVkID0gbnVsbCwgdGhpcy5jbG9zZWQgPSBmYWxzZSwgdGhpcy5jbG9zZUVtaXR0ZWQgPSBmYWxzZSwgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSB0ICYmIHQuZGVmYXVsdEVuY29kaW5nIHx8ICJ1dGY4IiwgdGhpcy5hd2FpdERyYWluV3JpdGVycyA9IG51bGwsIHRoaXMubXVsdGlBd2FpdERyYWluID0gZmFsc2UsIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZSwgdGhpcy5kYXRhRW1pdHRlZCA9IGZhbHNlLCB0aGlzLmRlY29kZXIgPSBudWxsLCB0aGlzLmVuY29kaW5nID0gbnVsbCwgdCAmJiB0LmVuY29kaW5nICYmICh0aGlzLmRlY29kZXIgPSBuZXcgaXYodC5lbmNvZGluZyksIHRoaXMuZW5jb2RpbmcgPSB0LmVuY29kaW5nKTsKICAgIH0KICAgIGZ1bmN0aW9uIExlKHQpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExlKSkKICAgICAgICByZXR1cm4gbmV3IExlKHQpOwogICAgICBsZXQgZSA9IHRoaXMgaW5zdGFuY2VvZiBRcigpOwogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IGpoKHQsIHRoaXMsIGUpLCB0ICYmICh0eXBlb2YgdC5yZWFkID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX3JlYWQgPSB0LnJlYWQpLCB0eXBlb2YgdC5kZXN0cm95ID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX2Rlc3Ryb3kgPSB0LmRlc3Ryb3kpLCB0eXBlb2YgdC5jb25zdHJ1Y3QgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fY29uc3RydWN0ID0gdC5jb25zdHJ1Y3QpLCB0LnNpZ25hbCAmJiAhZSAmJiBONSh0LnNpZ25hbCwgdGhpcykpLCBIaS5jYWxsKHRoaXMsIHQpLCBoZi5jb25zdHJ1Y3QodGhpcywgKCkgPT4gewogICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlICYmIEpvKHRoaXMsIHRoaXMuX3JlYWRhYmxlU3RhdGUpOwogICAgICB9KTsKICAgIH0KICAgIExlLnByb3RvdHlwZS5kZXN0cm95ID0gaGYuZGVzdHJveTsKICAgIExlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gaGYudW5kZXN0cm95OwogICAgTGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24odCwgZSkgewogICAgICBlKHQpOwogICAgfTsKICAgIExlLnByb3RvdHlwZVtrNS5jYXB0dXJlUmVqZWN0aW9uU3ltYm9sXSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhpcy5kZXN0cm95KHQpOwogICAgfTsKICAgIExlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gbnYodGhpcywgdCwgZSwgZmFsc2UpOwogICAgfTsKICAgIExlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gbnYodGhpcywgdCwgZSwgdHJ1ZSk7CiAgICB9OwogICAgZnVuY3Rpb24gbnYodCwgZSwgciwgbykgewogICAgICBQZSgicmVhZGFibGVBZGRDaHVuayIsIGUpOwogICAgICBsZXQgZiA9IHQuX3JlYWRhYmxlU3RhdGUsIHA7CiAgICAgIGlmIChmLm9iamVjdE1vZGUgfHwgKHR5cGVvZiBlID09ICJzdHJpbmciID8gKHIgPSByIHx8IGYuZGVmYXVsdEVuY29kaW5nLCBmLmVuY29kaW5nICE9PSByICYmIChvICYmIGYuZW5jb2RpbmcgPyBlID0gVWguZnJvbShlLCByKS50b1N0cmluZyhmLmVuY29kaW5nKSA6IChlID0gVWguZnJvbShlLCByKSwgciA9ICIiKSkpIDogZSBpbnN0YW5jZW9mIFVoID8gciA9ICIiIDogSGkuX2lzVWludDhBcnJheShlKSA/IChlID0gSGkuX3VpbnQ4QXJyYXlUb0J1ZmZlcihlKSwgciA9ICIiKSA6IGUgIT0gbnVsbCAmJiAocCA9IG5ldyBGNSgiY2h1bmsiLCBbInN0cmluZyIsICJCdWZmZXIiLCAiVWludDhBcnJheSJdLCBlKSkpLCBwKQogICAgICAgIHNmKHQsIHApOwogICAgICBlbHNlIGlmIChlID09PSBudWxsKQogICAgICAgIGYucmVhZGluZyA9IGZhbHNlLCAkNSh0LCBmKTsKICAgICAgZWxzZSBpZiAoZi5vYmplY3RNb2RlIHx8IGUgJiYgZS5sZW5ndGggPiAwKQogICAgICAgIGlmIChvKQogICAgICAgICAgaWYgKGYuZW5kRW1pdHRlZCkKICAgICAgICAgICAgc2YodCwgbmV3IFc1KTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoZi5kZXN0cm95ZWQgfHwgZi5lcnJvcmVkKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgSGgodCwgZiwgZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZi5lbmRlZCkKICAgICAgICAgIHNmKHQsIG5ldyBINSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoZi5kZXN0cm95ZWQgfHwgZi5lcnJvcmVkKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBmLnJlYWRpbmcgPSBmYWxzZSwgZi5kZWNvZGVyICYmICFyID8gKGUgPSBmLmRlY29kZXIud3JpdGUoZSksIGYub2JqZWN0TW9kZSB8fCBlLmxlbmd0aCAhPT0gMCA/IEhoKHQsIGYsIGUsIGZhbHNlKSA6IEpvKHQsIGYpKSA6IEhoKHQsIGYsIGUsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICBvIHx8IChmLnJlYWRpbmcgPSBmYWxzZSwgSm8odCwgZikpOwogICAgICByZXR1cm4gIWYuZW5kZWQgJiYgKGYubGVuZ3RoIDwgZi5oaWdoV2F0ZXJNYXJrIHx8IGYubGVuZ3RoID09PSAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIEhoKHQsIGUsIHIsIG8pIHsKICAgICAgZS5mbG93aW5nICYmIGUubGVuZ3RoID09PSAwICYmICFlLnN5bmMgJiYgdC5saXN0ZW5lckNvdW50KCJkYXRhIikgPiAwID8gKGUubXVsdGlBd2FpdERyYWluID8gZS5hd2FpdERyYWluV3JpdGVycy5jbGVhcigpIDogZS5hd2FpdERyYWluV3JpdGVycyA9IG51bGwsIGUuZGF0YUVtaXR0ZWQgPSB0cnVlLCB0LmVtaXQoImRhdGEiLCByKSkgOiAoZS5sZW5ndGggKz0gZS5vYmplY3RNb2RlID8gMSA6IHIubGVuZ3RoLCBvID8gZS5idWZmZXIudW5zaGlmdChyKSA6IGUuYnVmZmVyLnB1c2gociksIGUubmVlZFJlYWRhYmxlICYmIFFvKHQpKSwgSm8odCwgZSk7CiAgICB9CiAgICBMZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbigpIHsKICAgICAgbGV0IHQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICByZXR1cm4gdFt3bl0gPT09IHRydWUgfHwgdC5mbG93aW5nID09PSBmYWxzZTsKICAgIH07CiAgICBMZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbih0KSB7CiAgICAgIGxldCBlID0gbmV3IGl2KHQpOwogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nOwogICAgICBsZXQgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLCBvID0gIiI7CiAgICAgIGZvciAobGV0IGYgb2YgcikKICAgICAgICBvICs9IGUud3JpdGUoZik7CiAgICAgIHJldHVybiByLmNsZWFyKCksIG8gIT09ICIiICYmIHIucHVzaChvKSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBvLmxlbmd0aCwgdGhpczsKICAgIH07CiAgICB2YXIgWjUgPSAxMDczNzQxODI0OwogICAgZnVuY3Rpb24gVjUodCkgewogICAgICBpZiAodCA+IFo1KQogICAgICAgIHRocm93IG5ldyB6NSgic2l6ZSIsICI8PSAxR2lCIiwgdCk7CiAgICAgIHJldHVybiB0LS0sIHQgfD0gdCA+Pj4gMSwgdCB8PSB0ID4+PiAyLCB0IHw9IHQgPj4+IDQsIHQgfD0gdCA+Pj4gOCwgdCB8PSB0ID4+PiAxNiwgdCsrLCB0OwogICAgfQogICAgZnVuY3Rpb24gZXYodCwgZSkgewogICAgICByZXR1cm4gdCA8PSAwIHx8IGUubGVuZ3RoID09PSAwICYmIGUuZW5kZWQgPyAwIDogZS5vYmplY3RNb2RlID8gMSA6IEU1KHQpID8gZS5mbG93aW5nICYmIGUubGVuZ3RoID8gZS5idWZmZXIuZmlyc3QoKS5sZW5ndGggOiBlLmxlbmd0aCA6IHQgPD0gZS5sZW5ndGggPyB0IDogZS5lbmRlZCA/IGUubGVuZ3RoIDogMDsKICAgIH0KICAgIExlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24odCkgewogICAgICBQZSgicmVhZCIsIHQpLCB0ID09PSB1bmRlZmluZWQgPyB0ID0gTmFOIDogUzUodCkgfHwgKHQgPSBBNSh0LCAxMCkpOwogICAgICBsZXQgZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGUsIHIgPSB0OwogICAgICBpZiAodCA+IGUuaGlnaFdhdGVyTWFyayAmJiAoZS5oaWdoV2F0ZXJNYXJrID0gVjUodCkpLCB0ICE9PSAwICYmIChlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlKSwgdCA9PT0gMCAmJiBlLm5lZWRSZWFkYWJsZSAmJiAoKGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IGUubGVuZ3RoID49IGUuaGlnaFdhdGVyTWFyayA6IGUubGVuZ3RoID4gMCkgfHwgZS5lbmRlZCkpCiAgICAgICAgcmV0dXJuIFBlKCJyZWFkOiBlbWl0UmVhZGFibGUiLCBlLmxlbmd0aCwgZS5lbmRlZCksIGUubGVuZ3RoID09PSAwICYmIGUuZW5kZWQgPyBXaCh0aGlzKSA6IFFvKHRoaXMpLCBudWxsOwogICAgICBpZiAodCA9IGV2KHQsIGUpLCB0ID09PSAwICYmIGUuZW5kZWQpCiAgICAgICAgcmV0dXJuIGUubGVuZ3RoID09PSAwICYmIFdoKHRoaXMpLCBudWxsOwogICAgICBsZXQgbyA9IGUubmVlZFJlYWRhYmxlOwogICAgICBpZiAoUGUoIm5lZWQgcmVhZGFibGUiLCBvKSwgKGUubGVuZ3RoID09PSAwIHx8IGUubGVuZ3RoIC0gdCA8IGUuaGlnaFdhdGVyTWFyaykgJiYgKG8gPSB0cnVlLCBQZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLCBvKSksIGUuZW5kZWQgfHwgZS5yZWFkaW5nIHx8IGUuZGVzdHJveWVkIHx8IGUuZXJyb3JlZCB8fCAhZS5jb25zdHJ1Y3RlZCkKICAgICAgICBvID0gZmFsc2UsIFBlKCJyZWFkaW5nLCBlbmRlZCBvciBjb25zdHJ1Y3RpbmciLCBvKTsKICAgICAgZWxzZSBpZiAobykgewogICAgICAgIFBlKCJkbyByZWFkIiksIGUucmVhZGluZyA9IHRydWUsIGUuc3luYyA9IHRydWUsIGUubGVuZ3RoID09PSAwICYmIChlLm5lZWRSZWFkYWJsZSA9IHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayk7CiAgICAgICAgfSBjYXRjaCAocCkgewogICAgICAgICAgc2YodGhpcywgcCk7CiAgICAgICAgfQogICAgICAgIGUuc3luYyA9IGZhbHNlLCBlLnJlYWRpbmcgfHwgKHQgPSBldihyLCBlKSk7CiAgICAgIH0KICAgICAgbGV0IGY7CiAgICAgIHJldHVybiB0ID4gMCA/IGYgPSBodih0LCBlKSA6IGYgPSBudWxsLCBmID09PSBudWxsID8gKGUubmVlZFJlYWRhYmxlID0gZS5sZW5ndGggPD0gZS5oaWdoV2F0ZXJNYXJrLCB0ID0gMCkgOiAoZS5sZW5ndGggLT0gdCwgZS5tdWx0aUF3YWl0RHJhaW4gPyBlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKCkgOiBlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbCksIGUubGVuZ3RoID09PSAwICYmIChlLmVuZGVkIHx8IChlLm5lZWRSZWFkYWJsZSA9IHRydWUpLCByICE9PSB0ICYmIGUuZW5kZWQgJiYgV2godGhpcykpLCBmICE9PSBudWxsICYmICFlLmVycm9yRW1pdHRlZCAmJiAhZS5jbG9zZUVtaXR0ZWQgJiYgKGUuZGF0YUVtaXR0ZWQgPSB0cnVlLCB0aGlzLmVtaXQoImRhdGEiLCBmKSksIGY7CiAgICB9OwogICAgZnVuY3Rpb24gJDUodCwgZSkgewogICAgICBpZiAoUGUoIm9uRW9mQ2h1bmsiKSwgIWUuZW5kZWQpIHsKICAgICAgICBpZiAoZS5kZWNvZGVyKSB7CiAgICAgICAgICBsZXQgciA9IGUuZGVjb2Rlci5lbmQoKTsKICAgICAgICAgIHIgJiYgci5sZW5ndGggJiYgKGUuYnVmZmVyLnB1c2gociksIGUubGVuZ3RoICs9IGUub2JqZWN0TW9kZSA/IDEgOiByLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGUuZW5kZWQgPSB0cnVlLCBlLnN5bmMgPyBRbyh0KSA6IChlLm5lZWRSZWFkYWJsZSA9IGZhbHNlLCBlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWUsIGZ2KHQpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gUW8odCkgewogICAgICBsZXQgZSA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIFBlKCJlbWl0UmVhZGFibGUiLCBlLm5lZWRSZWFkYWJsZSwgZS5lbWl0dGVkUmVhZGFibGUpLCBlLm5lZWRSZWFkYWJsZSA9IGZhbHNlLCBlLmVtaXR0ZWRSZWFkYWJsZSB8fCAoUGUoImVtaXRSZWFkYWJsZSIsIGUuZmxvd2luZyksIGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZSwgVHIubmV4dFRpY2soZnYsIHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZ2KHQpIHsKICAgICAgbGV0IGUgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBQZSgiZW1pdFJlYWRhYmxlXyIsIGUuZGVzdHJveWVkLCBlLmxlbmd0aCwgZS5lbmRlZCksICFlLmRlc3Ryb3llZCAmJiAhZS5lcnJvcmVkICYmIChlLmxlbmd0aCB8fCBlLmVuZGVkKSAmJiAodC5lbWl0KCJyZWFkYWJsZSIpLCBlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlKSwgZS5uZWVkUmVhZGFibGUgPSAhZS5mbG93aW5nICYmICFlLmVuZGVkICYmIGUubGVuZ3RoIDw9IGUuaGlnaFdhdGVyTWFyaywgb3YodCk7CiAgICB9CiAgICBmdW5jdGlvbiBKbyh0LCBlKSB7CiAgICAgICFlLnJlYWRpbmdNb3JlICYmIGUuY29uc3RydWN0ZWQgJiYgKGUucmVhZGluZ01vcmUgPSB0cnVlLCBUci5uZXh0VGljayhHNSwgdCwgZSkpOwogICAgfQogICAgZnVuY3Rpb24gRzUodCwgZSkgewogICAgICBmb3IgKDshZS5yZWFkaW5nICYmICFlLmVuZGVkICYmIChlLmxlbmd0aCA8IGUuaGlnaFdhdGVyTWFyayB8fCBlLmZsb3dpbmcgJiYgZS5sZW5ndGggPT09IDApOyApIHsKICAgICAgICBsZXQgciA9IGUubGVuZ3RoOwogICAgICAgIGlmIChQZSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSwgdC5yZWFkKDApLCByID09PSBlLmxlbmd0aCkKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGUucmVhZGluZ01vcmUgPSBmYWxzZTsKICAgIH0KICAgIExlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhyb3cgbmV3IFU1KCJfcmVhZCgpIik7CiAgICB9OwogICAgTGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGxldCByID0gdGhpcywgbyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7CiAgICAgIG8ucGlwZXMubGVuZ3RoID09PSAxICYmIChvLm11bHRpQXdhaXREcmFpbiB8fCAoby5tdWx0aUF3YWl0RHJhaW4gPSB0cnVlLCBvLmF3YWl0RHJhaW5Xcml0ZXJzID0gbmV3IHE1KG8uYXdhaXREcmFpbldyaXRlcnMgPyBbby5hd2FpdERyYWluV3JpdGVyc10gOiBbXSkpKSwgby5waXBlcy5wdXNoKHQpLCBQZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIiwgby5waXBlcy5sZW5ndGgsIGUpOwogICAgICBsZXQgcCA9ICghZSB8fCBlLmVuZCAhPT0gZmFsc2UpICYmIHQgIT09IFRyLnN0ZG91dCAmJiB0ICE9PSBUci5zdGRlcnIgPyB5MiA6IF9lOwogICAgICBvLmVuZEVtaXR0ZWQgPyBUci5uZXh0VGljayhwKSA6IHIub25jZSgiZW5kIiwgcCksIHQub24oInVucGlwZSIsIG0yKTsKICAgICAgZnVuY3Rpb24gbTIoTiwgd2UpIHsKICAgICAgICBQZSgib251bnBpcGUiKSwgTiA9PT0gciAmJiB3ZSAmJiB3ZS5oYXNVbnBpcGVkID09PSBmYWxzZSAmJiAod2UuaGFzVW5waXBlZCA9IHRydWUsIFMoKSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geTIoKSB7CiAgICAgICAgUGUoIm9uZW5kIiksIHQuZW5kKCk7CiAgICAgIH0KICAgICAgbGV0IE0sIHggPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gUygpIHsKICAgICAgICBQZSgiY2xlYW51cCIpLCB0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIEwyKSwgdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIiwgZ2UpLCBNICYmIHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIiwgTSksIHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgcTIpLCB0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLCBtMiksIHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHkyKSwgci5yZW1vdmVMaXN0ZW5lcigiZW5kIiwgX2UpLCByLnJlbW92ZUxpc3RlbmVyKCJkYXRhIiwgQiksIHggPSB0cnVlLCBNICYmIG8uYXdhaXREcmFpbldyaXRlcnMgJiYgKCF0Ll93cml0YWJsZVN0YXRlIHx8IHQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSAmJiBNKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRTIoKSB7CiAgICAgICAgeCB8fCAoby5waXBlcy5sZW5ndGggPT09IDEgJiYgby5waXBlc1swXSA9PT0gdCA/IChQZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIiwgMCksIG8uYXdhaXREcmFpbldyaXRlcnMgPSB0LCBvLm11bHRpQXdhaXREcmFpbiA9IGZhbHNlKSA6IG8ucGlwZXMubGVuZ3RoID4gMSAmJiBvLnBpcGVzLmluY2x1ZGVzKHQpICYmIChQZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIiwgby5hd2FpdERyYWluV3JpdGVycy5zaXplKSwgby5hd2FpdERyYWluV3JpdGVycy5hZGQodCkpLCByLnBhdXNlKCkpLCBNIHx8IChNID0gWTUociwgdCksIHQub24oImRyYWluIiwgTSkpOwogICAgICB9CiAgICAgIHIub24oImRhdGEiLCBCKTsKICAgICAgZnVuY3Rpb24gQihOKSB7CiAgICAgICAgUGUoIm9uZGF0YSIpOwogICAgICAgIGxldCB3ZSA9IHQud3JpdGUoTik7CiAgICAgICAgUGUoImRlc3Qud3JpdGUiLCB3ZSksIHdlID09PSBmYWxzZSAmJiBFMigpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHEyKE4pIHsKICAgICAgICBpZiAoUGUoIm9uZXJyb3IiLCBOKSwgX2UoKSwgdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLCBxMiksIHQubGlzdGVuZXJDb3VudCgiZXJyb3IiKSA9PT0gMCkgewogICAgICAgICAgbGV0IHdlID0gdC5fd3JpdGFibGVTdGF0ZSB8fCB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICAgICAgd2UgJiYgIXdlLmVycm9yRW1pdHRlZCA/IHNmKHQsIE4pIDogdC5lbWl0KCJlcnJvciIsIE4pOwogICAgICAgIH0KICAgICAgfQogICAgICBMNSh0LCAiZXJyb3IiLCBxMik7CiAgICAgIGZ1bmN0aW9uIEwyKCkgewogICAgICAgIHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsIGdlKSwgX2UoKTsKICAgICAgfQogICAgICB0Lm9uY2UoImNsb3NlIiwgTDIpOwogICAgICBmdW5jdGlvbiBnZSgpIHsKICAgICAgICBQZSgib25maW5pc2giKSwgdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLCBMMiksIF9lKCk7CiAgICAgIH0KICAgICAgdC5vbmNlKCJmaW5pc2giLCBnZSk7CiAgICAgIGZ1bmN0aW9uIF9lKCkgewogICAgICAgIFBlKCJ1bnBpcGUiKSwgci51bnBpcGUodCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHQuZW1pdCgicGlwZSIsIHIpLCB0LndyaXRhYmxlTmVlZERyYWluID09PSB0cnVlID8gby5mbG93aW5nICYmIEUyKCkgOiBvLmZsb3dpbmcgfHwgKFBlKCJwaXBlIHJlc3VtZSIpLCByLnJlc3VtZSgpKSwgdDsKICAgIH07CiAgICBmdW5jdGlvbiBZNSh0LCBlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBsZXQgbyA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgICAgby5hd2FpdERyYWluV3JpdGVycyA9PT0gZSA/IChQZSgicGlwZU9uRHJhaW4iLCAxKSwgby5hd2FpdERyYWluV3JpdGVycyA9IG51bGwpIDogby5tdWx0aUF3YWl0RHJhaW4gJiYgKFBlKCJwaXBlT25EcmFpbiIsIG8uYXdhaXREcmFpbldyaXRlcnMuc2l6ZSksIG8uYXdhaXREcmFpbldyaXRlcnMuZGVsZXRlKGUpKSwgKCFvLmF3YWl0RHJhaW5Xcml0ZXJzIHx8IG8uYXdhaXREcmFpbldyaXRlcnMuc2l6ZSA9PT0gMCkgJiYgdC5saXN0ZW5lckNvdW50KCJkYXRhIikgJiYgdC5yZXN1bWUoKTsKICAgICAgfTsKICAgIH0KICAgIExlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIGxldCBlID0gdGhpcy5fcmVhZGFibGVTdGF0ZSwgciA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTsKICAgICAgaWYgKGUucGlwZXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBpZiAoIXQpIHsKICAgICAgICBsZXQgZiA9IGUucGlwZXM7CiAgICAgICAgZS5waXBlcyA9IFtdLCB0aGlzLnBhdXNlKCk7CiAgICAgICAgZm9yIChsZXQgcCA9IDA7cCA8IGYubGVuZ3RoOyBwKyspCiAgICAgICAgICBmW3BdLmVtaXQoInVucGlwZSIsIHRoaXMsIHsgaGFzVW5waXBlZDogZmFsc2UgfSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgbGV0IG8gPSB4NShlLnBpcGVzLCB0KTsKICAgICAgcmV0dXJuIG8gPT09IC0xID8gdGhpcyA6IChlLnBpcGVzLnNwbGljZShvLCAxKSwgZS5waXBlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5wYXVzZSgpLCB0LmVtaXQoInVucGlwZSIsIHRoaXMsIHIpLCB0aGlzKTsKICAgIH07CiAgICBMZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGxldCByID0gSGkucHJvdG90eXBlLm9uLmNhbGwodGhpcywgdCwgZSksIG8gPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICByZXR1cm4gdCA9PT0gImRhdGEiID8gKG8ucmVhZGFibGVMaXN0ZW5pbmcgPSB0aGlzLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIikgPiAwLCBvLmZsb3dpbmcgIT09IGZhbHNlICYmIHRoaXMucmVzdW1lKCkpIDogdCA9PT0gInJlYWRhYmxlIiAmJiAhby5lbmRFbWl0dGVkICYmICFvLnJlYWRhYmxlTGlzdGVuaW5nICYmIChvLnJlYWRhYmxlTGlzdGVuaW5nID0gby5uZWVkUmVhZGFibGUgPSB0cnVlLCBvLmZsb3dpbmcgPSBmYWxzZSwgby5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZSwgUGUoIm9uIHJlYWRhYmxlIiwgby5sZW5ndGgsIG8ucmVhZGluZyksIG8ubGVuZ3RoID8gUW8odGhpcykgOiBvLnJlYWRpbmcgfHwgVHIubmV4dFRpY2soWDUsIHRoaXMpKSwgcjsKICAgIH07CiAgICBMZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBMZS5wcm90b3R5cGUub247CiAgICBMZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGxldCByID0gSGkucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcywgdCwgZSk7CiAgICAgIHJldHVybiB0ID09PSAicmVhZGFibGUiICYmIFRyLm5leHRUaWNrKGF2LCB0aGlzKSwgcjsKICAgIH07CiAgICBMZS5wcm90b3R5cGUub2ZmID0gTGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwogICAgTGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgbGV0IGUgPSBIaS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiAodCA9PT0gInJlYWRhYmxlIiB8fCB0ID09PSB1bmRlZmluZWQpICYmIFRyLm5leHRUaWNrKGF2LCB0aGlzKSwgZTsKICAgIH07CiAgICBmdW5jdGlvbiBhdih0KSB7CiAgICAgIGxldCBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgZS5yZWFkYWJsZUxpc3RlbmluZyA9IHQubGlzdGVuZXJDb3VudCgicmVhZGFibGUiKSA+IDAsIGUucmVzdW1lU2NoZWR1bGVkICYmIGVbd25dID09PSBmYWxzZSA/IGUuZmxvd2luZyA9IHRydWUgOiB0Lmxpc3RlbmVyQ291bnQoImRhdGEiKSA+IDAgPyB0LnJlc3VtZSgpIDogZS5yZWFkYWJsZUxpc3RlbmluZyB8fCAoZS5mbG93aW5nID0gbnVsbCk7CiAgICB9CiAgICBmdW5jdGlvbiBYNSh0KSB7CiAgICAgIFBlKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSwgdC5yZWFkKDApOwogICAgfQogICAgTGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgdCA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7CiAgICAgIHJldHVybiB0LmZsb3dpbmcgfHwgKFBlKCJyZXN1bWUiKSwgdC5mbG93aW5nID0gIXQucmVhZGFibGVMaXN0ZW5pbmcsIEo1KHRoaXMsIHQpKSwgdFt3bl0gPSBmYWxzZSwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiBKNSh0LCBlKSB7CiAgICAgIGUucmVzdW1lU2NoZWR1bGVkIHx8IChlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWUsIFRyLm5leHRUaWNrKFE1LCB0LCBlKSk7CiAgICB9CiAgICBmdW5jdGlvbiBRNSh0LCBlKSB7CiAgICAgIFBlKCJyZXN1bWUiLCBlLnJlYWRpbmcpLCBlLnJlYWRpbmcgfHwgdC5yZWFkKDApLCBlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlLCB0LmVtaXQoInJlc3VtZSIpLCBvdih0KSwgZS5mbG93aW5nICYmICFlLnJlYWRpbmcgJiYgdC5yZWFkKDApOwogICAgfQogICAgTGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBQZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIiwgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSAmJiAoUGUoInBhdXNlIiksIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlLCB0aGlzLmVtaXQoInBhdXNlIikpLCB0aGlzLl9yZWFkYWJsZVN0YXRlW3duXSA9IHRydWUsIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gb3YodCkgewogICAgICBsZXQgZSA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIGZvciAoUGUoImZsb3ciLCBlLmZsb3dpbmcpO2UuZmxvd2luZyAmJiB0LnJlYWQoKSAhPT0gbnVsbDsgKQogICAgICAgIDsKICAgIH0KICAgIExlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24odCkgewogICAgICBsZXQgZSA9IGZhbHNlOwogICAgICB0Lm9uKCJkYXRhIiwgKG8pID0+IHsKICAgICAgICAhdGhpcy5wdXNoKG8pICYmIHQucGF1c2UgJiYgKGUgPSB0cnVlLCB0LnBhdXNlKCkpOwogICAgICB9KSwgdC5vbigiZW5kIiwgKCkgPT4gewogICAgICAgIHRoaXMucHVzaChudWxsKTsKICAgICAgfSksIHQub24oImVycm9yIiwgKG8pID0+IHsKICAgICAgICBzZih0aGlzLCBvKTsKICAgICAgfSksIHQub24oImNsb3NlIiwgKCkgPT4gewogICAgICAgIHRoaXMuZGVzdHJveSgpOwogICAgICB9KSwgdC5vbigiZGVzdHJveSIsICgpID0+IHsKICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgfSksIHRoaXMuX3JlYWQgPSAoKSA9PiB7CiAgICAgICAgZSAmJiB0LnJlc3VtZSAmJiAoZSA9IGZhbHNlLCB0LnJlc3VtZSgpKTsKICAgICAgfTsKICAgICAgbGV0IHIgPSBSNSh0KTsKICAgICAgZm9yIChsZXQgbyA9IDE7byA8IHIubGVuZ3RoOyBvKyspIHsKICAgICAgICBsZXQgZiA9IHJbb107CiAgICAgICAgdGhpc1tmXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0W2ZdID09ICJmdW5jdGlvbiIgJiYgKHRoaXNbZl0gPSB0W2ZdLmJpbmQodCkpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIExlLnByb3RvdHlwZVtJNV0gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHN2KHRoaXMpOwogICAgfTsKICAgIExlLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIHQgIT09IHVuZGVmaW5lZCAmJiBLNSh0LCAib3B0aW9ucyIpLCBzdih0aGlzLCB0KTsKICAgIH07CiAgICBmdW5jdGlvbiBzdih0LCBlKSB7CiAgICAgIHR5cGVvZiB0LnJlYWQgIT0gImZ1bmN0aW9uIiAmJiAodCA9IExlLndyYXAodCwgeyBvYmplY3RNb2RlOiB0cnVlIH0pKTsKICAgICAgbGV0IHIgPSBleCh0LCBlKTsKICAgICAgcmV0dXJuIHIuc3RyZWFtID0gdCwgcjsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uKiBleCh0LCBlKSB7CiAgICAgIGxldCByID0gemg7CiAgICAgIGZ1bmN0aW9uIG8obTIpIHsKICAgICAgICB0aGlzID09PSB0ID8gKHIoKSwgciA9IHpoKSA6IHIgPSBtMjsKICAgICAgfQogICAgICB0Lm9uKCJyZWFkYWJsZSIsIG8pOwogICAgICBsZXQgZiwgcCA9IEQ1KHQsIHsgd3JpdGFibGU6IGZhbHNlIH0sIChtMikgPT4gewogICAgICAgIGYgPSBtMiA/IFExKGYsIG0yKSA6IG51bGwsIHIoKSwgciA9IHpoOwogICAgICB9KTsKICAgICAgdHJ5IHsKICAgICAgICBmb3IgKDs7ICkgewogICAgICAgICAgbGV0IG0yID0gdC5kZXN0cm95ZWQgPyBudWxsIDogdC5yZWFkKCk7CiAgICAgICAgICBpZiAobTIgIT09IG51bGwpCiAgICAgICAgICAgIHlpZWxkIG0yOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChmKQogICAgICAgICAgICAgIHRocm93IGY7CiAgICAgICAgICAgIGlmIChmID09PSBudWxsKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgYXdhaXQgbmV3IEI1KG8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAobTIpIHsKICAgICAgICB0aHJvdyBmID0gUTEoZiwgbTIpLCBmOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIChmIHx8IGU/LmRlc3Ryb3lPblJldHVybiAhPT0gZmFsc2UpICYmIChmID09PSB1bmRlZmluZWQgfHwgdC5fcmVhZGFibGVTdGF0ZS5hdXRvRGVzdHJveSkgPyBoZi5kZXN0cm95ZXIodCwgbnVsbCkgOiAodC5vZmYoInJlYWRhYmxlIiwgbyksIHAoKSk7CiAgICAgIH0KICAgIH0KICAgIHR2KExlLnByb3RvdHlwZSwgeyByZWFkYWJsZTogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgbGV0IHQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICByZXR1cm4gISF0ICYmIHQucmVhZGFibGUgIT09IGZhbHNlICYmICF0LmRlc3Ryb3llZCAmJiAhdC5lcnJvckVtaXR0ZWQgJiYgIXQuZW5kRW1pdHRlZDsKICAgIH0sIHNldCh0KSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSAhIXQpOwogICAgfSB9LCByZWFkYWJsZURpZFJlYWQ6IHsgX19wcm90b19fOiBudWxsLCBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWQ7CiAgICB9IH0sIHJlYWRhYmxlQWJvcnRlZDogeyBfX3Byb3RvX186IG51bGwsIGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gISEodGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIHx8IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCkgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCk7CiAgICB9IH0sIHJlYWRhYmxlSGlnaFdhdGVyTWFyazogeyBfX3Byb3RvX186IG51bGwsIGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrOwogICAgfSB9LCByZWFkYWJsZUJ1ZmZlcjogeyBfX3Byb3RvX186IG51bGwsIGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjsKICAgIH0gfSwgcmVhZGFibGVGbG93aW5nOiB7IF9fcHJvdG9fXzogbnVsbCwgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc7CiAgICB9LCBzZXQ6IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gdCk7CiAgICB9IH0sIHJlYWRhYmxlTGVuZ3RoOiB7IF9fcHJvdG9fXzogbnVsbCwgZW51bWVyYWJsZTogZmFsc2UsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoOwogICAgfSB9LCByZWFkYWJsZU9iamVjdE1vZGU6IHsgX19wcm90b19fOiBudWxsLCBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlOwogICAgfSB9LCByZWFkYWJsZUVuY29kaW5nOiB7IF9fcHJvdG9fXzogbnVsbCwgZW51bWVyYWJsZTogZmFsc2UsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nIDogbnVsbDsKICAgIH0gfSwgZXJyb3JlZDogeyBfX3Byb3RvX186IG51bGwsIGVudW1lcmFibGU6IGZhbHNlLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkIDogbnVsbDsKICAgIH0gfSwgY2xvc2VkOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2U7CiAgICB9IH0sIGRlc3Ryb3llZDogeyBfX3Byb3RvX186IG51bGwsIGVudW1lcmFibGU6IGZhbHNlLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgOiBmYWxzZTsKICAgIH0sIHNldCh0KSB7CiAgICAgICF0aGlzLl9yZWFkYWJsZVN0YXRlIHx8ICh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHQpOwogICAgfSB9LCByZWFkYWJsZUVuZGVkOiB7IF9fcHJvdG9fXzogbnVsbCwgZW51bWVyYWJsZTogZmFsc2UsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgOiBmYWxzZTsKICAgIH0gfSB9KTsKICAgIHR2KGpoLnByb3RvdHlwZSwgeyBwaXBlc0NvdW50OiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5waXBlcy5sZW5ndGg7CiAgICB9IH0sIHBhdXNlZDogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXNbd25dICE9PSBmYWxzZTsKICAgIH0sIHNldCh0KSB7CiAgICAgIHRoaXNbd25dID0gISF0OwogICAgfSB9IH0pOwogICAgTGUuX2Zyb21MaXN0ID0gaHY7CiAgICBmdW5jdGlvbiBodih0LCBlKSB7CiAgICAgIGlmIChlLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgbGV0IHI7CiAgICAgIHJldHVybiBlLm9iamVjdE1vZGUgPyByID0gZS5idWZmZXIuc2hpZnQoKSA6ICF0IHx8IHQgPj0gZS5sZW5ndGggPyAoZS5kZWNvZGVyID8gciA9IGUuYnVmZmVyLmpvaW4oIiIpIDogZS5idWZmZXIubGVuZ3RoID09PSAxID8gciA9IGUuYnVmZmVyLmZpcnN0KCkgOiByID0gZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSwgZS5idWZmZXIuY2xlYXIoKSkgOiByID0gZS5idWZmZXIuY29uc3VtZSh0LCBlLmRlY29kZXIpLCByOwogICAgfQogICAgZnVuY3Rpb24gV2godCkgewogICAgICBsZXQgZSA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIFBlKCJlbmRSZWFkYWJsZSIsIGUuZW5kRW1pdHRlZCksIGUuZW5kRW1pdHRlZCB8fCAoZS5lbmRlZCA9IHRydWUsIFRyLm5leHRUaWNrKHR4LCBlLCB0KSk7CiAgICB9CiAgICBmdW5jdGlvbiB0eCh0LCBlKSB7CiAgICAgIGlmIChQZSgiZW5kUmVhZGFibGVOVCIsIHQuZW5kRW1pdHRlZCwgdC5sZW5ndGgpLCAhdC5lcnJvcmVkICYmICF0LmNsb3NlRW1pdHRlZCAmJiAhdC5lbmRFbWl0dGVkICYmIHQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgaWYgKHQuZW5kRW1pdHRlZCA9IHRydWUsIGUuZW1pdCgiZW5kIiksIGUud3JpdGFibGUgJiYgZS5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkKICAgICAgICAgIFRyLm5leHRUaWNrKHJ4LCBlKTsKICAgICAgICBlbHNlIGlmICh0LmF1dG9EZXN0cm95KSB7CiAgICAgICAgICBsZXQgciA9IGUuX3dyaXRhYmxlU3RhdGU7CiAgICAgICAgICAoIXIgfHwgci5hdXRvRGVzdHJveSAmJiAoci5maW5pc2hlZCB8fCByLndyaXRhYmxlID09PSBmYWxzZSkpICYmIGUuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcngodCkgewogICAgICB0LndyaXRhYmxlICYmICF0LndyaXRhYmxlRW5kZWQgJiYgIXQuZGVzdHJveWVkICYmIHQuZW5kKCk7CiAgICB9CiAgICBMZS5mcm9tID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gajUoTGUsIHQsIGUpOwogICAgfTsKICAgIHZhciBLaDsKICAgIGZ1bmN0aW9uIHV2KCkgewogICAgICByZXR1cm4gS2ggPT09IHVuZGVmaW5lZCAmJiAoS2ggPSB7fSksIEtoOwogICAgfQogICAgTGUuZnJvbVdlYiA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIHV2KCkubmV3U3RyZWFtUmVhZGFibGVGcm9tUmVhZGFibGVTdHJlYW0odCwgZSk7CiAgICB9OwogICAgTGUudG9XZWIgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiB1digpLm5ld1JlYWRhYmxlU3RyZWFtRnJvbVN0cmVhbVJlYWRhYmxlKHQsIGUpOwogICAgfTsKICAgIExlLndyYXAgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHZhciByLCBvOwogICAgICByZXR1cm4gbmV3IExlKHsgb2JqZWN0TW9kZTogKHIgPSAobyA9IHQucmVhZGFibGVPYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBvICE9PSB1bmRlZmluZWQgPyBvIDogdC5vYmplY3RNb2RlKSAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgPyByIDogdHJ1ZSwgLi4uZSwgZGVzdHJveShmLCBwKSB7CiAgICAgICAgaGYuZGVzdHJveWVyKHQsIGYpLCBwKGYpOwogICAgICB9IH0pLndyYXAodCk7CiAgICB9OwogIH0pOwogIEpoID0gVDIoKGpJLCB4dikgPT4gewogICAgdmFyIE1uID0gKE9pKCksIHVyKHByKSksIHsgQXJyYXlQcm90b3R5cGVTbGljZTogcHYsIEVycm9yOiBpeCwgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZTogdnYsIE9iamVjdERlZmluZVByb3BlcnR5OiBidiwgT2JqZWN0RGVmaW5lUHJvcGVydGllczogbngsIE9iamVjdFNldFByb3RvdHlwZU9mOiBtdiwgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2U6IGZ4LCBTeW1ib2w6IGF4LCBTeW1ib2xIYXNJbnN0YW5jZTogb3ggfSA9IFR0KCk7CiAgICB4di5leHBvcnRzID0gc3Q7CiAgICBzdC5Xcml0YWJsZVN0YXRlID0geWE7CiAgICB2YXIgeyBFdmVudEVtaXR0ZXI6IHN4IH0gPSBraSgpLCBtYSA9IFZvKCkuU3RyZWFtLCB7IEJ1ZmZlcjogZXMgfSA9IFV0KCksIGlzID0geW4oKSwgeyBhZGRBYm9ydFNpZ25hbDogaHggfSA9IEdvKCksIHsgZ2V0SGlnaFdhdGVyTWFyazogdXgsIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrOiBseCB9ID0gWG8oKSwgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRTogZHgsIEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEOiBjeCwgRVJSX01VTFRJUExFX0NBTExCQUNLOiBndiwgRVJSX1NUUkVBTV9DQU5OT1RfUElQRTogcHgsIEVSUl9TVFJFQU1fREVTVFJPWUVEOiBnYSwgRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEOiB2eCwgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUzogYngsIEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EOiBteCwgRVJSX1VOS05PV05fRU5DT0RJTkc6IHl2IH0gPSBKdCgpLmNvZGVzLCB7IGVycm9yT3JEZXN0cm95OiB1ZiB9ID0gaXM7CiAgICBtdihzdC5wcm90b3R5cGUsIG1hLnByb3RvdHlwZSk7CiAgICBtdihzdCwgbWEpOwogICAgZnVuY3Rpb24gJGgoKSB7CiAgICB9CiAgICB2YXIgbGYgPSBheCgia09uRmluaXNoZWQiKTsKICAgIGZ1bmN0aW9uIHlhKHQsIGUsIHIpIHsKICAgICAgdHlwZW9mIHIgIT0gImJvb2xlYW4iICYmIChyID0gZSBpbnN0YW5jZW9mIFFyKCkpLCB0aGlzLm9iamVjdE1vZGUgPSAhISh0ICYmIHQub2JqZWN0TW9kZSksIHIgJiYgKHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhISh0ICYmIHQud3JpdGFibGVPYmplY3RNb2RlKSksIHRoaXMuaGlnaFdhdGVyTWFyayA9IHQgPyB1eCh0aGlzLCB0LCAid3JpdGFibGVIaWdoV2F0ZXJNYXJrIiwgcikgOiBseChmYWxzZSksIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZSwgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZSwgdGhpcy5lbmRpbmcgPSBmYWxzZSwgdGhpcy5lbmRlZCA9IGZhbHNlLCB0aGlzLmZpbmlzaGVkID0gZmFsc2UsIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CiAgICAgIGxldCBvID0gISEodCAmJiB0LmRlY29kZVN0cmluZ3MgPT09IGZhbHNlKTsKICAgICAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW8sIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gdCAmJiB0LmRlZmF1bHRFbmNvZGluZyB8fCAidXRmOCIsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy53cml0aW5nID0gZmFsc2UsIHRoaXMuY29ya2VkID0gMCwgdGhpcy5zeW5jID0gdHJ1ZSwgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2UsIHRoaXMub253cml0ZSA9IHl4LmJpbmQodW5kZWZpbmVkLCBlKSwgdGhpcy53cml0ZWNiID0gbnVsbCwgdGhpcy53cml0ZWxlbiA9IDAsIHRoaXMuYWZ0ZXJXcml0ZVRpY2tJbmZvID0gbnVsbCwgcnModGhpcyksIHRoaXMucGVuZGluZ2NiID0gMCwgdGhpcy5jb25zdHJ1Y3RlZCA9IHRydWUsIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZSwgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZSwgdGhpcy5lbWl0Q2xvc2UgPSAhdCB8fCB0LmVtaXRDbG9zZSAhPT0gZmFsc2UsIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhdCB8fCB0LmF1dG9EZXN0cm95ICE9PSBmYWxzZSwgdGhpcy5lcnJvcmVkID0gbnVsbCwgdGhpcy5jbG9zZWQgPSBmYWxzZSwgdGhpcy5jbG9zZUVtaXR0ZWQgPSBmYWxzZSwgdGhpc1tsZl0gPSBbXTsKICAgIH0KICAgIGZ1bmN0aW9uIHJzKHQpIHsKICAgICAgdC5idWZmZXJlZCA9IFtdLCB0LmJ1ZmZlcmVkSW5kZXggPSAwLCB0LmFsbEJ1ZmZlcnMgPSB0cnVlLCB0LmFsbE5vb3AgPSB0cnVlOwogICAgfQogICAgeWEucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcHYodGhpcy5idWZmZXJlZCwgdGhpcy5idWZmZXJlZEluZGV4KTsKICAgIH07CiAgICBidih5YS5wcm90b3R5cGUsICJidWZmZXJlZFJlcXVlc3RDb3VudCIsIHsgX19wcm90b19fOiBudWxsLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkLmxlbmd0aCAtIHRoaXMuYnVmZmVyZWRJbmRleDsKICAgIH0gfSk7CiAgICBmdW5jdGlvbiBzdCh0KSB7CiAgICAgIGxldCBlID0gdGhpcyBpbnN0YW5jZW9mIFFyKCk7CiAgICAgIGlmICghZSAmJiAhdnYoc3QsIHRoaXMpKQogICAgICAgIHJldHVybiBuZXcgc3QodCk7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgeWEodCwgdGhpcywgZSksIHQgJiYgKHR5cGVvZiB0LndyaXRlID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX3dyaXRlID0gdC53cml0ZSksIHR5cGVvZiB0LndyaXRldiA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl93cml0ZXYgPSB0LndyaXRldiksIHR5cGVvZiB0LmRlc3Ryb3kgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fZGVzdHJveSA9IHQuZGVzdHJveSksIHR5cGVvZiB0LmZpbmFsID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX2ZpbmFsID0gdC5maW5hbCksIHR5cGVvZiB0LmNvbnN0cnVjdCA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9jb25zdHJ1Y3QgPSB0LmNvbnN0cnVjdCksIHQuc2lnbmFsICYmIGh4KHQuc2lnbmFsLCB0aGlzKSksIG1hLmNhbGwodGhpcywgdCksIGlzLmNvbnN0cnVjdCh0aGlzLCAoKSA9PiB7CiAgICAgICAgbGV0IHIgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICAgIHIud3JpdGluZyB8fCBZaCh0aGlzLCByKSwgWGgodGhpcywgcik7CiAgICAgIH0pOwogICAgfQogICAgYnYoc3QsIG94LCB7IF9fcHJvdG9fXzogbnVsbCwgdmFsdWU6IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIHZ2KHRoaXMsIHQpID8gdHJ1ZSA6IHRoaXMgIT09IHN0ID8gZmFsc2UgOiB0ICYmIHQuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiB5YTsKICAgIH0gfSk7CiAgICBzdC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkgewogICAgICB1Zih0aGlzLCBuZXcgcHgpOwogICAgfTsKICAgIGZ1bmN0aW9uIHd2KHQsIGUsIHIsIG8pIHsKICAgICAgbGV0IGYgPSB0Ll93cml0YWJsZVN0YXRlOwogICAgICBpZiAodHlwZW9mIHIgPT0gImZ1bmN0aW9uIikKICAgICAgICBvID0gciwgciA9IGYuZGVmYXVsdEVuY29kaW5nOwogICAgICBlbHNlIHsKICAgICAgICBpZiAoIXIpCiAgICAgICAgICByID0gZi5kZWZhdWx0RW5jb2Rpbmc7CiAgICAgICAgZWxzZSBpZiAociAhPT0gImJ1ZmZlciIgJiYgIWVzLmlzRW5jb2RpbmcocikpCiAgICAgICAgICB0aHJvdyBuZXcgeXYocik7CiAgICAgICAgdHlwZW9mIG8gIT0gImZ1bmN0aW9uIiAmJiAobyA9ICRoKTsKICAgICAgfQogICAgICBpZiAoZSA9PT0gbnVsbCkKICAgICAgICB0aHJvdyBuZXcgYng7CiAgICAgIGlmICghZi5vYmplY3RNb2RlKQogICAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIikKICAgICAgICAgIGYuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgKGUgPSBlcy5mcm9tKGUsIHIpLCByID0gImJ1ZmZlciIpOwogICAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBlcykKICAgICAgICAgIHIgPSAiYnVmZmVyIjsKICAgICAgICBlbHNlIGlmIChtYS5faXNVaW50OEFycmF5KGUpKQogICAgICAgICAgZSA9IG1hLl91aW50OEFycmF5VG9CdWZmZXIoZSksIHIgPSAiYnVmZmVyIjsKICAgICAgICBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgZHgoImNodW5rIiwgWyJzdHJpbmciLCAiQnVmZmVyIiwgIlVpbnQ4QXJyYXkiXSwgZSk7CiAgICAgIGxldCBwOwogICAgICByZXR1cm4gZi5lbmRpbmcgPyBwID0gbmV3IG14IDogZi5kZXN0cm95ZWQgJiYgKHAgPSBuZXcgZ2EoIndyaXRlIikpLCBwID8gKE1uLm5leHRUaWNrKG8sIHApLCB1Zih0LCBwLCB0cnVlKSwgcCkgOiAoZi5wZW5kaW5nY2IrKywgZ3godCwgZiwgZSwgciwgbykpOwogICAgfQogICAgc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICByZXR1cm4gd3YodGhpcywgdCwgZSwgcikgPT09IHRydWU7CiAgICB9OwogICAgc3QucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrKzsKICAgIH07CiAgICBzdC5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCB0ID0gdGhpcy5fd3JpdGFibGVTdGF0ZTsKICAgICAgdC5jb3JrZWQgJiYgKHQuY29ya2VkLS0sIHQud3JpdGluZyB8fCBZaCh0aGlzLCB0KSk7CiAgICB9OwogICAgc3QucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHR5cGVvZiBlID09ICJzdHJpbmciICYmIChlID0gZngoZSkpLCAhZXMuaXNFbmNvZGluZyhlKSkKICAgICAgICB0aHJvdyBuZXcgeXYoZSk7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGUsIHRoaXM7CiAgICB9OwogICAgZnVuY3Rpb24gZ3godCwgZSwgciwgbywgZikgewogICAgICBsZXQgcCA9IGUub2JqZWN0TW9kZSA/IDEgOiByLmxlbmd0aDsKICAgICAgZS5sZW5ndGggKz0gcDsKICAgICAgbGV0IG0yID0gZS5sZW5ndGggPCBlLmhpZ2hXYXRlck1hcms7CiAgICAgIHJldHVybiBtMiB8fCAoZS5uZWVkRHJhaW4gPSB0cnVlKSwgZS53cml0aW5nIHx8IGUuY29ya2VkIHx8IGUuZXJyb3JlZCB8fCAhZS5jb25zdHJ1Y3RlZCA/IChlLmJ1ZmZlcmVkLnB1c2goeyBjaHVuazogciwgZW5jb2Rpbmc6IG8sIGNhbGxiYWNrOiBmIH0pLCBlLmFsbEJ1ZmZlcnMgJiYgbyAhPT0gImJ1ZmZlciIgJiYgKGUuYWxsQnVmZmVycyA9IGZhbHNlKSwgZS5hbGxOb29wICYmIGYgIT09ICRoICYmIChlLmFsbE5vb3AgPSBmYWxzZSkpIDogKGUud3JpdGVsZW4gPSBwLCBlLndyaXRlY2IgPSBmLCBlLndyaXRpbmcgPSB0cnVlLCBlLnN5bmMgPSB0cnVlLCB0Ll93cml0ZShyLCBvLCBlLm9ud3JpdGUpLCBlLnN5bmMgPSBmYWxzZSksIG0yICYmICFlLmVycm9yZWQgJiYgIWUuZGVzdHJveWVkOwogICAgfQogICAgZnVuY3Rpb24gZHYodCwgZSwgciwgbywgZiwgcCwgbTIpIHsKICAgICAgZS53cml0ZWxlbiA9IG8sIGUud3JpdGVjYiA9IG0yLCBlLndyaXRpbmcgPSB0cnVlLCBlLnN5bmMgPSB0cnVlLCBlLmRlc3Ryb3llZCA/IGUub253cml0ZShuZXcgZ2EoIndyaXRlIikpIDogciA/IHQuX3dyaXRldihmLCBlLm9ud3JpdGUpIDogdC5fd3JpdGUoZiwgcCwgZS5vbndyaXRlKSwgZS5zeW5jID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBjdih0LCBlLCByLCBvKSB7CiAgICAgIC0tZS5wZW5kaW5nY2IsIG8ociksIEdoKGUpLCB1Zih0LCByKTsKICAgIH0KICAgIGZ1bmN0aW9uIHl4KHQsIGUpIHsKICAgICAgbGV0IHIgPSB0Ll93cml0YWJsZVN0YXRlLCBvID0gci5zeW5jLCBmID0gci53cml0ZWNiOwogICAgICBpZiAodHlwZW9mIGYgIT0gImZ1bmN0aW9uIikgewogICAgICAgIHVmKHQsIG5ldyBndik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHIud3JpdGluZyA9IGZhbHNlLCByLndyaXRlY2IgPSBudWxsLCByLmxlbmd0aCAtPSByLndyaXRlbGVuLCByLndyaXRlbGVuID0gMCwgZSA/IChlLnN0YWNrLCByLmVycm9yZWQgfHwgKHIuZXJyb3JlZCA9IGUpLCB0Ll9yZWFkYWJsZVN0YXRlICYmICF0Ll9yZWFkYWJsZVN0YXRlLmVycm9yZWQgJiYgKHQuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA9IGUpLCBvID8gTW4ubmV4dFRpY2soY3YsIHQsIHIsIGUsIGYpIDogY3YodCwgciwgZSwgZikpIDogKHIuYnVmZmVyZWQubGVuZ3RoID4gci5idWZmZXJlZEluZGV4ICYmIFloKHQsIHIpLCBvID8gci5hZnRlcldyaXRlVGlja0luZm8gIT09IG51bGwgJiYgci5hZnRlcldyaXRlVGlja0luZm8uY2IgPT09IGYgPyByLmFmdGVyV3JpdGVUaWNrSW5mby5jb3VudCsrIDogKHIuYWZ0ZXJXcml0ZVRpY2tJbmZvID0geyBjb3VudDogMSwgY2I6IGYsIHN0cmVhbTogdCwgc3RhdGU6IHIgfSwgTW4ubmV4dFRpY2sod3gsIHIuYWZ0ZXJXcml0ZVRpY2tJbmZvKSkgOiBNdih0LCByLCAxLCBmKSk7CiAgICB9CiAgICBmdW5jdGlvbiB3eCh7IHN0cmVhbTogdCwgc3RhdGU6IGUsIGNvdW50OiByLCBjYjogbyB9KSB7CiAgICAgIHJldHVybiBlLmFmdGVyV3JpdGVUaWNrSW5mbyA9IG51bGwsIE12KHQsIGUsIHIsIG8pOwogICAgfQogICAgZnVuY3Rpb24gTXYodCwgZSwgciwgbykgewogICAgICBmb3IgKCFlLmVuZGluZyAmJiAhdC5kZXN0cm95ZWQgJiYgZS5sZW5ndGggPT09IDAgJiYgZS5uZWVkRHJhaW4gJiYgKGUubmVlZERyYWluID0gZmFsc2UsIHQuZW1pdCgiZHJhaW4iKSk7ci0tID4gMDsgKQogICAgICAgIGUucGVuZGluZ2NiLS0sIG8oKTsKICAgICAgZS5kZXN0cm95ZWQgJiYgR2goZSksIFhoKHQsIGUpOwogICAgfQogICAgZnVuY3Rpb24gR2godCkgewogICAgICBpZiAodC53cml0aW5nKQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChsZXQgZiA9IHQuYnVmZmVyZWRJbmRleDtmIDwgdC5idWZmZXJlZC5sZW5ndGg7ICsrZikgewogICAgICAgIHZhciBlOwogICAgICAgIGxldCB7IGNodW5rOiBwLCBjYWxsYmFjazogbTIgfSA9IHQuYnVmZmVyZWRbZl0sIHkyID0gdC5vYmplY3RNb2RlID8gMSA6IHAubGVuZ3RoOwogICAgICAgIHQubGVuZ3RoIC09IHkyLCBtMigoZSA9IHQuZXJyb3JlZCkgIT09IG51bGwgJiYgZSAhPT0gdW5kZWZpbmVkID8gZSA6IG5ldyBnYSgid3JpdGUiKSk7CiAgICAgIH0KICAgICAgbGV0IHIgPSB0W2xmXS5zcGxpY2UoMCk7CiAgICAgIGZvciAobGV0IGYgPSAwO2YgPCByLmxlbmd0aDsgZisrKSB7CiAgICAgICAgdmFyIG87CiAgICAgICAgcltmXSgobyA9IHQuZXJyb3JlZCkgIT09IG51bGwgJiYgbyAhPT0gdW5kZWZpbmVkID8gbyA6IG5ldyBnYSgiZW5kIikpOwogICAgICB9CiAgICAgIHJzKHQpOwogICAgfQogICAgZnVuY3Rpb24gWWgodCwgZSkgewogICAgICBpZiAoZS5jb3JrZWQgfHwgZS5idWZmZXJQcm9jZXNzaW5nIHx8IGUuZGVzdHJveWVkIHx8ICFlLmNvbnN0cnVjdGVkKQogICAgICAgIHJldHVybjsKICAgICAgbGV0IHsgYnVmZmVyZWQ6IHIsIGJ1ZmZlcmVkSW5kZXg6IG8sIG9iamVjdE1vZGU6IGYgfSA9IGUsIHAgPSByLmxlbmd0aCAtIG87CiAgICAgIGlmICghcCkKICAgICAgICByZXR1cm47CiAgICAgIGxldCBtMiA9IG87CiAgICAgIGlmIChlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlLCBwID4gMSAmJiB0Ll93cml0ZXYpIHsKICAgICAgICBlLnBlbmRpbmdjYiAtPSBwIC0gMTsKICAgICAgICBsZXQgeTIgPSBlLmFsbE5vb3AgPyAkaCA6ICh4KSA9PiB7CiAgICAgICAgICBmb3IgKGxldCBTID0gbTI7UyA8IHIubGVuZ3RoOyArK1MpCiAgICAgICAgICAgIHJbU10uY2FsbGJhY2soeCk7CiAgICAgICAgfSwgTSA9IGUuYWxsTm9vcCAmJiBtMiA9PT0gMCA/IHIgOiBwdihyLCBtMik7CiAgICAgICAgTS5hbGxCdWZmZXJzID0gZS5hbGxCdWZmZXJzLCBkdih0LCBlLCB0cnVlLCBlLmxlbmd0aCwgTSwgIiIsIHkyKSwgcnMoZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG8gewogICAgICAgICAgbGV0IHsgY2h1bms6IHkyLCBlbmNvZGluZzogTSwgY2FsbGJhY2s6IHggfSA9IHJbbTJdOwogICAgICAgICAgclttMisrXSA9IG51bGw7CiAgICAgICAgICBsZXQgUyA9IGYgPyAxIDogeTIubGVuZ3RoOwogICAgICAgICAgZHYodCwgZSwgZmFsc2UsIFMsIHkyLCBNLCB4KTsKICAgICAgICB9IHdoaWxlIChtMiA8IHIubGVuZ3RoICYmICFlLndyaXRpbmcpOwogICAgICAgIG0yID09PSByLmxlbmd0aCA/IHJzKGUpIDogbTIgPiAyNTYgPyAoci5zcGxpY2UoMCwgbTIpLCBlLmJ1ZmZlcmVkSW5kZXggPSAwKSA6IGUuYnVmZmVyZWRJbmRleCA9IG0yOwogICAgICB9CiAgICAgIGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlOwogICAgfQogICAgc3QucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgaWYgKHRoaXMuX3dyaXRldikKICAgICAgICB0aGlzLl93cml0ZXYoW3sgY2h1bms6IHQsIGVuY29kaW5nOiBlIH1dLCByKTsKICAgICAgZWxzZQogICAgICAgIHRocm93IG5ldyBjeCgiX3dyaXRlKCkiKTsKICAgIH07CiAgICBzdC5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7CiAgICBzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7CiAgICAgIHR5cGVvZiB0ID09ICJmdW5jdGlvbiIgPyAociA9IHQsIHQgPSBudWxsLCBlID0gbnVsbCkgOiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iICYmIChyID0gZSwgZSA9IG51bGwpOwogICAgICBsZXQgZjsKICAgICAgaWYgKHQgIT0gbnVsbCkgewogICAgICAgIGxldCBwID0gd3YodGhpcywgdCwgZSk7CiAgICAgICAgcCBpbnN0YW5jZW9mIGl4ICYmIChmID0gcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG8uY29ya2VkICYmIChvLmNvcmtlZCA9IDEsIHRoaXMudW5jb3JrKCkpLCBmIHx8ICghby5lcnJvcmVkICYmICFvLmVuZGluZyA/IChvLmVuZGluZyA9IHRydWUsIFhoKHRoaXMsIG8sIHRydWUpLCBvLmVuZGVkID0gdHJ1ZSkgOiBvLmZpbmlzaGVkID8gZiA9IG5ldyB2eCgiZW5kIikgOiBvLmRlc3Ryb3llZCAmJiAoZiA9IG5ldyBnYSgiZW5kIikpKSwgdHlwZW9mIHIgPT0gImZ1bmN0aW9uIiAmJiAoZiB8fCBvLmZpbmlzaGVkID8gTW4ubmV4dFRpY2sociwgZikgOiBvW2xmXS5wdXNoKHIpKSwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiB0cyh0KSB7CiAgICAgIHJldHVybiB0LmVuZGluZyAmJiAhdC5kZXN0cm95ZWQgJiYgdC5jb25zdHJ1Y3RlZCAmJiB0Lmxlbmd0aCA9PT0gMCAmJiAhdC5lcnJvcmVkICYmIHQuYnVmZmVyZWQubGVuZ3RoID09PSAwICYmICF0LmZpbmlzaGVkICYmICF0LndyaXRpbmcgJiYgIXQuZXJyb3JFbWl0dGVkICYmICF0LmNsb3NlRW1pdHRlZDsKICAgIH0KICAgIGZ1bmN0aW9uIE14KHQsIGUpIHsKICAgICAgbGV0IHIgPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gbyhmKSB7CiAgICAgICAgaWYgKHIpIHsKICAgICAgICAgIHVmKHQsIGYgPz8gZ3YoKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChyID0gdHJ1ZSwgZS5wZW5kaW5nY2ItLSwgZikgewogICAgICAgICAgbGV0IHAgPSBlW2xmXS5zcGxpY2UoMCk7CiAgICAgICAgICBmb3IgKGxldCBtMiA9IDA7bTIgPCBwLmxlbmd0aDsgbTIrKykKICAgICAgICAgICAgcFttMl0oZik7CiAgICAgICAgICB1Zih0LCBmLCBlLnN5bmMpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgdHMoZSkgJiYgKGUucHJlZmluaXNoZWQgPSB0cnVlLCB0LmVtaXQoInByZWZpbmlzaCIpLCBlLnBlbmRpbmdjYisrLCBNbi5uZXh0VGljayhWaCwgdCwgZSkpOwogICAgICB9CiAgICAgIGUuc3luYyA9IHRydWUsIGUucGVuZGluZ2NiKys7CiAgICAgIHRyeSB7CiAgICAgICAgdC5fZmluYWwobyk7CiAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICBvKGYpOwogICAgICB9CiAgICAgIGUuc3luYyA9IGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gX3godCwgZSkgewogICAgICAhZS5wcmVmaW5pc2hlZCAmJiAhZS5maW5hbENhbGxlZCAmJiAodHlwZW9mIHQuX2ZpbmFsID09ICJmdW5jdGlvbiIgJiYgIWUuZGVzdHJveWVkID8gKGUuZmluYWxDYWxsZWQgPSB0cnVlLCBNeCh0LCBlKSkgOiAoZS5wcmVmaW5pc2hlZCA9IHRydWUsIHQuZW1pdCgicHJlZmluaXNoIikpKTsKICAgIH0KICAgIGZ1bmN0aW9uIFhoKHQsIGUsIHIpIHsKICAgICAgdHMoZSkgJiYgKF94KHQsIGUpLCBlLnBlbmRpbmdjYiA9PT0gMCAmJiAociA/IChlLnBlbmRpbmdjYisrLCBNbi5uZXh0VGljaygobywgZikgPT4gewogICAgICAgIHRzKGYpID8gVmgobywgZikgOiBmLnBlbmRpbmdjYi0tOwogICAgICB9LCB0LCBlKSkgOiB0cyhlKSAmJiAoZS5wZW5kaW5nY2IrKywgVmgodCwgZSkpKSk7CiAgICB9CiAgICBmdW5jdGlvbiBWaCh0LCBlKSB7CiAgICAgIGUucGVuZGluZ2NiLS0sIGUuZmluaXNoZWQgPSB0cnVlOwogICAgICBsZXQgciA9IGVbbGZdLnNwbGljZSgwKTsKICAgICAgZm9yIChsZXQgbyA9IDA7byA8IHIubGVuZ3RoOyBvKyspCiAgICAgICAgcltvXSgpOwogICAgICBpZiAodC5lbWl0KCJmaW5pc2giKSwgZS5hdXRvRGVzdHJveSkgewogICAgICAgIGxldCBvID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgICAoIW8gfHwgby5hdXRvRGVzdHJveSAmJiAoby5lbmRFbWl0dGVkIHx8IG8ucmVhZGFibGUgPT09IGZhbHNlKSkgJiYgdC5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIG54KHN0LnByb3RvdHlwZSwgeyBjbG9zZWQ6IHsgX19wcm90b19fOiBudWxsLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5jbG9zZWQgOiBmYWxzZTsKICAgIH0gfSwgZGVzdHJveWVkOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2U7CiAgICB9LCBzZXQodCkgewogICAgICB0aGlzLl93cml0YWJsZVN0YXRlICYmICh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHQpOwogICAgfSB9LCB3cml0YWJsZTogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgbGV0IHQgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICByZXR1cm4gISF0ICYmIHQud3JpdGFibGUgIT09IGZhbHNlICYmICF0LmRlc3Ryb3llZCAmJiAhdC5lcnJvcmVkICYmICF0LmVuZGluZyAmJiAhdC5lbmRlZDsKICAgIH0sIHNldCh0KSB7CiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgKHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSAhIXQpOwogICAgfSB9LCB3cml0YWJsZUZpbmlzaGVkOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgOiBmYWxzZTsKICAgIH0gfSwgd3JpdGFibGVPYmplY3RNb2RlOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUub2JqZWN0TW9kZSA6IGZhbHNlOwogICAgfSB9LCB3cml0YWJsZUJ1ZmZlcjogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKTsKICAgIH0gfSwgd3JpdGFibGVFbmRlZDogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA6IGZhbHNlOwogICAgfSB9LCB3cml0YWJsZU5lZWREcmFpbjogeyBfX3Byb3RvX186IG51bGwsIGdldCgpIHsKICAgICAgbGV0IHQgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICByZXR1cm4gdCA/ICF0LmRlc3Ryb3llZCAmJiAhdC5lbmRpbmcgJiYgdC5uZWVkRHJhaW4gOiBmYWxzZTsKICAgIH0gfSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7CiAgICB9IH0sIHdyaXRhYmxlQ29ya2VkOiB7IF9fcHJvdG9fXzogbnVsbCwgZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkIDogMDsKICAgIH0gfSwgd3JpdGFibGVMZW5ndGg6IHsgX19wcm90b19fOiBudWxsLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoOwogICAgfSB9LCBlcnJvcmVkOiB7IF9fcHJvdG9fXzogbnVsbCwgZW51bWVyYWJsZTogZmFsc2UsIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yZWQgOiBudWxsOwogICAgfSB9LCB3cml0YWJsZUFib3J0ZWQ6IHsgX19wcm90b19fOiBudWxsLCBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICEhKHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgIT09IGZhbHNlICYmICh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yZWQpICYmICF0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkKTsKICAgIH0gfSB9KTsKICAgIHZhciB4eCA9IGlzLmRlc3Ryb3k7CiAgICBzdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICByZXR1cm4gIXIuZGVzdHJveWVkICYmIChyLmJ1ZmZlcmVkSW5kZXggPCByLmJ1ZmZlcmVkLmxlbmd0aCB8fCByW2xmXS5sZW5ndGgpICYmIE1uLm5leHRUaWNrKEdoLCByKSwgeHguY2FsbCh0aGlzLCB0LCBlKSwgdGhpczsKICAgIH07CiAgICBzdC5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGlzLnVuZGVzdHJveTsKICAgIHN0LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgZSh0KTsKICAgIH07CiAgICBzdC5wcm90b3R5cGVbc3guY2FwdHVyZVJlamVjdGlvblN5bWJvbF0gPSBmdW5jdGlvbih0KSB7CiAgICAgIHRoaXMuZGVzdHJveSh0KTsKICAgIH07CiAgICB2YXIgWmg7CiAgICBmdW5jdGlvbiBfdigpIHsKICAgICAgcmV0dXJuIFpoID09PSB1bmRlZmluZWQgJiYgKFpoID0ge30pLCBaaDsKICAgIH0KICAgIHN0LmZyb21XZWIgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiBfdigpLm5ld1N0cmVhbVdyaXRhYmxlRnJvbVdyaXRhYmxlU3RyZWFtKHQsIGUpOwogICAgfTsKICAgIHN0LnRvV2ViID0gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gX3YoKS5uZXdXcml0YWJsZVN0cmVhbUZyb21TdHJlYW1Xcml0YWJsZSh0KTsKICAgIH07CiAgfSk7CiAgRHYgPSBUMigoWkksIE52KSA9PiB7CiAgICB2YXIgUWggPSAoT2koKSwgdXIocHIpKSwgU3ggPSBVdCgpLCB7IGlzUmVhZGFibGU6IEV4LCBpc1dyaXRhYmxlOiBBeCwgaXNJdGVyYWJsZTogU3YsIGlzTm9kZVN0cmVhbTogUngsIGlzUmVhZGFibGVOb2RlU3RyZWFtOiBFdiwgaXNXcml0YWJsZU5vZGVTdHJlYW06IEF2LCBpc0R1cGxleE5vZGVTdHJlYW06IEJ4IH0gPSBGaSgpLCBSdiA9IFVpKCksIHsgQWJvcnRFcnJvcjogTHYsIGNvZGVzOiB7IEVSUl9JTlZBTElEX0FSR19UWVBFOiBxeCwgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFOiBCdiB9IH0gPSBKdCgpLCB7IGRlc3Ryb3llcjogZGYgfSA9IHluKCksIEl4ID0gUXIoKSwgVHggPSBiYSgpLCB7IGNyZWF0ZURlZmVycmVkUHJvbWlzZTogcXYgfSA9IEdyKCksIEl2ID0gRmgoKSwgVHYgPSBnbG9iYWxUaGlzLkJsb2IgfHwgU3guQmxvYiwga3ggPSB0eXBlb2YgVHYgPCAidSIgPyBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgVHY7CiAgICB9IDogZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LCBMeCA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyIHx8IE5vKCkuQWJvcnRDb250cm9sbGVyLCB7IEZ1bmN0aW9uUHJvdG90eXBlQ2FsbDoga3YgfSA9IFR0KCksIF9uID0gY2xhc3MgZXh0ZW5kcyBJeCB7CiAgICAgIGNvbnN0cnVjdG9yKGUpIHsKICAgICAgICBzdXBlcihlKSwgZT8ucmVhZGFibGUgPT09IGZhbHNlICYmICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlID0gZmFsc2UsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlKSwgZT8ud3JpdGFibGUgPT09IGZhbHNlICYmICh0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlID0gZmFsc2UsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gdHJ1ZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IHRydWUsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSB0cnVlKTsKICAgICAgfQogICAgfTsKICAgIE52LmV4cG9ydHMgPSBmdW5jdGlvbiB0KGUsIHIpIHsKICAgICAgaWYgKEJ4KGUpKQogICAgICAgIHJldHVybiBlOwogICAgICBpZiAoRXYoZSkpCiAgICAgICAgcmV0dXJuIG5zKHsgcmVhZGFibGU6IGUgfSk7CiAgICAgIGlmIChBdihlKSkKICAgICAgICByZXR1cm4gbnMoeyB3cml0YWJsZTogZSB9KTsKICAgICAgaWYgKFJ4KGUpKQogICAgICAgIHJldHVybiBucyh7IHdyaXRhYmxlOiBmYWxzZSwgcmVhZGFibGU6IGZhbHNlIH0pOwogICAgICBpZiAodHlwZW9mIGUgPT0gImZ1bmN0aW9uIikgewogICAgICAgIGxldCB7IHZhbHVlOiBmLCB3cml0ZTogcCwgZmluYWw6IG0yLCBkZXN0cm95OiB5MiB9ID0gTngoZSk7CiAgICAgICAgaWYgKFN2KGYpKQogICAgICAgICAgcmV0dXJuIEl2KF9uLCBmLCB7IG9iamVjdE1vZGU6IHRydWUsIHdyaXRlOiBwLCBmaW5hbDogbTIsIGRlc3Ryb3k6IHkyIH0pOwogICAgICAgIGxldCBNID0gZj8udGhlbjsKICAgICAgICBpZiAodHlwZW9mIE0gPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgbGV0IHgsIFMgPSBrdihNLCBmLCAoRTIpID0+IHsKICAgICAgICAgICAgaWYgKEUyICE9IG51bGwpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ2KCJudWxseSIsICJib2R5IiwgRTIpOwogICAgICAgICAgfSwgKEUyKSA9PiB7CiAgICAgICAgICAgIGRmKHgsIEUyKTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHggPSBuZXcgX24oeyBvYmplY3RNb2RlOiB0cnVlLCByZWFkYWJsZTogZmFsc2UsIHdyaXRlOiBwLCBmaW5hbChFMikgewogICAgICAgICAgICBtMihhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGF3YWl0IFMsIFFoLm5leHRUaWNrKEUyLCBudWxsKTsKICAgICAgICAgICAgICB9IGNhdGNoIChCKSB7CiAgICAgICAgICAgICAgICBRaC5uZXh0VGljayhFMiwgQik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIGRlc3Ryb3k6IHkyIH0pOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgQnYoIkl0ZXJhYmxlLCBBc3luY0l0ZXJhYmxlIG9yIEFzeW5jRnVuY3Rpb24iLCByLCBmKTsKICAgICAgfQogICAgICBpZiAoa3goZSkpCiAgICAgICAgcmV0dXJuIHQoZS5hcnJheUJ1ZmZlcigpKTsKICAgICAgaWYgKFN2KGUpKQogICAgICAgIHJldHVybiBJdihfbiwgZSwgeyBvYmplY3RNb2RlOiB0cnVlLCB3cml0YWJsZTogZmFsc2UgfSk7CiAgICAgIGlmICh0eXBlb2YgZT8ud3JpdGFibGUgPT0gIm9iamVjdCIgfHwgdHlwZW9mIGU/LnJlYWRhYmxlID09ICJvYmplY3QiKSB7CiAgICAgICAgbGV0IGYgPSBlICE9IG51bGwgJiYgZS5yZWFkYWJsZSA/IEV2KGU/LnJlYWRhYmxlKSA/IGU/LnJlYWRhYmxlIDogdChlLnJlYWRhYmxlKSA6IHVuZGVmaW5lZCwgcCA9IGUgIT0gbnVsbCAmJiBlLndyaXRhYmxlID8gQXYoZT8ud3JpdGFibGUpID8gZT8ud3JpdGFibGUgOiB0KGUud3JpdGFibGUpIDogdW5kZWZpbmVkOwogICAgICAgIHJldHVybiBucyh7IHJlYWRhYmxlOiBmLCB3cml0YWJsZTogcCB9KTsKICAgICAgfQogICAgICBsZXQgbyA9IGU/LnRoZW47CiAgICAgIGlmICh0eXBlb2YgbyA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgbGV0IGY7CiAgICAgICAgcmV0dXJuIGt2KG8sIGUsIChwKSA9PiB7CiAgICAgICAgICBwICE9IG51bGwgJiYgZi5wdXNoKHApLCBmLnB1c2gobnVsbCk7CiAgICAgICAgfSwgKHApID0+IHsKICAgICAgICAgIGRmKGYsIHApOwogICAgICAgIH0pLCBmID0gbmV3IF9uKHsgb2JqZWN0TW9kZTogdHJ1ZSwgd3JpdGFibGU6IGZhbHNlLCByZWFkKCkgewogICAgICAgIH0gfSk7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IHF4KHIsIFsiQmxvYiIsICJSZWFkYWJsZVN0cmVhbSIsICJXcml0YWJsZVN0cmVhbSIsICJTdHJlYW0iLCAiSXRlcmFibGUiLCAiQXN5bmNJdGVyYWJsZSIsICJGdW5jdGlvbiIsICJ7IHJlYWRhYmxlLCB3cml0YWJsZSB9IHBhaXIiLCAiUHJvbWlzZSJdLCBlKTsKICAgIH07CiAgICBmdW5jdGlvbiBOeCh0KSB7CiAgICAgIGxldCB7IHByb21pc2U6IGUsIHJlc29sdmU6IHIgfSA9IHF2KCksIG8gPSBuZXcgTHgsIGYgPSBvLnNpZ25hbDsKICAgICAgcmV0dXJuIHsgdmFsdWU6IHQoYXN5bmMgZnVuY3Rpb24qICgpIHsKICAgICAgICBmb3IgKDs7ICkgewogICAgICAgICAgbGV0IG0yID0gZTsKICAgICAgICAgIGUgPSBudWxsOwogICAgICAgICAgbGV0IHsgY2h1bms6IHkyLCBkb25lOiBNLCBjYjogeCB9ID0gYXdhaXQgbTI7CiAgICAgICAgICBpZiAoUWgubmV4dFRpY2soeCksIE0pCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGlmIChmLmFib3J0ZWQpCiAgICAgICAgICAgIHRocm93IG5ldyBMdih1bmRlZmluZWQsIHsgY2F1c2U6IGYucmVhc29uIH0pOwogICAgICAgICAgKHsgcHJvbWlzZTogZSwgcmVzb2x2ZTogciB9ID0gcXYoKSksIHlpZWxkIHkyOwogICAgICAgIH0KICAgICAgfSgpLCB7IHNpZ25hbDogZiB9KSwgd3JpdGUobTIsIHkyLCBNKSB7CiAgICAgICAgbGV0IHggPSByOwogICAgICAgIHIgPSBudWxsLCB4KHsgY2h1bms6IG0yLCBkb25lOiBmYWxzZSwgY2I6IE0gfSk7CiAgICAgIH0sIGZpbmFsKG0yKSB7CiAgICAgICAgbGV0IHkyID0gcjsKICAgICAgICByID0gbnVsbCwgeTIoeyBkb25lOiB0cnVlLCBjYjogbTIgfSk7CiAgICAgIH0sIGRlc3Ryb3kobTIsIHkyKSB7CiAgICAgICAgby5hYm9ydCgpLCB5MihtMik7CiAgICAgIH0gfTsKICAgIH0KICAgIGZ1bmN0aW9uIG5zKHQpIHsKICAgICAgbGV0IGUgPSB0LnJlYWRhYmxlICYmIHR5cGVvZiB0LnJlYWRhYmxlLnJlYWQgIT0gImZ1bmN0aW9uIiA/IFR4LndyYXAodC5yZWFkYWJsZSkgOiB0LnJlYWRhYmxlLCByID0gdC53cml0YWJsZSwgbyA9ICEhRXgoZSksIGYgPSAhIUF4KHIpLCBwLCBtMiwgeTIsIE0sIHg7CiAgICAgIGZ1bmN0aW9uIFMoRTIpIHsKICAgICAgICBsZXQgQiA9IE07CiAgICAgICAgTSA9IG51bGwsIEIgPyBCKEUyKSA6IEUyID8geC5kZXN0cm95KEUyKSA6ICFvICYmICFmICYmIHguZGVzdHJveSgpOwogICAgICB9CiAgICAgIHJldHVybiB4ID0gbmV3IF9uKHsgcmVhZGFibGVPYmplY3RNb2RlOiAhIShlICE9IG51bGwgJiYgZS5yZWFkYWJsZU9iamVjdE1vZGUpLCB3cml0YWJsZU9iamVjdE1vZGU6ICEhKHIgIT0gbnVsbCAmJiByLndyaXRhYmxlT2JqZWN0TW9kZSksIHJlYWRhYmxlOiBvLCB3cml0YWJsZTogZiB9KSwgZiAmJiAoUnYociwgKEUyKSA9PiB7CiAgICAgICAgZiA9IGZhbHNlLCBFMiAmJiBkZihlLCBFMiksIFMoRTIpOwogICAgICB9KSwgeC5fd3JpdGUgPSBmdW5jdGlvbihFMiwgQiwgcTIpIHsKICAgICAgICByLndyaXRlKEUyLCBCKSA/IHEyKCkgOiBwID0gcTI7CiAgICAgIH0sIHguX2ZpbmFsID0gZnVuY3Rpb24oRTIpIHsKICAgICAgICByLmVuZCgpLCBtMiA9IEUyOwogICAgICB9LCByLm9uKCJkcmFpbiIsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChwKSB7CiAgICAgICAgICBsZXQgRTIgPSBwOwogICAgICAgICAgcCA9IG51bGwsIEUyKCk7CiAgICAgICAgfQogICAgICB9KSwgci5vbigiZmluaXNoIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKG0yKSB7CiAgICAgICAgICBsZXQgRTIgPSBtMjsKICAgICAgICAgIG0yID0gbnVsbCwgRTIoKTsKICAgICAgICB9CiAgICAgIH0pKSwgbyAmJiAoUnYoZSwgKEUyKSA9PiB7CiAgICAgICAgbyA9IGZhbHNlLCBFMiAmJiBkZihlLCBFMiksIFMoRTIpOwogICAgICB9KSwgZS5vbigicmVhZGFibGUiLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoeTIpIHsKICAgICAgICAgIGxldCBFMiA9IHkyOwogICAgICAgICAgeTIgPSBudWxsLCBFMigpOwogICAgICAgIH0KICAgICAgfSksIGUub24oImVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIHgucHVzaChudWxsKTsKICAgICAgfSksIHguX3JlYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKDs7ICkgewogICAgICAgICAgbGV0IEUyID0gZS5yZWFkKCk7CiAgICAgICAgICBpZiAoRTIgPT09IG51bGwpIHsKICAgICAgICAgICAgeTIgPSB4Ll9yZWFkOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXgucHVzaChFMikpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0pLCB4Ll9kZXN0cm95ID0gZnVuY3Rpb24oRTIsIEIpIHsKICAgICAgICAhRTIgJiYgTSAhPT0gbnVsbCAmJiAoRTIgPSBuZXcgTHYpLCB5MiA9IG51bGwsIHAgPSBudWxsLCBtMiA9IG51bGwsIE0gPT09IG51bGwgPyBCKEUyKSA6IChNID0gQiwgZGYociwgRTIpLCBkZihlLCBFMikpOwogICAgICB9LCB4OwogICAgfQogIH0pOwogIFFyID0gVDIoKFZJLCBPdikgPT4gewogICAgdmFyIHsgT2JqZWN0RGVmaW5lUHJvcGVydGllczogRHgsIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjogYmksIE9iamVjdEtleXM6IFB4LCBPYmplY3RTZXRQcm90b3R5cGVPZjogUHYgfSA9IFR0KCk7CiAgICBPdi5leHBvcnRzID0ga3I7CiAgICB2YXIgcnUgPSBiYSgpLCB2ciA9IEpoKCk7CiAgICBQdihrci5wcm90b3R5cGUsIHJ1LnByb3RvdHlwZSk7CiAgICBQdihrciwgcnUpOwogICAgewogICAgICBsZXQgdCA9IFB4KHZyLnByb3RvdHlwZSk7CiAgICAgIGZvciAobGV0IGUgPSAwO2UgPCB0Lmxlbmd0aDsgZSsrKSB7CiAgICAgICAgbGV0IHIgPSB0W2VdOwogICAgICAgIGtyLnByb3RvdHlwZVtyXSB8fCAoa3IucHJvdG90eXBlW3JdID0gdnIucHJvdG90eXBlW3JdKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24ga3IodCkgewogICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2Yga3IpKQogICAgICAgIHJldHVybiBuZXcga3IodCk7CiAgICAgIHJ1LmNhbGwodGhpcywgdCksIHZyLmNhbGwodGhpcywgdCksIHQgPyAodGhpcy5hbGxvd0hhbGZPcGVuID0gdC5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZSwgdC5yZWFkYWJsZSA9PT0gZmFsc2UgJiYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGFibGUgPSBmYWxzZSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IHRydWUsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCA9IHRydWUpLCB0LndyaXRhYmxlID09PSBmYWxzZSAmJiAodGhpcy5fd3JpdGFibGVTdGF0ZS53cml0YWJsZSA9IGZhbHNlLCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA9IHRydWUsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSB0cnVlLCB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gdHJ1ZSkpIDogdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTsKICAgIH0KICAgIER4KGtyLnByb3RvdHlwZSwgeyB3cml0YWJsZTogeyBfX3Byb3RvX186IG51bGwsIC4uLmJpKHZyLnByb3RvdHlwZSwgIndyaXRhYmxlIikgfSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVIaWdoV2F0ZXJNYXJrIikgfSwgd3JpdGFibGVPYmplY3RNb2RlOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVPYmplY3RNb2RlIikgfSwgd3JpdGFibGVCdWZmZXI6IHsgX19wcm90b19fOiBudWxsLCAuLi5iaSh2ci5wcm90b3R5cGUsICJ3cml0YWJsZUJ1ZmZlciIpIH0sIHdyaXRhYmxlTGVuZ3RoOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVMZW5ndGgiKSB9LCB3cml0YWJsZUZpbmlzaGVkOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVGaW5pc2hlZCIpIH0sIHdyaXRhYmxlQ29ya2VkOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVDb3JrZWQiKSB9LCB3cml0YWJsZUVuZGVkOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVFbmRlZCIpIH0sIHdyaXRhYmxlTmVlZERyYWluOiB7IF9fcHJvdG9fXzogbnVsbCwgLi4uYmkodnIucHJvdG90eXBlLCAid3JpdGFibGVOZWVkRHJhaW4iKSB9LCBkZXN0cm95ZWQ6IHsgX19wcm90b19fOiBudWxsLCBnZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgIH0sIHNldCh0KSB7CiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiAodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0LCB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHQpOwogICAgfSB9IH0pOwogICAgdmFyIGV1OwogICAgZnVuY3Rpb24gQ3YoKSB7CiAgICAgIHJldHVybiBldSA9PT0gdW5kZWZpbmVkICYmIChldSA9IHt9KSwgZXU7CiAgICB9CiAgICBrci5mcm9tV2ViID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gQ3YoKS5uZXdTdHJlYW1EdXBsZXhGcm9tUmVhZGFibGVXcml0YWJsZVBhaXIodCwgZSk7CiAgICB9OwogICAga3IudG9XZWIgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBDdigpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleCh0KTsKICAgIH07CiAgICB2YXIgdHU7CiAgICBrci5mcm9tID0gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gdHUgfHwgKHR1ID0gRHYoKSksIHR1KHQsICJib2R5Iik7CiAgICB9OwogIH0pOwogIGZ1ID0gVDIoKCRJLCBVdikgPT4gewogICAgdmFyIHsgT2JqZWN0U2V0UHJvdG90eXBlT2Y6IEZ2LCBTeW1ib2w6IEN4IH0gPSBUdCgpOwogICAgVXYuZXhwb3J0cyA9IG1pOwogICAgdmFyIHsgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQ6IE94IH0gPSBKdCgpLmNvZGVzLCBudSA9IFFyKCksIHsgZ2V0SGlnaFdhdGVyTWFyazogRnggfSA9IFhvKCk7CiAgICBGdihtaS5wcm90b3R5cGUsIG51LnByb3RvdHlwZSk7CiAgICBGdihtaSwgbnUpOwogICAgdmFyIHdhID0gQ3goImtDYWxsYmFjayIpOwogICAgZnVuY3Rpb24gbWkodCkgewogICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgbWkpKQogICAgICAgIHJldHVybiBuZXcgbWkodCk7CiAgICAgIGxldCBlID0gdCA/IEZ4KHRoaXMsIHQsICJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLCB0cnVlKSA6IG51bGw7CiAgICAgIGUgPT09IDAgJiYgKHQgPSB7IC4uLnQsIGhpZ2hXYXRlck1hcms6IG51bGwsIHJlYWRhYmxlSGlnaFdhdGVyTWFyazogZSwgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB0LndyaXRhYmxlSGlnaFdhdGVyTWFyayB8fCAwIH0pLCBudS5jYWxsKHRoaXMsIHQpLCB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZSwgdGhpc1t3YV0gPSBudWxsLCB0ICYmICh0eXBlb2YgdC50cmFuc2Zvcm0gPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fdHJhbnNmb3JtID0gdC50cmFuc2Zvcm0pLCB0eXBlb2YgdC5mbHVzaCA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9mbHVzaCA9IHQuZmx1c2gpKSwgdGhpcy5vbigicHJlZmluaXNoIiwgVXgpOwogICAgfQogICAgZnVuY3Rpb24gaXUodCkgewogICAgICB0eXBlb2YgdGhpcy5fZmx1c2ggPT0gImZ1bmN0aW9uIiAmJiAhdGhpcy5kZXN0cm95ZWQgPyB0aGlzLl9mbHVzaCgoZSwgcikgPT4gewogICAgICAgIGlmIChlKSB7CiAgICAgICAgICB0ID8gdChlKSA6IHRoaXMuZGVzdHJveShlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgciAhPSBudWxsICYmIHRoaXMucHVzaChyKSwgdGhpcy5wdXNoKG51bGwpLCB0ICYmIHQoKTsKICAgICAgfSkgOiAodGhpcy5wdXNoKG51bGwpLCB0ICYmIHQoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBVeCgpIHsKICAgICAgdGhpcy5fZmluYWwgIT09IGl1ICYmIGl1LmNhbGwodGhpcyk7CiAgICB9CiAgICBtaS5wcm90b3R5cGUuX2ZpbmFsID0gaXU7CiAgICBtaS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgdGhyb3cgbmV3IE94KCJfdHJhbnNmb3JtKCkiKTsKICAgIH07CiAgICBtaS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX3JlYWRhYmxlU3RhdGUsIGYgPSB0aGlzLl93cml0YWJsZVN0YXRlLCBwID0gby5sZW5ndGg7CiAgICAgIHRoaXMuX3RyYW5zZm9ybSh0LCBlLCAobTIsIHkyKSA9PiB7CiAgICAgICAgaWYgKG0yKSB7CiAgICAgICAgICByKG0yKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgeTIgIT0gbnVsbCAmJiB0aGlzLnB1c2goeTIpLCBmLmVuZGVkIHx8IHAgPT09IG8ubGVuZ3RoIHx8IG8ubGVuZ3RoIDwgby5oaWdoV2F0ZXJNYXJrID8gcigpIDogdGhpc1t3YV0gPSByOwogICAgICB9KTsKICAgIH07CiAgICBtaS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXNbd2FdKSB7CiAgICAgICAgbGV0IHQgPSB0aGlzW3dhXTsKICAgICAgICB0aGlzW3dhXSA9IG51bGwsIHQoKTsKICAgICAgfQogICAgfTsKICB9KTsKICBvdSA9IFQyKChHSSwgSHYpID0+IHsKICAgIHZhciB7IE9iamVjdFNldFByb3RvdHlwZU9mOiB6diB9ID0gVHQoKTsKICAgIEh2LmV4cG9ydHMgPSBjZjsKICAgIHZhciBhdSA9IGZ1KCk7CiAgICB6dihjZi5wcm90b3R5cGUsIGF1LnByb3RvdHlwZSk7CiAgICB6dihjZiwgYXUpOwogICAgZnVuY3Rpb24gY2YodCkgewogICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgY2YpKQogICAgICAgIHJldHVybiBuZXcgY2YodCk7CiAgICAgIGF1LmNhbGwodGhpcywgdCk7CiAgICB9CiAgICBjZi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgcihudWxsLCB0KTsKICAgIH07CiAgfSk7CiAgb3MgPSBUMigoWUksIEd2KSA9PiB7CiAgICB2YXIgZnMgPSAoT2koKSwgdXIocHIpKSwgeyBBcnJheUlzQXJyYXk6IHp4LCBQcm9taXNlOiBIeCwgU3ltYm9sQXN5bmNJdGVyYXRvcjogV3ggfSA9IFR0KCksIGFzID0gVWkoKSwgeyBvbmNlOiBLeCB9ID0gR3IoKSwganggPSB5bigpLCBXdiA9IFFyKCksIHsgYWdncmVnYXRlVHdvRXJyb3JzOiBaeCwgY29kZXM6IHsgRVJSX0lOVkFMSURfQVJHX1RZUEU6IFZ2LCBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUU6IHN1LCBFUlJfTUlTU0lOR19BUkdTOiBWeCwgRVJSX1NUUkVBTV9ERVNUUk9ZRUQ6ICR4LCBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTogR3ggfSwgQWJvcnRFcnJvcjogWXggfSA9IEp0KCksIHsgdmFsaWRhdGVGdW5jdGlvbjogWHgsIHZhbGlkYXRlQWJvcnRTaWduYWw6IEp4IH0gPSBwYSgpLCB7IGlzSXRlcmFibGU6IHBmLCBpc1JlYWRhYmxlOiBodSwgaXNSZWFkYWJsZU5vZGVTdHJlYW06IGR1LCBpc05vZGVTdHJlYW06IEt2IH0gPSBGaSgpLCBReCA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyIHx8IE5vKCkuQWJvcnRDb250cm9sbGVyLCB1dSwgbHU7CiAgICBmdW5jdGlvbiBqdih0LCBlLCByKSB7CiAgICAgIGxldCBvID0gZmFsc2U7CiAgICAgIHQub24oImNsb3NlIiwgKCkgPT4gewogICAgICAgIG8gPSB0cnVlOwogICAgICB9KTsKICAgICAgbGV0IGYgPSBhcyh0LCB7IHJlYWRhYmxlOiBlLCB3cml0YWJsZTogciB9LCAocCkgPT4gewogICAgICAgIG8gPSAhcDsKICAgICAgfSk7CiAgICAgIHJldHVybiB7IGRlc3Ryb3k6IChwKSA9PiB7CiAgICAgICAgbyB8fCAobyA9IHRydWUsIGp4LmRlc3Ryb3llcih0LCBwIHx8IG5ldyAkeCgicGlwZSIpKSk7CiAgICAgIH0sIGNsZWFudXA6IGYgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGU3KHQpIHsKICAgICAgcmV0dXJuIFh4KHRbdC5sZW5ndGggLSAxXSwgInN0cmVhbXNbc3RyZWFtLmxlbmd0aCAtIDFdIiksIHQucG9wKCk7CiAgICB9CiAgICBmdW5jdGlvbiB0Nyh0KSB7CiAgICAgIGlmIChwZih0KSkKICAgICAgICByZXR1cm4gdDsKICAgICAgaWYgKGR1KHQpKQogICAgICAgIHJldHVybiByNyh0KTsKICAgICAgdGhyb3cgbmV3IFZ2KCJ2YWwiLCBbIlJlYWRhYmxlIiwgIkl0ZXJhYmxlIiwgIkFzeW5jSXRlcmFibGUiXSwgdCk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiogcjcodCkgewogICAgICBsdSB8fCAobHUgPSBiYSgpKSwgeWllbGQqIGx1LnByb3RvdHlwZVtXeF0uY2FsbCh0KTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIFp2KHQsIGUsIHIsIHsgZW5kOiBvIH0pIHsKICAgICAgbGV0IGYsIHAgPSBudWxsLCBtMiA9ICh4KSA9PiB7CiAgICAgICAgaWYgKHggJiYgKGYgPSB4KSwgcCkgewogICAgICAgICAgbGV0IFMgPSBwOwogICAgICAgICAgcCA9IG51bGwsIFMoKTsKICAgICAgICB9CiAgICAgIH0sIHkyID0gKCkgPT4gbmV3IEh4KCh4LCBTKSA9PiB7CiAgICAgICAgZiA/IFMoZikgOiBwID0gKCkgPT4gewogICAgICAgICAgZiA/IFMoZikgOiB4KCk7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGUub24oImRyYWluIiwgbTIpOwogICAgICBsZXQgTSA9IGFzKGUsIHsgcmVhZGFibGU6IGZhbHNlIH0sIG0yKTsKICAgICAgdHJ5IHsKICAgICAgICBlLndyaXRhYmxlTmVlZERyYWluICYmIGF3YWl0IHkyKCk7CiAgICAgICAgZm9yIGF3YWl0IChsZXQgeCBvZiB0KQogICAgICAgICAgZS53cml0ZSh4KSB8fCBhd2FpdCB5MigpOwogICAgICAgIG8gJiYgZS5lbmQoKSwgYXdhaXQgeTIoKSwgcigpOwogICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgcihmICE9PSB4ID8gWngoZiwgeCkgOiB4KTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBNKCksIGUub2ZmKCJkcmFpbiIsIG0yKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaTcoLi4udCkgewogICAgICByZXR1cm4gJHYodCwgS3goZTcodCkpKTsKICAgIH0KICAgIGZ1bmN0aW9uICR2KHQsIGUsIHIpIHsKICAgICAgaWYgKHQubGVuZ3RoID09PSAxICYmIHp4KHRbMF0pICYmICh0ID0gdFswXSksIHQubGVuZ3RoIDwgMikKICAgICAgICB0aHJvdyBuZXcgVngoInN0cmVhbXMiKTsKICAgICAgbGV0IG8gPSBuZXcgUXgsIGYgPSBvLnNpZ25hbCwgcCA9IHI/LnNpZ25hbCwgbTIgPSBbXTsKICAgICAgSngocCwgIm9wdGlvbnMuc2lnbmFsIik7CiAgICAgIGZ1bmN0aW9uIHkyKCkgewogICAgICAgIHEyKG5ldyBZeCk7CiAgICAgIH0KICAgICAgcD8uYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCB5Mik7CiAgICAgIGxldCBNLCB4LCBTID0gW10sIEUyID0gMDsKICAgICAgZnVuY3Rpb24gQihOKSB7CiAgICAgICAgcTIoTiwgLS1FMiA9PT0gMCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcTIoTiwgd2UpIHsKICAgICAgICBpZiAoTiAmJiAoIU0gfHwgTS5jb2RlID09PSAiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UiKSAmJiAoTSA9IE4pLCAhKCFNICYmICF3ZSkpIHsKICAgICAgICAgIGZvciAoO1MubGVuZ3RoOyApCiAgICAgICAgICAgIFMuc2hpZnQoKShNKTsKICAgICAgICAgIHA/LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IiwgeTIpLCBvLmFib3J0KCksIHdlICYmIChNIHx8IG0yLmZvckVhY2goKHllKSA9PiB5ZSgpKSwgZnMubmV4dFRpY2soZSwgTSwgeCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgTDI7CiAgICAgIGZvciAobGV0IE4gPSAwO04gPCB0Lmxlbmd0aDsgTisrKSB7CiAgICAgICAgbGV0IHdlID0gdFtOXSwgeWUgPSBOIDwgdC5sZW5ndGggLSAxLCB4ZSA9IE4gPiAwLCBSZSA9IHllIHx8IHI/LmVuZCAhPT0gZmFsc2UsIEVlID0gTiA9PT0gdC5sZW5ndGggLSAxOwogICAgICAgIGlmIChLdih3ZSkpIHsKICAgICAgICAgIGxldCBBZSA9IGZ1bmN0aW9uKFApIHsKICAgICAgICAgICAgUCAmJiBQLm5hbWUgIT09ICJBYm9ydEVycm9yIiAmJiBQLmNvZGUgIT09ICJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIgJiYgQihQKTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgX2UgPSBBZTsKICAgICAgICAgIGlmIChSZSkgewogICAgICAgICAgICBsZXQgeyBkZXN0cm95OiBQLCBjbGVhbnVwOiBTZSB9ID0ganYod2UsIHllLCB4ZSk7CiAgICAgICAgICAgIFMucHVzaChQKSwgaHUod2UpICYmIEVlICYmIG0yLnB1c2goU2UpOwogICAgICAgICAgfQogICAgICAgICAgd2Uub24oImVycm9yIiwgQWUpLCBodSh3ZSkgJiYgRWUgJiYgbTIucHVzaCgoKSA9PiB7CiAgICAgICAgICAgIHdlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIEFlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoTiA9PT0gMCkKICAgICAgICAgIGlmICh0eXBlb2Ygd2UgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBpZiAoTDIgPSB3ZSh7IHNpZ25hbDogZiB9KSwgIXBmKEwyKSkKICAgICAgICAgICAgICB0aHJvdyBuZXcgc3UoIkl0ZXJhYmxlLCBBc3luY0l0ZXJhYmxlIG9yIFN0cmVhbSIsICJzb3VyY2UiLCBMMik7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcGYod2UpIHx8IGR1KHdlKSA/IEwyID0gd2UgOiBMMiA9IFd2LmZyb20od2UpOwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB3ZSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgaWYgKEwyID0gdDcoTDIpLCBMMiA9IHdlKEwyLCB7IHNpZ25hbDogZiB9KSwgeWUpIHsKICAgICAgICAgICAgaWYgKCFwZihMMiwgdHJ1ZSkpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IHN1KCJBc3luY0l0ZXJhYmxlIiwgYHRyYW5zZm9ybVske04gLSAxfV1gLCBMMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgZ2U7CiAgICAgICAgICAgIHV1IHx8ICh1dSA9IG91KCkpOwogICAgICAgICAgICBsZXQgQWUgPSBuZXcgdXUoeyBvYmplY3RNb2RlOiB0cnVlIH0pLCBQID0gKGdlID0gTDIpID09PSBudWxsIHx8IGdlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBnZS50aGVuOwogICAgICAgICAgICBpZiAodHlwZW9mIFAgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICBFMisrLCBQLmNhbGwoTDIsIChpKSA9PiB7CiAgICAgICAgICAgICAgICB4ID0gaSwgaSAhPSBudWxsICYmIEFlLndyaXRlKGkpLCBSZSAmJiBBZS5lbmQoKSwgZnMubmV4dFRpY2soQik7CiAgICAgICAgICAgICAgfSwgKGkpID0+IHsKICAgICAgICAgICAgICAgIEFlLmRlc3Ryb3koaSksIGZzLm5leHRUaWNrKEIsIGkpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlbHNlIGlmIChwZihMMiwgdHJ1ZSkpCiAgICAgICAgICAgICAgRTIrKywgWnYoTDIsIEFlLCBCLCB7IGVuZDogUmUgfSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB0aHJvdyBuZXcgc3UoIkFzeW5jSXRlcmFibGUgb3IgUHJvbWlzZSIsICJkZXN0aW5hdGlvbiIsIEwyKTsKICAgICAgICAgICAgTDIgPSBBZTsKICAgICAgICAgICAgbGV0IHsgZGVzdHJveTogU2UsIGNsZWFudXA6IHYgfSA9IGp2KEwyLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIFMucHVzaChTZSksIEVlICYmIG0yLnB1c2godik7CiAgICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoS3Yod2UpKSB7CiAgICAgICAgICBpZiAoZHUoTDIpKSB7CiAgICAgICAgICAgIEUyICs9IDI7CiAgICAgICAgICAgIGxldCBBZSA9IG43KEwyLCB3ZSwgQiwgeyBlbmQ6IFJlIH0pOwogICAgICAgICAgICBodSh3ZSkgJiYgRWUgJiYgbTIucHVzaChBZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHBmKEwyKSkKICAgICAgICAgICAgRTIrKywgWnYoTDIsIHdlLCBCLCB7IGVuZDogUmUgfSk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRocm93IG5ldyBWdigidmFsIiwgWyJSZWFkYWJsZSIsICJJdGVyYWJsZSIsICJBc3luY0l0ZXJhYmxlIl0sIEwyKTsKICAgICAgICAgIEwyID0gd2U7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBMMiA9IFd2LmZyb20od2UpOwogICAgICB9CiAgICAgIHJldHVybiAoZiAhPSBudWxsICYmIGYuYWJvcnRlZCB8fCBwICE9IG51bGwgJiYgcC5hYm9ydGVkKSAmJiBmcy5uZXh0VGljayh5MiksIEwyOwogICAgfQogICAgZnVuY3Rpb24gbjcodCwgZSwgciwgeyBlbmQ6IG8gfSkgewogICAgICBsZXQgZiA9IGZhbHNlOwogICAgICByZXR1cm4gZS5vbigiY2xvc2UiLCAoKSA9PiB7CiAgICAgICAgZiB8fCByKG5ldyBHeCk7CiAgICAgIH0pLCB0LnBpcGUoZSwgeyBlbmQ6IG8gfSksIG8gPyB0Lm9uY2UoImVuZCIsICgpID0+IHsKICAgICAgICBmID0gdHJ1ZSwgZS5lbmQoKTsKICAgICAgfSkgOiByKCksIGFzKHQsIHsgcmVhZGFibGU6IHRydWUsIHdyaXRhYmxlOiBmYWxzZSB9LCAocCkgPT4gewogICAgICAgIGxldCBtMiA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgICAgcCAmJiBwLmNvZGUgPT09ICJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIgJiYgbTIgJiYgbTIuZW5kZWQgJiYgIW0yLmVycm9yZWQgJiYgIW0yLmVycm9yRW1pdHRlZCA/IHQub25jZSgiZW5kIiwgcikub25jZSgiZXJyb3IiLCByKSA6IHIocCk7CiAgICAgIH0pLCBhcyhlLCB7IHJlYWRhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgfSwgcik7CiAgICB9CiAgICBHdi5leHBvcnRzID0geyBwaXBlbGluZUltcGw6ICR2LCBwaXBlbGluZTogaTcgfTsKICB9KTsKICBlYiA9IFQyKChYSSwgUXYpID0+IHsKICAgIHZhciB7IHBpcGVsaW5lOiBmNyB9ID0gb3MoKSwgc3MgPSBRcigpLCB7IGRlc3Ryb3llcjogYTcgfSA9IHluKCksIHsgaXNOb2RlU3RyZWFtOiBvNywgaXNSZWFkYWJsZTogWXYsIGlzV3JpdGFibGU6IFh2IH0gPSBGaSgpLCB7IEFib3J0RXJyb3I6IHM3LCBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVkFMVUU6IEp2LCBFUlJfTUlTU0lOR19BUkdTOiBoNyB9IH0gPSBKdCgpOwogICAgUXYuZXhwb3J0cyA9IGZ1bmN0aW9uKC4uLmUpIHsKICAgICAgaWYgKGUubGVuZ3RoID09PSAwKQogICAgICAgIHRocm93IG5ldyBoNygic3RyZWFtcyIpOwogICAgICBpZiAoZS5sZW5ndGggPT09IDEpCiAgICAgICAgcmV0dXJuIHNzLmZyb20oZVswXSk7CiAgICAgIGxldCByID0gWy4uLmVdOwogICAgICBpZiAodHlwZW9mIGVbMF0gPT0gImZ1bmN0aW9uIiAmJiAoZVswXSA9IHNzLmZyb20oZVswXSkpLCB0eXBlb2YgZVtlLmxlbmd0aCAtIDFdID09ICJmdW5jdGlvbiIpIHsKICAgICAgICBsZXQgcTIgPSBlLmxlbmd0aCAtIDE7CiAgICAgICAgZVtxMl0gPSBzcy5mcm9tKGVbcTJdKTsKICAgICAgfQogICAgICBmb3IgKGxldCBxMiA9IDA7cTIgPCBlLmxlbmd0aDsgKytxMikKICAgICAgICBpZiAoISFvNyhlW3EyXSkpIHsKICAgICAgICAgIGlmIChxMiA8IGUubGVuZ3RoIC0gMSAmJiAhWXYoZVtxMl0pKQogICAgICAgICAgICB0aHJvdyBuZXcgSnYoYHN0cmVhbXNbJHtxMn1dYCwgcltxMl0sICJtdXN0IGJlIHJlYWRhYmxlIik7CiAgICAgICAgICBpZiAocTIgPiAwICYmICFYdihlW3EyXSkpCiAgICAgICAgICAgIHRocm93IG5ldyBKdihgc3RyZWFtc1ske3EyfV1gLCByW3EyXSwgIm11c3QgYmUgd3JpdGFibGUiKTsKICAgICAgICB9CiAgICAgIGxldCBvLCBmLCBwLCBtMiwgeTI7CiAgICAgIGZ1bmN0aW9uIE0ocTIpIHsKICAgICAgICBsZXQgTDIgPSBtMjsKICAgICAgICBtMiA9IG51bGwsIEwyID8gTDIocTIpIDogcTIgPyB5Mi5kZXN0cm95KHEyKSA6ICFCICYmICFFMiAmJiB5Mi5kZXN0cm95KCk7CiAgICAgIH0KICAgICAgbGV0IHggPSBlWzBdLCBTID0gZjcoZSwgTSksIEUyID0gISFYdih4KSwgQiA9ICEhWXYoUyk7CiAgICAgIHJldHVybiB5MiA9IG5ldyBzcyh7IHdyaXRhYmxlT2JqZWN0TW9kZTogISEoeCAhPSBudWxsICYmIHgud3JpdGFibGVPYmplY3RNb2RlKSwgcmVhZGFibGVPYmplY3RNb2RlOiAhIShTICE9IG51bGwgJiYgUy53cml0YWJsZU9iamVjdE1vZGUpLCB3cml0YWJsZTogRTIsIHJlYWRhYmxlOiBCIH0pLCBFMiAmJiAoeTIuX3dyaXRlID0gZnVuY3Rpb24ocTIsIEwyLCBnZSkgewogICAgICAgIHgud3JpdGUocTIsIEwyKSA/IGdlKCkgOiBvID0gZ2U7CiAgICAgIH0sIHkyLl9maW5hbCA9IGZ1bmN0aW9uKHEyKSB7CiAgICAgICAgeC5lbmQoKSwgZiA9IHEyOwogICAgICB9LCB4Lm9uKCJkcmFpbiIsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChvKSB7CiAgICAgICAgICBsZXQgcTIgPSBvOwogICAgICAgICAgbyA9IG51bGwsIHEyKCk7CiAgICAgICAgfQogICAgICB9KSwgUy5vbigiZmluaXNoIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGYpIHsKICAgICAgICAgIGxldCBxMiA9IGY7CiAgICAgICAgICBmID0gbnVsbCwgcTIoKTsKICAgICAgICB9CiAgICAgIH0pKSwgQiAmJiAoUy5vbigicmVhZGFibGUiLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAocCkgewogICAgICAgICAgbGV0IHEyID0gcDsKICAgICAgICAgIHAgPSBudWxsLCBxMigpOwogICAgICAgIH0KICAgICAgfSksIFMub24oImVuZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIHkyLnB1c2gobnVsbCk7CiAgICAgIH0pLCB5Mi5fcmVhZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAoOzsgKSB7CiAgICAgICAgICBsZXQgcTIgPSBTLnJlYWQoKTsKICAgICAgICAgIGlmIChxMiA9PT0gbnVsbCkgewogICAgICAgICAgICBwID0geTIuX3JlYWQ7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgheTIucHVzaChxMikpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0pLCB5Mi5fZGVzdHJveSA9IGZ1bmN0aW9uKHEyLCBMMikgewogICAgICAgICFxMiAmJiBtMiAhPT0gbnVsbCAmJiAocTIgPSBuZXcgczcpLCBwID0gbnVsbCwgbyA9IG51bGwsIGYgPSBudWxsLCBtMiA9PT0gbnVsbCA/IEwyKHEyKSA6IChtMiA9IEwyLCBhNyhTLCBxMikpOwogICAgICB9LCB5MjsKICAgIH07CiAgfSk7CiAgY3UgPSBUMigoSkksIHRiKSA9PiB7CiAgICB2YXIgeyBBcnJheVByb3RvdHlwZVBvcDogdTcsIFByb21pc2U6IGw3IH0gPSBUdCgpLCB7IGlzSXRlcmFibGU6IGQ3LCBpc05vZGVTdHJlYW06IGM3IH0gPSBGaSgpLCB7IHBpcGVsaW5lSW1wbDogcDcgfSA9IG9zKCksIHsgZmluaXNoZWQ6IHY3IH0gPSBVaSgpOwogICAgZnVuY3Rpb24gYjcoLi4udCkgewogICAgICByZXR1cm4gbmV3IGw3KChlLCByKSA9PiB7CiAgICAgICAgbGV0IG8sIGYsIHAgPSB0W3QubGVuZ3RoIC0gMV07CiAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAgPT0gIm9iamVjdCIgJiYgIWM3KHApICYmICFkNyhwKSkgewogICAgICAgICAgbGV0IG0yID0gdTcodCk7CiAgICAgICAgICBvID0gbTIuc2lnbmFsLCBmID0gbTIuZW5kOwogICAgICAgIH0KICAgICAgICBwNyh0LCAobTIsIHkyKSA9PiB7CiAgICAgICAgICBtMiA/IHIobTIpIDogZSh5Mik7CiAgICAgICAgfSwgeyBzaWduYWw6IG8sIGVuZDogZiB9KTsKICAgICAgfSk7CiAgICB9CiAgICB0Yi5leHBvcnRzID0geyBmaW5pc2hlZDogdjcsIHBpcGVsaW5lOiBiNyB9OwogIH0pOwogIGxiID0gVDIoKFFJLCB1YikgPT4gewogICAgdmFyIHsgQnVmZmVyOiBtNyB9ID0gVXQoKSwgeyBPYmplY3REZWZpbmVQcm9wZXJ0eTogZ2ksIE9iamVjdEtleXM6IG5iLCBSZWZsZWN0QXBwbHk6IGZiIH0gPSBUdCgpLCB7IHByb21pc2lmeTogeyBjdXN0b206IGFiIH0gfSA9IEdyKCksIHsgc3RyZWFtUmV0dXJuaW5nT3BlcmF0b3JzOiByYiwgcHJvbWlzZVJldHVybmluZ09wZXJhdG9yczogaWIgfSA9IGsxKCksIHsgY29kZXM6IHsgRVJSX0lMTEVHQUxfQ09OU1RSVUNUT1I6IG9iIH0gfSA9IEp0KCksIGc3ID0gZWIoKSwgeyBwaXBlbGluZTogc2IgfSA9IG9zKCksIHsgZGVzdHJveWVyOiB5NyB9ID0geW4oKSwgaGIgPSBVaSgpLCBwdSA9IGN1KCksIHZ1ID0gRmkoKSwgY3QgPSB1Yi5leHBvcnRzID0gVm8oKS5TdHJlYW07CiAgICBjdC5pc0Rpc3R1cmJlZCA9IHZ1LmlzRGlzdHVyYmVkOwogICAgY3QuaXNFcnJvcmVkID0gdnUuaXNFcnJvcmVkOwogICAgY3QuaXNSZWFkYWJsZSA9IHZ1LmlzUmVhZGFibGU7CiAgICBjdC5SZWFkYWJsZSA9IGJhKCk7CiAgICBmb3IgKGxldCB0IG9mIG5iKHJiKSkgewogICAgICBsZXQgciA9IGZ1bmN0aW9uKC4uLm8pIHsKICAgICAgICBpZiAobmV3LnRhcmdldCkKICAgICAgICAgIHRocm93IG9iKCk7CiAgICAgICAgcmV0dXJuIGN0LlJlYWRhYmxlLmZyb20oZmIoZSwgdGhpcywgbykpOwogICAgICB9OwogICAgICBNNyA9IHI7CiAgICAgIGxldCBlID0gcmJbdF07CiAgICAgIGdpKHIsICJuYW1lIiwgeyBfX3Byb3RvX186IG51bGwsIHZhbHVlOiBlLm5hbWUgfSksIGdpKHIsICJsZW5ndGgiLCB7IF9fcHJvdG9fXzogbnVsbCwgdmFsdWU6IGUubGVuZ3RoIH0pLCBnaShjdC5SZWFkYWJsZS5wcm90b3R5cGUsIHQsIHsgX19wcm90b19fOiBudWxsLCB2YWx1ZTogciwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7CiAgICB9CiAgICB2YXIgTTc7CiAgICBmb3IgKGxldCB0IG9mIG5iKGliKSkgewogICAgICBsZXQgciA9IGZ1bmN0aW9uKC4uLmYpIHsKICAgICAgICBpZiAobmV3LnRhcmdldCkKICAgICAgICAgIHRocm93IG9iKCk7CiAgICAgICAgcmV0dXJuIGZiKGUsIHRoaXMsIGYpOwogICAgICB9OwogICAgICBNNyA9IHI7CiAgICAgIGxldCBlID0gaWJbdF07CiAgICAgIGdpKHIsICJuYW1lIiwgeyBfX3Byb3RvX186IG51bGwsIHZhbHVlOiBlLm5hbWUgfSksIGdpKHIsICJsZW5ndGgiLCB7IF9fcHJvdG9fXzogbnVsbCwgdmFsdWU6IGUubGVuZ3RoIH0pLCBnaShjdC5SZWFkYWJsZS5wcm90b3R5cGUsIHQsIHsgX19wcm90b19fOiBudWxsLCB2YWx1ZTogciwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7CiAgICB9CiAgICB2YXIgTTc7CiAgICBjdC5Xcml0YWJsZSA9IEpoKCk7CiAgICBjdC5EdXBsZXggPSBRcigpOwogICAgY3QuVHJhbnNmb3JtID0gZnUoKTsKICAgIGN0LlBhc3NUaHJvdWdoID0gb3UoKTsKICAgIGN0LnBpcGVsaW5lID0gc2I7CiAgICB2YXIgeyBhZGRBYm9ydFNpZ25hbDogdzcgfSA9IEdvKCk7CiAgICBjdC5hZGRBYm9ydFNpZ25hbCA9IHc3OwogICAgY3QuZmluaXNoZWQgPSBoYjsKICAgIGN0LmRlc3Ryb3kgPSB5NzsKICAgIGN0LmNvbXBvc2UgPSBnNzsKICAgIGdpKGN0LCAicHJvbWlzZXMiLCB7IF9fcHJvdG9fXzogbnVsbCwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBnZXQoKSB7CiAgICAgIHJldHVybiBwdTsKICAgIH0gfSk7CiAgICBnaShzYiwgYWIsIHsgX19wcm90b19fOiBudWxsLCBlbnVtZXJhYmxlOiB0cnVlLCBnZXQoKSB7CiAgICAgIHJldHVybiBwdS5waXBlbGluZTsKICAgIH0gfSk7CiAgICBnaShoYiwgYWIsIHsgX19wcm90b19fOiBudWxsLCBlbnVtZXJhYmxlOiB0cnVlLCBnZXQoKSB7CiAgICAgIHJldHVybiBwdS5maW5pc2hlZDsKICAgIH0gfSk7CiAgICBjdC5TdHJlYW0gPSBjdDsKICAgIGN0Ll9pc1VpbnQ4QXJyYXkgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgVWludDhBcnJheTsKICAgIH07CiAgICBjdC5fdWludDhBcnJheVRvQnVmZmVyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gbTcuZnJvbShlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0LCBlLmJ5dGVMZW5ndGgpOwogICAgfTsKICB9KTsKICBidSA9IFQyKChlVCwgcHQpID0+IHsKICAgIHZhciBMdCA9IGxiKCksIF83ID0gY3UoKSwgeDcgPSBMdC5SZWFkYWJsZS5kZXN0cm95OwogICAgcHQuZXhwb3J0cyA9IEx0LlJlYWRhYmxlOwogICAgcHQuZXhwb3J0cy5fdWludDhBcnJheVRvQnVmZmVyID0gTHQuX3VpbnQ4QXJyYXlUb0J1ZmZlcjsKICAgIHB0LmV4cG9ydHMuX2lzVWludDhBcnJheSA9IEx0Ll9pc1VpbnQ4QXJyYXk7CiAgICBwdC5leHBvcnRzLmlzRGlzdHVyYmVkID0gTHQuaXNEaXN0dXJiZWQ7CiAgICBwdC5leHBvcnRzLmlzRXJyb3JlZCA9IEx0LmlzRXJyb3JlZDsKICAgIHB0LmV4cG9ydHMuaXNSZWFkYWJsZSA9IEx0LmlzUmVhZGFibGU7CiAgICBwdC5leHBvcnRzLlJlYWRhYmxlID0gTHQuUmVhZGFibGU7CiAgICBwdC5leHBvcnRzLldyaXRhYmxlID0gTHQuV3JpdGFibGU7CiAgICBwdC5leHBvcnRzLkR1cGxleCA9IEx0LkR1cGxleDsKICAgIHB0LmV4cG9ydHMuVHJhbnNmb3JtID0gTHQuVHJhbnNmb3JtOwogICAgcHQuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IEx0LlBhc3NUaHJvdWdoOwogICAgcHQuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IEx0LmFkZEFib3J0U2lnbmFsOwogICAgcHQuZXhwb3J0cy5maW5pc2hlZCA9IEx0LmZpbmlzaGVkOwogICAgcHQuZXhwb3J0cy5kZXN0cm95ID0gTHQuZGVzdHJveTsKICAgIHB0LmV4cG9ydHMuZGVzdHJveSA9IHg3OwogICAgcHQuZXhwb3J0cy5waXBlbGluZSA9IEx0LnBpcGVsaW5lOwogICAgcHQuZXhwb3J0cy5jb21wb3NlID0gTHQuY29tcG9zZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMdCwgInByb21pc2VzIiwgeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGdldCgpIHsKICAgICAgcmV0dXJuIF83OwogICAgfSB9KTsKICAgIHB0LmV4cG9ydHMuU3RyZWFtID0gTHQuU3RyZWFtOwogICAgcHQuZXhwb3J0cy5kZWZhdWx0ID0gcHQuZXhwb3J0czsKICB9KTsKICB2ZiA9IHt9OwogIEphKHZmLCB7IGRlZmF1bHQ6ICgpID0+IFM3IH0pOwogIGRiID0gUjAoKCkgPT4gewogICAgb3QodmYsIHJuKGJ1KCkpKTsKICAgIFM3ID0gcm4oYnUoKSk7CiAgfSk7CiAgeWkgPSBUMigoclQsIHZiKSA9PiB7CiAgICB2YXIgY2IgPSBUZSgpLkJ1ZmZlciwgcGIgPSAoZGIoKSwgdXIodmYpKS5UcmFuc2Zvcm0sIEU3ID0gY28oKS5TdHJpbmdEZWNvZGVyLCBBNyA9IEllKCk7CiAgICBmdW5jdGlvbiBMcih0KSB7CiAgICAgIHBiLmNhbGwodGhpcyksIHRoaXMuaGFzaE1vZGUgPSB0eXBlb2YgdCA9PSAic3RyaW5nIiwgdGhpcy5oYXNoTW9kZSA/IHRoaXNbdF0gPSB0aGlzLl9maW5hbE9yRGlnZXN0IDogdGhpcy5maW5hbCA9IHRoaXMuX2ZpbmFsT3JEaWdlc3QsIHRoaXMuX2ZpbmFsICYmICh0aGlzLl9fZmluYWwgPSB0aGlzLl9maW5hbCwgdGhpcy5fZmluYWwgPSBudWxsKSwgdGhpcy5fZGVjb2RlciA9IG51bGwsIHRoaXMuX2VuY29kaW5nID0gbnVsbDsKICAgIH0KICAgIEE3KExyLCBwYik7CiAgICBMci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICB0eXBlb2YgdCA9PSAic3RyaW5nIiAmJiAodCA9IGNiLmZyb20odCwgZSkpOwogICAgICB2YXIgbyA9IHRoaXMuX3VwZGF0ZSh0KTsKICAgICAgcmV0dXJuIHRoaXMuaGFzaE1vZGUgPyB0aGlzIDogKHIgJiYgKG8gPSB0aGlzLl90b1N0cmluZyhvLCByKSksIG8pOwogICAgfTsKICAgIExyLnByb3RvdHlwZS5zZXRBdXRvUGFkZGluZyA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIExyLnByb3RvdHlwZS5nZXRBdXRoVGFnID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigidHJ5aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpOwogICAgfTsKICAgIExyLnByb3RvdHlwZS5zZXRBdXRoVGFnID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigidHJ5aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpOwogICAgfTsKICAgIExyLnByb3RvdHlwZS5zZXRBQUQgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpOwogICAgfTsKICAgIExyLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICB2YXIgbzsKICAgICAgdHJ5IHsKICAgICAgICB0aGlzLmhhc2hNb2RlID8gdGhpcy5fdXBkYXRlKHQpIDogdGhpcy5wdXNoKHRoaXMuX3VwZGF0ZSh0KSk7CiAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICBvID0gZjsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICByKG8pOwogICAgICB9CiAgICB9OwogICAgTHIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIGU7CiAgICAgIHRyeSB7CiAgICAgICAgdGhpcy5wdXNoKHRoaXMuX19maW5hbCgpKTsKICAgICAgfSBjYXRjaCAocikgewogICAgICAgIGUgPSByOwogICAgICB9CiAgICAgIHQoZSk7CiAgICB9OwogICAgTHIucHJvdG90eXBlLl9maW5hbE9yRGlnZXN0ID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IHRoaXMuX19maW5hbCgpIHx8IGNiLmFsbG9jKDApOwogICAgICByZXR1cm4gdCAmJiAoZSA9IHRoaXMuX3RvU3RyaW5nKGUsIHQsIHRydWUpKSwgZTsKICAgIH07CiAgICBMci5wcm90b3R5cGUuX3RvU3RyaW5nID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICBpZiAodGhpcy5fZGVjb2RlciB8fCAodGhpcy5fZGVjb2RlciA9IG5ldyBFNyhlKSwgdGhpcy5fZW5jb2RpbmcgPSBlKSwgdGhpcy5fZW5jb2RpbmcgIT09IGUpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjYW4ndCBzd2l0Y2ggZW5jb2RpbmdzIik7CiAgICAgIHZhciBvID0gdGhpcy5fZGVjb2Rlci53cml0ZSh0KTsKICAgICAgcmV0dXJuIHIgJiYgKG8gKz0gdGhpcy5fZGVjb2Rlci5lbmQoKSksIG87CiAgICB9OwogICAgdmIuZXhwb3J0cyA9IExyOwogIH0pOwogIGJmID0gVDIoKGlULCBtYikgPT4gewogICAgdmFyIFI3ID0gSWUoKSwgQjcgPSBBbygpLCBxNyA9IEJvKCksIEk3ID0ga28oKSwgYmIgPSB5aSgpOwogICAgZnVuY3Rpb24gaHModCkgewogICAgICBiYi5jYWxsKHRoaXMsICJkaWdlc3QiKSwgdGhpcy5faGFzaCA9IHQ7CiAgICB9CiAgICBSNyhocywgYmIpOwogICAgaHMucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHRoaXMuX2hhc2gudXBkYXRlKHQpOwogICAgfTsKICAgIGhzLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2hhc2guZGlnZXN0KCk7CiAgICB9OwogICAgbWIuZXhwb3J0cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPSBlLnRvTG93ZXJDYXNlKCksIGUgPT09ICJtZDUiID8gbmV3IEI3IDogZSA9PT0gInJtZDE2MCIgfHwgZSA9PT0gInJpcGVtZDE2MCIgPyBuZXcgcTcgOiBuZXcgaHMoSTcoZSkpOwogICAgfTsKICB9KTsKICB3YiA9IFQyKChuVCwgeWIpID0+IHsKICAgIHZhciBUNyA9IEllKCksIHhuID0gVGUoKS5CdWZmZXIsIGdiID0geWkoKSwgazcgPSB4bi5hbGxvYygxMjgpLCBtZiA9IDY0OwogICAgZnVuY3Rpb24gdXModCwgZSkgewogICAgICBnYi5jYWxsKHRoaXMsICJkaWdlc3QiKSwgdHlwZW9mIGUgPT0gInN0cmluZyIgJiYgKGUgPSB4bi5mcm9tKGUpKSwgdGhpcy5fYWxnID0gdCwgdGhpcy5fa2V5ID0gZSwgZS5sZW5ndGggPiBtZiA/IGUgPSB0KGUpIDogZS5sZW5ndGggPCBtZiAmJiAoZSA9IHhuLmNvbmNhdChbZSwgazddLCBtZikpOwogICAgICBmb3IgKHZhciByID0gdGhpcy5faXBhZCA9IHhuLmFsbG9jVW5zYWZlKG1mKSwgbyA9IHRoaXMuX29wYWQgPSB4bi5hbGxvY1Vuc2FmZShtZiksIGYgPSAwO2YgPCBtZjsgZisrKQogICAgICAgIHJbZl0gPSBlW2ZdIF4gNTQsIG9bZl0gPSBlW2ZdIF4gOTI7CiAgICAgIHRoaXMuX2hhc2ggPSBbcl07CiAgICB9CiAgICBUNyh1cywgZ2IpOwogICAgdXMucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHRoaXMuX2hhc2gucHVzaCh0KTsKICAgIH07CiAgICB1cy5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ID0gdGhpcy5fYWxnKHhuLmNvbmNhdCh0aGlzLl9oYXNoKSk7CiAgICAgIHJldHVybiB0aGlzLl9hbGcoeG4uY29uY2F0KFt0aGlzLl9vcGFkLCB0XSkpOwogICAgfTsKICAgIHliLmV4cG9ydHMgPSB1czsKICB9KTsKICBtdSA9IFQyKChmVCwgTWIpID0+IHsKICAgIHZhciBMNyA9IEFvKCk7CiAgICBNYi5leHBvcnRzID0gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gbmV3IEw3KCkudXBkYXRlKHQpLmRpZ2VzdCgpOwogICAgfTsKICB9KTsKICB3dSA9IFQyKChhVCwgeGIpID0+IHsKICAgIHZhciBONyA9IEllKCksIEQ3ID0gd2IoKSwgX2IgPSB5aSgpLCBNYSA9IFRlKCkuQnVmZmVyLCBQNyA9IG11KCksIGd1ID0gQm8oKSwgeXUgPSBrbygpLCBDNyA9IE1hLmFsbG9jKDEyOCk7CiAgICBmdW5jdGlvbiBfYSh0LCBlKSB7CiAgICAgIF9iLmNhbGwodGhpcywgImRpZ2VzdCIpLCB0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IE1hLmZyb20oZSkpOwogICAgICB2YXIgciA9IHQgPT09ICJzaGE1MTIiIHx8IHQgPT09ICJzaGEzODQiID8gMTI4IDogNjQ7CiAgICAgIGlmICh0aGlzLl9hbGcgPSB0LCB0aGlzLl9rZXkgPSBlLCBlLmxlbmd0aCA+IHIpIHsKICAgICAgICB2YXIgbyA9IHQgPT09ICJybWQxNjAiID8gbmV3IGd1IDogeXUodCk7CiAgICAgICAgZSA9IG8udXBkYXRlKGUpLmRpZ2VzdCgpOwogICAgICB9IGVsc2UKICAgICAgICBlLmxlbmd0aCA8IHIgJiYgKGUgPSBNYS5jb25jYXQoW2UsIEM3XSwgcikpOwogICAgICBmb3IgKHZhciBmID0gdGhpcy5faXBhZCA9IE1hLmFsbG9jVW5zYWZlKHIpLCBwID0gdGhpcy5fb3BhZCA9IE1hLmFsbG9jVW5zYWZlKHIpLCBtMiA9IDA7bTIgPCByOyBtMisrKQogICAgICAgIGZbbTJdID0gZVttMl0gXiA1NCwgcFttMl0gPSBlW20yXSBeIDkyOwogICAgICB0aGlzLl9oYXNoID0gdCA9PT0gInJtZDE2MCIgPyBuZXcgZ3UgOiB5dSh0KSwgdGhpcy5faGFzaC51cGRhdGUoZik7CiAgICB9CiAgICBONyhfYSwgX2IpOwogICAgX2EucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHRoaXMuX2hhc2gudXBkYXRlKHQpOwogICAgfTsKICAgIF9hLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSB0aGlzLl9oYXNoLmRpZ2VzdCgpLCBlID0gdGhpcy5fYWxnID09PSAicm1kMTYwIiA/IG5ldyBndSA6IHl1KHRoaXMuX2FsZyk7CiAgICAgIHJldHVybiBlLnVwZGF0ZSh0aGlzLl9vcGFkKS51cGRhdGUodCkuZGlnZXN0KCk7CiAgICB9OwogICAgeGIuZXhwb3J0cyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPSBlLnRvTG93ZXJDYXNlKCksIGUgPT09ICJybWQxNjAiIHx8IGUgPT09ICJyaXBlbWQxNjAiID8gbmV3IF9hKCJybWQxNjAiLCByKSA6IGUgPT09ICJtZDUiID8gbmV3IEQ3KFA3LCByKSA6IG5ldyBfYShlLCByKTsKICAgIH07CiAgfSk7CiAgTXUgPSBUMigob1QsIE83KSA9PiB7CiAgICBPNy5leHBvcnRzID0geyBzaGEyMjRXaXRoUlNBRW5jcnlwdGlvbjogeyBzaWduOiAicnNhIiwgaGFzaDogInNoYTIyNCIsIGlkOiAiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMiIH0sICJSU0EtU0hBMjI0IjogeyBzaWduOiAiZWNkc2EvcnNhIiwgaGFzaDogInNoYTIyNCIsIGlkOiAiMzAyZDMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjA0MDUwMDA0MWMiIH0sIHNoYTI1NldpdGhSU0FFbmNyeXB0aW9uOiB7IHNpZ246ICJyc2EiLCBoYXNoOiAic2hhMjU2IiwgaWQ6ICIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCIgfSwgIlJTQS1TSEEyNTYiOiB7IHNpZ246ICJlY2RzYS9yc2EiLCBoYXNoOiAic2hhMjU2IiwgaWQ6ICIzMDMxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDEwNTAwMDQyMCIgfSwgc2hhMzg0V2l0aFJTQUVuY3J5cHRpb246IHsgc2lnbjogInJzYSIsIGhhc2g6ICJzaGEzODQiLCBpZDogIjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIiB9LCAiUlNBLVNIQTM4NCI6IHsgc2lnbjogImVjZHNhL3JzYSIsIGhhc2g6ICJzaGEzODQiLCBpZDogIjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIiB9LCBzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbjogeyBzaWduOiAicnNhIiwgaGFzaDogInNoYTUxMiIsIGlkOiAiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAiIH0sICJSU0EtU0hBNTEyIjogeyBzaWduOiAiZWNkc2EvcnNhIiwgaGFzaDogInNoYTUxMiIsIGlkOiAiMzA1MTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAzMDUwMDA0NDAiIH0sICJSU0EtU0hBMSI6IHsgc2lnbjogInJzYSIsIGhhc2g6ICJzaGExIiwgaWQ6ICIzMDIxMzAwOTA2MDUyYjBlMDMwMjFhMDUwMDA0MTQiIH0sICJlY2RzYS13aXRoLVNIQTEiOiB7IHNpZ246ICJlY2RzYSIsIGhhc2g6ICJzaGExIiwgaWQ6ICIiIH0sIHNoYTI1NjogeyBzaWduOiAiZWNkc2EiLCBoYXNoOiAic2hhMjU2IiwgaWQ6ICIiIH0sIHNoYTIyNDogeyBzaWduOiAiZWNkc2EiLCBoYXNoOiAic2hhMjI0IiwgaWQ6ICIiIH0sIHNoYTM4NDogeyBzaWduOiAiZWNkc2EiLCBoYXNoOiAic2hhMzg0IiwgaWQ6ICIiIH0sIHNoYTUxMjogeyBzaWduOiAiZWNkc2EiLCBoYXNoOiAic2hhNTEyIiwgaWQ6ICIiIH0sICJEU0EtU0hBIjogeyBzaWduOiAiZHNhIiwgaGFzaDogInNoYTEiLCBpZDogIiIgfSwgIkRTQS1TSEExIjogeyBzaWduOiAiZHNhIiwgaGFzaDogInNoYTEiLCBpZDogIiIgfSwgRFNBOiB7IHNpZ246ICJkc2EiLCBoYXNoOiAic2hhMSIsIGlkOiAiIiB9LCAiRFNBLVdJVEgtU0hBMjI0IjogeyBzaWduOiAiZHNhIiwgaGFzaDogInNoYTIyNCIsIGlkOiAiIiB9LCAiRFNBLVNIQTIyNCI6IHsgc2lnbjogImRzYSIsIGhhc2g6ICJzaGEyMjQiLCBpZDogIiIgfSwgIkRTQS1XSVRILVNIQTI1NiI6IHsgc2lnbjogImRzYSIsIGhhc2g6ICJzaGEyNTYiLCBpZDogIiIgfSwgIkRTQS1TSEEyNTYiOiB7IHNpZ246ICJkc2EiLCBoYXNoOiAic2hhMjU2IiwgaWQ6ICIiIH0sICJEU0EtV0lUSC1TSEEzODQiOiB7IHNpZ246ICJkc2EiLCBoYXNoOiAic2hhMzg0IiwgaWQ6ICIiIH0sICJEU0EtU0hBMzg0IjogeyBzaWduOiAiZHNhIiwgaGFzaDogInNoYTM4NCIsIGlkOiAiIiB9LCAiRFNBLVdJVEgtU0hBNTEyIjogeyBzaWduOiAiZHNhIiwgaGFzaDogInNoYTUxMiIsIGlkOiAiIiB9LCAiRFNBLVNIQTUxMiI6IHsgc2lnbjogImRzYSIsIGhhc2g6ICJzaGE1MTIiLCBpZDogIiIgfSwgIkRTQS1SSVBFTUQxNjAiOiB7IHNpZ246ICJkc2EiLCBoYXNoOiAicm1kMTYwIiwgaWQ6ICIiIH0sIHJpcGVtZDE2MFdpdGhSU0E6IHsgc2lnbjogInJzYSIsIGhhc2g6ICJybWQxNjAiLCBpZDogIjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNCIgfSwgIlJTQS1SSVBFTUQxNjAiOiB7IHNpZ246ICJyc2EiLCBoYXNoOiAicm1kMTYwIiwgaWQ6ICIzMDIxMzAwOTA2MDUyYjI0MDMwMjAxMDUwMDA0MTQiIH0sIG1kNVdpdGhSU0FFbmNyeXB0aW9uOiB7IHNpZ246ICJyc2EiLCBoYXNoOiAibWQ1IiwgaWQ6ICIzMDIwMzAwYzA2MDgyYTg2NDg4NmY3MGQwMjA1MDUwMDA0MTAiIH0sICJSU0EtTUQ1IjogeyBzaWduOiAicnNhIiwgaGFzaDogIm1kNSIsIGlkOiAiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwIiB9IH07CiAgfSk7CiAgRWIgPSBUMigoc1QsIFNiKSA9PiB7CiAgICBTYi5leHBvcnRzID0gTXUoKTsKICB9KTsKICBfdSA9IFQyKChoVCwgQWIpID0+IHsKICAgIHZhciBGNyA9IE1hdGgucG93KDIsIDMwKSAtIDE7CiAgICBBYi5leHBvcnRzID0gZnVuY3Rpb24odCwgZSkgewogICAgICBpZiAodHlwZW9mIHQgIT0gIm51bWJlciIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSXRlcmF0aW9ucyBub3QgYSBudW1iZXIiKTsKICAgICAgaWYgKHQgPCAwKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkJhZCBpdGVyYXRpb25zIik7CiAgICAgIGlmICh0eXBlb2YgZSAhPSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJLZXkgbGVuZ3RoIG5vdCBhIG51bWJlciIpOwogICAgICBpZiAoZSA8IDAgfHwgZSA+IEY3IHx8IGUgIT09IGUpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQmFkIGtleSBsZW5ndGgiKTsKICAgIH07CiAgfSk7CiAgeHUgPSBUMigodVQsIEJiKSA9PiB7CiAgICB2YXIgbHM7CiAgICBnbG9iYWwucHJvY2VzcyAmJiBnbG9iYWwucHJvY2Vzcy5icm93c2VyID8gbHMgPSAidXRmLTgiIDogZ2xvYmFsLnByb2Nlc3MgJiYgZ2xvYmFsLnByb2Nlc3MudmVyc2lvbiA/IChSYiA9IHBhcnNlSW50KHByb2Nlc3MudmVyc2lvbi5zcGxpdCgiLiIpWzBdLnNsaWNlKDEpLCAxMCksIGxzID0gUmIgPj0gNiA/ICJ1dGYtOCIgOiAiYmluYXJ5IikgOiBscyA9ICJ1dGYtOCI7CiAgICB2YXIgUmI7CiAgICBCYi5leHBvcnRzID0gbHM7CiAgfSk7CiAgRXUgPSBUMigobFQsIHFiKSA9PiB7CiAgICB2YXIgU3UgPSBUZSgpLkJ1ZmZlcjsKICAgIHFiLmV4cG9ydHMgPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIGlmIChTdS5pc0J1ZmZlcih0KSkKICAgICAgICByZXR1cm4gdDsKICAgICAgaWYgKHR5cGVvZiB0ID09ICJzdHJpbmciKQogICAgICAgIHJldHVybiBTdS5mcm9tKHQsIGUpOwogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHQpKQogICAgICAgIHJldHVybiBTdS5mcm9tKHQuYnVmZmVyKTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihyICsgIiBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSB0eXBlZCBhcnJheSBvciBhIERhdGFWaWV3Iik7CiAgICB9OwogIH0pOwogIEF1ID0gVDIoKGRULCBMYikgPT4gewogICAgdmFyIFU3ID0gbXUoKSwgejcgPSBCbygpLCBINyA9IGtvKCksIFNuID0gVGUoKS5CdWZmZXIsIFc3ID0gX3UoKSwgSWIgPSB4dSgpLCBUYiA9IEV1KCksIEs3ID0gU24uYWxsb2MoMTI4KSwgZHMgPSB7IG1kNTogMTYsIHNoYTE6IDIwLCBzaGEyMjQ6IDI4LCBzaGEyNTY6IDMyLCBzaGEzODQ6IDQ4LCBzaGE1MTI6IDY0LCBybWQxNjA6IDIwLCByaXBlbWQxNjA6IDIwIH07CiAgICBmdW5jdGlvbiBrYih0LCBlLCByKSB7CiAgICAgIHZhciBvID0gajcodCksIGYgPSB0ID09PSAic2hhNTEyIiB8fCB0ID09PSAic2hhMzg0IiA/IDEyOCA6IDY0OwogICAgICBlLmxlbmd0aCA+IGYgPyBlID0gbyhlKSA6IGUubGVuZ3RoIDwgZiAmJiAoZSA9IFNuLmNvbmNhdChbZSwgSzddLCBmKSk7CiAgICAgIGZvciAodmFyIHAgPSBTbi5hbGxvY1Vuc2FmZShmICsgZHNbdF0pLCBtMiA9IFNuLmFsbG9jVW5zYWZlKGYgKyBkc1t0XSksIHkyID0gMDt5MiA8IGY7IHkyKyspCiAgICAgICAgcFt5Ml0gPSBlW3kyXSBeIDU0LCBtMlt5Ml0gPSBlW3kyXSBeIDkyOwogICAgICB2YXIgTSA9IFNuLmFsbG9jVW5zYWZlKGYgKyByICsgNCk7CiAgICAgIHAuY29weShNLCAwLCAwLCBmKSwgdGhpcy5pcGFkMSA9IE0sIHRoaXMuaXBhZDIgPSBwLCB0aGlzLm9wYWQgPSBtMiwgdGhpcy5hbGcgPSB0LCB0aGlzLmJsb2Nrc2l6ZSA9IGYsIHRoaXMuaGFzaCA9IG8sIHRoaXMuc2l6ZSA9IGRzW3RdOwogICAgfQogICAga2IucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgdC5jb3B5KGUsIHRoaXMuYmxvY2tzaXplKTsKICAgICAgdmFyIHIgPSB0aGlzLmhhc2goZSk7CiAgICAgIHJldHVybiByLmNvcHkodGhpcy5vcGFkLCB0aGlzLmJsb2Nrc2l6ZSksIHRoaXMuaGFzaCh0aGlzLm9wYWQpOwogICAgfTsKICAgIGZ1bmN0aW9uIGo3KHQpIHsKICAgICAgZnVuY3Rpb24gZShvKSB7CiAgICAgICAgcmV0dXJuIEg3KHQpLnVwZGF0ZShvKS5kaWdlc3QoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiByKG8pIHsKICAgICAgICByZXR1cm4gbmV3IHo3KCkudXBkYXRlKG8pLmRpZ2VzdCgpOwogICAgICB9CiAgICAgIHJldHVybiB0ID09PSAicm1kMTYwIiB8fCB0ID09PSAicmlwZW1kMTYwIiA/IHIgOiB0ID09PSAibWQ1IiA/IFU3IDogZTsKICAgIH0KICAgIGZ1bmN0aW9uIFo3KHQsIGUsIHIsIG8sIGYpIHsKICAgICAgVzcociwgbyksIHQgPSBUYih0LCBJYiwgIlBhc3N3b3JkIiksIGUgPSBUYihlLCBJYiwgIlNhbHQiKSwgZiA9IGYgfHwgInNoYTEiOwogICAgICB2YXIgcCA9IG5ldyBrYihmLCB0LCBlLmxlbmd0aCksIG0yID0gU24uYWxsb2NVbnNhZmUobyksIHkyID0gU24uYWxsb2NVbnNhZmUoZS5sZW5ndGggKyA0KTsKICAgICAgZS5jb3B5KHkyLCAwLCAwLCBlLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIE0gPSAwLCB4ID0gZHNbZl0sIFMgPSBNYXRoLmNlaWwobyAvIHgpLCBFMiA9IDE7RTIgPD0gUzsgRTIrKykgewogICAgICAgIHkyLndyaXRlVUludDMyQkUoRTIsIGUubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBCID0gcC5ydW4oeTIsIHAuaXBhZDEpLCBxMiA9IEIsIEwyID0gMTtMMiA8IHI7IEwyKyspIHsKICAgICAgICAgIHEyID0gcC5ydW4ocTIsIHAuaXBhZDIpOwogICAgICAgICAgZm9yICh2YXIgZ2UgPSAwO2dlIDwgeDsgZ2UrKykKICAgICAgICAgICAgQltnZV0gXj0gcTJbZ2VdOwogICAgICAgIH0KICAgICAgICBCLmNvcHkobTIsIE0pLCBNICs9IHg7CiAgICAgIH0KICAgICAgcmV0dXJuIG0yOwogICAgfQogICAgTGIuZXhwb3J0cyA9IFo3OwogIH0pOwogIFViID0gVDIoKGNULCBGYikgPT4gewogICAgdmFyIENiID0gVGUoKS5CdWZmZXIsIFY3ID0gX3UoKSwgTmIgPSB4dSgpLCBEYiA9IEF1KCksIFBiID0gRXUoKSwgY3MsIHhhID0gZ2xvYmFsLmNyeXB0byAmJiBnbG9iYWwuY3J5cHRvLnN1YnRsZSwgJDcgPSB7IHNoYTogIlNIQS0xIiwgInNoYS0xIjogIlNIQS0xIiwgc2hhMTogIlNIQS0xIiwgc2hhMjU2OiAiU0hBLTI1NiIsICJzaGEtMjU2IjogIlNIQS0yNTYiLCBzaGEzODQ6ICJTSEEtMzg0IiwgInNoYS0zODQiOiAiU0hBLTM4NCIsICJzaGEtNTEyIjogIlNIQS01MTIiLCBzaGE1MTI6ICJTSEEtNTEyIiB9LCBSdSA9IFtdOwogICAgZnVuY3Rpb24gRzcodCkgewogICAgICBpZiAoZ2xvYmFsLnByb2Nlc3MgJiYgIWdsb2JhbC5wcm9jZXNzLmJyb3dzZXIgfHwgIXhhIHx8ICF4YS5pbXBvcnRLZXkgfHwgIXhhLmRlcml2ZUJpdHMpCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7CiAgICAgIGlmIChSdVt0XSAhPT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBSdVt0XTsKICAgICAgY3MgPSBjcyB8fCBDYi5hbGxvYyg4KTsKICAgICAgdmFyIGUgPSBPYihjcywgY3MsIDEwLCAxMjgsIHQpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSk7CiAgICAgIHJldHVybiBSdVt0XSA9IGUsIGU7CiAgICB9CiAgICB2YXIgRW47CiAgICBmdW5jdGlvbiBCdSgpIHsKICAgICAgcmV0dXJuIEVuIHx8IChnbG9iYWwucHJvY2VzcyAmJiBnbG9iYWwucHJvY2Vzcy5uZXh0VGljayA/IEVuID0gZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2sgOiBnbG9iYWwucXVldWVNaWNyb3Rhc2sgPyBFbiA9IGdsb2JhbC5xdWV1ZU1pY3JvdGFzayA6IGdsb2JhbC5zZXRJbW1lZGlhdGUgPyBFbiA9IGdsb2JhbC5zZXRJbW1lZGlhdGUgOiBFbiA9IGdsb2JhbC5zZXRUaW1lb3V0LCBFbik7CiAgICB9CiAgICBmdW5jdGlvbiBPYih0LCBlLCByLCBvLCBmKSB7CiAgICAgIHJldHVybiB4YS5pbXBvcnRLZXkoInJhdyIsIHQsIHsgbmFtZTogIlBCS0RGMiIgfSwgZmFsc2UsIFsiZGVyaXZlQml0cyJdKS50aGVuKGZ1bmN0aW9uKHApIHsKICAgICAgICByZXR1cm4geGEuZGVyaXZlQml0cyh7IG5hbWU6ICJQQktERjIiLCBzYWx0OiBlLCBpdGVyYXRpb25zOiByLCBoYXNoOiB7IG5hbWU6IGYgfSB9LCBwLCBvIDw8IDMpOwogICAgICB9KS50aGVuKGZ1bmN0aW9uKHApIHsKICAgICAgICByZXR1cm4gQ2IuZnJvbShwKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBZNyh0LCBlKSB7CiAgICAgIHQudGhlbihmdW5jdGlvbihyKSB7CiAgICAgICAgQnUoKShmdW5jdGlvbigpIHsKICAgICAgICAgIGUobnVsbCwgcik7CiAgICAgICAgfSk7CiAgICAgIH0sIGZ1bmN0aW9uKHIpIHsKICAgICAgICBCdSgpKGZ1bmN0aW9uKCkgewogICAgICAgICAgZShyKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICBGYi5leHBvcnRzID0gZnVuY3Rpb24odCwgZSwgciwgbywgZiwgcCkgewogICAgICB0eXBlb2YgZiA9PSAiZnVuY3Rpb24iICYmIChwID0gZiwgZiA9IHVuZGVmaW5lZCksIGYgPSBmIHx8ICJzaGExIjsKICAgICAgdmFyIG0yID0gJDdbZi50b0xvd2VyQ2FzZSgpXTsKICAgICAgaWYgKCFtMiB8fCB0eXBlb2YgZ2xvYmFsLlByb21pc2UgIT0gImZ1bmN0aW9uIikgewogICAgICAgIEJ1KCkoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgeTI7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB5MiA9IERiKHQsIGUsIHIsIG8sIGYpOwogICAgICAgICAgfSBjYXRjaCAoTSkgewogICAgICAgICAgICByZXR1cm4gcChNKTsKICAgICAgICAgIH0KICAgICAgICAgIHAobnVsbCwgeTIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoVjcociwgbyksIHQgPSBQYih0LCBOYiwgIlBhc3N3b3JkIiksIGUgPSBQYihlLCBOYiwgIlNhbHQiKSwgdHlwZW9mIHAgIT0gImZ1bmN0aW9uIikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIGNhbGxiYWNrIHByb3ZpZGVkIHRvIHBia2RmMiIpOwogICAgICBZNyhHNyhtMikudGhlbihmdW5jdGlvbih5MikgewogICAgICAgIHJldHVybiB5MiA/IE9iKHQsIGUsIHIsIG8sIG0yKSA6IERiKHQsIGUsIHIsIG8sIGYpOwogICAgICB9KSwgcCk7CiAgICB9OwogIH0pOwogIEl1ID0gVDIoKHF1KSA9PiB7CiAgICBxdS5wYmtkZjIgPSBVYigpOwogICAgcXUucGJrZGYyU3luYyA9IEF1KCk7CiAgfSk7CiAgVHUgPSBUMigoYnIpID0+IHsKICAgIGJyLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgdmFyIG8gPSBlWzAgKyByXSA8PCAyNCB8IGVbMSArIHJdIDw8IDE2IHwgZVsyICsgcl0gPDwgOCB8IGVbMyArIHJdOwogICAgICByZXR1cm4gbyA+Pj4gMDsKICAgIH07CiAgICBici53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBlWzAgKyBvXSA9IHIgPj4+IDI0LCBlWzEgKyBvXSA9IHIgPj4+IDE2ICYgMjU1LCBlWzIgKyBvXSA9IHIgPj4+IDggJiAyNTUsIGVbMyArIG9dID0gciAmIDI1NTsKICAgIH07CiAgICBici5pcCA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgZm9yICh2YXIgcCA9IDAsIG0yID0gMCwgeTIgPSA2O3kyID49IDA7IHkyIC09IDIpIHsKICAgICAgICBmb3IgKHZhciBNID0gMDtNIDw9IDI0OyBNICs9IDgpCiAgICAgICAgICBwIDw8PSAxLCBwIHw9IHIgPj4+IE0gKyB5MiAmIDE7CiAgICAgICAgZm9yICh2YXIgTSA9IDA7TSA8PSAyNDsgTSArPSA4KQogICAgICAgICAgcCA8PD0gMSwgcCB8PSBlID4+PiBNICsgeTIgJiAxOwogICAgICB9CiAgICAgIGZvciAodmFyIHkyID0gNjt5MiA+PSAwOyB5MiAtPSAyKSB7CiAgICAgICAgZm9yICh2YXIgTSA9IDE7TSA8PSAyNTsgTSArPSA4KQogICAgICAgICAgbTIgPDw9IDEsIG0yIHw9IHIgPj4+IE0gKyB5MiAmIDE7CiAgICAgICAgZm9yICh2YXIgTSA9IDE7TSA8PSAyNTsgTSArPSA4KQogICAgICAgICAgbTIgPDw9IDEsIG0yIHw9IGUgPj4+IE0gKyB5MiAmIDE7CiAgICAgIH0KICAgICAgb1tmICsgMF0gPSBwID4+PiAwLCBvW2YgKyAxXSA9IG0yID4+PiAwOwogICAgfTsKICAgIGJyLnJpcCA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgZm9yICh2YXIgcCA9IDAsIG0yID0gMCwgeTIgPSAwO3kyIDwgNDsgeTIrKykKICAgICAgICBmb3IgKHZhciBNID0gMjQ7TSA+PSAwOyBNIC09IDgpCiAgICAgICAgICBwIDw8PSAxLCBwIHw9IHIgPj4+IE0gKyB5MiAmIDEsIHAgPDw9IDEsIHAgfD0gZSA+Pj4gTSArIHkyICYgMTsKICAgICAgZm9yICh2YXIgeTIgPSA0O3kyIDwgODsgeTIrKykKICAgICAgICBmb3IgKHZhciBNID0gMjQ7TSA+PSAwOyBNIC09IDgpCiAgICAgICAgICBtMiA8PD0gMSwgbTIgfD0gciA+Pj4gTSArIHkyICYgMSwgbTIgPDw9IDEsIG0yIHw9IGUgPj4+IE0gKyB5MiAmIDE7CiAgICAgIG9bZiArIDBdID0gcCA+Pj4gMCwgb1tmICsgMV0gPSBtMiA+Pj4gMDsKICAgIH07CiAgICBici5wYzEgPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIGZvciAodmFyIHAgPSAwLCBtMiA9IDAsIHkyID0gNzt5MiA+PSA1OyB5Mi0tKSB7CiAgICAgICAgZm9yICh2YXIgTSA9IDA7TSA8PSAyNDsgTSArPSA4KQogICAgICAgICAgcCA8PD0gMSwgcCB8PSByID4+IE0gKyB5MiAmIDE7CiAgICAgICAgZm9yICh2YXIgTSA9IDA7TSA8PSAyNDsgTSArPSA4KQogICAgICAgICAgcCA8PD0gMSwgcCB8PSBlID4+IE0gKyB5MiAmIDE7CiAgICAgIH0KICAgICAgZm9yICh2YXIgTSA9IDA7TSA8PSAyNDsgTSArPSA4KQogICAgICAgIHAgPDw9IDEsIHAgfD0gciA+PiBNICsgeTIgJiAxOwogICAgICBmb3IgKHZhciB5MiA9IDE7eTIgPD0gMzsgeTIrKykgewogICAgICAgIGZvciAodmFyIE0gPSAwO00gPD0gMjQ7IE0gKz0gOCkKICAgICAgICAgIG0yIDw8PSAxLCBtMiB8PSByID4+IE0gKyB5MiAmIDE7CiAgICAgICAgZm9yICh2YXIgTSA9IDA7TSA8PSAyNDsgTSArPSA4KQogICAgICAgICAgbTIgPDw9IDEsIG0yIHw9IGUgPj4gTSArIHkyICYgMTsKICAgICAgfQogICAgICBmb3IgKHZhciBNID0gMDtNIDw9IDI0OyBNICs9IDgpCiAgICAgICAgbTIgPDw9IDEsIG0yIHw9IGUgPj4gTSArIHkyICYgMTsKICAgICAgb1tmICsgMF0gPSBwID4+PiAwLCBvW2YgKyAxXSA9IG0yID4+PiAwOwogICAgfTsKICAgIGJyLnIyOHNobCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGUgPDwgciAmIDI2ODQzNTQ1NSB8IGUgPj4+IDI4IC0gcjsKICAgIH07CiAgICB2YXIgcHMgPSBbMTQsIDExLCAxNywgNCwgMjcsIDIzLCAyNSwgMCwgMTMsIDIyLCA3LCAxOCwgNSwgOSwgMTYsIDI0LCAyLCAyMCwgMTIsIDIxLCAxLCA4LCAxNSwgMjYsIDE1LCA0LCAyNSwgMTksIDksIDEsIDI2LCAxNiwgNSwgMTEsIDIzLCA4LCAxMiwgNywgMTcsIDAsIDIyLCAzLCAxMCwgMTQsIDYsIDIwLCAyNywgMjRdOwogICAgYnIucGMyID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICBmb3IgKHZhciBwID0gMCwgbTIgPSAwLCB5MiA9IHBzLmxlbmd0aCA+Pj4gMSwgTSA9IDA7TSA8IHkyOyBNKyspCiAgICAgICAgcCA8PD0gMSwgcCB8PSBlID4+PiBwc1tNXSAmIDE7CiAgICAgIGZvciAodmFyIE0gPSB5MjtNIDwgcHMubGVuZ3RoOyBNKyspCiAgICAgICAgbTIgPDw9IDEsIG0yIHw9IHIgPj4+IHBzW01dICYgMTsKICAgICAgb1tmICsgMF0gPSBwID4+PiAwLCBvW2YgKyAxXSA9IG0yID4+PiAwOwogICAgfTsKICAgIGJyLmV4cGFuZCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdmFyIGYgPSAwLCBwID0gMDsKICAgICAgZiA9IChlICYgMSkgPDwgNSB8IGUgPj4+IDI3OwogICAgICBmb3IgKHZhciBtMiA9IDIzO20yID49IDE1OyBtMiAtPSA0KQogICAgICAgIGYgPDw9IDYsIGYgfD0gZSA+Pj4gbTIgJiA2MzsKICAgICAgZm9yICh2YXIgbTIgPSAxMTttMiA+PSAzOyBtMiAtPSA0KQogICAgICAgIHAgfD0gZSA+Pj4gbTIgJiA2MywgcCA8PD0gNjsKICAgICAgcCB8PSAoZSAmIDMxKSA8PCAxIHwgZSA+Pj4gMzEsIHJbbyArIDBdID0gZiA+Pj4gMCwgcltvICsgMV0gPSBwID4+PiAwOwogICAgfTsKICAgIHZhciB6YiA9IFsxNCwgMCwgNCwgMTUsIDEzLCA3LCAxLCA0LCAyLCAxNCwgMTUsIDIsIDExLCAxMywgOCwgMSwgMywgMTAsIDEwLCA2LCA2LCAxMiwgMTIsIDExLCA1LCA5LCA5LCA1LCAwLCAzLCA3LCA4LCA0LCAxNSwgMSwgMTIsIDE0LCA4LCA4LCAyLCAxMywgNCwgNiwgOSwgMiwgMSwgMTEsIDcsIDE1LCA1LCAxMiwgMTEsIDksIDMsIDcsIDE0LCAzLCAxMCwgMTAsIDAsIDUsIDYsIDAsIDEzLCAxNSwgMywgMSwgMTMsIDgsIDQsIDE0LCA3LCA2LCAxNSwgMTEsIDIsIDMsIDgsIDQsIDE0LCA5LCAxMiwgNywgMCwgMiwgMSwgMTMsIDEwLCAxMiwgNiwgMCwgOSwgNSwgMTEsIDEwLCA1LCAwLCAxMywgMTQsIDgsIDcsIDEwLCAxMSwgMSwgMTAsIDMsIDQsIDE1LCAxMywgNCwgMSwgMiwgNSwgMTEsIDgsIDYsIDEyLCA3LCA2LCAxMiwgOSwgMCwgMywgNSwgMiwgMTQsIDE1LCA5LCAxMCwgMTMsIDAsIDcsIDksIDAsIDE0LCA5LCA2LCAzLCAzLCA0LCAxNSwgNiwgNSwgMTAsIDEsIDIsIDEzLCA4LCAxMiwgNSwgNywgMTQsIDExLCAxMiwgNCwgMTEsIDIsIDE1LCA4LCAxLCAxMywgMSwgNiwgMTAsIDQsIDEzLCA5LCAwLCA4LCA2LCAxNSwgOSwgMywgOCwgMCwgNywgMTEsIDQsIDEsIDE1LCAyLCAxNCwgMTIsIDMsIDUsIDExLCAxMCwgNSwgMTQsIDIsIDcsIDEyLCA3LCAxMywgMTMsIDgsIDE0LCAxMSwgMywgNSwgMCwgNiwgNiwgMTUsIDksIDAsIDEwLCAzLCAxLCA0LCAyLCA3LCA4LCAyLCA1LCAxMiwgMTEsIDEsIDEyLCAxMCwgNCwgMTQsIDE1LCA5LCAxMCwgMywgNiwgMTUsIDksIDAsIDAsIDYsIDEyLCAxMCwgMTEsIDEsIDcsIDEzLCAxMywgOCwgMTUsIDksIDEsIDQsIDMsIDUsIDE0LCAxMSwgNSwgMTIsIDIsIDcsIDgsIDIsIDQsIDE0LCAyLCAxNCwgMTIsIDExLCA0LCAyLCAxLCAxMiwgNywgNCwgMTAsIDcsIDExLCAxMywgNiwgMSwgOCwgNSwgNSwgMCwgMywgMTUsIDE1LCAxMCwgMTMsIDMsIDAsIDksIDE0LCA4LCA5LCA2LCA0LCAxMSwgMiwgOCwgMSwgMTIsIDExLCA3LCAxMCwgMSwgMTMsIDE0LCA3LCAyLCA4LCAxMywgMTUsIDYsIDksIDE1LCAxMiwgMCwgNSwgOSwgNiwgMTAsIDMsIDQsIDAsIDUsIDE0LCAzLCAxMiwgMTAsIDEsIDE1LCAxMCwgNCwgMTUsIDIsIDksIDcsIDIsIDEyLCA2LCA5LCA4LCA1LCAwLCA2LCAxMywgMSwgMywgMTMsIDQsIDE0LCAxNCwgMCwgNywgMTEsIDUsIDMsIDExLCA4LCA5LCA0LCAxNCwgMywgMTUsIDIsIDUsIDEyLCAyLCA5LCA4LCA1LCAxMiwgMTUsIDMsIDEwLCA3LCAxMSwgMCwgMTQsIDQsIDEsIDEwLCA3LCAxLCA2LCAxMywgMCwgMTEsIDgsIDYsIDEzLCA0LCAxMywgMTEsIDAsIDIsIDExLCAxNCwgNywgMTUsIDQsIDAsIDksIDgsIDEsIDEzLCAxMCwgMywgMTQsIDEyLCAzLCA5LCA1LCA3LCAxMiwgNSwgMiwgMTAsIDE1LCA2LCA4LCAxLCA2LCAxLCA2LCA0LCAxMSwgMTEsIDEzLCAxMywgOCwgMTIsIDEsIDMsIDQsIDcsIDEwLCAxNCwgNywgMTAsIDksIDE1LCA1LCA2LCAwLCA4LCAxNSwgMCwgMTQsIDUsIDIsIDksIDMsIDIsIDEyLCAxMywgMSwgMiwgMTUsIDgsIDEzLCA0LCA4LCA2LCAxMCwgMTUsIDMsIDExLCA3LCAxLCA0LCAxMCwgMTIsIDksIDUsIDMsIDYsIDE0LCAxMSwgNSwgMCwgMCwgMTQsIDEyLCA5LCA3LCAyLCA3LCAyLCAxMSwgMSwgNCwgMTQsIDEsIDcsIDksIDQsIDEyLCAxMCwgMTQsIDgsIDIsIDEzLCAwLCAxNSwgNiwgMTIsIDEwLCA5LCAxMywgMCwgMTUsIDMsIDMsIDUsIDUsIDYsIDgsIDExXTsKICAgIGJyLnN1YnN0aXR1dGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGZvciAodmFyIG8gPSAwLCBmID0gMDtmIDwgNDsgZisrKSB7CiAgICAgICAgdmFyIHAgPSBlID4+PiAxOCAtIGYgKiA2ICYgNjMsIG0yID0gemJbZiAqIDY0ICsgcF07CiAgICAgICAgbyA8PD0gNCwgbyB8PSBtMjsKICAgICAgfQogICAgICBmb3IgKHZhciBmID0gMDtmIDwgNDsgZisrKSB7CiAgICAgICAgdmFyIHAgPSByID4+PiAxOCAtIGYgKiA2ICYgNjMsIG0yID0gemJbNCAqIDY0ICsgZiAqIDY0ICsgcF07CiAgICAgICAgbyA8PD0gNCwgbyB8PSBtMjsKICAgICAgfQogICAgICByZXR1cm4gbyA+Pj4gMDsKICAgIH07CiAgICB2YXIgSGIgPSBbMTYsIDI1LCAxMiwgMTEsIDMsIDIwLCA0LCAxNSwgMzEsIDE3LCA5LCA2LCAyNywgMTQsIDEsIDIyLCAzMCwgMjQsIDgsIDE4LCAwLCA1LCAyOSwgMjMsIDEzLCAxOSwgMiwgMjYsIDEwLCAyMSwgMjgsIDddOwogICAgYnIucGVybXV0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZm9yICh2YXIgciA9IDAsIG8gPSAwO28gPCBIYi5sZW5ndGg7IG8rKykKICAgICAgICByIDw8PSAxLCByIHw9IGUgPj4+IEhiW29dICYgMTsKICAgICAgcmV0dXJuIHIgPj4+IDA7CiAgICB9OwogICAgYnIucGFkU3BsaXQgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIGZvciAodmFyIGYgPSBlLnRvU3RyaW5nKDIpO2YubGVuZ3RoIDwgcjsgKQogICAgICAgIGYgPSAiMCIgKyBmOwogICAgICBmb3IgKHZhciBwID0gW10sIG0yID0gMDttMiA8IHI7IG0yICs9IG8pCiAgICAgICAgcC5wdXNoKGYuc2xpY2UobTIsIG0yICsgbykpOwogICAgICByZXR1cm4gcC5qb2luKCIgIik7CiAgICB9OwogIH0pOwogIGFyID0gVDIoKGJULCBLYikgPT4gewogICAgS2IuZXhwb3J0cyA9IFdiOwogICAgZnVuY3Rpb24gV2IodCwgZSkgewogICAgICBpZiAoIXQpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUgfHwgIkFzc2VydGlvbiBmYWlsZWQiKTsKICAgIH0KICAgIFdiLmVxdWFsID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBpZiAoZSAhPSByKQogICAgICAgIHRocm93IG5ldyBFcnJvcihvIHx8ICJBc3NlcnRpb24gZmFpbGVkOiAiICsgZSArICIgIT0gIiArIHIpOwogICAgfTsKICB9KTsKICB2cyA9IFQyKChtVCwgamIpID0+IHsKICAgIHZhciBYNyA9IGFyKCk7CiAgICBmdW5jdGlvbiBtcih0KSB7CiAgICAgIHRoaXMub3B0aW9ucyA9IHQsIHRoaXMudHlwZSA9IHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmJsb2NrU2l6ZSA9IDgsIHRoaXMuX2luaXQoKSwgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkodGhpcy5ibG9ja1NpemUpLCB0aGlzLmJ1ZmZlck9mZiA9IDA7CiAgICB9CiAgICBqYi5leHBvcnRzID0gbXI7CiAgICBtci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHsKICAgIH07CiAgICBtci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZS5sZW5ndGggPT09IDAgPyBbXSA6IHRoaXMudHlwZSA9PT0gImRlY3J5cHQiID8gdGhpcy5fdXBkYXRlRGVjcnlwdChlKSA6IHRoaXMuX3VwZGF0ZUVuY3J5cHQoZSk7CiAgICB9OwogICAgbXIucHJvdG90eXBlLl9idWZmZXIgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGZvciAodmFyIG8gPSBNYXRoLm1pbih0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLmJ1ZmZlck9mZiwgZS5sZW5ndGggLSByKSwgZiA9IDA7ZiA8IG87IGYrKykKICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZiArIGZdID0gZVtyICsgZl07CiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlck9mZiArPSBvLCBvOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fZmx1c2hCdWZmZXIgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsIDAsIGUsIHIpLCB0aGlzLmJ1ZmZlck9mZiA9IDAsIHRoaXMuYmxvY2tTaXplOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fdXBkYXRlRW5jcnlwdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSAwLCBvID0gMCwgZiA9ICh0aGlzLmJ1ZmZlck9mZiArIGUubGVuZ3RoKSAvIHRoaXMuYmxvY2tTaXplIHwgMCwgcCA9IG5ldyBBcnJheShmICogdGhpcy5ibG9ja1NpemUpOwogICAgICB0aGlzLmJ1ZmZlck9mZiAhPT0gMCAmJiAociArPSB0aGlzLl9idWZmZXIoZSwgciksIHRoaXMuYnVmZmVyT2ZmID09PSB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgKG8gKz0gdGhpcy5fZmx1c2hCdWZmZXIocCwgbykpKTsKICAgICAgZm9yICh2YXIgbTIgPSBlLmxlbmd0aCAtIChlLmxlbmd0aCAtIHIpICUgdGhpcy5ibG9ja1NpemU7ciA8IG0yOyByICs9IHRoaXMuYmxvY2tTaXplKQogICAgICAgIHRoaXMuX3VwZGF0ZShlLCByLCBwLCBvKSwgbyArPSB0aGlzLmJsb2NrU2l6ZTsKICAgICAgZm9yICg7ciA8IGUubGVuZ3RoOyByKyssIHRoaXMuYnVmZmVyT2ZmKyspCiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZdID0gZVtyXTsKICAgICAgcmV0dXJuIHA7CiAgICB9OwogICAgbXIucHJvdG90eXBlLl91cGRhdGVEZWNyeXB0ID0gZnVuY3Rpb24oZSkgewogICAgICBmb3IgKHZhciByID0gMCwgbyA9IDAsIGYgPSBNYXRoLmNlaWwoKHRoaXMuYnVmZmVyT2ZmICsgZS5sZW5ndGgpIC8gdGhpcy5ibG9ja1NpemUpIC0gMSwgcCA9IG5ldyBBcnJheShmICogdGhpcy5ibG9ja1NpemUpO2YgPiAwOyBmLS0pCiAgICAgICAgciArPSB0aGlzLl9idWZmZXIoZSwgciksIG8gKz0gdGhpcy5fZmx1c2hCdWZmZXIocCwgbyk7CiAgICAgIHJldHVybiByICs9IHRoaXMuX2J1ZmZlcihlLCByKSwgcDsKICAgIH07CiAgICBtci5wcm90b3R5cGUuZmluYWwgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciByOwogICAgICBlICYmIChyID0gdGhpcy51cGRhdGUoZSkpOwogICAgICB2YXIgbzsKICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gImVuY3J5cHQiID8gbyA9IHRoaXMuX2ZpbmFsRW5jcnlwdCgpIDogbyA9IHRoaXMuX2ZpbmFsRGVjcnlwdCgpLCByID8gci5jb25jYXQobykgOiBvOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24oZSwgcikgewogICAgICBpZiAociA9PT0gMCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAoO3IgPCBlLmxlbmd0aDsgKQogICAgICAgIGVbcisrXSA9IDA7CiAgICAgIHJldHVybiB0cnVlOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fZmluYWxFbmNyeXB0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy5fcGFkKHRoaXMuYnVmZmVyLCB0aGlzLmJ1ZmZlck9mZikpCiAgICAgICAgcmV0dXJuIFtdOwogICAgICB2YXIgZSA9IG5ldyBBcnJheSh0aGlzLmJsb2NrU2l6ZSk7CiAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodGhpcy5idWZmZXIsIDAsIGUsIDApLCBlOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fdW5wYWQgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlOwogICAgfTsKICAgIG1yLnByb3RvdHlwZS5fZmluYWxEZWNyeXB0ID0gZnVuY3Rpb24oKSB7CiAgICAgIFg3LmVxdWFsKHRoaXMuYnVmZmVyT2ZmLCB0aGlzLmJsb2NrU2l6ZSwgIk5vdCBlbm91Z2ggZGF0YSB0byBkZWNyeXB0Iik7CiAgICAgIHZhciBlID0gbmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTsKICAgICAgcmV0dXJuIHRoaXMuX2ZsdXNoQnVmZmVyKGUsIDApLCB0aGlzLl91bnBhZChlKTsKICAgIH07CiAgfSk7CiAga3UgPSBUMigoZ1QsICRiKSA9PiB7CiAgICB2YXIgWmIgPSBhcigpLCBKNyA9IEllKCksIE50ID0gVHUoKSwgVmIgPSB2cygpOwogICAgZnVuY3Rpb24gUTcoKSB7CiAgICAgIHRoaXMudG1wID0gbmV3IEFycmF5KDIpLCB0aGlzLmtleXMgPSBudWxsOwogICAgfQogICAgZnVuY3Rpb24gZWkodCkgewogICAgICBWYi5jYWxsKHRoaXMsIHQpOwogICAgICB2YXIgZSA9IG5ldyBRNzsKICAgICAgdGhpcy5fZGVzU3RhdGUgPSBlLCB0aGlzLmRlcml2ZUtleXMoZSwgdC5rZXkpOwogICAgfQogICAgSjcoZWksIFZiKTsKICAgICRiLmV4cG9ydHMgPSBlaTsKICAgIGVpLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIG5ldyBlaShlKTsKICAgIH07CiAgICB2YXIgZTkgPSBbMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMV07CiAgICBlaS5wcm90b3R5cGUuZGVyaXZlS2V5cyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZS5rZXlzID0gbmV3IEFycmF5KDE2ICogMiksIFpiLmVxdWFsKHIubGVuZ3RoLCB0aGlzLmJsb2NrU2l6ZSwgIkludmFsaWQga2V5IGxlbmd0aCIpOwogICAgICB2YXIgbyA9IE50LnJlYWRVSW50MzJCRShyLCAwKSwgZiA9IE50LnJlYWRVSW50MzJCRShyLCA0KTsKICAgICAgTnQucGMxKG8sIGYsIGUudG1wLCAwKSwgbyA9IGUudG1wWzBdLCBmID0gZS50bXBbMV07CiAgICAgIGZvciAodmFyIHAgPSAwO3AgPCBlLmtleXMubGVuZ3RoOyBwICs9IDIpIHsKICAgICAgICB2YXIgbTIgPSBlOVtwID4+PiAxXTsKICAgICAgICBvID0gTnQucjI4c2hsKG8sIG0yKSwgZiA9IE50LnIyOHNobChmLCBtMiksIE50LnBjMihvLCBmLCBlLmtleXMsIHApOwogICAgICB9CiAgICB9OwogICAgZWkucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIHZhciBwID0gdGhpcy5fZGVzU3RhdGUsIG0yID0gTnQucmVhZFVJbnQzMkJFKGUsIHIpLCB5MiA9IE50LnJlYWRVSW50MzJCRShlLCByICsgNCk7CiAgICAgIE50LmlwKG0yLCB5MiwgcC50bXAsIDApLCBtMiA9IHAudG1wWzBdLCB5MiA9IHAudG1wWzFdLCB0aGlzLnR5cGUgPT09ICJlbmNyeXB0IiA/IHRoaXMuX2VuY3J5cHQocCwgbTIsIHkyLCBwLnRtcCwgMCkgOiB0aGlzLl9kZWNyeXB0KHAsIG0yLCB5MiwgcC50bXAsIDApLCBtMiA9IHAudG1wWzBdLCB5MiA9IHAudG1wWzFdLCBOdC53cml0ZVVJbnQzMkJFKG8sIG0yLCBmKSwgTnQud3JpdGVVSW50MzJCRShvLCB5MiwgZiArIDQpOwogICAgfTsKICAgIGVpLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24oZSwgcikgewogICAgICBmb3IgKHZhciBvID0gZS5sZW5ndGggLSByLCBmID0gcjtmIDwgZS5sZW5ndGg7IGYrKykKICAgICAgICBlW2ZdID0gbzsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgZWkucHJvdG90eXBlLl91bnBhZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZm9yICh2YXIgciA9IGVbZS5sZW5ndGggLSAxXSwgbyA9IGUubGVuZ3RoIC0gcjtvIDwgZS5sZW5ndGg7IG8rKykKICAgICAgICBaYi5lcXVhbChlW29dLCByKTsKICAgICAgcmV0dXJuIGUuc2xpY2UoMCwgZS5sZW5ndGggLSByKTsKICAgIH07CiAgICBlaS5wcm90b3R5cGUuX2VuY3J5cHQgPSBmdW5jdGlvbihlLCByLCBvLCBmLCBwKSB7CiAgICAgIGZvciAodmFyIG0yID0gciwgeTIgPSBvLCBNID0gMDtNIDwgZS5rZXlzLmxlbmd0aDsgTSArPSAyKSB7CiAgICAgICAgdmFyIHggPSBlLmtleXNbTV0sIFMgPSBlLmtleXNbTSArIDFdOwogICAgICAgIE50LmV4cGFuZCh5MiwgZS50bXAsIDApLCB4IF49IGUudG1wWzBdLCBTIF49IGUudG1wWzFdOwogICAgICAgIHZhciBFMiA9IE50LnN1YnN0aXR1dGUoeCwgUyksIEIgPSBOdC5wZXJtdXRlKEUyKSwgcTIgPSB5MjsKICAgICAgICB5MiA9IChtMiBeIEIpID4+PiAwLCBtMiA9IHEyOwogICAgICB9CiAgICAgIE50LnJpcCh5MiwgbTIsIGYsIHApOwogICAgfTsKICAgIGVpLnByb3RvdHlwZS5fZGVjcnlwdCA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYsIHApIHsKICAgICAgZm9yICh2YXIgbTIgPSBvLCB5MiA9IHIsIE0gPSBlLmtleXMubGVuZ3RoIC0gMjtNID49IDA7IE0gLT0gMikgewogICAgICAgIHZhciB4ID0gZS5rZXlzW01dLCBTID0gZS5rZXlzW00gKyAxXTsKICAgICAgICBOdC5leHBhbmQobTIsIGUudG1wLCAwKSwgeCBePSBlLnRtcFswXSwgUyBePSBlLnRtcFsxXTsKICAgICAgICB2YXIgRTIgPSBOdC5zdWJzdGl0dXRlKHgsIFMpLCBCID0gTnQucGVybXV0ZShFMiksIHEyID0gbTI7CiAgICAgICAgbTIgPSAoeTIgXiBCKSA+Pj4gMCwgeTIgPSBxMjsKICAgICAgfQogICAgICBOdC5yaXAobTIsIHkyLCBmLCBwKTsKICAgIH07CiAgfSk7CiAgWWIgPSBUMigoR2IpID0+IHsKICAgIHZhciB0OSA9IGFyKCksIHI5ID0gSWUoKSwgYnMgPSB7fTsKICAgIGZ1bmN0aW9uIGk5KHQpIHsKICAgICAgdDkuZXF1YWwodC5sZW5ndGgsIDgsICJJbnZhbGlkIElWIGxlbmd0aCIpLCB0aGlzLml2ID0gbmV3IEFycmF5KDgpOwogICAgICBmb3IgKHZhciBlID0gMDtlIDwgdGhpcy5pdi5sZW5ndGg7IGUrKykKICAgICAgICB0aGlzLml2W2VdID0gdFtlXTsKICAgIH0KICAgIGZ1bmN0aW9uIG45KHQpIHsKICAgICAgZnVuY3Rpb24gZShwKSB7CiAgICAgICAgdC5jYWxsKHRoaXMsIHApLCB0aGlzLl9jYmNJbml0KCk7CiAgICAgIH0KICAgICAgcjkoZSwgdCk7CiAgICAgIGZvciAodmFyIHIgPSBPYmplY3Qua2V5cyhicyksIG8gPSAwO28gPCByLmxlbmd0aDsgbysrKSB7CiAgICAgICAgdmFyIGYgPSByW29dOwogICAgICAgIGUucHJvdG90eXBlW2ZdID0gYnNbZl07CiAgICAgIH0KICAgICAgcmV0dXJuIGUuY3JlYXRlID0gZnVuY3Rpb24obTIpIHsKICAgICAgICByZXR1cm4gbmV3IGUobTIpOwogICAgICB9LCBlOwogICAgfQogICAgR2IuaW5zdGFudGlhdGUgPSBuOTsKICAgIGJzLl9jYmNJbml0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gbmV3IGk5KHRoaXMub3B0aW9ucy5pdik7CiAgICAgIHRoaXMuX2NiY1N0YXRlID0gZTsKICAgIH07CiAgICBicy5fdXBkYXRlID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICB2YXIgcCA9IHRoaXMuX2NiY1N0YXRlLCBtMiA9IHRoaXMuY29uc3RydWN0b3Iuc3VwZXJfLnByb3RvdHlwZSwgeTIgPSBwLml2OwogICAgICBpZiAodGhpcy50eXBlID09PSAiZW5jcnlwdCIpIHsKICAgICAgICBmb3IgKHZhciBNID0gMDtNIDwgdGhpcy5ibG9ja1NpemU7IE0rKykKICAgICAgICAgIHkyW01dIF49IGVbciArIE1dOwogICAgICAgIG0yLl91cGRhdGUuY2FsbCh0aGlzLCB5MiwgMCwgbywgZik7CiAgICAgICAgZm9yICh2YXIgTSA9IDA7TSA8IHRoaXMuYmxvY2tTaXplOyBNKyspCiAgICAgICAgICB5MltNXSA9IG9bZiArIE1dOwogICAgICB9IGVsc2UgewogICAgICAgIG0yLl91cGRhdGUuY2FsbCh0aGlzLCBlLCByLCBvLCBmKTsKICAgICAgICBmb3IgKHZhciBNID0gMDtNIDwgdGhpcy5ibG9ja1NpemU7IE0rKykKICAgICAgICAgIG9bZiArIE1dIF49IHkyW01dOwogICAgICAgIGZvciAodmFyIE0gPSAwO00gPCB0aGlzLmJsb2NrU2l6ZTsgTSsrKQogICAgICAgICAgeTJbTV0gPSBlW3IgKyBNXTsKICAgICAgfQogICAgfTsKICB9KTsKICBRYiA9IFQyKCh3VCwgSmIpID0+IHsKICAgIHZhciBmOSA9IGFyKCksIGE5ID0gSWUoKSwgWGIgPSB2cygpLCBXaSA9IGt1KCk7CiAgICBmdW5jdGlvbiBvOSh0LCBlKSB7CiAgICAgIGY5LmVxdWFsKGUubGVuZ3RoLCAyNCwgIkludmFsaWQga2V5IGxlbmd0aCIpOwogICAgICB2YXIgciA9IGUuc2xpY2UoMCwgOCksIG8gPSBlLnNsaWNlKDgsIDE2KSwgZiA9IGUuc2xpY2UoMTYsIDI0KTsKICAgICAgdCA9PT0gImVuY3J5cHQiID8gdGhpcy5jaXBoZXJzID0gW1dpLmNyZWF0ZSh7IHR5cGU6ICJlbmNyeXB0Iiwga2V5OiByIH0pLCBXaS5jcmVhdGUoeyB0eXBlOiAiZGVjcnlwdCIsIGtleTogbyB9KSwgV2kuY3JlYXRlKHsgdHlwZTogImVuY3J5cHQiLCBrZXk6IGYgfSldIDogdGhpcy5jaXBoZXJzID0gW1dpLmNyZWF0ZSh7IHR5cGU6ICJkZWNyeXB0Iiwga2V5OiBmIH0pLCBXaS5jcmVhdGUoeyB0eXBlOiAiZW5jcnlwdCIsIGtleTogbyB9KSwgV2kuY3JlYXRlKHsgdHlwZTogImRlY3J5cHQiLCBrZXk6IHIgfSldOwogICAgfQogICAgZnVuY3Rpb24gQW4odCkgewogICAgICBYYi5jYWxsKHRoaXMsIHQpOwogICAgICB2YXIgZSA9IG5ldyBvOSh0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5rZXkpOwogICAgICB0aGlzLl9lZGVTdGF0ZSA9IGU7CiAgICB9CiAgICBhOShBbiwgWGIpOwogICAgSmIuZXhwb3J0cyA9IEFuOwogICAgQW4uY3JlYXRlID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gbmV3IEFuKGUpOwogICAgfTsKICAgIEFuLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICB2YXIgcCA9IHRoaXMuX2VkZVN0YXRlOwogICAgICBwLmNpcGhlcnNbMF0uX3VwZGF0ZShlLCByLCBvLCBmKSwgcC5jaXBoZXJzWzFdLl91cGRhdGUobywgZiwgbywgZiksIHAuY2lwaGVyc1syXS5fdXBkYXRlKG8sIGYsIG8sIGYpOwogICAgfTsKICAgIEFuLnByb3RvdHlwZS5fcGFkID0gV2kucHJvdG90eXBlLl9wYWQ7CiAgICBBbi5wcm90b3R5cGUuX3VucGFkID0gV2kucHJvdG90eXBlLl91bnBhZDsKICB9KTsKICBlbSA9IFQyKChnZikgPT4gewogICAgZ2YudXRpbHMgPSBUdSgpOwogICAgZ2YuQ2lwaGVyID0gdnMoKTsKICAgIGdmLkRFUyA9IGt1KCk7CiAgICBnZi5DQkMgPSBZYigpOwogICAgZ2YuRURFID0gUWIoKTsKICB9KTsKICBpbSA9IFQyKChfVCwgcm0pID0+IHsKICAgIHZhciB0bSA9IHlpKCksIHdpID0gZW0oKSwgczkgPSBJZSgpLCBSbiA9IFRlKCkuQnVmZmVyLCBTYSA9IHsgImRlcy1lZGUzLWNiYyI6IHdpLkNCQy5pbnN0YW50aWF0ZSh3aS5FREUpLCAiZGVzLWVkZTMiOiB3aS5FREUsICJkZXMtZWRlLWNiYyI6IHdpLkNCQy5pbnN0YW50aWF0ZSh3aS5FREUpLCAiZGVzLWVkZSI6IHdpLkVERSwgImRlcy1jYmMiOiB3aS5DQkMuaW5zdGFudGlhdGUod2kuREVTKSwgImRlcy1lY2IiOiB3aS5ERVMgfTsKICAgIFNhLmRlcyA9IFNhWyJkZXMtY2JjIl07CiAgICBTYS5kZXMzID0gU2FbImRlcy1lZGUzLWNiYyJdOwogICAgcm0uZXhwb3J0cyA9IG1zOwogICAgczkobXMsIHRtKTsKICAgIGZ1bmN0aW9uIG1zKHQpIHsKICAgICAgdG0uY2FsbCh0aGlzKTsKICAgICAgdmFyIGUgPSB0Lm1vZGUudG9Mb3dlckNhc2UoKSwgciA9IFNhW2VdLCBvOwogICAgICB0LmRlY3J5cHQgPyBvID0gImRlY3J5cHQiIDogbyA9ICJlbmNyeXB0IjsKICAgICAgdmFyIGYgPSB0LmtleTsKICAgICAgUm4uaXNCdWZmZXIoZikgfHwgKGYgPSBSbi5mcm9tKGYpKSwgKGUgPT09ICJkZXMtZWRlIiB8fCBlID09PSAiZGVzLWVkZS1jYmMiKSAmJiAoZiA9IFJuLmNvbmNhdChbZiwgZi5zbGljZSgwLCA4KV0pKTsKICAgICAgdmFyIHAgPSB0Lml2OwogICAgICBSbi5pc0J1ZmZlcihwKSB8fCAocCA9IFJuLmZyb20ocCkpLCB0aGlzLl9kZXMgPSByLmNyZWF0ZSh7IGtleTogZiwgaXY6IHAsIHR5cGU6IG8gfSk7CiAgICB9CiAgICBtcy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIFJuLmZyb20odGhpcy5fZGVzLnVwZGF0ZSh0KSk7CiAgICB9OwogICAgbXMucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gUm4uZnJvbSh0aGlzLl9kZXMuZmluYWwoKSk7CiAgICB9OwogIH0pOwogIG5tID0gVDIoKEx1KSA9PiB7CiAgICBMdS5lbmNyeXB0ID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gdC5fY2lwaGVyLmVuY3J5cHRCbG9jayhlKTsKICAgIH07CiAgICBMdS5kZWNyeXB0ID0gZnVuY3Rpb24odCwgZSkgewogICAgICByZXR1cm4gdC5fY2lwaGVyLmRlY3J5cHRCbG9jayhlKTsKICAgIH07CiAgfSk7CiAgeWYgPSBUMigoU1QsIGZtKSA9PiB7CiAgICBmbS5leHBvcnRzID0gZnVuY3Rpb24oZSwgcikgewogICAgICBmb3IgKHZhciBvID0gTWF0aC5taW4oZS5sZW5ndGgsIHIubGVuZ3RoKSwgZiA9IG5ldyBCdWZmZXIobyksIHAgPSAwO3AgPCBvOyArK3ApCiAgICAgICAgZltwXSA9IGVbcF0gXiByW3BdOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgfSk7CiAgb20gPSBUMigoTnUpID0+IHsKICAgIHZhciBhbSA9IHlmKCk7CiAgICBOdS5lbmNyeXB0ID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IGFtKGUsIHQuX3ByZXYpOwogICAgICByZXR1cm4gdC5fcHJldiA9IHQuX2NpcGhlci5lbmNyeXB0QmxvY2sociksIHQuX3ByZXY7CiAgICB9OwogICAgTnUuZGVjcnlwdCA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgdmFyIHIgPSB0Ll9wcmV2OwogICAgICB0Ll9wcmV2ID0gZTsKICAgICAgdmFyIG8gPSB0Ll9jaXBoZXIuZGVjcnlwdEJsb2NrKGUpOwogICAgICByZXR1cm4gYW0obywgcik7CiAgICB9OwogIH0pOwogIHVtID0gVDIoKGhtKSA9PiB7CiAgICB2YXIgRWEgPSBUZSgpLkJ1ZmZlciwgaDkgPSB5ZigpOwogICAgZnVuY3Rpb24gc20odCwgZSwgcikgewogICAgICB2YXIgbyA9IGUubGVuZ3RoLCBmID0gaDkoZSwgdC5fY2FjaGUpOwogICAgICByZXR1cm4gdC5fY2FjaGUgPSB0Ll9jYWNoZS5zbGljZShvKSwgdC5fcHJldiA9IEVhLmNvbmNhdChbdC5fcHJldiwgciA/IGUgOiBmXSksIGY7CiAgICB9CiAgICBobS5lbmNyeXB0ID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICBmb3IgKHZhciBvID0gRWEuYWxsb2NVbnNhZmUoMCksIGY7ZS5sZW5ndGg7ICkKICAgICAgICBpZiAodC5fY2FjaGUubGVuZ3RoID09PSAwICYmICh0Ll9jYWNoZSA9IHQuX2NpcGhlci5lbmNyeXB0QmxvY2sodC5fcHJldiksIHQuX3ByZXYgPSBFYS5hbGxvY1Vuc2FmZSgwKSksIHQuX2NhY2hlLmxlbmd0aCA8PSBlLmxlbmd0aCkKICAgICAgICAgIGYgPSB0Ll9jYWNoZS5sZW5ndGgsIG8gPSBFYS5jb25jYXQoW28sIHNtKHQsIGUuc2xpY2UoMCwgZiksIHIpXSksIGUgPSBlLnNsaWNlKGYpOwogICAgICAgIGVsc2UgewogICAgICAgICAgbyA9IEVhLmNvbmNhdChbbywgc20odCwgZSwgcildKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcmV0dXJuIG87CiAgICB9OwogIH0pOwogIGRtID0gVDIoKGxtKSA9PiB7CiAgICB2YXIgRHUgPSBUZSgpLkJ1ZmZlcjsKICAgIGZ1bmN0aW9uIHU5KHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrKHQuX3ByZXYpLCBmID0gb1swXSBeIGU7CiAgICAgIHJldHVybiB0Ll9wcmV2ID0gRHUuY29uY2F0KFt0Ll9wcmV2LnNsaWNlKDEpLCBEdS5mcm9tKFtyID8gZSA6IGZdKV0pLCBmOwogICAgfQogICAgbG0uZW5jcnlwdCA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IGUubGVuZ3RoLCBmID0gRHUuYWxsb2NVbnNhZmUobyksIHAgPSAtMTsrK3AgPCBvOyApCiAgICAgICAgZltwXSA9IHU5KHQsIGVbcF0sIHIpOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgfSk7CiAgcG0gPSBUMigoY20pID0+IHsKICAgIHZhciBncyA9IFRlKCkuQnVmZmVyOwogICAgZnVuY3Rpb24gbDkodCwgZSwgcikgewogICAgICBmb3IgKHZhciBvLCBmID0gLTEsIHAgPSA4LCBtMiA9IDAsIHkyLCBNOysrZiA8IHA7ICkKICAgICAgICBvID0gdC5fY2lwaGVyLmVuY3J5cHRCbG9jayh0Ll9wcmV2KSwgeTIgPSBlICYgMSA8PCA3IC0gZiA/IDEyOCA6IDAsIE0gPSBvWzBdIF4geTIsIG0yICs9IChNICYgMTI4KSA+PiBmICUgOCwgdC5fcHJldiA9IGQ5KHQuX3ByZXYsIHIgPyB5MiA6IE0pOwogICAgICByZXR1cm4gbTI7CiAgICB9CiAgICBmdW5jdGlvbiBkOSh0LCBlKSB7CiAgICAgIHZhciByID0gdC5sZW5ndGgsIG8gPSAtMSwgZiA9IGdzLmFsbG9jVW5zYWZlKHQubGVuZ3RoKTsKICAgICAgZm9yICh0ID0gZ3MuY29uY2F0KFt0LCBncy5mcm9tKFtlXSldKTsrK28gPCByOyApCiAgICAgICAgZltvXSA9IHRbb10gPDwgMSB8IHRbbyArIDFdID4+IDc7CiAgICAgIHJldHVybiBmOwogICAgfQogICAgY20uZW5jcnlwdCA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IGUubGVuZ3RoLCBmID0gZ3MuYWxsb2NVbnNhZmUobyksIHAgPSAtMTsrK3AgPCBvOyApCiAgICAgICAgZltwXSA9IGw5KHQsIGVbcF0sIHIpOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgfSk7CiAgYm0gPSBUMigodm0pID0+IHsKICAgIHZhciBjOSA9IHlmKCk7CiAgICBmdW5jdGlvbiBwOSh0KSB7CiAgICAgIHJldHVybiB0Ll9wcmV2ID0gdC5fY2lwaGVyLmVuY3J5cHRCbG9jayh0Ll9wcmV2KSwgdC5fcHJldjsKICAgIH0KICAgIHZtLmVuY3J5cHQgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGZvciAoO3QuX2NhY2hlLmxlbmd0aCA8IGUubGVuZ3RoOyApCiAgICAgICAgdC5fY2FjaGUgPSBCdWZmZXIuY29uY2F0KFt0Ll9jYWNoZSwgcDkodCldKTsKICAgICAgdmFyIHIgPSB0Ll9jYWNoZS5zbGljZSgwLCBlLmxlbmd0aCk7CiAgICAgIHJldHVybiB0Ll9jYWNoZSA9IHQuX2NhY2hlLnNsaWNlKGUubGVuZ3RoKSwgYzkoZSwgcik7CiAgICB9OwogIH0pOwogIFB1ID0gVDIoKElULCBtbSkgPT4gewogICAgZnVuY3Rpb24gdjkodCkgewogICAgICBmb3IgKHZhciBlID0gdC5sZW5ndGgsIHI7ZS0tOyApCiAgICAgICAgaWYgKHIgPSB0LnJlYWRVSW50OChlKSwgciA9PT0gMjU1KQogICAgICAgICAgdC53cml0ZVVJbnQ4KDAsIGUpOwogICAgICAgIGVsc2UgewogICAgICAgICAgcisrLCB0LndyaXRlVUludDgociwgZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBtbS5leHBvcnRzID0gdjk7CiAgfSk7CiAgT3UgPSBUMigoeW0pID0+IHsKICAgIHZhciBiOSA9IHlmKCksIGdtID0gVGUoKS5CdWZmZXIsIG05ID0gUHUoKTsKICAgIGZ1bmN0aW9uIGc5KHQpIHsKICAgICAgdmFyIGUgPSB0Ll9jaXBoZXIuZW5jcnlwdEJsb2NrUmF3KHQuX3ByZXYpOwogICAgICByZXR1cm4gbTkodC5fcHJldiksIGU7CiAgICB9CiAgICB2YXIgQ3UgPSAxNjsKICAgIHltLmVuY3J5cHQgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHZhciByID0gTWF0aC5jZWlsKGUubGVuZ3RoIC8gQ3UpLCBvID0gdC5fY2FjaGUubGVuZ3RoOwogICAgICB0Ll9jYWNoZSA9IGdtLmNvbmNhdChbdC5fY2FjaGUsIGdtLmFsbG9jVW5zYWZlKHIgKiBDdSldKTsKICAgICAgZm9yICh2YXIgZiA9IDA7ZiA8IHI7IGYrKykgewogICAgICAgIHZhciBwID0gZzkodCksIG0yID0gbyArIGYgKiBDdTsKICAgICAgICB0Ll9jYWNoZS53cml0ZVVJbnQzMkJFKHBbMF0sIG0yICsgMCksIHQuX2NhY2hlLndyaXRlVUludDMyQkUocFsxXSwgbTIgKyA0KSwgdC5fY2FjaGUud3JpdGVVSW50MzJCRShwWzJdLCBtMiArIDgpLCB0Ll9jYWNoZS53cml0ZVVJbnQzMkJFKHBbM10sIG0yICsgMTIpOwogICAgICB9CiAgICAgIHZhciB5MiA9IHQuX2NhY2hlLnNsaWNlKDAsIGUubGVuZ3RoKTsKICAgICAgcmV0dXJuIHQuX2NhY2hlID0gdC5fY2FjaGUuc2xpY2UoZS5sZW5ndGgpLCBiOShlLCB5Mik7CiAgICB9OwogIH0pOwogIEZ1ID0gVDIoKGtULCB5OSkgPT4gewogICAgeTkuZXhwb3J0cyA9IHsgImFlcy0xMjgtZWNiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDAsIG1vZGU6ICJFQ0IiLCB0eXBlOiAiYmxvY2siIH0sICJhZXMtMTkyLWVjYiI6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAxOTIsIGl2OiAwLCBtb2RlOiAiRUNCIiwgdHlwZTogImJsb2NrIiB9LCAiYWVzLTI1Ni1lY2IiOiB7IGNpcGhlcjogIkFFUyIsIGtleTogMjU2LCBpdjogMCwgbW9kZTogIkVDQiIsIHR5cGU6ICJibG9jayIgfSwgImFlcy0xMjgtY2JjIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDE2LCBtb2RlOiAiQ0JDIiwgdHlwZTogImJsb2NrIiB9LCAiYWVzLTE5Mi1jYmMiOiB7IGNpcGhlcjogIkFFUyIsIGtleTogMTkyLCBpdjogMTYsIG1vZGU6ICJDQkMiLCB0eXBlOiAiYmxvY2siIH0sICJhZXMtMjU2LWNiYyI6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAyNTYsIGl2OiAxNiwgbW9kZTogIkNCQyIsIHR5cGU6ICJibG9jayIgfSwgYWVzMTI4OiB7IGNpcGhlcjogIkFFUyIsIGtleTogMTI4LCBpdjogMTYsIG1vZGU6ICJDQkMiLCB0eXBlOiAiYmxvY2siIH0sIGFlczE5MjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiQ0JDIiwgdHlwZTogImJsb2NrIiB9LCBhZXMyNTY6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAyNTYsIGl2OiAxNiwgbW9kZTogIkNCQyIsIHR5cGU6ICJibG9jayIgfSwgImFlcy0xMjgtY2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDE2LCBtb2RlOiAiQ0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xOTItY2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiQ0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0yNTYtY2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDI1NiwgaXY6IDE2LCBtb2RlOiAiQ0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xMjgtY2ZiOCI6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAxMjgsIGl2OiAxNiwgbW9kZTogIkNGQjgiLCB0eXBlOiAic3RyZWFtIiB9LCAiYWVzLTE5Mi1jZmI4IjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiQ0ZCOCIsIHR5cGU6ICJzdHJlYW0iIH0sICJhZXMtMjU2LWNmYjgiOiB7IGNpcGhlcjogIkFFUyIsIGtleTogMjU2LCBpdjogMTYsIG1vZGU6ICJDRkI4IiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xMjgtY2ZiMSI6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAxMjgsIGl2OiAxNiwgbW9kZTogIkNGQjEiLCB0eXBlOiAic3RyZWFtIiB9LCAiYWVzLTE5Mi1jZmIxIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiQ0ZCMSIsIHR5cGU6ICJzdHJlYW0iIH0sICJhZXMtMjU2LWNmYjEiOiB7IGNpcGhlcjogIkFFUyIsIGtleTogMjU2LCBpdjogMTYsIG1vZGU6ICJDRkIxIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xMjgtb2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDE2LCBtb2RlOiAiT0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xOTItb2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiT0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0yNTYtb2ZiIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDI1NiwgaXY6IDE2LCBtb2RlOiAiT0ZCIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xMjgtY3RyIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDE2LCBtb2RlOiAiQ1RSIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xOTItY3RyIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDE5MiwgaXY6IDE2LCBtb2RlOiAiQ1RSIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0yNTYtY3RyIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDI1NiwgaXY6IDE2LCBtb2RlOiAiQ1RSIiwgdHlwZTogInN0cmVhbSIgfSwgImFlcy0xMjgtZ2NtIjogeyBjaXBoZXI6ICJBRVMiLCBrZXk6IDEyOCwgaXY6IDEyLCBtb2RlOiAiR0NNIiwgdHlwZTogImF1dGgiIH0sICJhZXMtMTkyLWdjbSI6IHsgY2lwaGVyOiAiQUVTIiwga2V5OiAxOTIsIGl2OiAxMiwgbW9kZTogIkdDTSIsIHR5cGU6ICJhdXRoIiB9LCAiYWVzLTI1Ni1nY20iOiB7IGNpcGhlcjogIkFFUyIsIGtleTogMjU2LCBpdjogMTIsIG1vZGU6ICJHQ00iLCB0eXBlOiAiYXV0aCIgfSB9OwogIH0pOwogIHdzID0gVDIoKExULCB3bSkgPT4gewogICAgdmFyIHc5ID0geyBFQ0I6IG5tKCksIENCQzogb20oKSwgQ0ZCOiB1bSgpLCBDRkI4OiBkbSgpLCBDRkIxOiBwbSgpLCBPRkI6IGJtKCksIENUUjogT3UoKSwgR0NNOiBPdSgpIH0sIHlzID0gRnUoKTsKICAgIGZvciAoVXUgaW4geXMpCiAgICAgIHlzW1V1XS5tb2R1bGUgPSB3OVt5c1tVdV0ubW9kZV07CiAgICB2YXIgVXU7CiAgICB3bS5leHBvcnRzID0geXM7CiAgfSk7CiAgQWEgPSBUMigoTlQsIF9tKSA9PiB7CiAgICB2YXIgTXMgPSBUZSgpLkJ1ZmZlcjsKICAgIGZ1bmN0aW9uIEh1KHQpIHsKICAgICAgTXMuaXNCdWZmZXIodCkgfHwgKHQgPSBNcy5mcm9tKHQpKTsKICAgICAgZm9yICh2YXIgZSA9IHQubGVuZ3RoIC8gNCB8IDAsIHIgPSBuZXcgQXJyYXkoZSksIG8gPSAwO28gPCBlOyBvKyspCiAgICAgICAgcltvXSA9IHQucmVhZFVJbnQzMkJFKG8gKiA0KTsKICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBmdW5jdGlvbiB6dSh0KSB7CiAgICAgIGZvciAodmFyIGUgPSAwO2UgPCB0Lmxlbmd0aDsgdCsrKQogICAgICAgIHRbZV0gPSAwOwogICAgfQogICAgZnVuY3Rpb24gTW0odCwgZSwgciwgbywgZikgewogICAgICBmb3IgKHZhciBwID0gclswXSwgbTIgPSByWzFdLCB5MiA9IHJbMl0sIE0gPSByWzNdLCB4ID0gdFswXSBeIGVbMF0sIFMgPSB0WzFdIF4gZVsxXSwgRTIgPSB0WzJdIF4gZVsyXSwgQiA9IHRbM10gXiBlWzNdLCBxMiwgTDIsIGdlLCBfZSwgTiA9IDQsIHdlID0gMTt3ZSA8IGY7IHdlKyspCiAgICAgICAgcTIgPSBwW3ggPj4+IDI0XSBeIG0yW1MgPj4+IDE2ICYgMjU1XSBeIHkyW0UyID4+PiA4ICYgMjU1XSBeIE1bQiAmIDI1NV0gXiBlW04rK10sIEwyID0gcFtTID4+PiAyNF0gXiBtMltFMiA+Pj4gMTYgJiAyNTVdIF4geTJbQiA+Pj4gOCAmIDI1NV0gXiBNW3ggJiAyNTVdIF4gZVtOKytdLCBnZSA9IHBbRTIgPj4+IDI0XSBeIG0yW0IgPj4+IDE2ICYgMjU1XSBeIHkyW3ggPj4+IDggJiAyNTVdIF4gTVtTICYgMjU1XSBeIGVbTisrXSwgX2UgPSBwW0IgPj4+IDI0XSBeIG0yW3ggPj4+IDE2ICYgMjU1XSBeIHkyW1MgPj4+IDggJiAyNTVdIF4gTVtFMiAmIDI1NV0gXiBlW04rK10sIHggPSBxMiwgUyA9IEwyLCBFMiA9IGdlLCBCID0gX2U7CiAgICAgIHJldHVybiBxMiA9IChvW3ggPj4+IDI0XSA8PCAyNCB8IG9bUyA+Pj4gMTYgJiAyNTVdIDw8IDE2IHwgb1tFMiA+Pj4gOCAmIDI1NV0gPDwgOCB8IG9bQiAmIDI1NV0pIF4gZVtOKytdLCBMMiA9IChvW1MgPj4+IDI0XSA8PCAyNCB8IG9bRTIgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IG9bQiA+Pj4gOCAmIDI1NV0gPDwgOCB8IG9beCAmIDI1NV0pIF4gZVtOKytdLCBnZSA9IChvW0UyID4+PiAyNF0gPDwgMjQgfCBvW0IgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IG9beCA+Pj4gOCAmIDI1NV0gPDwgOCB8IG9bUyAmIDI1NV0pIF4gZVtOKytdLCBfZSA9IChvW0IgPj4+IDI0XSA8PCAyNCB8IG9beCA+Pj4gMTYgJiAyNTVdIDw8IDE2IHwgb1tTID4+PiA4ICYgMjU1XSA8PCA4IHwgb1tFMiAmIDI1NV0pIF4gZVtOKytdLCBxMiA9IHEyID4+PiAwLCBMMiA9IEwyID4+PiAwLCBnZSA9IGdlID4+PiAwLCBfZSA9IF9lID4+PiAwLCBbcTIsIEwyLCBnZSwgX2VdOwogICAgfQogICAgdmFyIE05ID0gWzAsIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQsIDEyOCwgMjcsIDU0XSwga3QgPSBmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgdCA9IG5ldyBBcnJheSgyNTYpLCBlID0gMDtlIDwgMjU2OyBlKyspCiAgICAgICAgZSA8IDEyOCA/IHRbZV0gPSBlIDw8IDEgOiB0W2VdID0gZSA8PCAxIF4gMjgzOwogICAgICBmb3IgKHZhciByID0gW10sIG8gPSBbXSwgZiA9IFtbXSwgW10sIFtdLCBbXV0sIHAgPSBbW10sIFtdLCBbXSwgW11dLCBtMiA9IDAsIHkyID0gMCwgTSA9IDA7TSA8IDI1NjsgKytNKSB7CiAgICAgICAgdmFyIHggPSB5MiBeIHkyIDw8IDEgXiB5MiA8PCAyIF4geTIgPDwgMyBeIHkyIDw8IDQ7CiAgICAgICAgeCA9IHggPj4+IDggXiB4ICYgMjU1IF4gOTksIHJbbTJdID0geCwgb1t4XSA9IG0yOwogICAgICAgIHZhciBTID0gdFttMl0sIEUyID0gdFtTXSwgQiA9IHRbRTJdLCBxMiA9IHRbeF0gKiAyNTcgXiB4ICogMTY4NDMwMDg7CiAgICAgICAgZlswXVttMl0gPSBxMiA8PCAyNCB8IHEyID4+PiA4LCBmWzFdW20yXSA9IHEyIDw8IDE2IHwgcTIgPj4+IDE2LCBmWzJdW20yXSA9IHEyIDw8IDggfCBxMiA+Pj4gMjQsIGZbM11bbTJdID0gcTIsIHEyID0gQiAqIDE2ODQzMDA5IF4gRTIgKiA2NTUzNyBeIFMgKiAyNTcgXiBtMiAqIDE2ODQzMDA4LCBwWzBdW3hdID0gcTIgPDwgMjQgfCBxMiA+Pj4gOCwgcFsxXVt4XSA9IHEyIDw8IDE2IHwgcTIgPj4+IDE2LCBwWzJdW3hdID0gcTIgPDwgOCB8IHEyID4+PiAyNCwgcFszXVt4XSA9IHEyLCBtMiA9PT0gMCA/IG0yID0geTIgPSAxIDogKG0yID0gUyBeIHRbdFt0W0IgXiBTXV1dLCB5MiBePSB0W3RbeTJdXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgU0JPWDogciwgSU5WX1NCT1g6IG8sIFNVQl9NSVg6IGYsIElOVl9TVUJfTUlYOiBwIH07CiAgICB9KCk7CiAgICBmdW5jdGlvbiBncih0KSB7CiAgICAgIHRoaXMuX2tleSA9IEh1KHQpLCB0aGlzLl9yZXNldCgpOwogICAgfQogICAgZ3IuYmxvY2tTaXplID0gNCAqIDQ7CiAgICBnci5rZXlTaXplID0gMjU2IC8gODsKICAgIGdyLnByb3RvdHlwZS5ibG9ja1NpemUgPSBnci5ibG9ja1NpemU7CiAgICBnci5wcm90b3R5cGUua2V5U2l6ZSA9IGdyLmtleVNpemU7CiAgICBnci5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9rZXksIGUgPSB0Lmxlbmd0aCwgciA9IGUgKyA2LCBvID0gKHIgKyAxKSAqIDQsIGYgPSBbXSwgcCA9IDA7cCA8IGU7IHArKykKICAgICAgICBmW3BdID0gdFtwXTsKICAgICAgZm9yIChwID0gZTtwIDwgbzsgcCsrKSB7CiAgICAgICAgdmFyIG0yID0gZltwIC0gMV07CiAgICAgICAgcCAlIGUgPT09IDAgPyAobTIgPSBtMiA8PCA4IHwgbTIgPj4+IDI0LCBtMiA9IGt0LlNCT1hbbTIgPj4+IDI0XSA8PCAyNCB8IGt0LlNCT1hbbTIgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGt0LlNCT1hbbTIgPj4+IDggJiAyNTVdIDw8IDggfCBrdC5TQk9YW20yICYgMjU1XSwgbTIgXj0gTTlbcCAvIGUgfCAwXSA8PCAyNCkgOiBlID4gNiAmJiBwICUgZSA9PT0gNCAmJiAobTIgPSBrdC5TQk9YW20yID4+PiAyNF0gPDwgMjQgfCBrdC5TQk9YW20yID4+PiAxNiAmIDI1NV0gPDwgMTYgfCBrdC5TQk9YW20yID4+PiA4ICYgMjU1XSA8PCA4IHwga3QuU0JPWFttMiAmIDI1NV0pLCBmW3BdID0gZltwIC0gZV0gXiBtMjsKICAgICAgfQogICAgICBmb3IgKHZhciB5MiA9IFtdLCBNID0gMDtNIDwgbzsgTSsrKSB7CiAgICAgICAgdmFyIHggPSBvIC0gTSwgUyA9IGZbeCAtIChNICUgNCA/IDAgOiA0KV07CiAgICAgICAgTSA8IDQgfHwgeCA8PSA0ID8geTJbTV0gPSBTIDogeTJbTV0gPSBrdC5JTlZfU1VCX01JWFswXVtrdC5TQk9YW1MgPj4+IDI0XV0gXiBrdC5JTlZfU1VCX01JWFsxXVtrdC5TQk9YW1MgPj4+IDE2ICYgMjU1XV0gXiBrdC5JTlZfU1VCX01JWFsyXVtrdC5TQk9YW1MgPj4+IDggJiAyNTVdXSBeIGt0LklOVl9TVUJfTUlYWzNdW2t0LlNCT1hbUyAmIDI1NV1dOwogICAgICB9CiAgICAgIHRoaXMuX25Sb3VuZHMgPSByLCB0aGlzLl9rZXlTY2hlZHVsZSA9IGYsIHRoaXMuX2ludktleVNjaGVkdWxlID0geTI7CiAgICB9OwogICAgZ3IucHJvdG90eXBlLmVuY3J5cHRCbG9ja1JhdyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIHQgPSBIdSh0KSwgTW0odCwgdGhpcy5fa2V5U2NoZWR1bGUsIGt0LlNVQl9NSVgsIGt0LlNCT1gsIHRoaXMuX25Sb3VuZHMpOwogICAgfTsKICAgIGdyLnByb3RvdHlwZS5lbmNyeXB0QmxvY2sgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlID0gdGhpcy5lbmNyeXB0QmxvY2tSYXcodCksIHIgPSBNcy5hbGxvY1Vuc2FmZSgxNik7CiAgICAgIHJldHVybiByLndyaXRlVUludDMyQkUoZVswXSwgMCksIHIud3JpdGVVSW50MzJCRShlWzFdLCA0KSwgci53cml0ZVVJbnQzMkJFKGVbMl0sIDgpLCByLndyaXRlVUludDMyQkUoZVszXSwgMTIpLCByOwogICAgfTsKICAgIGdyLnByb3RvdHlwZS5kZWNyeXB0QmxvY2sgPSBmdW5jdGlvbih0KSB7CiAgICAgIHQgPSBIdSh0KTsKICAgICAgdmFyIGUgPSB0WzFdOwogICAgICB0WzFdID0gdFszXSwgdFszXSA9IGU7CiAgICAgIHZhciByID0gTW0odCwgdGhpcy5faW52S2V5U2NoZWR1bGUsIGt0LklOVl9TVUJfTUlYLCBrdC5JTlZfU0JPWCwgdGhpcy5fblJvdW5kcyksIG8gPSBNcy5hbGxvY1Vuc2FmZSgxNik7CiAgICAgIHJldHVybiBvLndyaXRlVUludDMyQkUoclswXSwgMCksIG8ud3JpdGVVSW50MzJCRShyWzNdLCA0KSwgby53cml0ZVVJbnQzMkJFKHJbMl0sIDgpLCBvLndyaXRlVUludDMyQkUoclsxXSwgMTIpLCBvOwogICAgfTsKICAgIGdyLnByb3RvdHlwZS5zY3J1YiA9IGZ1bmN0aW9uKCkgewogICAgICB6dSh0aGlzLl9rZXlTY2hlZHVsZSksIHp1KHRoaXMuX2ludktleVNjaGVkdWxlKSwgenUodGhpcy5fa2V5KTsKICAgIH07CiAgICBfbS5leHBvcnRzLkFFUyA9IGdyOwogIH0pOwogIEVtID0gVDIoKERULCBTbSkgPT4gewogICAgdmFyIHdmID0gVGUoKS5CdWZmZXIsIF85ID0gd2YuYWxsb2MoMTYsIDApOwogICAgZnVuY3Rpb24geDkodCkgewogICAgICByZXR1cm4gW3QucmVhZFVJbnQzMkJFKDApLCB0LnJlYWRVSW50MzJCRSg0KSwgdC5yZWFkVUludDMyQkUoOCksIHQucmVhZFVJbnQzMkJFKDEyKV07CiAgICB9CiAgICBmdW5jdGlvbiB4bSh0KSB7CiAgICAgIHZhciBlID0gd2YuYWxsb2NVbnNhZmUoMTYpOwogICAgICByZXR1cm4gZS53cml0ZVVJbnQzMkJFKHRbMF0gPj4+IDAsIDApLCBlLndyaXRlVUludDMyQkUodFsxXSA+Pj4gMCwgNCksIGUud3JpdGVVSW50MzJCRSh0WzJdID4+PiAwLCA4KSwgZS53cml0ZVVJbnQzMkJFKHRbM10gPj4+IDAsIDEyKSwgZTsKICAgIH0KICAgIGZ1bmN0aW9uIFJhKHQpIHsKICAgICAgdGhpcy5oID0gdCwgdGhpcy5zdGF0ZSA9IHdmLmFsbG9jKDE2LCAwKSwgdGhpcy5jYWNoZSA9IHdmLmFsbG9jVW5zYWZlKDApOwogICAgfQogICAgUmEucHJvdG90eXBlLmdoYXNoID0gZnVuY3Rpb24odCkgewogICAgICBmb3IgKHZhciBlID0gLTE7KytlIDwgdC5sZW5ndGg7ICkKICAgICAgICB0aGlzLnN0YXRlW2VdIF49IHRbZV07CiAgICAgIHRoaXMuX211bHRpcGx5KCk7CiAgICB9OwogICAgUmEucHJvdG90eXBlLl9tdWx0aXBseSA9IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciB0ID0geDkodGhpcy5oKSwgZSA9IFswLCAwLCAwLCAwXSwgciwgbywgZiwgcCA9IC0xOysrcCA8IDEyODsgKSB7CiAgICAgICAgZm9yIChvID0gKHRoaXMuc3RhdGVbfn4ocCAvIDgpXSAmIDEgPDwgNyAtIHAgJSA4KSAhPT0gMCwgbyAmJiAoZVswXSBePSB0WzBdLCBlWzFdIF49IHRbMV0sIGVbMl0gXj0gdFsyXSwgZVszXSBePSB0WzNdKSwgZiA9ICh0WzNdICYgMSkgIT09IDAsIHIgPSAzO3IgPiAwOyByLS0pCiAgICAgICAgICB0W3JdID0gdFtyXSA+Pj4gMSB8ICh0W3IgLSAxXSAmIDEpIDw8IDMxOwogICAgICAgIHRbMF0gPSB0WzBdID4+PiAxLCBmICYmICh0WzBdID0gdFswXSBeIDIyNSA8PCAyNCk7CiAgICAgIH0KICAgICAgdGhpcy5zdGF0ZSA9IHhtKGUpOwogICAgfTsKICAgIFJhLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHRoaXMuY2FjaGUgPSB3Zi5jb25jYXQoW3RoaXMuY2FjaGUsIHRdKTsKICAgICAgZm9yICh2YXIgZTt0aGlzLmNhY2hlLmxlbmd0aCA+PSAxNjsgKQogICAgICAgIGUgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KSwgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpLCB0aGlzLmdoYXNoKGUpOwogICAgfTsKICAgIFJhLnByb3RvdHlwZS5maW5hbCA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RoICYmIHRoaXMuZ2hhc2god2YuY29uY2F0KFt0aGlzLmNhY2hlLCBfOV0sIDE2KSksIHRoaXMuZ2hhc2goeG0oWzAsIHQsIDAsIGVdKSksIHRoaXMuc3RhdGU7CiAgICB9OwogICAgU20uZXhwb3J0cyA9IFJhOwogIH0pOwogIFd1ID0gVDIoKFBULCBCbSkgPT4gewogICAgdmFyIFM5ID0gQWEoKSwgcnIgPSBUZSgpLkJ1ZmZlciwgQW0gPSB5aSgpLCBFOSA9IEllKCksIFJtID0gRW0oKSwgQTkgPSB5ZigpLCBSOSA9IFB1KCk7CiAgICBmdW5jdGlvbiBCOSh0LCBlKSB7CiAgICAgIHZhciByID0gMDsKICAgICAgdC5sZW5ndGggIT09IGUubGVuZ3RoICYmIHIrKzsKICAgICAgZm9yICh2YXIgbyA9IE1hdGgubWluKHQubGVuZ3RoLCBlLmxlbmd0aCksIGYgPSAwO2YgPCBvOyArK2YpCiAgICAgICAgciArPSB0W2ZdIF4gZVtmXTsKICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBmdW5jdGlvbiBxOSh0LCBlLCByKSB7CiAgICAgIGlmIChlLmxlbmd0aCA9PT0gMTIpCiAgICAgICAgcmV0dXJuIHQuX2ZpbklEID0gcnIuY29uY2F0KFtlLCByci5mcm9tKFswLCAwLCAwLCAxXSldKSwgcnIuY29uY2F0KFtlLCByci5mcm9tKFswLCAwLCAwLCAyXSldKTsKICAgICAgdmFyIG8gPSBuZXcgUm0ociksIGYgPSBlLmxlbmd0aCwgcCA9IGYgJSAxNjsKICAgICAgby51cGRhdGUoZSksIHAgJiYgKHAgPSAxNiAtIHAsIG8udXBkYXRlKHJyLmFsbG9jKHAsIDApKSksIG8udXBkYXRlKHJyLmFsbG9jKDgsIDApKTsKICAgICAgdmFyIG0yID0gZiAqIDgsIHkyID0gcnIuYWxsb2MoOCk7CiAgICAgIHkyLndyaXRlVUludEJFKG0yLCAwLCA4KSwgby51cGRhdGUoeTIpLCB0Ll9maW5JRCA9IG8uc3RhdGU7CiAgICAgIHZhciBNID0gcnIuZnJvbSh0Ll9maW5JRCk7CiAgICAgIHJldHVybiBSOShNKSwgTTsKICAgIH0KICAgIGZ1bmN0aW9uIEJuKHQsIGUsIHIsIG8pIHsKICAgICAgQW0uY2FsbCh0aGlzKTsKICAgICAgdmFyIGYgPSByci5hbGxvYyg0LCAwKTsKICAgICAgdGhpcy5fY2lwaGVyID0gbmV3IFM5LkFFUyhlKTsKICAgICAgdmFyIHAgPSB0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKGYpOwogICAgICB0aGlzLl9naGFzaCA9IG5ldyBSbShwKSwgciA9IHE5KHRoaXMsIHIsIHApLCB0aGlzLl9wcmV2ID0gcnIuZnJvbShyKSwgdGhpcy5fY2FjaGUgPSByci5hbGxvY1Vuc2FmZSgwKSwgdGhpcy5fc2VjQ2FjaGUgPSByci5hbGxvY1Vuc2FmZSgwKSwgdGhpcy5fZGVjcnlwdCA9IG8sIHRoaXMuX2FsZW4gPSAwLCB0aGlzLl9sZW4gPSAwLCB0aGlzLl9tb2RlID0gdCwgdGhpcy5fYXV0aFRhZyA9IG51bGwsIHRoaXMuX2NhbGxlZCA9IGZhbHNlOwogICAgfQogICAgRTkoQm4sIEFtKTsKICAgIEJuLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24odCkgewogICAgICBpZiAoIXRoaXMuX2NhbGxlZCAmJiB0aGlzLl9hbGVuKSB7CiAgICAgICAgdmFyIGUgPSAxNiAtIHRoaXMuX2FsZW4gJSAxNjsKICAgICAgICBlIDwgMTYgJiYgKGUgPSByci5hbGxvYyhlLCAwKSwgdGhpcy5fZ2hhc2gudXBkYXRlKGUpKTsKICAgICAgfQogICAgICB0aGlzLl9jYWxsZWQgPSB0cnVlOwogICAgICB2YXIgciA9IHRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLCB0KTsKICAgICAgcmV0dXJuIHRoaXMuX2RlY3J5cHQgPyB0aGlzLl9naGFzaC51cGRhdGUodCkgOiB0aGlzLl9naGFzaC51cGRhdGUociksIHRoaXMuX2xlbiArPSB0Lmxlbmd0aCwgcjsKICAgIH07CiAgICBCbi5wcm90b3R5cGUuX2ZpbmFsID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLl9kZWNyeXB0ICYmICF0aGlzLl9hdXRoVGFnKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhIik7CiAgICAgIHZhciB0ID0gQTkodGhpcy5fZ2hhc2guZmluYWwodGhpcy5fYWxlbiAqIDgsIHRoaXMuX2xlbiAqIDgpLCB0aGlzLl9jaXBoZXIuZW5jcnlwdEJsb2NrKHRoaXMuX2ZpbklEKSk7CiAgICAgIGlmICh0aGlzLl9kZWNyeXB0ICYmIEI5KHQsIHRoaXMuX2F1dGhUYWcpKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhIik7CiAgICAgIHRoaXMuX2F1dGhUYWcgPSB0LCB0aGlzLl9jaXBoZXIuc2NydWIoKTsKICAgIH07CiAgICBCbi5wcm90b3R5cGUuZ2V0QXV0aFRhZyA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5fZGVjcnlwdCB8fCAhcnIuaXNCdWZmZXIodGhpcy5fYXV0aFRhZykpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0aW5nIHRvIGdldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpOwogICAgICByZXR1cm4gdGhpcy5fYXV0aFRhZzsKICAgIH07CiAgICBCbi5wcm90b3R5cGUuc2V0QXV0aFRhZyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCF0aGlzLl9kZWNyeXB0KQogICAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKTsKICAgICAgdGhpcy5fYXV0aFRhZyA9IGU7CiAgICB9OwogICAgQm4ucHJvdG90eXBlLnNldEFBRCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHRoaXMuX2NhbGxlZCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRpbmcgdG8gc2V0IEFBRCBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpOwogICAgICB0aGlzLl9naGFzaC51cGRhdGUoZSksIHRoaXMuX2FsZW4gKz0gZS5sZW5ndGg7CiAgICB9OwogICAgQm0uZXhwb3J0cyA9IEJuOwogIH0pOwogIGp1ID0gVDIoKENULCBJbSkgPT4gewogICAgdmFyIEk5ID0gQWEoKSwgS3UgPSBUZSgpLkJ1ZmZlciwgcW0gPSB5aSgpLCBUOSA9IEllKCk7CiAgICBmdW5jdGlvbiBfcyh0LCBlLCByLCBvKSB7CiAgICAgIHFtLmNhbGwodGhpcyksIHRoaXMuX2NpcGhlciA9IG5ldyBJOS5BRVMoZSksIHRoaXMuX3ByZXYgPSBLdS5mcm9tKHIpLCB0aGlzLl9jYWNoZSA9IEt1LmFsbG9jVW5zYWZlKDApLCB0aGlzLl9zZWNDYWNoZSA9IEt1LmFsbG9jVW5zYWZlKDApLCB0aGlzLl9kZWNyeXB0ID0gbywgdGhpcy5fbW9kZSA9IHQ7CiAgICB9CiAgICBUOShfcywgcW0pOwogICAgX3MucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgdCwgdGhpcy5fZGVjcnlwdCk7CiAgICB9OwogICAgX3MucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLl9jaXBoZXIuc2NydWIoKTsKICAgIH07CiAgICBJbS5leHBvcnRzID0gX3M7CiAgfSk7CiAgQmEgPSBUMigoT1QsIFRtKSA9PiB7CiAgICB2YXIgcW4gPSBUZSgpLkJ1ZmZlciwgazkgPSBBbygpOwogICAgZnVuY3Rpb24gTDkodCwgZSwgciwgbykgewogICAgICBpZiAocW4uaXNCdWZmZXIodCkgfHwgKHQgPSBxbi5mcm9tKHQsICJiaW5hcnkiKSksIGUgJiYgKHFuLmlzQnVmZmVyKGUpIHx8IChlID0gcW4uZnJvbShlLCAiYmluYXJ5IikpLCBlLmxlbmd0aCAhPT0gOCkpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNhbHQgc2hvdWxkIGJlIEJ1ZmZlciB3aXRoIDggYnl0ZSBsZW5ndGgiKTsKICAgICAgZm9yICh2YXIgZiA9IHIgLyA4LCBwID0gcW4uYWxsb2MoZiksIG0yID0gcW4uYWxsb2MobyB8fCAwKSwgeTIgPSBxbi5hbGxvYygwKTtmID4gMCB8fCBvID4gMDsgKSB7CiAgICAgICAgdmFyIE0gPSBuZXcgazk7CiAgICAgICAgTS51cGRhdGUoeTIpLCBNLnVwZGF0ZSh0KSwgZSAmJiBNLnVwZGF0ZShlKSwgeTIgPSBNLmRpZ2VzdCgpOwogICAgICAgIHZhciB4ID0gMDsKICAgICAgICBpZiAoZiA+IDApIHsKICAgICAgICAgIHZhciBTID0gcC5sZW5ndGggLSBmOwogICAgICAgICAgeCA9IE1hdGgubWluKGYsIHkyLmxlbmd0aCksIHkyLmNvcHkocCwgUywgMCwgeCksIGYgLT0geDsKICAgICAgICB9CiAgICAgICAgaWYgKHggPCB5Mi5sZW5ndGggJiYgbyA+IDApIHsKICAgICAgICAgIHZhciBFMiA9IG0yLmxlbmd0aCAtIG8sIEIgPSBNYXRoLm1pbihvLCB5Mi5sZW5ndGggLSB4KTsKICAgICAgICAgIHkyLmNvcHkobTIsIEUyLCB4LCB4ICsgQiksIG8gLT0gQjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHkyLmZpbGwoMCksIHsga2V5OiBwLCBpdjogbTIgfTsKICAgIH0KICAgIFRtLmV4cG9ydHMgPSBMOTsKICB9KTsKICBEbSA9IFQyKChadSkgPT4gewogICAgdmFyIGttID0gd3MoKSwgTjkgPSBXdSgpLCBNaSA9IFRlKCkuQnVmZmVyLCBEOSA9IGp1KCksIExtID0geWkoKSwgUDkgPSBBYSgpLCBDOSA9IEJhKCksIE85ID0gSWUoKTsKICAgIGZ1bmN0aW9uIHFhKHQsIGUsIHIpIHsKICAgICAgTG0uY2FsbCh0aGlzKSwgdGhpcy5fY2FjaGUgPSBuZXcgeHMsIHRoaXMuX2NpcGhlciA9IG5ldyBQOS5BRVMoZSksIHRoaXMuX3ByZXYgPSBNaS5mcm9tKHIpLCB0aGlzLl9tb2RlID0gdCwgdGhpcy5fYXV0b3BhZGRpbmcgPSB0cnVlOwogICAgfQogICAgTzkocWEsIExtKTsKICAgIHFhLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24odCkgewogICAgICB0aGlzLl9jYWNoZS5hZGQodCk7CiAgICAgIGZvciAodmFyIGUsIHIsIG8gPSBbXTtlID0gdGhpcy5fY2FjaGUuZ2V0KCk7ICkKICAgICAgICByID0gdGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsIGUpLCBvLnB1c2gocik7CiAgICAgIHJldHVybiBNaS5jb25jYXQobyk7CiAgICB9OwogICAgdmFyIEY5ID0gTWkuYWxsb2MoMTYsIDE2KTsKICAgIHFhLnByb3RvdHlwZS5fZmluYWwgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQgPSB0aGlzLl9jYWNoZS5mbHVzaCgpOwogICAgICBpZiAodGhpcy5fYXV0b3BhZGRpbmcpCiAgICAgICAgcmV0dXJuIHQgPSB0aGlzLl9tb2RlLmVuY3J5cHQodGhpcywgdCksIHRoaXMuX2NpcGhlci5zY3J1YigpLCB0OwogICAgICBpZiAoIXQuZXF1YWxzKEY5KSkKICAgICAgICB0aHJvdyB0aGlzLl9jaXBoZXIuc2NydWIoKSwgbmV3IEVycm9yKCJkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgiKTsKICAgIH07CiAgICBxYS5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmcgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiB0aGlzLl9hdXRvcGFkZGluZyA9ICEhdCwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiB4cygpIHsKICAgICAgdGhpcy5jYWNoZSA9IE1pLmFsbG9jVW5zYWZlKDApOwogICAgfQogICAgeHMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhpcy5jYWNoZSA9IE1pLmNvbmNhdChbdGhpcy5jYWNoZSwgdF0pOwogICAgfTsKICAgIHhzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY2FjaGUubGVuZ3RoID4gMTUpIHsKICAgICAgICB2YXIgdCA9IHRoaXMuY2FjaGUuc2xpY2UoMCwgMTYpOwogICAgICAgIHJldHVybiB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZS5zbGljZSgxNiksIHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgeHMucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIHQgPSAxNiAtIHRoaXMuY2FjaGUubGVuZ3RoLCBlID0gTWkuYWxsb2NVbnNhZmUodCksIHIgPSAtMTsrK3IgPCB0OyApCiAgICAgICAgZS53cml0ZVVJbnQ4KHQsIHIpOwogICAgICByZXR1cm4gTWkuY29uY2F0KFt0aGlzLmNhY2hlLCBlXSk7CiAgICB9OwogICAgZnVuY3Rpb24gTm0odCwgZSwgcikgewogICAgICB2YXIgbyA9IGttW3QudG9Mb3dlckNhc2UoKV07CiAgICAgIGlmICghbykKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTsKICAgICAgaWYgKHR5cGVvZiBlID09ICJzdHJpbmciICYmIChlID0gTWkuZnJvbShlKSksIGUubGVuZ3RoICE9PSBvLmtleSAvIDgpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoICIgKyBlLmxlbmd0aCk7CiAgICAgIGlmICh0eXBlb2YgciA9PSAic3RyaW5nIiAmJiAociA9IE1pLmZyb20ocikpLCBvLm1vZGUgIT09ICJHQ00iICYmIHIubGVuZ3RoICE9PSBvLml2KQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgaXYgbGVuZ3RoICIgKyByLmxlbmd0aCk7CiAgICAgIHJldHVybiBvLnR5cGUgPT09ICJzdHJlYW0iID8gbmV3IEQ5KG8ubW9kdWxlLCBlLCByKSA6IG8udHlwZSA9PT0gImF1dGgiID8gbmV3IE45KG8ubW9kdWxlLCBlLCByKSA6IG5ldyBxYShvLm1vZHVsZSwgZSwgcik7CiAgICB9CiAgICBmdW5jdGlvbiBVOSh0LCBlKSB7CiAgICAgIHZhciByID0ga21bdC50b0xvd2VyQ2FzZSgpXTsKICAgICAgaWYgKCFyKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpOwogICAgICB2YXIgbyA9IEM5KGUsIGZhbHNlLCByLmtleSwgci5pdik7CiAgICAgIHJldHVybiBObSh0LCBvLmtleSwgby5pdik7CiAgICB9CiAgICBadS5jcmVhdGVDaXBoZXJpdiA9IE5tOwogICAgWnUuY3JlYXRlQ2lwaGVyID0gVTk7CiAgfSk7CiAgRm0gPSBUMigoVnUpID0+IHsKICAgIHZhciB6OSA9IFd1KCksIE1mID0gVGUoKS5CdWZmZXIsIFBtID0gd3MoKSwgSDkgPSBqdSgpLCBDbSA9IHlpKCksIFc5ID0gQWEoKSwgSzkgPSBCYSgpLCBqOSA9IEllKCk7CiAgICBmdW5jdGlvbiBJYSh0LCBlLCByKSB7CiAgICAgIENtLmNhbGwodGhpcyksIHRoaXMuX2NhY2hlID0gbmV3IFNzLCB0aGlzLl9sYXN0ID0gdW5kZWZpbmVkLCB0aGlzLl9jaXBoZXIgPSBuZXcgVzkuQUVTKGUpLCB0aGlzLl9wcmV2ID0gTWYuZnJvbShyKSwgdGhpcy5fbW9kZSA9IHQsIHRoaXMuX2F1dG9wYWRkaW5nID0gdHJ1ZTsKICAgIH0KICAgIGo5KElhLCBDbSk7CiAgICBJYS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhpcy5fY2FjaGUuYWRkKHQpOwogICAgICBmb3IgKHZhciBlLCByLCBvID0gW107ZSA9IHRoaXMuX2NhY2hlLmdldCh0aGlzLl9hdXRvcGFkZGluZyk7ICkKICAgICAgICByID0gdGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsIGUpLCBvLnB1c2gocik7CiAgICAgIHJldHVybiBNZi5jb25jYXQobyk7CiAgICB9OwogICAgSWEucHJvdG90eXBlLl9maW5hbCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdCA9IHRoaXMuX2NhY2hlLmZsdXNoKCk7CiAgICAgIGlmICh0aGlzLl9hdXRvcGFkZGluZykKICAgICAgICByZXR1cm4gWjkodGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsIHQpKTsKICAgICAgaWYgKHQpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkYXRhIG5vdCBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgiKTsKICAgIH07CiAgICBJYS5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmcgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiB0aGlzLl9hdXRvcGFkZGluZyA9ICEhdCwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiBTcygpIHsKICAgICAgdGhpcy5jYWNoZSA9IE1mLmFsbG9jVW5zYWZlKDApOwogICAgfQogICAgU3MucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdGhpcy5jYWNoZSA9IE1mLmNvbmNhdChbdGhpcy5jYWNoZSwgdF0pOwogICAgfTsKICAgIFNzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlOwogICAgICBpZiAodCkgewogICAgICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCA+IDE2KQogICAgICAgICAgcmV0dXJuIGUgPSB0aGlzLmNhY2hlLnNsaWNlKDAsIDE2KSwgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUuc2xpY2UoMTYpLCBlOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY2FjaGUubGVuZ3RoID49IDE2KQogICAgICAgIHJldHVybiBlID0gdGhpcy5jYWNoZS5zbGljZSgwLCAxNiksIHRoaXMuY2FjaGUgPSB0aGlzLmNhY2hlLnNsaWNlKDE2KSwgZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwogICAgU3MucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmNhY2hlLmxlbmd0aCkKICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTsKICAgIH07CiAgICBmdW5jdGlvbiBaOSh0KSB7CiAgICAgIHZhciBlID0gdFsxNV07CiAgICAgIGlmIChlIDwgMSB8fCBlID4gMTYpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmFibGUgdG8gZGVjcnlwdCBkYXRhIik7CiAgICAgIGZvciAodmFyIHIgPSAtMTsrK3IgPCBlOyApCiAgICAgICAgaWYgKHRbciArICgxNiAtIGUpXSAhPT0gZSkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5hYmxlIHRvIGRlY3J5cHQgZGF0YSIpOwogICAgICBpZiAoZSAhPT0gMTYpCiAgICAgICAgcmV0dXJuIHQuc2xpY2UoMCwgMTYgLSBlKTsKICAgIH0KICAgIGZ1bmN0aW9uIE9tKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSBQbVt0LnRvTG93ZXJDYXNlKCldOwogICAgICBpZiAoIW8pCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7CiAgICAgIGlmICh0eXBlb2YgciA9PSAic3RyaW5nIiAmJiAociA9IE1mLmZyb20ocikpLCBvLm1vZGUgIT09ICJHQ00iICYmIHIubGVuZ3RoICE9PSBvLml2KQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgaXYgbGVuZ3RoICIgKyByLmxlbmd0aCk7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IE1mLmZyb20oZSkpLCBlLmxlbmd0aCAhPT0gby5rZXkgLyA4KQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQga2V5IGxlbmd0aCAiICsgZS5sZW5ndGgpOwogICAgICByZXR1cm4gby50eXBlID09PSAic3RyZWFtIiA/IG5ldyBIOShvLm1vZHVsZSwgZSwgciwgdHJ1ZSkgOiBvLnR5cGUgPT09ICJhdXRoIiA/IG5ldyB6OShvLm1vZHVsZSwgZSwgciwgdHJ1ZSkgOiBuZXcgSWEoby5tb2R1bGUsIGUsIHIpOwogICAgfQogICAgZnVuY3Rpb24gVjkodCwgZSkgewogICAgICB2YXIgciA9IFBtW3QudG9Mb3dlckNhc2UoKV07CiAgICAgIGlmICghcikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTsKICAgICAgdmFyIG8gPSBLOShlLCBmYWxzZSwgci5rZXksIHIuaXYpOwogICAgICByZXR1cm4gT20odCwgby5rZXksIG8uaXYpOwogICAgfQogICAgVnUuY3JlYXRlRGVjaXBoZXIgPSBWOTsKICAgIFZ1LmNyZWF0ZURlY2lwaGVyaXYgPSBPbTsKICB9KTsKICBFcyA9IFQyKChOcikgPT4gewogICAgdmFyIFVtID0gRG0oKSwgem0gPSBGbSgpLCAkOSA9IEZ1KCk7CiAgICBmdW5jdGlvbiBHOSgpIHsKICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKCQ5KTsKICAgIH0KICAgIE5yLmNyZWF0ZUNpcGhlciA9IE5yLkNpcGhlciA9IFVtLmNyZWF0ZUNpcGhlcjsKICAgIE5yLmNyZWF0ZUNpcGhlcml2ID0gTnIuQ2lwaGVyaXYgPSBVbS5jcmVhdGVDaXBoZXJpdjsKICAgIE5yLmNyZWF0ZURlY2lwaGVyID0gTnIuRGVjaXBoZXIgPSB6bS5jcmVhdGVEZWNpcGhlcjsKICAgIE5yLmNyZWF0ZURlY2lwaGVyaXYgPSBOci5EZWNpcGhlcml2ID0gem0uY3JlYXRlRGVjaXBoZXJpdjsKICAgIE5yLmxpc3RDaXBoZXJzID0gTnIuZ2V0Q2lwaGVycyA9IEc5OwogIH0pOwogIEhtID0gVDIoKF9pKSA9PiB7CiAgICBfaVsiZGVzLWVjYiJdID0geyBrZXk6IDgsIGl2OiAwIH07CiAgICBfaVsiZGVzLWNiYyJdID0gX2kuZGVzID0geyBrZXk6IDgsIGl2OiA4IH07CiAgICBfaVsiZGVzLWVkZTMtY2JjIl0gPSBfaS5kZXMzID0geyBrZXk6IDI0LCBpdjogOCB9OwogICAgX2lbImRlcy1lZGUzIl0gPSB7IGtleTogMjQsIGl2OiAwIH07CiAgICBfaVsiZGVzLWVkZS1jYmMiXSA9IHsga2V5OiAxNiwgaXY6IDggfTsKICAgIF9pWyJkZXMtZWRlIl0gPSB7IGtleTogMTYsIGl2OiAwIH07CiAgfSk7CiAgVm0gPSBUMigoRHIpID0+IHsKICAgIHZhciBXbSA9IGltKCksICR1ID0gRXMoKSwgS2kgPSB3cygpLCB4aSA9IEhtKCksIEttID0gQmEoKTsKICAgIGZ1bmN0aW9uIFk5KHQsIGUpIHsKICAgICAgdCA9IHQudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIHIsIG87CiAgICAgIGlmIChLaVt0XSkKICAgICAgICByID0gS2lbdF0ua2V5LCBvID0gS2lbdF0uaXY7CiAgICAgIGVsc2UgaWYgKHhpW3RdKQogICAgICAgIHIgPSB4aVt0XS5rZXkgKiA4LCBvID0geGlbdF0uaXY7CiAgICAgIGVsc2UKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTsKICAgICAgdmFyIGYgPSBLbShlLCBmYWxzZSwgciwgbyk7CiAgICAgIHJldHVybiBqbSh0LCBmLmtleSwgZi5pdik7CiAgICB9CiAgICBmdW5jdGlvbiBYOSh0LCBlKSB7CiAgICAgIHQgPSB0LnRvTG93ZXJDYXNlKCk7CiAgICAgIHZhciByLCBvOwogICAgICBpZiAoS2lbdF0pCiAgICAgICAgciA9IEtpW3RdLmtleSwgbyA9IEtpW3RdLml2OwogICAgICBlbHNlIGlmICh4aVt0XSkKICAgICAgICByID0geGlbdF0ua2V5ICogOCwgbyA9IHhpW3RdLml2OwogICAgICBlbHNlCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7CiAgICAgIHZhciBmID0gS20oZSwgZmFsc2UsIHIsIG8pOwogICAgICByZXR1cm4gWm0odCwgZi5rZXksIGYuaXYpOwogICAgfQogICAgZnVuY3Rpb24gam0odCwgZSwgcikgewogICAgICBpZiAodCA9IHQudG9Mb3dlckNhc2UoKSwgS2lbdF0pCiAgICAgICAgcmV0dXJuICR1LmNyZWF0ZUNpcGhlcml2KHQsIGUsIHIpOwogICAgICBpZiAoeGlbdF0pCiAgICAgICAgcmV0dXJuIG5ldyBXbSh7IGtleTogZSwgaXY6IHIsIG1vZGU6IHQgfSk7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpOwogICAgfQogICAgZnVuY3Rpb24gWm0odCwgZSwgcikgewogICAgICBpZiAodCA9IHQudG9Mb3dlckNhc2UoKSwgS2lbdF0pCiAgICAgICAgcmV0dXJuICR1LmNyZWF0ZURlY2lwaGVyaXYodCwgZSwgcik7CiAgICAgIGlmICh4aVt0XSkKICAgICAgICByZXR1cm4gbmV3IFdtKHsga2V5OiBlLCBpdjogciwgbW9kZTogdCwgZGVjcnlwdDogdHJ1ZSB9KTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7CiAgICB9CiAgICBmdW5jdGlvbiBKOSgpIHsKICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHhpKS5jb25jYXQoJHUuZ2V0Q2lwaGVycygpKTsKICAgIH0KICAgIERyLmNyZWF0ZUNpcGhlciA9IERyLkNpcGhlciA9IFk5OwogICAgRHIuY3JlYXRlQ2lwaGVyaXYgPSBEci5DaXBoZXJpdiA9IGptOwogICAgRHIuY3JlYXRlRGVjaXBoZXIgPSBEci5EZWNpcGhlciA9IFg5OwogICAgRHIuY3JlYXRlRGVjaXBoZXJpdiA9IERyLkRlY2lwaGVyaXYgPSBabTsKICAgIERyLmxpc3RDaXBoZXJzID0gRHIuZ2V0Q2lwaGVycyA9IEo5OwogIH0pOwogIGppID0gVDIoKCkgPT4gewogIH0pOwogIFl1ID0gVDIoKCRtLCBHdSkgPT4gewogICAgKGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgZnVuY3Rpb24gcih2LCBpKSB7CiAgICAgICAgaWYgKCF2KQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkgfHwgIkFzc2VydGlvbiBmYWlsZWQiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvKHYsIGkpIHsKICAgICAgICB2LnN1cGVyXyA9IGk7CiAgICAgICAgdmFyIGEgPSBmdW5jdGlvbigpIHsKICAgICAgICB9OwogICAgICAgIGEucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIHYucHJvdG90eXBlID0gbmV3IGEsIHYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdjsKICAgICAgfQogICAgICBmdW5jdGlvbiBmKHYsIGksIGEpIHsKICAgICAgICBpZiAoZi5pc0JOKHYpKQogICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMud29yZHMgPSBudWxsLCB0aGlzLmxlbmd0aCA9IDAsIHRoaXMucmVkID0gbnVsbCwgdiAhPT0gbnVsbCAmJiAoKGkgPT09ICJsZSIgfHwgaSA9PT0gImJlIikgJiYgKGEgPSBpLCBpID0gMTApLCB0aGlzLl9pbml0KHYgfHwgMCwgaSB8fCAxMCwgYSB8fCAiYmUiKSk7CiAgICAgIH0KICAgICAgdHlwZW9mIHQgPT0gIm9iamVjdCIgPyB0LmV4cG9ydHMgPSBmIDogZS5CTiA9IGYsIGYuQk4gPSBmLCBmLndvcmRTaXplID0gMjY7CiAgICAgIHZhciBwOwogICAgICB0cnkgewogICAgICAgIHR5cGVvZiB3aW5kb3cgPCAidSIgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgPCAidSIgPyBwID0gd2luZG93LkJ1ZmZlciA6IHAgPSBqaSgpLkJ1ZmZlcjsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgICAgZi5pc0JOID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpIGluc3RhbmNlb2YgZiA/IHRydWUgOiBpICE9PSBudWxsICYmIHR5cGVvZiBpID09ICJvYmplY3QiICYmIGkuY29uc3RydWN0b3Iud29yZFNpemUgPT09IGYud29yZFNpemUgJiYgQXJyYXkuaXNBcnJheShpLndvcmRzKTsKICAgICAgfSwgZi5tYXggPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIGkuY21wKGEpID4gMCA/IGkgOiBhOwogICAgICB9LCBmLm1pbiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gaS5jbXAoYSkgPCAwID8gaSA6IGE7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAodHlwZW9mIGkgPT0gIm51bWJlciIpCiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdE51bWJlcihpLCBhLCBoMik7CiAgICAgICAgaWYgKHR5cGVvZiBpID09ICJvYmplY3QiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShpLCBhLCBoMik7CiAgICAgICAgYSA9PT0gImhleCIgJiYgKGEgPSAxNiksIHIoYSA9PT0gKGEgfCAwKSAmJiBhID49IDIgJiYgYSA8PSAzNiksIGkgPSBpLnRvU3RyaW5nKCkucmVwbGFjZSgvXHMrL2csICIiKTsKICAgICAgICB2YXIgcyA9IDA7CiAgICAgICAgaVswXSA9PT0gIi0iICYmIChzKyssIHRoaXMubmVnYXRpdmUgPSAxKSwgcyA8IGkubGVuZ3RoICYmIChhID09PSAxNiA/IHRoaXMuX3BhcnNlSGV4KGksIHMsIGgyKSA6ICh0aGlzLl9wYXJzZUJhc2UoaSwgYSwgcyksIGgyID09PSAibGUiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYSwgaDIpKSk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpIDwgMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDEsIGkgPSAtaSksIGkgPCA2NzEwODg2NCA/ICh0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2M10sIHRoaXMubGVuZ3RoID0gMSkgOiBpIDwgNDUwMzU5OTYyNzM3MDQ5NiA/ICh0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2MywgaSAvIDY3MTA4ODY0ICYgNjcxMDg4NjNdLCB0aGlzLmxlbmd0aCA9IDIpIDogKHIoaSA8IDkwMDcxOTkyNTQ3NDA5OTIpLCB0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2MywgaSAvIDY3MTA4ODY0ICYgNjcxMDg4NjMsIDFdLCB0aGlzLmxlbmd0aCA9IDMpLCBoMiA9PT0gImxlIiAmJiB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGEsIGgyKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIGkubGVuZ3RoID09ICJudW1iZXIiKSwgaS5sZW5ndGggPD0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXM7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoaS5sZW5ndGggLyAzKSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IHRoaXMubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gMDsKICAgICAgICB2YXIgdSwgYywgYjIgPSAwOwogICAgICAgIGlmIChoMiA9PT0gImJlIikKICAgICAgICAgIGZvciAocyA9IGkubGVuZ3RoIC0gMSwgdSA9IDA7cyA+PSAwOyBzIC09IDMpCiAgICAgICAgICAgIGMgPSBpW3NdIHwgaVtzIC0gMV0gPDwgOCB8IGlbcyAtIDJdIDw8IDE2LCB0aGlzLndvcmRzW3VdIHw9IGMgPDwgYjIgJiA2NzEwODg2MywgdGhpcy53b3Jkc1t1ICsgMV0gPSBjID4+PiAyNiAtIGIyICYgNjcxMDg4NjMsIGIyICs9IDI0LCBiMiA+PSAyNiAmJiAoYjIgLT0gMjYsIHUrKyk7CiAgICAgICAgZWxzZSBpZiAoaDIgPT09ICJsZSIpCiAgICAgICAgICBmb3IgKHMgPSAwLCB1ID0gMDtzIDwgaS5sZW5ndGg7IHMgKz0gMykKICAgICAgICAgICAgYyA9IGlbc10gfCBpW3MgKyAxXSA8PCA4IHwgaVtzICsgMl0gPDwgMTYsIHRoaXMud29yZHNbdV0gfD0gYyA8PCBiMiAmIDY3MTA4ODYzLCB0aGlzLndvcmRzW3UgKyAxXSA9IGMgPj4+IDI2IC0gYjIgJiA2NzEwODg2MywgYjIgKz0gMjQsIGIyID49IDI2ICYmIChiMiAtPSAyNiwgdSsrKTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBtMih2LCBpKSB7CiAgICAgICAgdmFyIGEgPSB2LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgcmV0dXJuIGEgPj0gNjUgJiYgYSA8PSA3MCA/IGEgLSA1NSA6IGEgPj0gOTcgJiYgYSA8PSAxMDIgPyBhIC0gODcgOiBhIC0gNDggJiAxNTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5Mih2LCBpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gbTIodiwgYSk7CiAgICAgICAgcmV0dXJuIGEgLSAxID49IGkgJiYgKGgyIHw9IG0yKHYsIGEgLSAxKSA8PCA0KSwgaDI7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuX3BhcnNlSGV4ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgoaS5sZW5ndGggLSBhKSAvIDYpLCB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgdGhpcy5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSAwOwogICAgICAgIHZhciB1ID0gMCwgYyA9IDAsIGIyOwogICAgICAgIGlmIChoMiA9PT0gImJlIikKICAgICAgICAgIGZvciAocyA9IGkubGVuZ3RoIC0gMTtzID49IGE7IHMgLT0gMikKICAgICAgICAgICAgYjIgPSB5MihpLCBhLCBzKSA8PCB1LCB0aGlzLndvcmRzW2NdIHw9IGIyICYgNjcxMDg4NjMsIHUgPj0gMTggPyAodSAtPSAxOCwgYyArPSAxLCB0aGlzLndvcmRzW2NdIHw9IGIyID4+PiAyNikgOiB1ICs9IDg7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgbCA9IGkubGVuZ3RoIC0gYTsKICAgICAgICAgIGZvciAocyA9IGwgJSAyID09PSAwID8gYSArIDEgOiBhO3MgPCBpLmxlbmd0aDsgcyArPSAyKQogICAgICAgICAgICBiMiA9IHkyKGksIGEsIHMpIDw8IHUsIHRoaXMud29yZHNbY10gfD0gYjIgJiA2NzEwODg2MywgdSA+PSAxOCA/ICh1IC09IDE4LCBjICs9IDEsIHRoaXMud29yZHNbY10gfD0gYjIgPj4+IDI2KSA6IHUgKz0gODsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBNKHYsIGksIGEsIGgyKSB7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSBNYXRoLm1pbih2Lmxlbmd0aCwgYSksIGMgPSBpO2MgPCB1OyBjKyspIHsKICAgICAgICAgIHZhciBiMiA9IHYuY2hhckNvZGVBdChjKSAtIDQ4OwogICAgICAgICAgcyAqPSBoMiwgYjIgPj0gNDkgPyBzICs9IGIyIC0gNDkgKyAxMCA6IGIyID49IDE3ID8gcyArPSBiMiAtIDE3ICsgMTAgOiBzICs9IGIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAxO3UgPD0gNjcxMDg4NjM7IHUgKj0gYSkKICAgICAgICAgIHMrKzsKICAgICAgICBzLS0sIHUgPSB1IC8gYSB8IDA7CiAgICAgICAgZm9yICh2YXIgYyA9IGkubGVuZ3RoIC0gaDIsIGIyID0gYyAlIHMsIGwgPSBNYXRoLm1pbihjLCBjIC0gYjIpICsgaDIsIG4gPSAwLCBkID0gaDI7ZCA8IGw7IGQgKz0gcykKICAgICAgICAgIG4gPSBNKGksIGQsIGQgKyBzLCBhKSwgdGhpcy5pbXVsbih1KSwgdGhpcy53b3Jkc1swXSArIG4gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbiA6IHRoaXMuX2lhZGRuKG4pOwogICAgICAgIGlmIChiMiAhPT0gMCkgewogICAgICAgICAgdmFyIHcgPSAxOwogICAgICAgICAgZm9yIChuID0gTShpLCBkLCBpLmxlbmd0aCwgYSksIGQgPSAwO2QgPCBiMjsgZCsrKQogICAgICAgICAgICB3ICo9IGE7CiAgICAgICAgICB0aGlzLmltdWxuKHcpLCB0aGlzLndvcmRzWzBdICsgbiA8IDY3MTA4ODY0ID8gdGhpcy53b3Jkc1swXSArPSBuIDogdGhpcy5faWFkZG4obik7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGg7IGErKykKICAgICAgICAgIGkud29yZHNbYV0gPSB0aGlzLndvcmRzW2FdOwogICAgICAgIGkubGVuZ3RoID0gdGhpcy5sZW5ndGgsIGkubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlLCBpLnJlZCA9IHRoaXMucmVkOwogICAgICB9LCBmLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIHRoaXMuY29weShpKSwgaTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA8IGk7ICkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDA7ICkKICAgICAgICAgIHRoaXMubGVuZ3RoLS07CiAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwICYmICh0aGlzLm5lZ2F0aXZlID0gMCksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMucmVkID8gIjxCTi1SOiAiIDogIjxCTjogIikgKyB0aGlzLnRvU3RyaW5nKDE2KSArICI+IjsKICAgICAgfTsKICAgICAgdmFyIHggPSBbIiIsICIwIiwgIjAwIiwgIjAwMCIsICIwMDAwIiwgIjAwMDAwIiwgIjAwMDAwMCIsICIwMDAwMDAwIiwgIjAwMDAwMDAwIiwgIjAwMDAwMDAwMCIsICIwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sIFMgPSBbMCwgMCwgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LCA4LCA3LCA3LCA3LCA3LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1XSwgRTIgPSBbMCwgMCwgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsIDQzMDQ2NzIxLCAxZTcsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LCAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LCAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3Nl07CiAgICAgIGYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGkgPSBpIHx8IDEwLCBhID0gYSB8IDAgfHwgMTsKICAgICAgICB2YXIgaDI7CiAgICAgICAgaWYgKGkgPT09IDE2IHx8IGkgPT09ICJoZXgiKSB7CiAgICAgICAgICBoMiA9ICIiOwogICAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAwLCBjID0gMDtjIDwgdGhpcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgICB2YXIgYjIgPSB0aGlzLndvcmRzW2NdLCBsID0gKChiMiA8PCBzIHwgdSkgJiAxNjc3NzIxNSkudG9TdHJpbmcoMTYpOwogICAgICAgICAgICB1ID0gYjIgPj4+IDI0IC0gcyAmIDE2Nzc3MjE1LCB1ICE9PSAwIHx8IGMgIT09IHRoaXMubGVuZ3RoIC0gMSA/IGgyID0geFs2IC0gbC5sZW5ndGhdICsgbCArIGgyIDogaDIgPSBsICsgaDIsIHMgKz0gMiwgcyA+PSAyNiAmJiAocyAtPSAyNiwgYy0tKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodSAhPT0gMCAmJiAoaDIgPSB1LnRvU3RyaW5nKDE2KSArIGgyKTtoMi5sZW5ndGggJSBhICE9PSAwOyApCiAgICAgICAgICAgIGgyID0gIjAiICsgaDI7CiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAoaDIgPSAiLSIgKyBoMiksIGgyOwogICAgICAgIH0KICAgICAgICBpZiAoaSA9PT0gKGkgfCAwKSAmJiBpID49IDIgJiYgaSA8PSAzNikgewogICAgICAgICAgdmFyIG4gPSBTW2ldLCBkID0gRTJbaV07CiAgICAgICAgICBoMiA9ICIiOwogICAgICAgICAgdmFyIHcgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgICBmb3IgKHcubmVnYXRpdmUgPSAwOyF3LmlzWmVybygpOyApIHsKICAgICAgICAgICAgdmFyIGcgPSB3Lm1vZG4oZCkudG9TdHJpbmcoaSk7CiAgICAgICAgICAgIHcgPSB3LmlkaXZuKGQpLCB3LmlzWmVybygpID8gaDIgPSBnICsgaDIgOiBoMiA9IHhbbiAtIGcubGVuZ3RoXSArIGcgKyBoMjsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodGhpcy5pc1plcm8oKSAmJiAoaDIgPSAiMCIgKyBoMik7aDIubGVuZ3RoICUgYSAhPT0gMDsgKQogICAgICAgICAgICBoMiA9ICIwIiArIGgyOwogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKGgyID0gIi0iICsgaDIpLCBoMjsKICAgICAgICB9CiAgICAgICAgcihmYWxzZSwgIkJhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYiKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IHRoaXMud29yZHNbMF07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAyID8gaSArPSB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAxID8gaSArPSA0NTAzNTk5NjI3MzcwNDk2ICsgdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPiAyICYmIHIoZmFsc2UsICJOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMiKSwgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1pIDogaTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gcih0eXBlb2YgcCA8ICJ1IiksIHRoaXMudG9BcnJheUxpa2UocCwgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSB0aGlzLmJ5dGVMZW5ndGgoKSwgdSA9IGgyIHx8IE1hdGgubWF4KDEsIHMpOwogICAgICAgIHIocyA8PSB1LCAiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCIpLCByKHUgPiAwLCAiUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwIiksIHRoaXMuc3RyaXAoKTsKICAgICAgICB2YXIgYyA9IGEgPT09ICJsZSIsIGIyID0gbmV3IGkodSksIGwsIG4sIGQgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgaWYgKGMpIHsKICAgICAgICAgIGZvciAobiA9IDA7IWQuaXNaZXJvKCk7IG4rKykKICAgICAgICAgICAgbCA9IGQuYW5kbG4oMjU1KSwgZC5pdXNocm4oOCksIGIyW25dID0gbDsKICAgICAgICAgIGZvciAoO24gPCB1OyBuKyspCiAgICAgICAgICAgIGIyW25dID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChuID0gMDtuIDwgdSAtIHM7IG4rKykKICAgICAgICAgICAgYjJbbl0gPSAwOwogICAgICAgICAgZm9yIChuID0gMDshZC5pc1plcm8oKTsgbisrKQogICAgICAgICAgICBsID0gZC5hbmRsbigyNTUpLCBkLml1c2hybig4KSwgYjJbdSAtIG4gLSAxXSA9IGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiMjsKICAgICAgfSwgTWF0aC5jbHozMiA/IGYucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMihpKTsKICAgICAgfSA6IGYucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLCBoMiA9IDA7CiAgICAgICAgcmV0dXJuIGEgPj0gNDA5NiAmJiAoaDIgKz0gMTMsIGEgPj4+PSAxMyksIGEgPj0gNjQgJiYgKGgyICs9IDcsIGEgPj4+PSA3KSwgYSA+PSA4ICYmIChoMiArPSA0LCBhID4+Pj0gNCksIGEgPj0gMiAmJiAoaDIgKz0gMiwgYSA+Pj49IDIpLCBoMiArIGE7CiAgICAgIH0sIGYucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgIHJldHVybiAyNjsKICAgICAgICB2YXIgYSA9IGksIGgyID0gMDsKICAgICAgICByZXR1cm4gKGEgJiA4MTkxKSA9PT0gMCAmJiAoaDIgKz0gMTMsIGEgPj4+PSAxMyksIChhICYgMTI3KSA9PT0gMCAmJiAoaDIgKz0gNywgYSA+Pj49IDcpLCAoYSAmIDE1KSA9PT0gMCAmJiAoaDIgKz0gNCwgYSA+Pj49IDQpLCAoYSAmIDMpID09PSAwICYmIChoMiArPSAyLCBhID4+Pj0gMiksIChhICYgMSkgPT09IDAgJiYgaDIrKywgaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdLCBhID0gdGhpcy5fY291bnRCaXRzKGkpOwogICAgICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgYTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gQih2KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IG5ldyBBcnJheSh2LmJpdExlbmd0aCgpKSwgYSA9IDA7YSA8IGkubGVuZ3RoOyBhKyspIHsKICAgICAgICAgIHZhciBoMiA9IGEgLyAyNiB8IDAsIHMgPSBhICUgMjY7CiAgICAgICAgICBpW2FdID0gKHYud29yZHNbaDJdICYgMSA8PCBzKSA+Pj4gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gMDthIDwgdGhpcy5sZW5ndGg7IGErKykgewogICAgICAgICAgdmFyIGgyID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1thXSk7CiAgICAgICAgICBpZiAoaSArPSBoMiwgaDIgIT09IDI2KQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5hYnMoKS5pbm90bihpKS5pYWRkbigxKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGVzdG4oaSAtIDEpID8gdGhpcy5ub3RuKGkpLmlhZGRuKDEpLmluZWcoKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc1plcm8oKSB8fCAodGhpcy5uZWdhdGl2ZSBePSAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA8IGkubGVuZ3RoOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgIHRoaXMud29yZHNbYV0gPSB0aGlzLndvcmRzW2FdIHwgaS53b3Jkc1thXTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXVvcihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaW9yKGkpIDogaS5jbG9uZSgpLmlvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1b3IoaSkgOiBpLmNsb25lKCkuaXVvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IGEgPSBpIDogYSA9IHRoaXM7CiAgICAgICAgZm9yICh2YXIgaDIgPSAwO2gyIDwgYS5sZW5ndGg7IGgyKyspCiAgICAgICAgICB0aGlzLndvcmRzW2gyXSA9IHRoaXMud29yZHNbaDJdICYgaS53b3Jkc1toMl07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gYS5sZW5ndGgsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdWFuZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhbmQoaSkgOiBpLmNsb25lKCkuaWFuZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdWFuZChpKSA6IGkuY2xvbmUoKS5pdWFuZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEsIGgyOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyAoYSA9IHRoaXMsIGgyID0gaSkgOiAoYSA9IGksIGgyID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGgyLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IGEud29yZHNbc10gXiBoMi53b3Jkc1tzXTsKICAgICAgICBpZiAodGhpcyAhPT0gYSkKICAgICAgICAgIGZvciAoO3MgPCBhLmxlbmd0aDsgcysrKQogICAgICAgICAgICB0aGlzLndvcmRzW3NdID0gYS53b3Jkc1tzXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBhLmxlbmd0aCwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1eG9yKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXhvcihpKSA6IGkuY2xvbmUoKS5peG9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1eG9yKGkpIDogaS5jbG9uZSgpLml1eG9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBNYXRoLmNlaWwoaSAvIDI2KSB8IDAsIGgyID0gaSAlIDI2OwogICAgICAgIHRoaXMuX2V4cGFuZChhKSwgaDIgPiAwICYmIGEtLTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgYTsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IH50aGlzLndvcmRzW3NdICYgNjcxMDg4NjM7CiAgICAgICAgcmV0dXJuIGgyID4gMCAmJiAodGhpcy53b3Jkc1tzXSA9IH50aGlzLndvcmRzW3NdICYgNjcxMDg4NjMgPj4gMjYgLSBoMiksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgaDIgPSBpIC8gMjYgfCAwLCBzID0gaSAlIDI2OwogICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoaDIgKyAxKSwgYSA/IHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gfCAxIDw8IHMgOiB0aGlzLndvcmRzW2gyXSA9IHRoaXMud29yZHNbaDJdICYgfigxIDw8IHMpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuaXN1YihpKSwgdGhpcy5uZWdhdGl2ZSBePSAxLCB0aGlzLl9ub3JtU2lnbigpOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLmlzdWIoaSksIGkubmVnYXRpdmUgPSAxLCBhLl9ub3JtU2lnbigpOwogICAgICAgIHZhciBoMiwgczsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gKGgyID0gdGhpcywgcyA9IGkpIDogKGgyID0gaSwgcyA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIHUgPSAwLCBjID0gMDtjIDwgcy5sZW5ndGg7IGMrKykKICAgICAgICAgIGEgPSAoaDIud29yZHNbY10gfCAwKSArIChzLndvcmRzW2NdIHwgMCkgKyB1LCB0aGlzLndvcmRzW2NdID0gYSAmIDY3MTA4ODYzLCB1ID0gYSA+Pj4gMjY7CiAgICAgICAgZm9yICg7dSAhPT0gMCAmJiBjIDwgaDIubGVuZ3RoOyBjKyspCiAgICAgICAgICBhID0gKGgyLndvcmRzW2NdIHwgMCkgKyB1LCB0aGlzLndvcmRzW2NdID0gYSAmIDY3MTA4ODYzLCB1ID0gYSA+Pj4gMjY7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID0gaDIubGVuZ3RoLCB1ICE9PSAwKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSB1LCB0aGlzLmxlbmd0aCsrOwogICAgICAgIGVsc2UgaWYgKGgyICE9PSB0aGlzKQogICAgICAgICAgZm9yICg7YyA8IGgyLmxlbmd0aDsgYysrKQogICAgICAgICAgICB0aGlzLndvcmRzW2NdID0gaDIud29yZHNbY107CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwID8gKGkubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5zdWIoaSksIGkubmVnYXRpdmUgXj0gMSwgYSkgOiBpLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDAgPyAodGhpcy5uZWdhdGl2ZSA9IDAsIGEgPSBpLnN1Yih0aGlzKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIGEpIDogdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pYWRkKGkpIDogaS5jbG9uZSgpLmlhZGQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkubmVnYXRpdmUgIT09IDApIHsKICAgICAgICAgIGkubmVnYXRpdmUgPSAwOwogICAgICAgICAgdmFyIGEgPSB0aGlzLmlhZGQoaSk7CiAgICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSA9IDEsIGEuX25vcm1TaWduKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGQoaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLl9ub3JtU2lnbigpOwogICAgICAgIHZhciBoMiA9IHRoaXMuY21wKGkpOwogICAgICAgIGlmIChoMiA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5sZW5ndGggPSAxLCB0aGlzLndvcmRzWzBdID0gMCwgdGhpczsKICAgICAgICB2YXIgcywgdTsKICAgICAgICBoMiA+IDAgPyAocyA9IHRoaXMsIHUgPSBpKSA6IChzID0gaSwgdSA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIGMgPSAwLCBiMiA9IDA7YjIgPCB1Lmxlbmd0aDsgYjIrKykKICAgICAgICAgIGEgPSAocy53b3Jkc1tiMl0gfCAwKSAtICh1LndvcmRzW2IyXSB8IDApICsgYywgYyA9IGEgPj4gMjYsIHRoaXMud29yZHNbYjJdID0gYSAmIDY3MTA4ODYzOwogICAgICAgIGZvciAoO2MgIT09IDAgJiYgYjIgPCBzLmxlbmd0aDsgYjIrKykKICAgICAgICAgIGEgPSAocy53b3Jkc1tiMl0gfCAwKSArIGMsIGMgPSBhID4+IDI2LCB0aGlzLndvcmRzW2IyXSA9IGEgJiA2NzEwODg2MzsKICAgICAgICBpZiAoYyA9PT0gMCAmJiBiMiA8IHMubGVuZ3RoICYmIHMgIT09IHRoaXMpCiAgICAgICAgICBmb3IgKDtiMiA8IHMubGVuZ3RoOyBiMisrKQogICAgICAgICAgICB0aGlzLndvcmRzW2IyXSA9IHMud29yZHNbYjJdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBiMiksIHMgIT09IHRoaXMgJiYgKHRoaXMubmVnYXRpdmUgPSAxKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKGkpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBxMih2LCBpLCBhKSB7CiAgICAgICAgYS5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiB2Lm5lZ2F0aXZlOwogICAgICAgIHZhciBoMiA9IHYubGVuZ3RoICsgaS5sZW5ndGggfCAwOwogICAgICAgIGEubGVuZ3RoID0gaDIsIGgyID0gaDIgLSAxIHwgMDsKICAgICAgICB2YXIgcyA9IHYud29yZHNbMF0gfCAwLCB1ID0gaS53b3Jkc1swXSB8IDAsIGMgPSBzICogdSwgYjIgPSBjICYgNjcxMDg4NjMsIGwgPSBjIC8gNjcxMDg4NjQgfCAwOwogICAgICAgIGEud29yZHNbMF0gPSBiMjsKICAgICAgICBmb3IgKHZhciBuID0gMTtuIDwgaDI7IG4rKykgewogICAgICAgICAgZm9yICh2YXIgZCA9IGwgPj4+IDI2LCB3ID0gbCAmIDY3MTA4ODYzLCBnID0gTWF0aC5taW4obiwgaS5sZW5ndGggLSAxKSwgXzIgPSBNYXRoLm1heCgwLCBuIC0gdi5sZW5ndGggKyAxKTtfMiA8PSBnOyBfMisrKSB7CiAgICAgICAgICAgIHZhciBBMiA9IG4gLSBfMiB8IDA7CiAgICAgICAgICAgIHMgPSB2LndvcmRzW0EyXSB8IDAsIHUgPSBpLndvcmRzW18yXSB8IDAsIGMgPSBzICogdSArIHcsIGQgKz0gYyAvIDY3MTA4ODY0IHwgMCwgdyA9IGMgJiA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIGEud29yZHNbbl0gPSB3IHwgMCwgbCA9IGQgfCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbCAhPT0gMCA/IGEud29yZHNbbl0gPSBsIHwgMCA6IGEubGVuZ3RoLS0sIGEuc3RyaXAoKTsKICAgICAgfQogICAgICB2YXIgTDIgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gaS53b3JkcywgdSA9IGEud29yZHMsIGMgPSBoMi53b3JkcywgYjIgPSAwLCBsLCBuLCBkLCB3ID0gc1swXSB8IDAsIGcgPSB3ICYgODE5MSwgXzIgPSB3ID4+PiAxMywgQTIgPSBzWzFdIHwgMCwgUjIgPSBBMiAmIDgxOTEsIEkgPSBBMiA+Pj4gMTMsIE1lID0gc1syXSB8IDAsIGsgPSBNZSAmIDgxOTEsIEQyID0gTWUgPj4+IDEzLCBudCA9IHNbM10gfCAwLCBDMiA9IG50ICYgODE5MSwgTyA9IG50ID4+PiAxMywgdnQgPSBzWzRdIHwgMCwgRiA9IHZ0ICYgODE5MSwgVSA9IHZ0ID4+PiAxMywgYnQgPSBzWzVdIHwgMCwgejIgPSBidCAmIDgxOTEsIEggPSBidCA+Pj4gMTMsIG10ID0gc1s2XSB8IDAsIFcgPSBtdCAmIDgxOTEsIEsgPSBtdCA+Pj4gMTMsIGd0ID0gc1s3XSB8IDAsIGogPSBndCAmIDgxOTEsIFogPSBndCA+Pj4gMTMsIHl0ID0gc1s4XSB8IDAsIFYgPSB5dCAmIDgxOTEsICQgPSB5dCA+Pj4gMTMsIHd0ID0gc1s5XSB8IDAsIEcgPSB3dCAmIDgxOTEsIFkgPSB3dCA+Pj4gMTMsIE10ID0gdVswXSB8IDAsIFggPSBNdCAmIDgxOTEsIEogPSBNdCA+Pj4gMTMsIF90ID0gdVsxXSB8IDAsIFEgPSBfdCAmIDgxOTEsIGVlID0gX3QgPj4+IDEzLCB4dCA9IHVbMl0gfCAwLCB0ZSA9IHh0ICYgODE5MSwgcmUgPSB4dCA+Pj4gMTMsIFN0ID0gdVszXSB8IDAsIGllID0gU3QgJiA4MTkxLCBuZSA9IFN0ID4+PiAxMywgRXQgPSB1WzRdIHwgMCwgZmUgPSBFdCAmIDgxOTEsIGFlID0gRXQgPj4+IDEzLCBBdCA9IHVbNV0gfCAwLCBvZSA9IEF0ICYgODE5MSwgc2UgPSBBdCA+Pj4gMTMsIFJ0ID0gdVs2XSB8IDAsIGhlID0gUnQgJiA4MTkxLCB1ZSA9IFJ0ID4+PiAxMywgQnQgPSB1WzddIHwgMCwgbGUgPSBCdCAmIDgxOTEsIGRlID0gQnQgPj4+IDEzLCBxdCA9IHVbOF0gfCAwLCBjZSA9IHF0ICYgODE5MSwgcGUgPSBxdCA+Pj4gMTMsIEl0ID0gdVs5XSB8IDAsIHZlID0gSXQgJiA4MTkxLCBiZSA9IEl0ID4+PiAxMzsKICAgICAgICBoMi5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiBhLm5lZ2F0aXZlLCBoMi5sZW5ndGggPSAxOSwgbCA9IE1hdGguaW11bChnLCBYKSwgbiA9IE1hdGguaW11bChnLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIFgpIHwgMCwgZCA9IE1hdGguaW11bChfMiwgSik7CiAgICAgICAgdmFyIGZ0ID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGZ0ID4+PiAyNikgfCAwLCBmdCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChSMiwgWCksIG4gPSBNYXRoLmltdWwoUjIsIEopLCBuID0gbiArIE1hdGguaW11bChJLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKGcsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIGVlKSB8IDA7CiAgICAgICAgdmFyIEJlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEJlID4+PiAyNikgfCAwLCBCZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChrLCBYKSwgbiA9IE1hdGguaW11bChrLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIFgpIHwgMCwgZCA9IE1hdGguaW11bChEMiwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgcmUpIHwgMDsKICAgICAgICB2YXIgcWUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAocWUgPj4+IDI2KSB8IDAsIHFlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEMyLCBYKSwgbiA9IE1hdGguaW11bChDMiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKE8sIFgpIHwgMCwgZCA9IE1hdGguaW11bChPLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoaywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIG5lKSB8IDA7CiAgICAgICAgdmFyIHplID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHplID4+PiAyNikgfCAwLCB6ZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChGLCBYKSwgbiA9IE1hdGguaW11bChGLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoVSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFUsIEopLCBsID0gbCArIE1hdGguaW11bChDMiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBhZSkgfCAwOwogICAgICAgIHZhciBIZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChIZSA+Pj4gMjYpIHwgMCwgSGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoejIsIFgpLCBuID0gTWF0aC5pbXVsKHoyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSCwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEgsIEopLCBsID0gbCArIE1hdGguaW11bChGLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBzZSkgfCAwOwogICAgICAgIHZhciBXZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChXZSA+Pj4gMjYpIHwgMCwgV2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoVywgWCksIG4gPSBNYXRoLmltdWwoVywgSiksIG4gPSBuICsgTWF0aC5pbXVsKEssIFgpIHwgMCwgZCA9IE1hdGguaW11bChLLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoejIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCB1ZSkgfCAwOwogICAgICAgIHZhciBLZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChLZSA+Pj4gMjYpIHwgMCwgS2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoaiwgWCksIG4gPSBNYXRoLmltdWwoaiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKFosIFgpIHwgMCwgZCA9IE1hdGguaW11bChaLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoVywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBkZSkgfCAwOwogICAgICAgIHZhciBqZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChqZSA+Pj4gMjYpIHwgMCwgamUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoViwgWCksIG4gPSBNYXRoLmltdWwoViwgSiksIG4gPSBuICsgTWF0aC5pbXVsKCQsIFgpIHwgMCwgZCA9IE1hdGguaW11bCgkLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoaiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBwZSkgfCAwOwogICAgICAgIHZhciBaZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChaZSA+Pj4gMjYpIHwgMCwgWmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgWCksIG4gPSBNYXRoLmltdWwoRywgSiksIG4gPSBuICsgTWF0aC5pbXVsKFksIFgpIHwgMCwgZCA9IE1hdGguaW11bChZLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBiZSkgfCAwOwogICAgICAgIHZhciBWZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChWZSA+Pj4gMjYpIHwgMCwgVmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgUSksIG4gPSBNYXRoLmltdWwoRywgZWUpLCBuID0gbiArIE1hdGguaW11bChZLCBRKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgZWUpLCBsID0gbCArIE1hdGguaW11bChWLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6Miwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGJlKSB8IDA7CiAgICAgICAgdmFyICRlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKCRlID4+PiAyNikgfCAwLCAkZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCB0ZSksIG4gPSBNYXRoLmltdWwoRywgcmUpLCBuID0gbiArIE1hdGguaW11bChZLCB0ZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHJlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgYmUpIHwgMDsKICAgICAgICB2YXIgR2UgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoR2UgPj4+IDI2KSB8IDAsIEdlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGllKSwgbiA9IE1hdGguaW11bChHLCBuZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGllKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgbmUpLCBsID0gbCArIE1hdGguaW11bChWLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgYmUpIHwgMDsKICAgICAgICB2YXIgWWUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWWUgPj4+IDI2KSB8IDAsIFllICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGZlKSwgbiA9IE1hdGguaW11bChHLCBhZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGZlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgYWUpLCBsID0gbCArIE1hdGguaW11bChWLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGJlKSB8IDA7CiAgICAgICAgdmFyIFhlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFhlID4+PiAyNikgfCAwLCBYZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBvZSksIG4gPSBNYXRoLmltdWwoRywgc2UpLCBuID0gbiArIE1hdGguaW11bChZLCBvZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHNlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBiZSkgfCAwOwogICAgICAgIHZhciBKZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChKZSA+Pj4gMjYpIHwgMCwgSmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgaGUpLCBuID0gTWF0aC5pbXVsKEcsIHVlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgaGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCB1ZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGJlKSB8IDA7CiAgICAgICAgdmFyIFFlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFFlID4+PiAyNikgfCAwLCBRZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBsZSksIG4gPSBNYXRoLmltdWwoRywgZGUpLCBuID0gbiArIE1hdGguaW11bChZLCBsZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGRlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgYmUpIHwgMDsKICAgICAgICB2YXIgZXQgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoZXQgPj4+IDI2KSB8IDAsIGV0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGNlKSwgbiA9IE1hdGguaW11bChHLCBwZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGNlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgcGUpLCBsID0gbCArIE1hdGguaW11bChWLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBiZSkgfCAwOwogICAgICAgIHZhciB0dCA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArICh0dCA+Pj4gMjYpIHwgMCwgdHQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgdmUpLCBuID0gTWF0aC5pbXVsKEcsIGJlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgdmUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBiZSk7CiAgICAgICAgdmFyIHJ0ID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICByZXR1cm4gYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChydCA+Pj4gMjYpIHwgMCwgcnQgJj0gNjcxMDg4NjMsIGNbMF0gPSBmdCwgY1sxXSA9IEJlLCBjWzJdID0gcWUsIGNbM10gPSB6ZSwgY1s0XSA9IEhlLCBjWzVdID0gV2UsIGNbNl0gPSBLZSwgY1s3XSA9IGplLCBjWzhdID0gWmUsIGNbOV0gPSBWZSwgY1sxMF0gPSAkZSwgY1sxMV0gPSBHZSwgY1sxMl0gPSBZZSwgY1sxM10gPSBYZSwgY1sxNF0gPSBKZSwgY1sxNV0gPSBRZSwgY1sxNl0gPSBldCwgY1sxN10gPSB0dCwgY1sxOF0gPSBydCwgYjIgIT09IDAgJiYgKGNbMTldID0gYjIsIGgyLmxlbmd0aCsrKSwgaDI7CiAgICAgIH07CiAgICAgIE1hdGguaW11bCB8fCAoTDIgPSBxMik7CiAgICAgIGZ1bmN0aW9uIGdlKHYsIGksIGEpIHsKICAgICAgICBhLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIHYubmVnYXRpdmUsIGEubGVuZ3RoID0gdi5sZW5ndGggKyBpLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBoMiA9IDAsIHMgPSAwLCB1ID0gMDt1IDwgYS5sZW5ndGggLSAxOyB1KyspIHsKICAgICAgICAgIHZhciBjID0gczsKICAgICAgICAgIHMgPSAwOwogICAgICAgICAgZm9yICh2YXIgYjIgPSBoMiAmIDY3MTA4ODYzLCBsID0gTWF0aC5taW4odSwgaS5sZW5ndGggLSAxKSwgbiA9IE1hdGgubWF4KDAsIHUgLSB2Lmxlbmd0aCArIDEpO24gPD0gbDsgbisrKSB7CiAgICAgICAgICAgIHZhciBkID0gdSAtIG4sIHcgPSB2LndvcmRzW2RdIHwgMCwgZyA9IGkud29yZHNbbl0gfCAwLCBfMiA9IHcgKiBnLCBBMiA9IF8yICYgNjcxMDg4NjM7CiAgICAgICAgICAgIGMgPSBjICsgKF8yIC8gNjcxMDg4NjQgfCAwKSB8IDAsIEEyID0gQTIgKyBiMiB8IDAsIGIyID0gQTIgJiA2NzEwODg2MywgYyA9IGMgKyAoQTIgPj4+IDI2KSB8IDAsIHMgKz0gYyA+Pj4gMjYsIGMgJj0gNjcxMDg4NjM7CiAgICAgICAgICB9CiAgICAgICAgICBhLndvcmRzW3VdID0gYjIsIGgyID0gYywgYyA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoMiAhPT0gMCA/IGEud29yZHNbdV0gPSBoMiA6IGEubGVuZ3RoLS0sIGEuc3RyaXAoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBfZSh2LCBpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gbmV3IE47CiAgICAgICAgcmV0dXJuIGgyLm11bHAodiwgaSwgYSk7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyLCBzID0gdGhpcy5sZW5ndGggKyBpLmxlbmd0aDsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEwICYmIGkubGVuZ3RoID09PSAxMCA/IGgyID0gTDIodGhpcywgaSwgYSkgOiBzIDwgNjMgPyBoMiA9IHEyKHRoaXMsIGksIGEpIDogcyA8IDEwMjQgPyBoMiA9IGdlKHRoaXMsIGksIGEpIDogaDIgPSBfZSh0aGlzLCBpLCBhKSwgaDI7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIE4odiwgaSkgewogICAgICAgIHRoaXMueCA9IHYsIHRoaXMueSA9IGk7CiAgICAgIH0KICAgICAgTi5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gbmV3IEFycmF5KGkpLCBoMiA9IGYucHJvdG90eXBlLl9jb3VudEJpdHMoaSkgLSAxLCBzID0gMDtzIDwgaTsgcysrKQogICAgICAgICAgYVtzXSA9IHRoaXMucmV2QmluKHMsIGgyLCBpKTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgTi5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSBoMiAtIDEpCiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDA7dSA8IGE7IHUrKykKICAgICAgICAgIHMgfD0gKGkgJiAxKSA8PCBhIC0gdSAtIDEsIGkgPj49IDE7CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0sIE4ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbihpLCBhLCBoMiwgcywgdSwgYykgewogICAgICAgIGZvciAodmFyIGIyID0gMDtiMiA8IGM7IGIyKyspCiAgICAgICAgICBzW2IyXSA9IGFbaVtiMl1dLCB1W2IyXSA9IGgyW2lbYjJdXTsKICAgICAgfSwgTi5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oaSwgYSwgaDIsIHMsIHUsIGMpIHsKICAgICAgICB0aGlzLnBlcm11dGUoYywgaSwgYSwgaDIsIHMsIHUpOwogICAgICAgIGZvciAodmFyIGIyID0gMTtiMiA8IHU7IGIyIDw8PSAxKQogICAgICAgICAgZm9yICh2YXIgbCA9IGIyIDw8IDEsIG4gPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpLCBkID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKSwgdyA9IDA7dyA8IHU7IHcgKz0gbCkKICAgICAgICAgICAgZm9yICh2YXIgZyA9IG4sIF8yID0gZCwgQTIgPSAwO0EyIDwgYjI7IEEyKyspIHsKICAgICAgICAgICAgICB2YXIgUjIgPSBoMlt3ICsgQTJdLCBJID0gc1t3ICsgQTJdLCBNZSA9IGgyW3cgKyBBMiArIGIyXSwgayA9IHNbdyArIEEyICsgYjJdLCBEMiA9IGcgKiBNZSAtIF8yICogazsKICAgICAgICAgICAgICBrID0gZyAqIGsgKyBfMiAqIE1lLCBNZSA9IEQyLCBoMlt3ICsgQTJdID0gUjIgKyBNZSwgc1t3ICsgQTJdID0gSSArIGssIGgyW3cgKyBBMiArIGIyXSA9IFIyIC0gTWUsIHNbdyArIEEyICsgYjJdID0gSSAtIGssIEEyICE9PSBsICYmIChEMiA9IG4gKiBnIC0gZCAqIF8yLCBfMiA9IG4gKiBfMiArIGQgKiBnLCBnID0gRDIpOwogICAgICAgICAgICB9CiAgICAgIH0sIE4ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMiA9IE1hdGgubWF4KGEsIGkpIHwgMSwgcyA9IGgyICYgMSwgdSA9IDA7CiAgICAgICAgZm9yIChoMiA9IGgyIC8gMiB8IDA7aDI7IGgyID0gaDIgPj4+IDEpCiAgICAgICAgICB1Kys7CiAgICAgICAgcmV0dXJuIDEgPDwgdSArIDEgKyBzOwogICAgICB9LCBOLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmICghKGgyIDw9IDEpKQogICAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGgyIC8gMjsgcysrKSB7CiAgICAgICAgICAgIHZhciB1ID0gaVtzXTsKICAgICAgICAgICAgaVtzXSA9IGlbaDIgLSBzIC0gMV0sIGlbaDIgLSBzIC0gMV0gPSB1LCB1ID0gYVtzXSwgYVtzXSA9IC1hW2gyIC0gcyAtIDFdLCBhW2gyIC0gcyAtIDFdID0gLXU7CiAgICAgICAgICB9CiAgICAgIH0sIE4ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBmb3IgKHZhciBoMiA9IDAsIHMgPSAwO3MgPCBhIC8gMjsgcysrKSB7CiAgICAgICAgICB2YXIgdSA9IE1hdGgucm91bmQoaVsyICogcyArIDFdIC8gYSkgKiA4MTkyICsgTWF0aC5yb3VuZChpWzIgKiBzXSAvIGEpICsgaDI7CiAgICAgICAgICBpW3NdID0gdSAmIDY3MTA4ODYzLCB1IDwgNjcxMDg4NjQgPyBoMiA9IDAgOiBoMiA9IHUgLyA2NzEwODg2NCB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9LCBOLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24oaSwgYSwgaDIsIHMpIHsKICAgICAgICBmb3IgKHZhciB1ID0gMCwgYyA9IDA7YyA8IGE7IGMrKykKICAgICAgICAgIHUgPSB1ICsgKGlbY10gfCAwKSwgaDJbMiAqIGNdID0gdSAmIDgxOTEsIHUgPSB1ID4+PiAxMywgaDJbMiAqIGMgKyAxXSA9IHUgJiA4MTkxLCB1ID0gdSA+Pj4gMTM7CiAgICAgICAgZm9yIChjID0gMiAqIGE7YyA8IHM7ICsrYykKICAgICAgICAgIGgyW2NdID0gMDsKICAgICAgICByKHUgPT09IDApLCByKCh1ICYgLTgxOTIpID09PSAwKTsKICAgICAgfSwgTi5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gbmV3IEFycmF5KGkpLCBoMiA9IDA7aDIgPCBpOyBoMisrKQogICAgICAgICAgYVtoMl0gPSAwOwogICAgICAgIHJldHVybiBhOwogICAgICB9LCBOLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKGkubGVuZ3RoLCBhLmxlbmd0aCksIHUgPSB0aGlzLm1ha2VSQlQocyksIGMgPSB0aGlzLnN0dWIocyksIGIyID0gbmV3IEFycmF5KHMpLCBsID0gbmV3IEFycmF5KHMpLCBuID0gbmV3IEFycmF5KHMpLCBkID0gbmV3IEFycmF5KHMpLCB3ID0gbmV3IEFycmF5KHMpLCBnID0gbmV3IEFycmF5KHMpLCBfMiA9IGgyLndvcmRzOwogICAgICAgIF8yLmxlbmd0aCA9IHMsIHRoaXMuY29udmVydDEzYihpLndvcmRzLCBpLmxlbmd0aCwgYjIsIHMpLCB0aGlzLmNvbnZlcnQxM2IoYS53b3JkcywgYS5sZW5ndGgsIGQsIHMpLCB0aGlzLnRyYW5zZm9ybShiMiwgYywgbCwgbiwgcywgdSksIHRoaXMudHJhbnNmb3JtKGQsIGMsIHcsIGcsIHMsIHUpOwogICAgICAgIGZvciAodmFyIEEyID0gMDtBMiA8IHM7IEEyKyspIHsKICAgICAgICAgIHZhciBSMiA9IGxbQTJdICogd1tBMl0gLSBuW0EyXSAqIGdbQTJdOwogICAgICAgICAgbltBMl0gPSBsW0EyXSAqIGdbQTJdICsgbltBMl0gKiB3W0EyXSwgbFtBMl0gPSBSMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKGwsIG4sIHMpLCB0aGlzLnRyYW5zZm9ybShsLCBuLCBfMiwgYywgcywgdSksIHRoaXMuY29uanVnYXRlKF8yLCBjLCBzKSwgdGhpcy5ub3JtYWxpemUxM2IoXzIsIHMpLCBoMi5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiBhLm5lZ2F0aXZlLCBoMi5sZW5ndGggPSBpLmxlbmd0aCArIGEubGVuZ3RoLCBoMi5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gYS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIGkubGVuZ3RoKSwgdGhpcy5tdWxUbyhpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBhLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgaS5sZW5ndGgpLCBfZSh0aGlzLCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKGksIHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IDA7aDIgPCB0aGlzLmxlbmd0aDsgaDIrKykgewogICAgICAgICAgdmFyIHMgPSAodGhpcy53b3Jkc1toMl0gfCAwKSAqIGksIHUgPSAocyAmIDY3MTA4ODYzKSArIChhICYgNjcxMDg4NjMpOwogICAgICAgICAgYSA+Pj0gMjYsIGEgKz0gcyAvIDY3MTA4ODY0IHwgMCwgYSArPSB1ID4+PiAyNiwgdGhpcy53b3Jkc1toMl0gPSB1ICYgNjcxMDg4NjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhICE9PSAwICYmICh0aGlzLndvcmRzW2gyXSA9IGEsIHRoaXMubGVuZ3RoKyspLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gQihpKTsKICAgICAgICBpZiAoYS5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gbmV3IGYoMSk7CiAgICAgICAgZm9yICh2YXIgaDIgPSB0aGlzLCBzID0gMDtzIDwgYS5sZW5ndGggJiYgYVtzXSA9PT0gMDsgcysrLCBoMiA9IGgyLnNxcigpKQogICAgICAgICAgOwogICAgICAgIGlmICgrK3MgPCBhLmxlbmd0aCkKICAgICAgICAgIGZvciAodmFyIHUgPSBoMi5zcXIoKTtzIDwgYS5sZW5ndGg7IHMrKywgdSA9IHUuc3FyKCkpCiAgICAgICAgICAgIGFbc10gIT09IDAgJiYgKGgyID0gaDIubXVsKHUpKTsKICAgICAgICByZXR1cm4gaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2LCBzID0gNjcxMDg4NjMgPj4+IDI2IC0gYSA8PCAyNiAtIGEsIHU7CiAgICAgICAgaWYgKGEgIT09IDApIHsKICAgICAgICAgIHZhciBjID0gMDsKICAgICAgICAgIGZvciAodSA9IDA7dSA8IHRoaXMubGVuZ3RoOyB1KyspIHsKICAgICAgICAgICAgdmFyIGIyID0gdGhpcy53b3Jkc1t1XSAmIHMsIGwgPSAodGhpcy53b3Jkc1t1XSB8IDApIC0gYjIgPDwgYTsKICAgICAgICAgICAgdGhpcy53b3Jkc1t1XSA9IGwgfCBjLCBjID0gYjIgPj4+IDI2IC0gYTsKICAgICAgICAgIH0KICAgICAgICAgIGMgJiYgKHRoaXMud29yZHNbdV0gPSBjLCB0aGlzLmxlbmd0aCsrKTsKICAgICAgICB9CiAgICAgICAgaWYgKGgyICE9PSAwKSB7CiAgICAgICAgICBmb3IgKHUgPSB0aGlzLmxlbmd0aCAtIDE7dSA+PSAwOyB1LS0pCiAgICAgICAgICAgIHRoaXMud29yZHNbdSArIGgyXSA9IHRoaXMud29yZHNbdV07CiAgICAgICAgICBmb3IgKHUgPSAwO3UgPCBoMjsgdSsrKQogICAgICAgICAgICB0aGlzLndvcmRzW3VdID0gMDsKICAgICAgICAgIHRoaXMubGVuZ3RoICs9IGgyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBzOwogICAgICAgIGEgPyBzID0gKGEgLSBhICUgMjYpIC8gMjYgOiBzID0gMDsKICAgICAgICB2YXIgdSA9IGkgJSAyNiwgYyA9IE1hdGgubWluKChpIC0gdSkgLyAyNiwgdGhpcy5sZW5ndGgpLCBiMiA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IHUgPDwgdSwgbCA9IGgyOwogICAgICAgIGlmIChzIC09IGMsIHMgPSBNYXRoLm1heCgwLCBzKSwgbCkgewogICAgICAgICAgZm9yICh2YXIgbiA9IDA7biA8IGM7IG4rKykKICAgICAgICAgICAgbC53b3Jkc1tuXSA9IHRoaXMud29yZHNbbl07CiAgICAgICAgICBsLmxlbmd0aCA9IGM7CiAgICAgICAgfQogICAgICAgIGlmIChjICE9PSAwKQogICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gYykKICAgICAgICAgICAgZm9yICh0aGlzLmxlbmd0aCAtPSBjLCBuID0gMDtuIDwgdGhpcy5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICB0aGlzLndvcmRzW25dID0gdGhpcy53b3Jkc1tuICsgY107CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAwLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGQgPSAwOwogICAgICAgIGZvciAobiA9IHRoaXMubGVuZ3RoIC0gMTtuID49IDAgJiYgKGQgIT09IDAgfHwgbiA+PSBzKTsgbi0tKSB7CiAgICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbbl0gfCAwOwogICAgICAgICAgdGhpcy53b3Jkc1tuXSA9IGQgPDwgMjYgLSB1IHwgdyA+Pj4gdSwgZCA9IHcgJiBiMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGwgJiYgZCAhPT0gMCAmJiAobC53b3Jkc1tsLmxlbmd0aCsrXSA9IGQpLCB0aGlzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMSksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHJldHVybiByKHRoaXMubmVnYXRpdmUgPT09IDApLCB0aGlzLml1c2hybihpLCBhLCBoMik7CiAgICAgIH0sIGYucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjYsIHMgPSAxIDw8IGE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDw9IGgyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciB1ID0gdGhpcy53b3Jkc1toMl07CiAgICAgICAgcmV0dXJuICEhKHUgJiBzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjY7CiAgICAgICAgaWYgKHIodGhpcy5uZWdhdGl2ZSA9PT0gMCwgImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycyIpLCB0aGlzLmxlbmd0aCA8PSBoMikKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIGlmIChhICE9PSAwICYmIGgyKyssIHRoaXMubGVuZ3RoID0gTWF0aC5taW4oaDIsIHRoaXMubGVuZ3RoKSwgYSAhPT0gMCkgewogICAgICAgICAgdmFyIHMgPSA2NzEwODg2MyBeIDY3MTA4ODYzID4+PiBhIDw8IGE7CiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpLCBpIDwgMCA/IHRoaXMuaXN1Ym4oLWkpIDogdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBpID8gKHRoaXMud29yZHNbMF0gPSBpIC0gKHRoaXMud29yZHNbMF0gfCAwKSwgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMpIDogKHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlzdWJuKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcykgOiB0aGlzLl9pYWRkbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHRoaXMud29yZHNbMF0gKz0gaTsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1thXSA+PSA2NzEwODg2NDsgYSsrKQogICAgICAgICAgdGhpcy53b3Jkc1thXSAtPSA2NzEwODg2NCwgYSA9PT0gdGhpcy5sZW5ndGggLSAxID8gdGhpcy53b3Jkc1thICsgMV0gPSAxIDogdGhpcy53b3Jkc1thICsgMV0rKzsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgYSArIDEpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAocih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KSwgaSA8IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5pYWRkbigtaSk7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaWFkZG4oaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzOwogICAgICAgIGlmICh0aGlzLndvcmRzWzBdIC09IGksIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKQogICAgICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdLCB0aGlzLm5lZ2F0aXZlID0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1thXSA8IDA7IGErKykKICAgICAgICAgICAgdGhpcy53b3Jkc1thXSArPSA2NzEwODg2NCwgdGhpcy53b3Jkc1thICsgMV0gLT0gMTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSBpLmxlbmd0aCArIGgyLCB1OwogICAgICAgIHRoaXMuX2V4cGFuZChzKTsKICAgICAgICB2YXIgYywgYjIgPSAwOwogICAgICAgIGZvciAodSA9IDA7dSA8IGkubGVuZ3RoOyB1KyspIHsKICAgICAgICAgIGMgPSAodGhpcy53b3Jkc1t1ICsgaDJdIHwgMCkgKyBiMjsKICAgICAgICAgIHZhciBsID0gKGkud29yZHNbdV0gfCAwKSAqIGE7CiAgICAgICAgICBjIC09IGwgJiA2NzEwODg2MywgYjIgPSAoYyA+PiAyNikgLSAobCAvIDY3MTA4ODY0IHwgMCksIHRoaXMud29yZHNbdSArIGgyXSA9IGMgJiA2NzEwODg2MzsKICAgICAgICB9CiAgICAgICAgZm9yICg7dSA8IHRoaXMubGVuZ3RoIC0gaDI7IHUrKykKICAgICAgICAgIGMgPSAodGhpcy53b3Jkc1t1ICsgaDJdIHwgMCkgKyBiMiwgYjIgPSBjID4+IDI2LCB0aGlzLndvcmRzW3UgKyBoMl0gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgaWYgKGIyID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgICBmb3IgKHIoYjIgPT09IC0xKSwgYjIgPSAwLCB1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykKICAgICAgICAgIGMgPSAtKHRoaXMud29yZHNbdV0gfCAwKSArIGIyLCBiMiA9IGMgPj4gMjYsIHRoaXMud29yZHNbdV0gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMiA9IHRoaXMubGVuZ3RoIC0gaS5sZW5ndGgsIHMgPSB0aGlzLmNsb25lKCksIHUgPSBpLCBjID0gdS53b3Jkc1t1Lmxlbmd0aCAtIDFdIHwgMCwgYjIgPSB0aGlzLl9jb3VudEJpdHMoYyk7CiAgICAgICAgaDIgPSAyNiAtIGIyLCBoMiAhPT0gMCAmJiAodSA9IHUudXNobG4oaDIpLCBzLml1c2hsbihoMiksIGMgPSB1LndvcmRzW3UubGVuZ3RoIC0gMV0gfCAwKTsKICAgICAgICB2YXIgbCA9IHMubGVuZ3RoIC0gdS5sZW5ndGgsIG47CiAgICAgICAgaWYgKGEgIT09ICJtb2QiKSB7CiAgICAgICAgICBuID0gbmV3IGYobnVsbCksIG4ubGVuZ3RoID0gbCArIDEsIG4ud29yZHMgPSBuZXcgQXJyYXkobi5sZW5ndGgpOwogICAgICAgICAgZm9yICh2YXIgZCA9IDA7ZCA8IG4ubGVuZ3RoOyBkKyspCiAgICAgICAgICAgIG4ud29yZHNbZF0gPSAwOwogICAgICAgIH0KICAgICAgICB2YXIgdyA9IHMuY2xvbmUoKS5faXNobG5zdWJtdWwodSwgMSwgbCk7CiAgICAgICAgdy5uZWdhdGl2ZSA9PT0gMCAmJiAocyA9IHcsIG4gJiYgKG4ud29yZHNbbF0gPSAxKSk7CiAgICAgICAgZm9yICh2YXIgZyA9IGwgLSAxO2cgPj0gMDsgZy0tKSB7CiAgICAgICAgICB2YXIgXzIgPSAocy53b3Jkc1t1Lmxlbmd0aCArIGddIHwgMCkgKiA2NzEwODg2NCArIChzLndvcmRzW3UubGVuZ3RoICsgZyAtIDFdIHwgMCk7CiAgICAgICAgICBmb3IgKF8yID0gTWF0aC5taW4oXzIgLyBjIHwgMCwgNjcxMDg4NjMpLCBzLl9pc2hsbnN1Ym11bCh1LCBfMiwgZyk7cy5uZWdhdGl2ZSAhPT0gMDsgKQogICAgICAgICAgICBfMi0tLCBzLm5lZ2F0aXZlID0gMCwgcy5faXNobG5zdWJtdWwodSwgMSwgZyksIHMuaXNaZXJvKCkgfHwgKHMubmVnYXRpdmUgXj0gMSk7CiAgICAgICAgICBuICYmIChuLndvcmRzW2ddID0gXzIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiAmJiBuLnN0cmlwKCksIHMuc3RyaXAoKSwgYSAhPT0gImRpdiIgJiYgaDIgIT09IDAgJiYgcy5pdXNocm4oaDIpLCB7IGRpdjogbiB8fCBudWxsLCBtb2Q6IHMgfTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAocighaS5pc1plcm8oKSksIHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4geyBkaXY6IG5ldyBmKDApLCBtb2Q6IG5ldyBmKDApIH07CiAgICAgICAgdmFyIHMsIHUsIGM7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCA/IChjID0gdGhpcy5uZWcoKS5kaXZtb2QoaSwgYSksIGEgIT09ICJtb2QiICYmIChzID0gYy5kaXYubmVnKCkpLCBhICE9PSAiZGl2IiAmJiAodSA9IGMubW9kLm5lZygpLCBoMiAmJiB1Lm5lZ2F0aXZlICE9PSAwICYmIHUuaWFkZChpKSksIHsgZGl2OiBzLCBtb2Q6IHUgfSkgOiB0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDAgPyAoYyA9IHRoaXMuZGl2bW9kKGkubmVnKCksIGEpLCBhICE9PSAibW9kIiAmJiAocyA9IGMuZGl2Lm5lZygpKSwgeyBkaXY6IHMsIG1vZDogYy5tb2QgfSkgOiAodGhpcy5uZWdhdGl2ZSAmIGkubmVnYXRpdmUpICE9PSAwID8gKGMgPSB0aGlzLm5lZygpLmRpdm1vZChpLm5lZygpLCBhKSwgYSAhPT0gImRpdiIgJiYgKHUgPSBjLm1vZC5uZWcoKSwgaDIgJiYgdS5uZWdhdGl2ZSAhPT0gMCAmJiB1LmlzdWIoaSkpLCB7IGRpdjogYy5kaXYsIG1vZDogdSB9KSA6IGkubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAoaSkgPCAwID8geyBkaXY6IG5ldyBmKDApLCBtb2Q6IHRoaXMgfSA6IGkubGVuZ3RoID09PSAxID8gYSA9PT0gImRpdiIgPyB7IGRpdjogdGhpcy5kaXZuKGkud29yZHNbMF0pLCBtb2Q6IG51bGwgfSA6IGEgPT09ICJtb2QiID8geyBkaXY6IG51bGwsIG1vZDogbmV3IGYodGhpcy5tb2RuKGkud29yZHNbMF0pKSB9IDogeyBkaXY6IHRoaXMuZGl2bihpLndvcmRzWzBdKSwgbW9kOiBuZXcgZih0aGlzLm1vZG4oaS53b3Jkc1swXSkpIH0gOiB0aGlzLl93b3JkRGl2KGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJkaXYiLCBmYWxzZSkuZGl2OwogICAgICB9LCBmLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJtb2QiLCBmYWxzZSkubW9kOwogICAgICB9LCBmLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAibW9kIiwgdHJ1ZSkubW9kOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuZGl2bW9kKGkpOwogICAgICAgIGlmIChhLm1vZC5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBhLmRpdjsKICAgICAgICB2YXIgaDIgPSBhLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGEubW9kLmlzdWIoaSkgOiBhLm1vZCwgcyA9IGkudXNocm4oMSksIHUgPSBpLmFuZGxuKDEpLCBjID0gaDIuY21wKHMpOwogICAgICAgIHJldHVybiBjIDwgMCB8fCB1ID09PSAxICYmIGMgPT09IDAgPyBhLmRpdiA6IGEuZGl2Lm5lZ2F0aXZlICE9PSAwID8gYS5kaXYuaXN1Ym4oMSkgOiBhLmRpdi5pYWRkbigxKTsKICAgICAgfSwgZi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkgPD0gNjcxMDg4NjMpOwogICAgICAgIGZvciAodmFyIGEgPSAoMSA8PCAyNikgJSBpLCBoMiA9IDAsIHMgPSB0aGlzLmxlbmd0aCAtIDE7cyA+PSAwOyBzLS0pCiAgICAgICAgICBoMiA9IChhICogaDIgKyAodGhpcy53b3Jkc1tzXSB8IDApKSAlIGk7CiAgICAgICAgcmV0dXJuIGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkgPD0gNjcxMDg4NjMpOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IHRoaXMubGVuZ3RoIC0gMTtoMiA+PSAwOyBoMi0tKSB7CiAgICAgICAgICB2YXIgcyA9ICh0aGlzLndvcmRzW2gyXSB8IDApICsgYSAqIDY3MTA4ODY0OwogICAgICAgICAgdGhpcy53b3Jkc1toMl0gPSBzIC8gaSB8IDAsIGEgPSBzICUgaTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCksIHIoIWkuaXNaZXJvKCkpOwogICAgICAgIHZhciBhID0gdGhpcywgaDIgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSAhPT0gMCA/IGEgPSBhLnVtb2QoaSkgOiBhID0gYS5jbG9uZSgpOwogICAgICAgIGZvciAodmFyIHMgPSBuZXcgZigxKSwgdSA9IG5ldyBmKDApLCBjID0gbmV3IGYoMCksIGIyID0gbmV3IGYoMSksIGwgPSAwO2EuaXNFdmVuKCkgJiYgaDIuaXNFdmVuKCk7ICkKICAgICAgICAgIGEuaXVzaHJuKDEpLCBoMi5pdXNocm4oMSksICsrbDsKICAgICAgICBmb3IgKHZhciBuID0gaDIuY2xvbmUoKSwgZCA9IGEuY2xvbmUoKTshYS5pc1plcm8oKTsgKSB7CiAgICAgICAgICBmb3IgKHZhciB3ID0gMCwgZyA9IDE7KGEud29yZHNbMF0gJiBnKSA9PT0gMCAmJiB3IDwgMjY7ICsrdywgZyA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKHcgPiAwKQogICAgICAgICAgICBmb3IgKGEuaXVzaHJuKHcpO3ctLSA+IDA7ICkKICAgICAgICAgICAgICAocy5pc09kZCgpIHx8IHUuaXNPZGQoKSkgJiYgKHMuaWFkZChuKSwgdS5pc3ViKGQpKSwgcy5pdXNocm4oMSksIHUuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICh2YXIgXzIgPSAwLCBBMiA9IDE7KGgyLndvcmRzWzBdICYgQTIpID09PSAwICYmIF8yIDwgMjY7ICsrXzIsIEEyIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAoXzIgPiAwKQogICAgICAgICAgICBmb3IgKGgyLml1c2hybihfMik7XzItLSA+IDA7ICkKICAgICAgICAgICAgICAoYy5pc09kZCgpIHx8IGIyLmlzT2RkKCkpICYmIChjLmlhZGQobiksIGIyLmlzdWIoZCkpLCBjLml1c2hybigxKSwgYjIuaXVzaHJuKDEpOwogICAgICAgICAgYS5jbXAoaDIpID49IDAgPyAoYS5pc3ViKGgyKSwgcy5pc3ViKGMpLCB1LmlzdWIoYjIpKSA6IChoMi5pc3ViKGEpLCBjLmlzdWIocyksIGIyLmlzdWIodSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBhOiBjLCBiOiBiMiwgZ2NkOiBoMi5pdXNobG4obCkgfTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCksIHIoIWkuaXNaZXJvKCkpOwogICAgICAgIHZhciBhID0gdGhpcywgaDIgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSAhPT0gMCA/IGEgPSBhLnVtb2QoaSkgOiBhID0gYS5jbG9uZSgpOwogICAgICAgIGZvciAodmFyIHMgPSBuZXcgZigxKSwgdSA9IG5ldyBmKDApLCBjID0gaDIuY2xvbmUoKTthLmNtcG4oMSkgPiAwICYmIGgyLmNtcG4oMSkgPiAwOyApIHsKICAgICAgICAgIGZvciAodmFyIGIyID0gMCwgbCA9IDE7KGEud29yZHNbMF0gJiBsKSA9PT0gMCAmJiBiMiA8IDI2OyArK2IyLCBsIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAoYjIgPiAwKQogICAgICAgICAgICBmb3IgKGEuaXVzaHJuKGIyKTtiMi0tID4gMDsgKQogICAgICAgICAgICAgIHMuaXNPZGQoKSAmJiBzLmlhZGQoYyksIHMuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICh2YXIgbiA9IDAsIGQgPSAxOyhoMi53b3Jkc1swXSAmIGQpID09PSAwICYmIG4gPCAyNjsgKytuLCBkIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAobiA+IDApCiAgICAgICAgICAgIGZvciAoaDIuaXVzaHJuKG4pO24tLSA+IDA7ICkKICAgICAgICAgICAgICB1LmlzT2RkKCkgJiYgdS5pYWRkKGMpLCB1Lml1c2hybigxKTsKICAgICAgICAgIGEuY21wKGgyKSA+PSAwID8gKGEuaXN1YihoMiksIHMuaXN1Yih1KSkgOiAoaDIuaXN1YihhKSwgdS5pc3ViKHMpKTsKICAgICAgICB9CiAgICAgICAgdmFyIHc7CiAgICAgICAgcmV0dXJuIGEuY21wbigxKSA9PT0gMCA/IHcgPSBzIDogdyA9IHUsIHcuY21wbigwKSA8IDAgJiYgdy5pYWRkKGkpLCB3OwogICAgICB9LCBmLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS5hYnMoKTsKICAgICAgICBpZiAoaS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiB0aGlzLmFicygpOwogICAgICAgIHZhciBhID0gdGhpcy5jbG9uZSgpLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlID0gMCwgaDIubmVnYXRpdmUgPSAwOwogICAgICAgIGZvciAodmFyIHMgPSAwO2EuaXNFdmVuKCkgJiYgaDIuaXNFdmVuKCk7IHMrKykKICAgICAgICAgIGEuaXVzaHJuKDEpLCBoMi5pdXNocm4oMSk7CiAgICAgICAgZG8gewogICAgICAgICAgZm9yICg7YS5pc0V2ZW4oKTsgKQogICAgICAgICAgICBhLml1c2hybigxKTsKICAgICAgICAgIGZvciAoO2gyLmlzRXZlbigpOyApCiAgICAgICAgICAgIGgyLml1c2hybigxKTsKICAgICAgICAgIHZhciB1ID0gYS5jbXAoaDIpOwogICAgICAgICAgaWYgKHUgPCAwKSB7CiAgICAgICAgICAgIHZhciBjID0gYTsKICAgICAgICAgICAgYSA9IGgyLCBoMiA9IGM7CiAgICAgICAgICB9IGVsc2UgaWYgKHUgPT09IDAgfHwgaDIuY21wbigxKSA9PT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBhLmlzdWIoaDIpOwogICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgIHJldHVybiBoMi5pdXNobG4ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWdjZChpKS5hLnVtb2QoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIpOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNiwgcyA9IDEgPDwgYTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gaDIpCiAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKGgyICsgMSksIHRoaXMud29yZHNbaDJdIHw9IHMsIHRoaXM7CiAgICAgICAgZm9yICh2YXIgdSA9IHMsIGMgPSBoMjt1ICE9PSAwICYmIGMgPCB0aGlzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICB2YXIgYjIgPSB0aGlzLndvcmRzW2NdIHwgMDsKICAgICAgICAgIGIyICs9IHUsIHUgPSBiMiA+Pj4gMjYsIGIyICY9IDY3MTA4ODYzLCB0aGlzLndvcmRzW2NdID0gYjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1ICE9PSAwICYmICh0aGlzLndvcmRzW2NdID0gdSwgdGhpcy5sZW5ndGgrKyksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSA8IDA7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIWEpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgYSkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgICB2YXIgaDI7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMSkKICAgICAgICAgIGgyID0gMTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGEgJiYgKGkgPSAtaSksIHIoaSA8PSA2NzEwODg2MywgIk51bWJlciBpcyB0b28gYmlnIik7CiAgICAgICAgICB2YXIgcyA9IHRoaXMud29yZHNbMF0gfCAwOwogICAgICAgICAgaDIgPSBzID09PSBpID8gMCA6IHMgPCBpID8gLTEgOiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1oMiB8IDAgOiBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDApCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIHZhciBhID0gdGhpcy51Y21wKGkpOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWEgfCAwIDogYTsKICAgICAgfSwgZi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBpLmxlbmd0aCkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IGkubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IHRoaXMubGVuZ3RoIC0gMTtoMiA+PSAwOyBoMi0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMud29yZHNbaDJdIHwgMCwgdSA9IGkud29yZHNbaDJdIHwgMDsKICAgICAgICAgIGlmIChzICE9PSB1KSB7CiAgICAgICAgICAgIHMgPCB1ID8gYSA9IC0xIDogcyA+IHUgJiYgKGEgPSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9LCBmLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPj0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA+PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA8PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpIDw9IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IDA7CiAgICAgIH0sIGYucmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBuZXcgUChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoIXRoaXMucmVkLCAiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCByKHRoaXMubmVnYXRpdmUgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCBpLmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWQgPSBpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsICJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHRoaXMuX2ZvcmNlUmVkKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmFkZCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmlhZGQodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuc3ViKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuaXN1Yih0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5zaGwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgaSksIHRoaXMucmVkLm11bCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgaSksIHRoaXMucmVkLmltdWwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FyKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuaXNxcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnNxcnQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pbnZtKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLm5lZyh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkICYmICFpLnJlZCwgInJlZFBvdyhub3JtYWxOdW0pIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5wb3codGhpcywgaSk7CiAgICAgIH07CiAgICAgIHZhciB3ZSA9IHsgazI1NjogbnVsbCwgcDIyNDogbnVsbCwgcDE5MjogbnVsbCwgcDI1NTE5OiBudWxsIH07CiAgICAgIGZ1bmN0aW9uIHllKHYsIGkpIHsKICAgICAgICB0aGlzLm5hbWUgPSB2LCB0aGlzLnAgPSBuZXcgZihpLCAxNiksIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKSwgdGhpcy5rID0gbmV3IGYoMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLCB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpOwogICAgICB9CiAgICAgIHllLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gaS53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKSwgaTsKICAgICAgfSwgeWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLCBoMjsKICAgICAgICBkbwogICAgICAgICAgdGhpcy5zcGxpdChhLCB0aGlzLnRtcCksIGEgPSB0aGlzLmltdWxLKGEpLCBhID0gYS5pYWRkKHRoaXMudG1wKSwgaDIgPSBhLmJpdExlbmd0aCgpOwogICAgICAgIHdoaWxlIChoMiA+IHRoaXMubik7CiAgICAgICAgdmFyIHMgPSBoMiA8IHRoaXMubiA/IC0xIDogYS51Y21wKHRoaXMucCk7CiAgICAgICAgcmV0dXJuIHMgPT09IDAgPyAoYS53b3Jkc1swXSA9IDAsIGEubGVuZ3RoID0gMSkgOiBzID4gMCA/IGEuaXN1Yih0aGlzLnApIDogYS5zdHJpcCAhPT0gdW5kZWZpbmVkID8gYS5zdHJpcCgpIDogYS5fc3RyaXAoKSwgYTsKICAgICAgfSwgeWUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGkuaXVzaHJuKHRoaXMubiwgMCwgYSk7CiAgICAgIH0sIHllLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaS5pbXVsKHRoaXMuayk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHhlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgImsyNTYiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYiKTsKICAgICAgfQogICAgICBvKHhlLCB5ZSksIHhlLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBmb3IgKHZhciBoMiA9IDQxOTQzMDMsIHMgPSBNYXRoLm1pbihpLmxlbmd0aCwgOSksIHUgPSAwO3UgPCBzOyB1KyspCiAgICAgICAgICBhLndvcmRzW3VdID0gaS53b3Jkc1t1XTsKICAgICAgICBpZiAoYS5sZW5ndGggPSBzLCBpLmxlbmd0aCA8PSA5KSB7CiAgICAgICAgICBpLndvcmRzWzBdID0gMCwgaS5sZW5ndGggPSAxOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgYyA9IGkud29yZHNbOV07CiAgICAgICAgZm9yIChhLndvcmRzW2EubGVuZ3RoKytdID0gYyAmIGgyLCB1ID0gMTA7dSA8IGkubGVuZ3RoOyB1KyspIHsKICAgICAgICAgIHZhciBiMiA9IGkud29yZHNbdV0gfCAwOwogICAgICAgICAgaS53b3Jkc1t1IC0gMTBdID0gKGIyICYgaDIpIDw8IDQgfCBjID4+PiAyMiwgYyA9IGIyOwogICAgICAgIH0KICAgICAgICBjID4+Pj0gMjIsIGkud29yZHNbdSAtIDEwXSA9IGMsIGMgPT09IDAgJiYgaS5sZW5ndGggPiAxMCA/IGkubGVuZ3RoIC09IDEwIDogaS5sZW5ndGggLT0gOTsKICAgICAgfSwgeGUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIGkud29yZHNbaS5sZW5ndGhdID0gMCwgaS53b3Jkc1tpLmxlbmd0aCArIDFdID0gMCwgaS5sZW5ndGggKz0gMjsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSAwO2gyIDwgaS5sZW5ndGg7IGgyKyspIHsKICAgICAgICAgIHZhciBzID0gaS53b3Jkc1toMl0gfCAwOwogICAgICAgICAgYSArPSBzICogOTc3LCBpLndvcmRzW2gyXSA9IGEgJiA2NzEwODg2MywgYSA9IHMgKiA2NCArIChhIC8gNjcxMDg4NjQgfCAwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkud29yZHNbaS5sZW5ndGggLSAxXSA9PT0gMCAmJiAoaS5sZW5ndGgtLSwgaS53b3Jkc1tpLmxlbmd0aCAtIDFdID09PSAwICYmIGkubGVuZ3RoLS0pLCBpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBSZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJwMjI0IiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIik7CiAgICAgIH0KICAgICAgbyhSZSwgeWUpOwogICAgICBmdW5jdGlvbiBFZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJwMTkyIiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIik7CiAgICAgIH0KICAgICAgbyhFZSwgeWUpOwogICAgICBmdW5jdGlvbiBBZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICIyNTUxOSIsICI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIik7CiAgICAgIH0KICAgICAgbyhBZSwgeWUpLCBBZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gMDtoMiA8IGkubGVuZ3RoOyBoMisrKSB7CiAgICAgICAgICB2YXIgcyA9IChpLndvcmRzW2gyXSB8IDApICogMTkgKyBhLCB1ID0gcyAmIDY3MTA4ODYzOwogICAgICAgICAgcyA+Pj49IDI2LCBpLndvcmRzW2gyXSA9IHUsIGEgPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYSAhPT0gMCAmJiAoaS53b3Jkc1tpLmxlbmd0aCsrXSA9IGEpLCBpOwogICAgICB9LCBmLl9wcmltZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAod2VbaV0pCiAgICAgICAgICByZXR1cm4gd2VbaV07CiAgICAgICAgdmFyIGE7CiAgICAgICAgaWYgKGkgPT09ICJrMjU2IikKICAgICAgICAgIGEgPSBuZXcgeGU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAyMjQiKQogICAgICAgICAgYSA9IG5ldyBSZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDE5MiIpCiAgICAgICAgICBhID0gbmV3IEVlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMjU1MTkiKQogICAgICAgICAgYSA9IG5ldyBBZTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcHJpbWUgIiArIGkpOwogICAgICAgIHJldHVybiB3ZVtpXSA9IGEsIGE7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFAodikgewogICAgICAgIGlmICh0eXBlb2YgdiA9PSAic3RyaW5nIikgewogICAgICAgICAgdmFyIGkgPSBmLl9wcmltZSh2KTsKICAgICAgICAgIHRoaXMubSA9IGkucCwgdGhpcy5wcmltZSA9IGk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICByKHYuZ3RuKDEpLCAibW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIiksIHRoaXMubSA9IHYsIHRoaXMucHJpbWUgPSBudWxsOwogICAgICB9CiAgICAgIFAucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIHIoaS5yZWQsICJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIik7CiAgICAgIH0sIFAucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHIoKGkubmVnYXRpdmUgfCBhLm5lZ2F0aXZlKSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIHIoaS5yZWQgJiYgaS5yZWQgPT09IGEucmVkLCAicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpOwogICAgICB9LCBQLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnByaW1lID8gdGhpcy5wcmltZS5pcmVkdWNlKGkpLl9mb3JjZVJlZCh0aGlzKSA6IGkudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpLmlzWmVybygpID8gaS5jbG9uZSgpIDogdGhpcy5tLnN1YihpKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuYWRkKGEpOwogICAgICAgIHJldHVybiBoMi5jbXAodGhpcy5tKSA+PSAwICYmIGgyLmlzdWIodGhpcy5tKSwgaDIuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5pYWRkKGEpOwogICAgICAgIHJldHVybiBoMi5jbXAodGhpcy5tKSA+PSAwICYmIGgyLmlzdWIodGhpcy5tKSwgaDI7CiAgICAgIH0sIFAucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuc3ViKGEpOwogICAgICAgIHJldHVybiBoMi5jbXBuKDApIDwgMCAmJiBoMi5pYWRkKHRoaXMubSksIGgyLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuaXN1YihhKTsKICAgICAgICByZXR1cm4gaDIuY21wbigwKSA8IDAgJiYgaDIuaWFkZCh0aGlzLm0pLCBoMjsKICAgICAgfSwgUC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkxKGkpLCB0aGlzLmltb2QoaS51c2hsbihhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoaSwgYSksIHRoaXMuaW1vZChpLmltdWwoYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoaSwgYSksIHRoaXMuaW1vZChpLm11bChhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW11bChpLCBpLmNsb25lKCkpOwogICAgICB9LCBQLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsKGksIGkpOwogICAgICB9LCBQLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkuY2xvbmUoKTsKICAgICAgICB2YXIgYSA9IHRoaXMubS5hbmRsbigzKTsKICAgICAgICBpZiAocihhICUgMiA9PT0gMSksIGEgPT09IDMpIHsKICAgICAgICAgIHZhciBoMiA9IHRoaXMubS5hZGQobmV3IGYoMSkpLml1c2hybigyKTsKICAgICAgICAgIHJldHVybiB0aGlzLnBvdyhpLCBoMik7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHMgPSB0aGlzLm0uc3VibigxKSwgdSA9IDA7IXMuaXNaZXJvKCkgJiYgcy5hbmRsbigxKSA9PT0gMDsgKQogICAgICAgICAgdSsrLCBzLml1c2hybigxKTsKICAgICAgICByKCFzLmlzWmVybygpKTsKICAgICAgICB2YXIgYyA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBiMiA9IGMucmVkTmVnKCksIGwgPSB0aGlzLm0uc3VibigxKS5pdXNocm4oMSksIG4gPSB0aGlzLm0uYml0TGVuZ3RoKCk7CiAgICAgICAgZm9yIChuID0gbmV3IGYoMiAqIG4gKiBuKS50b1JlZCh0aGlzKTt0aGlzLnBvdyhuLCBsKS5jbXAoYjIpICE9PSAwOyApCiAgICAgICAgICBuLnJlZElBZGQoYjIpOwogICAgICAgIGZvciAodmFyIGQgPSB0aGlzLnBvdyhuLCBzKSwgdyA9IHRoaXMucG93KGksIHMuYWRkbigxKS5pdXNocm4oMSkpLCBnID0gdGhpcy5wb3coaSwgcyksIF8yID0gdTtnLmNtcChjKSAhPT0gMDsgKSB7CiAgICAgICAgICBmb3IgKHZhciBBMiA9IGcsIFIyID0gMDtBMi5jbXAoYykgIT09IDA7IFIyKyspCiAgICAgICAgICAgIEEyID0gQTIucmVkU3FyKCk7CiAgICAgICAgICByKFIyIDwgXzIpOwogICAgICAgICAgdmFyIEkgPSB0aGlzLnBvdyhkLCBuZXcgZigxKS5pdXNobG4oXzIgLSBSMiAtIDEpKTsKICAgICAgICAgIHcgPSB3LnJlZE11bChJKSwgZCA9IEkucmVkU3FyKCksIGcgPSBnLnJlZE11bChkKSwgXzIgPSBSMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHc7CiAgICAgIH0sIFAucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLl9pbnZtcCh0aGlzLm0pOwogICAgICAgIHJldHVybiBhLm5lZ2F0aXZlICE9PSAwID8gKGEubmVnYXRpdmUgPSAwLCB0aGlzLmltb2QoYSkucmVkTmVnKCkpIDogdGhpcy5pbW9kKGEpOwogICAgICB9LCBQLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gbmV3IGYoMSkudG9SZWQodGhpcyk7CiAgICAgICAgaWYgKGEuY21wbigxKSA9PT0gMCkKICAgICAgICAgIHJldHVybiBpLmNsb25lKCk7CiAgICAgICAgdmFyIGgyID0gNCwgcyA9IG5ldyBBcnJheSgxIDw8IGgyKTsKICAgICAgICBzWzBdID0gbmV3IGYoMSkudG9SZWQodGhpcyksIHNbMV0gPSBpOwogICAgICAgIGZvciAodmFyIHUgPSAyO3UgPCBzLmxlbmd0aDsgdSsrKQogICAgICAgICAgc1t1XSA9IHRoaXMubXVsKHNbdSAtIDFdLCBpKTsKICAgICAgICB2YXIgYyA9IHNbMF0sIGIyID0gMCwgbCA9IDAsIG4gPSBhLmJpdExlbmd0aCgpICUgMjY7CiAgICAgICAgZm9yIChuID09PSAwICYmIChuID0gMjYpLCB1ID0gYS5sZW5ndGggLSAxO3UgPj0gMDsgdS0tKSB7CiAgICAgICAgICBmb3IgKHZhciBkID0gYS53b3Jkc1t1XSwgdyA9IG4gLSAxO3cgPj0gMDsgdy0tKSB7CiAgICAgICAgICAgIHZhciBnID0gZCA+PiB3ICYgMTsKICAgICAgICAgICAgaWYgKGMgIT09IHNbMF0gJiYgKGMgPSB0aGlzLnNxcihjKSksIGcgPT09IDAgJiYgYjIgPT09IDApIHsKICAgICAgICAgICAgICBsID0gMDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiMiA8PD0gMSwgYjIgfD0gZywgbCsrLCAhKGwgIT09IGgyICYmICh1ICE9PSAwIHx8IHcgIT09IDApKSAmJiAoYyA9IHRoaXMubXVsKGMsIHNbYjJdKSwgbCA9IDAsIGIyID0gMCk7CiAgICAgICAgICB9CiAgICAgICAgICBuID0gMjY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjOwogICAgICB9LCBQLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLnVtb2QodGhpcy5tKTsKICAgICAgICByZXR1cm4gYSA9PT0gaSA/IGEuY2xvbmUoKSA6IGE7CiAgICAgIH0sIFAucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS5jbG9uZSgpOwogICAgICAgIHJldHVybiBhLnJlZCA9IG51bGwsIGE7CiAgICAgIH0sIGYubW9udCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gbmV3IFNlKGkpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBTZSh2KSB7CiAgICAgICAgUC5jYWxsKHRoaXMsIHYpLCB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpLCB0aGlzLnNoaWZ0ICUgMjYgIT09IDAgJiYgKHRoaXMuc2hpZnQgKz0gMjYgLSB0aGlzLnNoaWZ0ICUgMjYpLCB0aGlzLnIgPSBuZXcgZigxKS5pdXNobG4odGhpcy5zaGlmdCksIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKSwgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMuciksIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTsKICAgICAgfQogICAgICBvKFNlLCBQKSwgU2UucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbW9kKGkudXNobG4odGhpcy5zaGlmdCkpOwogICAgICB9LCBTZS5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmltb2QoaS5tdWwodGhpcy5yaW52KSk7CiAgICAgICAgcmV0dXJuIGEucmVkID0gbnVsbCwgYTsKICAgICAgfSwgU2UucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkgfHwgYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLndvcmRzWzBdID0gMCwgaS5sZW5ndGggPSAxLCBpOwogICAgICAgIHZhciBoMiA9IGkuaW11bChhKSwgcyA9IGgyLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSwgdSA9IGgyLmlzdWIocykuaXVzaHJuKHRoaXMuc2hpZnQpLCBjID0gdTsKICAgICAgICByZXR1cm4gdS5jbXAodGhpcy5tKSA+PSAwID8gYyA9IHUuaXN1Yih0aGlzLm0pIDogdS5jbXBuKDApIDwgMCAmJiAoYyA9IHUuaWFkZCh0aGlzLm0pKSwgYy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkgfHwgYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBuZXcgZigwKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgICAgdmFyIGgyID0gaS5tdWwoYSksIHMgPSBoMi5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIHUgPSBoMi5pc3ViKHMpLml1c2hybih0aGlzLnNoaWZ0KSwgYyA9IHU7CiAgICAgICAgcmV0dXJuIHUuY21wKHRoaXMubSkgPj0gMCA/IGMgPSB1LmlzdWIodGhpcy5tKSA6IHUuY21wbigwKSA8IDAgJiYgKGMgPSB1LmlhZGQodGhpcy5tKSksIGMuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBTZS5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuaW1vZChpLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7CiAgICAgICAgcmV0dXJuIGEuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9OwogICAgfSkodHlwZW9mIEd1ID4gInUiIHx8IEd1LCAkbSk7CiAgfSk7CiAgWW0gPSBUMigoR20sIFh1KSA9PiB7CiAgICAoZnVuY3Rpb24odCwgZSkgewogICAgICBmdW5jdGlvbiByKHYsIGkpIHsKICAgICAgICBpZiAoIXYpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaSB8fCAiQXNzZXJ0aW9uIGZhaWxlZCIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG8odiwgaSkgewogICAgICAgIHYuc3VwZXJfID0gaTsKICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIH07CiAgICAgICAgYS5wcm90b3R5cGUgPSBpLnByb3RvdHlwZSwgdi5wcm90b3R5cGUgPSBuZXcgYSwgdi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSB2OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGYodiwgaSwgYSkgewogICAgICAgIGlmIChmLmlzQk4odikpCiAgICAgICAgICByZXR1cm4gdjsKICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy53b3JkcyA9IG51bGwsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5yZWQgPSBudWxsLCB2ICE9PSBudWxsICYmICgoaSA9PT0gImxlIiB8fCBpID09PSAiYmUiKSAmJiAoYSA9IGksIGkgPSAxMCksIHRoaXMuX2luaXQodiB8fCAwLCBpIHx8IDEwLCBhIHx8ICJiZSIpKTsKICAgICAgfQogICAgICB0eXBlb2YgdCA9PSAib2JqZWN0IiA/IHQuZXhwb3J0cyA9IGYgOiBlLkJOID0gZiwgZi5CTiA9IGYsIGYud29yZFNpemUgPSAyNjsKICAgICAgdmFyIHA7CiAgICAgIHRyeSB7CiAgICAgICAgdHlwZW9mIHdpbmRvdyA8ICJ1IiAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciA8ICJ1IiA/IHAgPSB3aW5kb3cuQnVmZmVyIDogcCA9IGppKCkuQnVmZmVyOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgICBmLmlzQk4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkgaW5zdGFuY2VvZiBmID8gdHJ1ZSA6IGkgIT09IG51bGwgJiYgdHlwZW9mIGkgPT0gIm9iamVjdCIgJiYgaS5jb25zdHJ1Y3Rvci53b3JkU2l6ZSA9PT0gZi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KGkud29yZHMpOwogICAgICB9LCBmLm1heCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gaS5jbXAoYSkgPiAwID8gaSA6IGE7CiAgICAgIH0sIGYubWluID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiBpLmNtcChhKSA8IDAgPyBpIDogYTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmICh0eXBlb2YgaSA9PSAibnVtYmVyIikKICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKGksIGEsIGgyKTsKICAgICAgICBpZiAodHlwZW9mIGkgPT0gIm9iamVjdCIpCiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KGksIGEsIGgyKTsKICAgICAgICBhID09PSAiaGV4IiAmJiAoYSA9IDE2KSwgcihhID09PSAoYSB8IDApICYmIGEgPj0gMiAmJiBhIDw9IDM2KSwgaSA9IGkudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywgIiIpOwogICAgICAgIHZhciBzID0gMDsKICAgICAgICBpWzBdID09PSAiLSIgJiYgKHMrKywgdGhpcy5uZWdhdGl2ZSA9IDEpLCBzIDwgaS5sZW5ndGggJiYgKGEgPT09IDE2ID8gdGhpcy5fcGFyc2VIZXgoaSwgcywgaDIpIDogKHRoaXMuX3BhcnNlQmFzZShpLCBhLCBzKSwgaDIgPT09ICJsZSIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBhLCBoMikpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGkgPCAwICYmICh0aGlzLm5lZ2F0aXZlID0gMSwgaSA9IC1pKSwgaSA8IDY3MTA4ODY0ID8gKHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAxKSA6IGkgPCA0NTAzNTk5NjI3MzcwNDk2ID8gKHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzLCBpIC8gNjcxMDg4NjQgJiA2NzEwODg2M10sIHRoaXMubGVuZ3RoID0gMikgOiAocihpIDwgOTAwNzE5OTI1NDc0MDk5MiksIHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzLCBpIC8gNjcxMDg4NjQgJiA2NzEwODg2MywgMV0sIHRoaXMubGVuZ3RoID0gMyksIGgyID09PSAibGUiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYSwgaDIpOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAocih0eXBlb2YgaS5sZW5ndGggPT0gIm51bWJlciIpLCBpLmxlbmd0aCA8PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMSwgdGhpczsKICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChpLmxlbmd0aCAvIDMpLCB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgdGhpcy5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSAwOwogICAgICAgIHZhciB1LCBjLCBiMiA9IDA7CiAgICAgICAgaWYgKGgyID09PSAiYmUiKQogICAgICAgICAgZm9yIChzID0gaS5sZW5ndGggLSAxLCB1ID0gMDtzID49IDA7IHMgLT0gMykKICAgICAgICAgICAgYyA9IGlbc10gfCBpW3MgLSAxXSA8PCA4IHwgaVtzIC0gMl0gPDwgMTYsIHRoaXMud29yZHNbdV0gfD0gYyA8PCBiMiAmIDY3MTA4ODYzLCB0aGlzLndvcmRzW3UgKyAxXSA9IGMgPj4+IDI2IC0gYjIgJiA2NzEwODg2MywgYjIgKz0gMjQsIGIyID49IDI2ICYmIChiMiAtPSAyNiwgdSsrKTsKICAgICAgICBlbHNlIGlmIChoMiA9PT0gImxlIikKICAgICAgICAgIGZvciAocyA9IDAsIHUgPSAwO3MgPCBpLmxlbmd0aDsgcyArPSAzKQogICAgICAgICAgICBjID0gaVtzXSB8IGlbcyArIDFdIDw8IDggfCBpW3MgKyAyXSA8PCAxNiwgdGhpcy53b3Jkc1t1XSB8PSBjIDw8IGIyICYgNjcxMDg4NjMsIHRoaXMud29yZHNbdSArIDFdID0gYyA+Pj4gMjYgLSBiMiAmIDY3MTA4ODYzLCBiMiArPSAyNCwgYjIgPj0gMjYgJiYgKGIyIC09IDI2LCB1KyspOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIG0yKHYsIGkpIHsKICAgICAgICB2YXIgYSA9IHYuY2hhckNvZGVBdChpKTsKICAgICAgICByZXR1cm4gYSA+PSA2NSAmJiBhIDw9IDcwID8gYSAtIDU1IDogYSA+PSA5NyAmJiBhIDw9IDEwMiA/IGEgLSA4NyA6IGEgLSA0OCAmIDE1OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHkyKHYsIGksIGEpIHsKICAgICAgICB2YXIgaDIgPSBtMih2LCBhKTsKICAgICAgICByZXR1cm4gYSAtIDEgPj0gaSAmJiAoaDIgfD0gbTIodiwgYSAtIDEpIDw8IDQpLCBoMjsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChpLmxlbmd0aCAtIGEpIC8gNiksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCB0aGlzLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IDA7CiAgICAgICAgdmFyIHUgPSAwLCBjID0gMCwgYjI7CiAgICAgICAgaWYgKGgyID09PSAiYmUiKQogICAgICAgICAgZm9yIChzID0gaS5sZW5ndGggLSAxO3MgPj0gYTsgcyAtPSAyKQogICAgICAgICAgICBiMiA9IHkyKGksIGEsIHMpIDw8IHUsIHRoaXMud29yZHNbY10gfD0gYjIgJiA2NzEwODg2MywgdSA+PSAxOCA/ICh1IC09IDE4LCBjICs9IDEsIHRoaXMud29yZHNbY10gfD0gYjIgPj4+IDI2KSA6IHUgKz0gODsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBsID0gaS5sZW5ndGggLSBhOwogICAgICAgICAgZm9yIChzID0gbCAlIDIgPT09IDAgPyBhICsgMSA6IGE7cyA8IGkubGVuZ3RoOyBzICs9IDIpCiAgICAgICAgICAgIGIyID0geTIoaSwgYSwgcykgPDwgdSwgdGhpcy53b3Jkc1tjXSB8PSBiMiAmIDY3MTA4ODYzLCB1ID49IDE4ID8gKHUgLT0gMTgsIGMgKz0gMSwgdGhpcy53b3Jkc1tjXSB8PSBiMiA+Pj4gMjYpIDogdSArPSA4OwogICAgICAgIH0KICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIE0odiwgaSwgYSwgaDIpIHsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IE1hdGgubWluKHYubGVuZ3RoLCBhKSwgYyA9IGk7YyA8IHU7IGMrKykgewogICAgICAgICAgdmFyIGIyID0gdi5jaGFyQ29kZUF0KGMpIC0gNDg7CiAgICAgICAgICBzICo9IGgyLCBiMiA+PSA0OSA/IHMgKz0gYjIgLSA0OSArIDEwIDogYjIgPj0gMTcgPyBzICs9IGIyIC0gMTcgKyAxMCA6IHMgKz0gYjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMTsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDE7dSA8PSA2NzEwODg2MzsgdSAqPSBhKQogICAgICAgICAgcysrOwogICAgICAgIHMtLSwgdSA9IHUgLyBhIHwgMDsKICAgICAgICBmb3IgKHZhciBjID0gaS5sZW5ndGggLSBoMiwgYjIgPSBjICUgcywgbCA9IE1hdGgubWluKGMsIGMgLSBiMikgKyBoMiwgbiA9IDAsIGQgPSBoMjtkIDwgbDsgZCArPSBzKQogICAgICAgICAgbiA9IE0oaSwgZCwgZCArIHMsIGEpLCB0aGlzLmltdWxuKHUpLCB0aGlzLndvcmRzWzBdICsgbiA8IDY3MTA4ODY0ID8gdGhpcy53b3Jkc1swXSArPSBuIDogdGhpcy5faWFkZG4obik7CiAgICAgICAgaWYgKGIyICE9PSAwKSB7CiAgICAgICAgICB2YXIgdyA9IDE7CiAgICAgICAgICBmb3IgKG4gPSBNKGksIGQsIGkubGVuZ3RoLCBhKSwgZCA9IDA7ZCA8IGIyOyBkKyspCiAgICAgICAgICAgIHcgKj0gYTsKICAgICAgICAgIHRoaXMuaW11bG4odyksIHRoaXMud29yZHNbMF0gKyBuIDwgNjcxMDg4NjQgPyB0aGlzLndvcmRzWzBdICs9IG4gOiB0aGlzLl9pYWRkbihuKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oaSkgewogICAgICAgIGkud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aDsgYSsrKQogICAgICAgICAgaS53b3Jkc1thXSA9IHRoaXMud29yZHNbYV07CiAgICAgICAgaS5sZW5ndGggPSB0aGlzLmxlbmd0aCwgaS5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmUsIGkucmVkID0gdGhpcy5yZWQ7CiAgICAgIH0sIGYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gdGhpcy5jb3B5KGkpLCBpOwogICAgICB9LCBmLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoIDwgaTsgKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMDsgKQogICAgICAgICAgdGhpcy5sZW5ndGgtLTsKICAgICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDAgJiYgKHRoaXMubmVnYXRpdmUgPSAwKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5yZWQgPyAiPEJOLVI6ICIgOiAiPEJOOiAiKSArIHRoaXMudG9TdHJpbmcoMTYpICsgIj4iOwogICAgICB9OwogICAgICB2YXIgeCA9IFsiIiwgIjAiLCAiMDAiLCAiMDAwIiwgIjAwMDAiLCAiMDAwMDAiLCAiMDAwMDAwIiwgIjAwMDAwMDAiLCAiMDAwMDAwMDAiLCAiMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiXSwgUyA9IFswLCAwLCAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsIDgsIDcsIDcsIDcsIDcsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDVdLCBFMiA9IFswLCAwLCAzMzU1NDQzMiwgNDMwNDY3MjEsIDE2Nzc3MjE2LCA0ODgyODEyNSwgNjA0NjYxNzYsIDQwMzUzNjA3LCAxNjc3NzIxNiwgNDMwNDY3MjEsIDFlNywgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsIDE2Nzc3MjE2LCAyNDEzNzU2OSwgMzQwMTIyMjQsIDQ3MDQ1ODgxLCA2NDAwMDAwMCwgNDA4NDEwMSwgNTE1MzYzMiwgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XTsKICAgICAgZi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaSA9IGkgfHwgMTAsIGEgPSBhIHwgMCB8fCAxOwogICAgICAgIHZhciBoMjsKICAgICAgICBpZiAoaSA9PT0gMTYgfHwgaSA9PT0gImhleCIpIHsKICAgICAgICAgIGgyID0gIiI7CiAgICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDAsIGMgPSAwO2MgPCB0aGlzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICAgIHZhciBiMiA9IHRoaXMud29yZHNbY10sIGwgPSAoKGIyIDw8IHMgfCB1KSAmIDE2Nzc3MjE1KS50b1N0cmluZygxNik7CiAgICAgICAgICAgIHUgPSBiMiA+Pj4gMjQgLSBzICYgMTY3NzcyMTUsIHUgIT09IDAgfHwgYyAhPT0gdGhpcy5sZW5ndGggLSAxID8gaDIgPSB4WzYgLSBsLmxlbmd0aF0gKyBsICsgaDIgOiBoMiA9IGwgKyBoMiwgcyArPSAyLCBzID49IDI2ICYmIChzIC09IDI2LCBjLS0pOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh1ICE9PSAwICYmIChoMiA9IHUudG9TdHJpbmcoMTYpICsgaDIpO2gyLmxlbmd0aCAlIGEgIT09IDA7ICkKICAgICAgICAgICAgaDIgPSAiMCIgKyBoMjsKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIChoMiA9ICItIiArIGgyKSwgaDI7CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSAoaSB8IDApICYmIGkgPj0gMiAmJiBpIDw9IDM2KSB7CiAgICAgICAgICB2YXIgbiA9IFNbaV0sIGQgPSBFMltpXTsKICAgICAgICAgIGgyID0gIiI7CiAgICAgICAgICB2YXIgdyA9IHRoaXMuY2xvbmUoKTsKICAgICAgICAgIGZvciAody5uZWdhdGl2ZSA9IDA7IXcuaXNaZXJvKCk7ICkgewogICAgICAgICAgICB2YXIgZyA9IHcubW9kbihkKS50b1N0cmluZyhpKTsKICAgICAgICAgICAgdyA9IHcuaWRpdm4oZCksIHcuaXNaZXJvKCkgPyBoMiA9IGcgKyBoMiA6IGgyID0geFtuIC0gZy5sZW5ndGhdICsgZyArIGgyOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh0aGlzLmlzWmVybygpICYmIChoMiA9ICIwIiArIGgyKTtoMi5sZW5ndGggJSBhICE9PSAwOyApCiAgICAgICAgICAgIGgyID0gIjAiICsgaDI7CiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAoaDIgPSAiLSIgKyBoMiksIGgyOwogICAgICAgIH0KICAgICAgICByKGZhbHNlLCAiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpOwogICAgICB9LCBmLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gdGhpcy53b3Jkc1swXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDIgPyBpICs9IHRoaXMud29yZHNbMV0gKiA2NzEwODg2NCA6IHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDEgPyBpICs9IDQ1MDM1OTk2MjczNzA0OTYgKyB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA+IDIgJiYgcihmYWxzZSwgIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLCB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWkgOiBpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiByKHR5cGVvZiBwIDwgInUiKSwgdGhpcy50b0FycmF5TGlrZShwLCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IHRoaXMuYnl0ZUxlbmd0aCgpLCB1ID0gaDIgfHwgTWF0aC5tYXgoMSwgcyk7CiAgICAgICAgcihzIDw9IHUsICJieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoIiksIHIodSA+IDAsICJSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAiKSwgdGhpcy5zdHJpcCgpOwogICAgICAgIHZhciBjID0gYSA9PT0gImxlIiwgYjIgPSBuZXcgaSh1KSwgbCwgbiwgZCA9IHRoaXMuY2xvbmUoKTsKICAgICAgICBpZiAoYykgewogICAgICAgICAgZm9yIChuID0gMDshZC5pc1plcm8oKTsgbisrKQogICAgICAgICAgICBsID0gZC5hbmRsbigyNTUpLCBkLml1c2hybig4KSwgYjJbbl0gPSBsOwogICAgICAgICAgZm9yICg7biA8IHU7IG4rKykKICAgICAgICAgICAgYjJbbl0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKG4gPSAwO24gPCB1IC0gczsgbisrKQogICAgICAgICAgICBiMltuXSA9IDA7CiAgICAgICAgICBmb3IgKG4gPSAwOyFkLmlzWmVybygpOyBuKyspCiAgICAgICAgICAgIGwgPSBkLmFuZGxuKDI1NSksIGQuaXVzaHJuKDgpLCBiMlt1IC0gbiAtIDFdID0gbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGIyOwogICAgICB9LCBNYXRoLmNsejMyID8gZi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKGkpOwogICAgICB9IDogZi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGksIGgyID0gMDsKICAgICAgICByZXR1cm4gYSA+PSA0MDk2ICYmIChoMiArPSAxMywgYSA+Pj49IDEzKSwgYSA+PSA2NCAmJiAoaDIgKz0gNywgYSA+Pj49IDcpLCBhID49IDggJiYgKGgyICs9IDQsIGEgPj4+PSA0KSwgYSA+PSAyICYmIChoMiArPSAyLCBhID4+Pj0gMiksIGgyICsgYTsKICAgICAgfSwgZi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgcmV0dXJuIDI2OwogICAgICAgIHZhciBhID0gaSwgaDIgPSAwOwogICAgICAgIHJldHVybiAoYSAmIDgxOTEpID09PSAwICYmIChoMiArPSAxMywgYSA+Pj49IDEzKSwgKGEgJiAxMjcpID09PSAwICYmIChoMiArPSA3LCBhID4+Pj0gNyksIChhICYgMTUpID09PSAwICYmIChoMiArPSA0LCBhID4+Pj0gNCksIChhICYgMykgPT09IDAgJiYgKGgyICs9IDIsIGEgPj4+PSAyKSwgKGEgJiAxKSA9PT0gMCAmJiBoMisrLCBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0sIGEgPSB0aGlzLl9jb3VudEJpdHMoaSk7CiAgICAgICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBhOwogICAgICB9OwogICAgICBmdW5jdGlvbiBCKHYpIHsKICAgICAgICBmb3IgKHZhciBpID0gbmV3IEFycmF5KHYuYml0TGVuZ3RoKCkpLCBhID0gMDthIDwgaS5sZW5ndGg7IGErKykgewogICAgICAgICAgdmFyIGgyID0gYSAvIDI2IHwgMCwgcyA9IGEgJSAyNjsKICAgICAgICAgIGlbYV0gPSAodi53b3Jkc1toMl0gJiAxIDw8IHMpID4+PiBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSAwO2EgPCB0aGlzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICB2YXIgaDIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2FdKTsKICAgICAgICAgIGlmIChpICs9IGgyLCBoMiAhPT0gMjYpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfSwgZi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpOwogICAgICB9LCBmLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyB0aGlzLmFicygpLmlub3RuKGkpLmlhZGRuKDEpIDogdGhpcy5jbG9uZSgpOwogICAgICB9LCBmLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy50ZXN0bihpIC0gMSkgPyB0aGlzLm5vdG4oaSkuaWFkZG4oMSkuaW5lZygpIDogdGhpcy5jbG9uZSgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzWmVybygpIHx8ICh0aGlzLm5lZ2F0aXZlIF49IDEpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoIDwgaS5sZW5ndGg7ICkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCBpLmxlbmd0aDsgYSsrKQogICAgICAgICAgdGhpcy53b3Jkc1thXSA9IHRoaXMud29yZHNbYV0gfCBpLndvcmRzW2FdOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdW9yKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pb3IoaSkgOiBpLmNsb25lKCkuaW9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVvcihpKSA6IGkuY2xvbmUoKS5pdW9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gYSA9IGkgOiBhID0gdGhpczsKICAgICAgICBmb3IgKHZhciBoMiA9IDA7aDIgPCBhLmxlbmd0aDsgaDIrKykKICAgICAgICAgIHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gJiBpLndvcmRzW2gyXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBhLmxlbmd0aCwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1YW5kKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFuZChpKSA6IGkuY2xvbmUoKS5pYW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1YW5kKGkpIDogaS5jbG9uZSgpLml1YW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSwgaDI7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IChhID0gdGhpcywgaDIgPSBpKSA6IChhID0gaSwgaDIgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgaDIubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gYS53b3Jkc1tzXSBeIGgyLndvcmRzW3NdOwogICAgICAgIGlmICh0aGlzICE9PSBhKQogICAgICAgICAgZm9yICg7cyA8IGEubGVuZ3RoOyBzKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbc10gPSBhLndvcmRzW3NdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXV4b3IoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5peG9yKGkpIDogaS5jbG9uZSgpLml4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXV4b3IoaSkgOiBpLmNsb25lKCkuaXV4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IE1hdGguY2VpbChpIC8gMjYpIHwgMCwgaDIgPSBpICUgMjY7CiAgICAgICAgdGhpcy5fZXhwYW5kKGEpLCBoMiA+IDAgJiYgYS0tOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBhOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gfnRoaXMud29yZHNbc10gJiA2NzEwODg2MzsKICAgICAgICByZXR1cm4gaDIgPiAwICYmICh0aGlzLndvcmRzW3NdID0gfnRoaXMud29yZHNbc10gJiA2NzEwODg2MyA+PiAyNiAtIGgyKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBoMiA9IGkgLyAyNiB8IDAsIHMgPSBpICUgMjY7CiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZChoMiArIDEpLCBhID8gdGhpcy53b3Jkc1toMl0gPSB0aGlzLndvcmRzW2gyXSB8IDEgPDwgcyA6IHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gJiB+KDEgPDwgcyksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5pc3ViKGkpLCB0aGlzLm5lZ2F0aXZlIF49IDEsIHRoaXMuX25vcm1TaWduKCk7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiBpLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuaXN1YihpKSwgaS5uZWdhdGl2ZSA9IDEsIGEuX25vcm1TaWduKCk7CiAgICAgICAgdmFyIGgyLCBzOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyAoaDIgPSB0aGlzLCBzID0gaSkgOiAoaDIgPSBpLCBzID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBzLmxlbmd0aDsgYysrKQogICAgICAgICAgYSA9IChoMi53b3Jkc1tjXSB8IDApICsgKHMud29yZHNbY10gfCAwKSArIHUsIHRoaXMud29yZHNbY10gPSBhICYgNjcxMDg4NjMsIHUgPSBhID4+PiAyNjsKICAgICAgICBmb3IgKDt1ICE9PSAwICYmIGMgPCBoMi5sZW5ndGg7IGMrKykKICAgICAgICAgIGEgPSAoaDIud29yZHNbY10gfCAwKSArIHUsIHRoaXMud29yZHNbY10gPSBhICYgNjcxMDg4NjMsIHUgPSBhID4+PiAyNjsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPSBoMi5sZW5ndGgsIHUgIT09IDApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IHUsIHRoaXMubGVuZ3RoKys7CiAgICAgICAgZWxzZSBpZiAoaDIgIT09IHRoaXMpCiAgICAgICAgICBmb3IgKDtjIDwgaDIubGVuZ3RoOyBjKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbY10gPSBoMi53b3Jkc1tjXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIHJldHVybiBpLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDAgPyAoaS5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLnN1YihpKSwgaS5uZWdhdGl2ZSBePSAxLCBhKSA6IGkubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/ICh0aGlzLm5lZ2F0aXZlID0gMCwgYSA9IGkuc3ViKHRoaXMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgYSkgOiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhZGQoaSkgOiBpLmNsb25lKCkuaWFkZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaS5uZWdhdGl2ZSAhPT0gMCkgewogICAgICAgICAgaS5uZWdhdGl2ZSA9IDA7CiAgICAgICAgICB2YXIgYSA9IHRoaXMuaWFkZChpKTsKICAgICAgICAgIHJldHVybiBpLm5lZ2F0aXZlID0gMSwgYS5fbm9ybVNpZ24oKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaWFkZChpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMuX25vcm1TaWduKCk7CiAgICAgICAgdmFyIGgyID0gdGhpcy5jbXAoaSk7CiAgICAgICAgaWYgKGgyID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXMud29yZHNbMF0gPSAwLCB0aGlzOwogICAgICAgIHZhciBzLCB1OwogICAgICAgIGgyID4gMCA/IChzID0gdGhpcywgdSA9IGkpIDogKHMgPSBpLCB1ID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgYyA9IDAsIGIyID0gMDtiMiA8IHUubGVuZ3RoOyBiMisrKQogICAgICAgICAgYSA9IChzLndvcmRzW2IyXSB8IDApIC0gKHUud29yZHNbYjJdIHwgMCkgKyBjLCBjID0gYSA+PiAyNiwgdGhpcy53b3Jkc1tiMl0gPSBhICYgNjcxMDg4NjM7CiAgICAgICAgZm9yICg7YyAhPT0gMCAmJiBiMiA8IHMubGVuZ3RoOyBiMisrKQogICAgICAgICAgYSA9IChzLndvcmRzW2IyXSB8IDApICsgYywgYyA9IGEgPj4gMjYsIHRoaXMud29yZHNbYjJdID0gYSAmIDY3MTA4ODYzOwogICAgICAgIGlmIChjID09PSAwICYmIGIyIDwgcy5sZW5ndGggJiYgcyAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO2IyIDwgcy5sZW5ndGg7IGIyKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbYjJdID0gcy53b3Jkc1tiMl07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGIyKSwgcyAhPT0gdGhpcyAmJiAodGhpcy5uZWdhdGl2ZSA9IDEpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIoaSk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHEyKHYsIGksIGEpIHsKICAgICAgICBhLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIHYubmVnYXRpdmU7CiAgICAgICAgdmFyIGgyID0gdi5sZW5ndGggKyBpLmxlbmd0aCB8IDA7CiAgICAgICAgYS5sZW5ndGggPSBoMiwgaDIgPSBoMiAtIDEgfCAwOwogICAgICAgIHZhciBzID0gdi53b3Jkc1swXSB8IDAsIHUgPSBpLndvcmRzWzBdIHwgMCwgYyA9IHMgKiB1LCBiMiA9IGMgJiA2NzEwODg2MywgbCA9IGMgLyA2NzEwODg2NCB8IDA7CiAgICAgICAgYS53b3Jkc1swXSA9IGIyOwogICAgICAgIGZvciAodmFyIG4gPSAxO24gPCBoMjsgbisrKSB7CiAgICAgICAgICBmb3IgKHZhciBkID0gbCA+Pj4gMjYsIHcgPSBsICYgNjcxMDg4NjMsIGcgPSBNYXRoLm1pbihuLCBpLmxlbmd0aCAtIDEpLCBfMiA9IE1hdGgubWF4KDAsIG4gLSB2Lmxlbmd0aCArIDEpO18yIDw9IGc7IF8yKyspIHsKICAgICAgICAgICAgdmFyIEEyID0gbiAtIF8yIHwgMDsKICAgICAgICAgICAgcyA9IHYud29yZHNbQTJdIHwgMCwgdSA9IGkud29yZHNbXzJdIHwgMCwgYyA9IHMgKiB1ICsgdywgZCArPSBjIC8gNjcxMDg4NjQgfCAwLCB3ID0gYyAmIDY3MTA4ODYzOwogICAgICAgICAgfQogICAgICAgICAgYS53b3Jkc1tuXSA9IHcgfCAwLCBsID0gZCB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsICE9PSAwID8gYS53b3Jkc1tuXSA9IGwgfCAwIDogYS5sZW5ndGgtLSwgYS5zdHJpcCgpOwogICAgICB9CiAgICAgIHZhciBMMiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSBpLndvcmRzLCB1ID0gYS53b3JkcywgYyA9IGgyLndvcmRzLCBiMiA9IDAsIGwsIG4sIGQsIHcgPSBzWzBdIHwgMCwgZyA9IHcgJiA4MTkxLCBfMiA9IHcgPj4+IDEzLCBBMiA9IHNbMV0gfCAwLCBSMiA9IEEyICYgODE5MSwgSSA9IEEyID4+PiAxMywgTWUgPSBzWzJdIHwgMCwgayA9IE1lICYgODE5MSwgRDIgPSBNZSA+Pj4gMTMsIG50ID0gc1szXSB8IDAsIEMyID0gbnQgJiA4MTkxLCBPID0gbnQgPj4+IDEzLCB2dCA9IHNbNF0gfCAwLCBGID0gdnQgJiA4MTkxLCBVID0gdnQgPj4+IDEzLCBidCA9IHNbNV0gfCAwLCB6MiA9IGJ0ICYgODE5MSwgSCA9IGJ0ID4+PiAxMywgbXQgPSBzWzZdIHwgMCwgVyA9IG10ICYgODE5MSwgSyA9IG10ID4+PiAxMywgZ3QgPSBzWzddIHwgMCwgaiA9IGd0ICYgODE5MSwgWiA9IGd0ID4+PiAxMywgeXQgPSBzWzhdIHwgMCwgViA9IHl0ICYgODE5MSwgJCA9IHl0ID4+PiAxMywgd3QgPSBzWzldIHwgMCwgRyA9IHd0ICYgODE5MSwgWSA9IHd0ID4+PiAxMywgTXQgPSB1WzBdIHwgMCwgWCA9IE10ICYgODE5MSwgSiA9IE10ID4+PiAxMywgX3QgPSB1WzFdIHwgMCwgUSA9IF90ICYgODE5MSwgZWUgPSBfdCA+Pj4gMTMsIHh0ID0gdVsyXSB8IDAsIHRlID0geHQgJiA4MTkxLCByZSA9IHh0ID4+PiAxMywgU3QgPSB1WzNdIHwgMCwgaWUgPSBTdCAmIDgxOTEsIG5lID0gU3QgPj4+IDEzLCBFdCA9IHVbNF0gfCAwLCBmZSA9IEV0ICYgODE5MSwgYWUgPSBFdCA+Pj4gMTMsIEF0ID0gdVs1XSB8IDAsIG9lID0gQXQgJiA4MTkxLCBzZSA9IEF0ID4+PiAxMywgUnQgPSB1WzZdIHwgMCwgaGUgPSBSdCAmIDgxOTEsIHVlID0gUnQgPj4+IDEzLCBCdCA9IHVbN10gfCAwLCBsZSA9IEJ0ICYgODE5MSwgZGUgPSBCdCA+Pj4gMTMsIHF0ID0gdVs4XSB8IDAsIGNlID0gcXQgJiA4MTkxLCBwZSA9IHF0ID4+PiAxMywgSXQgPSB1WzldIHwgMCwgdmUgPSBJdCAmIDgxOTEsIGJlID0gSXQgPj4+IDEzOwogICAgICAgIGgyLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIGEubmVnYXRpdmUsIGgyLmxlbmd0aCA9IDE5LCBsID0gTWF0aC5pbXVsKGcsIFgpLCBuID0gTWF0aC5pbXVsKGcsIEopLCBuID0gbiArIE1hdGguaW11bChfMiwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKF8yLCBKKTsKICAgICAgICB2YXIgZnQgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoZnQgPj4+IDI2KSB8IDAsIGZ0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFIyLCBYKSwgbiA9IE1hdGguaW11bChSMiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKEksIFgpIHwgMCwgZCA9IE1hdGguaW11bChJLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoZywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgZWUpIHwgMDsKICAgICAgICB2YXIgQmUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoQmUgPj4+IDI2KSB8IDAsIEJlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKGssIFgpLCBuID0gTWF0aC5pbXVsKGssIEopLCBuID0gbiArIE1hdGguaW11bChEMiwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEQyLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCByZSkgfCAwOwogICAgICAgIHZhciBxZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChxZSA+Pj4gMjYpIHwgMCwgcWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoQzIsIFgpLCBuID0gTWF0aC5pbXVsKEMyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoTywgWCkgfCAwLCBkID0gTWF0aC5pbXVsKE8sIEopLCBsID0gbCArIE1hdGguaW11bChrLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgbmUpIHwgMDsKICAgICAgICB2YXIgemUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoemUgPj4+IDI2KSB8IDAsIHplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEYsIFgpLCBuID0gTWF0aC5pbXVsKEYsIEopLCBuID0gbiArIE1hdGguaW11bChVLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoVSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIGFlKSB8IDA7CiAgICAgICAgdmFyIEhlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEhlID4+PiAyNikgfCAwLCBIZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bCh6MiwgWCksIG4gPSBNYXRoLmltdWwoejIsIEopLCBuID0gbiArIE1hdGguaW11bChILCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSCwgSiksIGwgPSBsICsgTWF0aC5pbXVsKEYsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIHNlKSB8IDA7CiAgICAgICAgdmFyIFdlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFdlID4+PiAyNikgfCAwLCBXZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChXLCBYKSwgbiA9IE1hdGguaW11bChXLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSywgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEssIEopLCBsID0gbCArIE1hdGguaW11bCh6MiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIHVlKSB8IDA7CiAgICAgICAgdmFyIEtlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEtlID4+PiAyNikgfCAwLCBLZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChqLCBYKSwgbiA9IE1hdGguaW11bChqLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoWiwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFosIEopLCBsID0gbCArIE1hdGguaW11bChXLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIGRlKSB8IDA7CiAgICAgICAgdmFyIGplID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGplID4+PiAyNikgfCAwLCBqZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChWLCBYKSwgbiA9IE1hdGguaW11bChWLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoJCwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKCQsIEopLCBsID0gbCArIE1hdGguaW11bChqLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIHBlKSB8IDA7CiAgICAgICAgdmFyIFplID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFplID4+PiAyNikgfCAwLCBaZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBYKSwgbiA9IE1hdGguaW11bChHLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFksIEopLCBsID0gbCArIE1hdGguaW11bChWLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIGJlKSB8IDA7CiAgICAgICAgdmFyIFZlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFZlID4+PiAyNikgfCAwLCBWZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBRKSwgbiA9IE1hdGguaW11bChHLCBlZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIFEpIHwgMCwgZCA9IE1hdGguaW11bChZLCBlZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6Miwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgYmUpIHwgMDsKICAgICAgICB2YXIgJGUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoJGUgPj4+IDI2KSB8IDAsICRlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIHRlKSwgbiA9IE1hdGguaW11bChHLCByZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIHRlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgcmUpLCBsID0gbCArIE1hdGguaW11bChWLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBiZSkgfCAwOwogICAgICAgIHZhciBHZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChHZSA+Pj4gMjYpIHwgMCwgR2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgaWUpLCBuID0gTWF0aC5pbXVsKEcsIG5lKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgaWUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBuZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBiZSkgfCAwOwogICAgICAgIHZhciBZZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChZZSA+Pj4gMjYpIHwgMCwgWWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgZmUpLCBuID0gTWF0aC5pbXVsKEcsIGFlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgZmUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBhZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgYmUpIHwgMDsKICAgICAgICB2YXIgWGUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWGUgPj4+IDI2KSB8IDAsIFhlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIG9lKSwgbiA9IE1hdGguaW11bChHLCBzZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIG9lKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgc2UpLCBsID0gbCArIE1hdGguaW11bChWLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGJlKSB8IDA7CiAgICAgICAgdmFyIEplID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEplID4+PiAyNikgfCAwLCBKZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBoZSksIG4gPSBNYXRoLmltdWwoRywgdWUpLCBuID0gbiArIE1hdGguaW11bChZLCBoZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHVlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgYmUpIHwgMDsKICAgICAgICB2YXIgUWUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoUWUgPj4+IDI2KSB8IDAsIFFlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGxlKSwgbiA9IE1hdGguaW11bChHLCBkZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGxlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgZGUpLCBsID0gbCArIE1hdGguaW11bChWLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBiZSkgfCAwOwogICAgICAgIHZhciBldCA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChldCA+Pj4gMjYpIHwgMCwgZXQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgY2UpLCBuID0gTWF0aC5pbXVsKEcsIHBlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgY2UpIHwgMCwgZCA9IE1hdGguaW11bChZLCBwZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGJlKSB8IDA7CiAgICAgICAgdmFyIHR0ID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHR0ID4+PiAyNikgfCAwLCB0dCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCB2ZSksIG4gPSBNYXRoLmltdWwoRywgYmUpLCBuID0gbiArIE1hdGguaW11bChZLCB2ZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGJlKTsKICAgICAgICB2YXIgcnQgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIHJldHVybiBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHJ0ID4+PiAyNikgfCAwLCBydCAmPSA2NzEwODg2MywgY1swXSA9IGZ0LCBjWzFdID0gQmUsIGNbMl0gPSBxZSwgY1szXSA9IHplLCBjWzRdID0gSGUsIGNbNV0gPSBXZSwgY1s2XSA9IEtlLCBjWzddID0gamUsIGNbOF0gPSBaZSwgY1s5XSA9IFZlLCBjWzEwXSA9ICRlLCBjWzExXSA9IEdlLCBjWzEyXSA9IFllLCBjWzEzXSA9IFhlLCBjWzE0XSA9IEplLCBjWzE1XSA9IFFlLCBjWzE2XSA9IGV0LCBjWzE3XSA9IHR0LCBjWzE4XSA9IHJ0LCBiMiAhPT0gMCAmJiAoY1sxOV0gPSBiMiwgaDIubGVuZ3RoKyspLCBoMjsKICAgICAgfTsKICAgICAgTWF0aC5pbXVsIHx8IChMMiA9IHEyKTsKICAgICAgZnVuY3Rpb24gZ2UodiwgaSwgYSkgewogICAgICAgIGEubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gdi5uZWdhdGl2ZSwgYS5sZW5ndGggPSB2Lmxlbmd0aCArIGkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGgyID0gMCwgcyA9IDAsIHUgPSAwO3UgPCBhLmxlbmd0aCAtIDE7IHUrKykgewogICAgICAgICAgdmFyIGMgPSBzOwogICAgICAgICAgcyA9IDA7CiAgICAgICAgICBmb3IgKHZhciBiMiA9IGgyICYgNjcxMDg4NjMsIGwgPSBNYXRoLm1pbih1LCBpLmxlbmd0aCAtIDEpLCBuID0gTWF0aC5tYXgoMCwgdSAtIHYubGVuZ3RoICsgMSk7biA8PSBsOyBuKyspIHsKICAgICAgICAgICAgdmFyIGQgPSB1IC0gbiwgdyA9IHYud29yZHNbZF0gfCAwLCBnID0gaS53b3Jkc1tuXSB8IDAsIF8yID0gdyAqIGcsIEEyID0gXzIgJiA2NzEwODg2MzsKICAgICAgICAgICAgYyA9IGMgKyAoXzIgLyA2NzEwODg2NCB8IDApIHwgMCwgQTIgPSBBMiArIGIyIHwgMCwgYjIgPSBBMiAmIDY3MTA4ODYzLCBjID0gYyArIChBMiA+Pj4gMjYpIHwgMCwgcyArPSBjID4+PiAyNiwgYyAmPSA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIGEud29yZHNbdV0gPSBiMiwgaDIgPSBjLCBjID0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGgyICE9PSAwID8gYS53b3Jkc1t1XSA9IGgyIDogYS5sZW5ndGgtLSwgYS5zdHJpcCgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIF9lKHYsIGksIGEpIHsKICAgICAgICB2YXIgaDIgPSBuZXcgTjsKICAgICAgICByZXR1cm4gaDIubXVscCh2LCBpLCBhKTsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDIsIHMgPSB0aGlzLmxlbmd0aCArIGkubGVuZ3RoOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMTAgJiYgaS5sZW5ndGggPT09IDEwID8gaDIgPSBMMih0aGlzLCBpLCBhKSA6IHMgPCA2MyA/IGgyID0gcTIodGhpcywgaSwgYSkgOiBzIDwgMTAyNCA/IGgyID0gZ2UodGhpcywgaSwgYSkgOiBoMiA9IF9lKHRoaXMsIGksIGEpLCBoMjsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gTih2LCBpKSB7CiAgICAgICAgdGhpcy54ID0gdiwgdGhpcy55ID0gaTsKICAgICAgfQogICAgICBOLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSBuZXcgQXJyYXkoaSksIGgyID0gZi5wcm90b3R5cGUuX2NvdW50Qml0cyhpKSAtIDEsIHMgPSAwO3MgPCBpOyBzKyspCiAgICAgICAgICBhW3NdID0gdGhpcy5yZXZCaW4ocywgaDIsIGkpOwogICAgICAgIHJldHVybiBhOwogICAgICB9LCBOLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IGgyIC0gMSkKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMDt1IDwgYTsgdSsrKQogICAgICAgICAgcyB8PSAoaSAmIDEpIDw8IGEgLSB1IC0gMSwgaSA+Pj0gMTsKICAgICAgICByZXR1cm4gczsKICAgICAgfSwgTi5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uKGksIGEsIGgyLCBzLCB1LCBjKSB7CiAgICAgICAgZm9yICh2YXIgYjIgPSAwO2IyIDwgYzsgYjIrKykKICAgICAgICAgIHNbYjJdID0gYVtpW2IyXV0sIHVbYjJdID0gaDJbaVtiMl1dOwogICAgICB9LCBOLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihpLCBhLCBoMiwgcywgdSwgYykgewogICAgICAgIHRoaXMucGVybXV0ZShjLCBpLCBhLCBoMiwgcywgdSk7CiAgICAgICAgZm9yICh2YXIgYjIgPSAxO2IyIDwgdTsgYjIgPDw9IDEpCiAgICAgICAgICBmb3IgKHZhciBsID0gYjIgPDwgMSwgbiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCksIGQgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpLCB3ID0gMDt3IDwgdTsgdyArPSBsKQogICAgICAgICAgICBmb3IgKHZhciBnID0gbiwgXzIgPSBkLCBBMiA9IDA7QTIgPCBiMjsgQTIrKykgewogICAgICAgICAgICAgIHZhciBSMiA9IGgyW3cgKyBBMl0sIEkgPSBzW3cgKyBBMl0sIE1lID0gaDJbdyArIEEyICsgYjJdLCBrID0gc1t3ICsgQTIgKyBiMl0sIEQyID0gZyAqIE1lIC0gXzIgKiBrOwogICAgICAgICAgICAgIGsgPSBnICogayArIF8yICogTWUsIE1lID0gRDIsIGgyW3cgKyBBMl0gPSBSMiArIE1lLCBzW3cgKyBBMl0gPSBJICsgaywgaDJbdyArIEEyICsgYjJdID0gUjIgLSBNZSwgc1t3ICsgQTIgKyBiMl0gPSBJIC0gaywgQTIgIT09IGwgJiYgKEQyID0gbiAqIGcgLSBkICogXzIsIF8yID0gbiAqIF8yICsgZCAqIGcsIGcgPSBEMik7CiAgICAgICAgICAgIH0KICAgICAgfSwgTi5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gTWF0aC5tYXgoYSwgaSkgfCAxLCBzID0gaDIgJiAxLCB1ID0gMDsKICAgICAgICBmb3IgKGgyID0gaDIgLyAyIHwgMDtoMjsgaDIgPSBoMiA+Pj4gMSkKICAgICAgICAgIHUrKzsKICAgICAgICByZXR1cm4gMSA8PCB1ICsgMSArIHM7CiAgICAgIH0sIE4ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKCEoaDIgPD0gMSkpCiAgICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgaDIgLyAyOyBzKyspIHsKICAgICAgICAgICAgdmFyIHUgPSBpW3NdOwogICAgICAgICAgICBpW3NdID0gaVtoMiAtIHMgLSAxXSwgaVtoMiAtIHMgLSAxXSA9IHUsIHUgPSBhW3NdLCBhW3NdID0gLWFbaDIgLSBzIC0gMV0sIGFbaDIgLSBzIC0gMV0gPSAtdTsKICAgICAgICAgIH0KICAgICAgfSwgTi5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGZvciAodmFyIGgyID0gMCwgcyA9IDA7cyA8IGEgLyAyOyBzKyspIHsKICAgICAgICAgIHZhciB1ID0gTWF0aC5yb3VuZChpWzIgKiBzICsgMV0gLyBhKSAqIDgxOTIgKyBNYXRoLnJvdW5kKGlbMiAqIHNdIC8gYSkgKyBoMjsKICAgICAgICAgIGlbc10gPSB1ICYgNjcxMDg4NjMsIHUgPCA2NzEwODg2NCA/IGgyID0gMCA6IGgyID0gdSAvIDY3MTA4ODY0IHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0sIE4ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbihpLCBhLCBoMiwgcykgewogICAgICAgIGZvciAodmFyIHUgPSAwLCBjID0gMDtjIDwgYTsgYysrKQogICAgICAgICAgdSA9IHUgKyAoaVtjXSB8IDApLCBoMlsyICogY10gPSB1ICYgODE5MSwgdSA9IHUgPj4+IDEzLCBoMlsyICogYyArIDFdID0gdSAmIDgxOTEsIHUgPSB1ID4+PiAxMzsKICAgICAgICBmb3IgKGMgPSAyICogYTtjIDwgczsgKytjKQogICAgICAgICAgaDJbY10gPSAwOwogICAgICAgIHIodSA9PT0gMCksIHIoKHUgJiAtODE5MikgPT09IDApOwogICAgICB9LCBOLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSBuZXcgQXJyYXkoaSksIGgyID0gMDtoMiA8IGk7IGgyKyspCiAgICAgICAgICBhW2gyXSA9IDA7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIE4ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoaS5sZW5ndGgsIGEubGVuZ3RoKSwgdSA9IHRoaXMubWFrZVJCVChzKSwgYyA9IHRoaXMuc3R1YihzKSwgYjIgPSBuZXcgQXJyYXkocyksIGwgPSBuZXcgQXJyYXkocyksIG4gPSBuZXcgQXJyYXkocyksIGQgPSBuZXcgQXJyYXkocyksIHcgPSBuZXcgQXJyYXkocyksIGcgPSBuZXcgQXJyYXkocyksIF8yID0gaDIud29yZHM7CiAgICAgICAgXzIubGVuZ3RoID0gcywgdGhpcy5jb252ZXJ0MTNiKGkud29yZHMsIGkubGVuZ3RoLCBiMiwgcyksIHRoaXMuY29udmVydDEzYihhLndvcmRzLCBhLmxlbmd0aCwgZCwgcyksIHRoaXMudHJhbnNmb3JtKGIyLCBjLCBsLCBuLCBzLCB1KSwgdGhpcy50cmFuc2Zvcm0oZCwgYywgdywgZywgcywgdSk7CiAgICAgICAgZm9yICh2YXIgQTIgPSAwO0EyIDwgczsgQTIrKykgewogICAgICAgICAgdmFyIFIyID0gbFtBMl0gKiB3W0EyXSAtIG5bQTJdICogZ1tBMl07CiAgICAgICAgICBuW0EyXSA9IGxbQTJdICogZ1tBMl0gKyBuW0EyXSAqIHdbQTJdLCBsW0EyXSA9IFIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUobCwgbiwgcyksIHRoaXMudHJhbnNmb3JtKGwsIG4sIF8yLCBjLCBzLCB1KSwgdGhpcy5jb25qdWdhdGUoXzIsIGMsIHMpLCB0aGlzLm5vcm1hbGl6ZTEzYihfMiwgcyksIGgyLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIGEubmVnYXRpdmUsIGgyLmxlbmd0aCA9IGkubGVuZ3RoICsgYS5sZW5ndGgsIGgyLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBhLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgaS5sZW5ndGgpLCB0aGlzLm11bFRvKGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGEud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBpLmxlbmd0aCksIF9lKHRoaXMsIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8oaSwgdGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCk7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gMDtoMiA8IHRoaXMubGVuZ3RoOyBoMisrKSB7CiAgICAgICAgICB2YXIgcyA9ICh0aGlzLndvcmRzW2gyXSB8IDApICogaSwgdSA9IChzICYgNjcxMDg4NjMpICsgKGEgJiA2NzEwODg2Myk7CiAgICAgICAgICBhID4+PSAyNiwgYSArPSBzIC8gNjcxMDg4NjQgfCAwLCBhICs9IHUgPj4+IDI2LCB0aGlzLndvcmRzW2gyXSA9IHUgJiA2NzEwODg2MzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGEgIT09IDAgJiYgKHRoaXMud29yZHNbaDJdID0gYSwgdGhpcy5sZW5ndGgrKyksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpOwogICAgICB9LCBmLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBCKGkpOwogICAgICAgIGlmIChhLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiBuZXcgZigxKTsKICAgICAgICBmb3IgKHZhciBoMiA9IHRoaXMsIHMgPSAwO3MgPCBhLmxlbmd0aCAmJiBhW3NdID09PSAwOyBzKyssIGgyID0gaDIuc3FyKCkpCiAgICAgICAgICA7CiAgICAgICAgaWYgKCsrcyA8IGEubGVuZ3RoKQogICAgICAgICAgZm9yICh2YXIgdSA9IGgyLnNxcigpO3MgPCBhLmxlbmd0aDsgcysrLCB1ID0gdS5zcXIoKSkKICAgICAgICAgICAgYVtzXSAhPT0gMCAmJiAoaDIgPSBoMi5tdWwodSkpOwogICAgICAgIHJldHVybiBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjYsIHMgPSA2NzEwODg2MyA+Pj4gMjYgLSBhIDw8IDI2IC0gYSwgdTsKICAgICAgICBpZiAoYSAhPT0gMCkgewogICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgZm9yICh1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykgewogICAgICAgICAgICB2YXIgYjIgPSB0aGlzLndvcmRzW3VdICYgcywgbCA9ICh0aGlzLndvcmRzW3VdIHwgMCkgLSBiMiA8PCBhOwogICAgICAgICAgICB0aGlzLndvcmRzW3VdID0gbCB8IGMsIGMgPSBiMiA+Pj4gMjYgLSBhOwogICAgICAgICAgfQogICAgICAgICAgYyAmJiAodGhpcy53b3Jkc1t1XSA9IGMsIHRoaXMubGVuZ3RoKyspOwogICAgICAgIH0KICAgICAgICBpZiAoaDIgIT09IDApIHsKICAgICAgICAgIGZvciAodSA9IHRoaXMubGVuZ3RoIC0gMTt1ID49IDA7IHUtLSkKICAgICAgICAgICAgdGhpcy53b3Jkc1t1ICsgaDJdID0gdGhpcy53b3Jkc1t1XTsKICAgICAgICAgIGZvciAodSA9IDA7dSA8IGgyOyB1KyspCiAgICAgICAgICAgIHRoaXMud29yZHNbdV0gPSAwOwogICAgICAgICAgdGhpcy5sZW5ndGggKz0gaDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMubmVnYXRpdmUgPT09IDApLCB0aGlzLml1c2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIHM7CiAgICAgICAgYSA/IHMgPSAoYSAtIGEgJSAyNikgLyAyNiA6IHMgPSAwOwogICAgICAgIHZhciB1ID0gaSAlIDI2LCBjID0gTWF0aC5taW4oKGkgLSB1KSAvIDI2LCB0aGlzLmxlbmd0aCksIGIyID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4gdSA8PCB1LCBsID0gaDI7CiAgICAgICAgaWYgKHMgLT0gYywgcyA9IE1hdGgubWF4KDAsIHMpLCBsKSB7CiAgICAgICAgICBmb3IgKHZhciBuID0gMDtuIDwgYzsgbisrKQogICAgICAgICAgICBsLndvcmRzW25dID0gdGhpcy53b3Jkc1tuXTsKICAgICAgICAgIGwubGVuZ3RoID0gYzsKICAgICAgICB9CiAgICAgICAgaWYgKGMgIT09IDApCiAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBjKQogICAgICAgICAgICBmb3IgKHRoaXMubGVuZ3RoIC09IGMsIG4gPSAwO24gPCB0aGlzLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgIHRoaXMud29yZHNbbl0gPSB0aGlzLndvcmRzW24gKyBjXTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMTsKICAgICAgICB2YXIgZCA9IDA7CiAgICAgICAgZm9yIChuID0gdGhpcy5sZW5ndGggLSAxO24gPj0gMCAmJiAoZCAhPT0gMCB8fCBuID49IHMpOyBuLS0pIHsKICAgICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tuXSB8IDA7CiAgICAgICAgICB0aGlzLndvcmRzW25dID0gZCA8PCAyNiAtIHUgfCB3ID4+PiB1LCBkID0gdyAmIGIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbCAmJiBkICE9PSAwICYmIChsLndvcmRzW2wubGVuZ3RoKytdID0gZCksIHRoaXMubGVuZ3RoID09PSAwICYmICh0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaHJuKGksIGEsIGgyKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNiwgcyA9IDEgPDwgYTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gaDIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHUgPSB0aGlzLndvcmRzW2gyXTsKICAgICAgICByZXR1cm4gISEodSAmIHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNjsKICAgICAgICBpZiAocih0aGlzLm5lZ2F0aXZlID09PSAwLCAiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksIHRoaXMubGVuZ3RoIDw9IGgyKQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKGEgIT09IDAgJiYgaDIrKywgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihoMiwgdGhpcy5sZW5ndGgpLCBhICE9PSAwKSB7CiAgICAgICAgICB2YXIgcyA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IGEgPDwgYTsKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCksIGkgPCAwID8gdGhpcy5pc3VibigtaSkgOiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IGkgPyAodGhpcy53b3Jkc1swXSA9IGkgLSAodGhpcy53b3Jkc1swXSB8IDApLCB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcykgOiAodGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaXN1Ym4oaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzKSA6IHRoaXMuX2lhZGRuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdGhpcy53b3Jkc1swXSArPSBpOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2FdID49IDY3MTA4ODY0OyBhKyspCiAgICAgICAgICB0aGlzLndvcmRzW2FdIC09IDY3MTA4ODY0LCBhID09PSB0aGlzLmxlbmd0aCAtIDEgPyB0aGlzLndvcmRzW2EgKyAxXSA9IDEgOiB0aGlzLndvcmRzW2EgKyAxXSsrOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBhICsgMSksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChyKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpLCBpIDwgMCkKICAgICAgICAgIHJldHVybiB0aGlzLmlhZGRuKC1pKTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkbihpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXM7CiAgICAgICAgaWYgKHRoaXMud29yZHNbMF0gLT0gaSwgdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApCiAgICAgICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF0sIHRoaXMubmVnYXRpdmUgPSAxOwogICAgICAgIGVsc2UKICAgICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2FdIDwgMDsgYSsrKQogICAgICAgICAgICB0aGlzLndvcmRzW2FdICs9IDY3MTA4ODY0LCB0aGlzLndvcmRzW2EgKyAxXSAtPSAxOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IGkubGVuZ3RoICsgaDIsIHU7CiAgICAgICAgdGhpcy5fZXhwYW5kKHMpOwogICAgICAgIHZhciBjLCBiMiA9IDA7CiAgICAgICAgZm9yICh1ID0gMDt1IDwgaS5sZW5ndGg7IHUrKykgewogICAgICAgICAgYyA9ICh0aGlzLndvcmRzW3UgKyBoMl0gfCAwKSArIGIyOwogICAgICAgICAgdmFyIGwgPSAoaS53b3Jkc1t1XSB8IDApICogYTsKICAgICAgICAgIGMgLT0gbCAmIDY3MTA4ODYzLCBiMiA9IChjID4+IDI2KSAtIChsIC8gNjcxMDg4NjQgfCAwKSwgdGhpcy53b3Jkc1t1ICsgaDJdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIH0KICAgICAgICBmb3IgKDt1IDwgdGhpcy5sZW5ndGggLSBoMjsgdSsrKQogICAgICAgICAgYyA9ICh0aGlzLndvcmRzW3UgKyBoMl0gfCAwKSArIGIyLCBiMiA9IGMgPj4gMjYsIHRoaXMud29yZHNbdSArIGgyXSA9IGMgJiA2NzEwODg2MzsKICAgICAgICBpZiAoYjIgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICAgIGZvciAocihiMiA9PT0gLTEpLCBiMiA9IDAsIHUgPSAwO3UgPCB0aGlzLmxlbmd0aDsgdSsrKQogICAgICAgICAgYyA9IC0odGhpcy53b3Jkc1t1XSB8IDApICsgYjIsIGIyID0gYyA+PiAyNiwgdGhpcy53b3Jkc1t1XSA9IGMgJiA2NzEwODg2MzsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gdGhpcy5sZW5ndGggLSBpLmxlbmd0aCwgcyA9IHRoaXMuY2xvbmUoKSwgdSA9IGksIGMgPSB1LndvcmRzW3UubGVuZ3RoIC0gMV0gfCAwLCBiMiA9IHRoaXMuX2NvdW50Qml0cyhjKTsKICAgICAgICBoMiA9IDI2IC0gYjIsIGgyICE9PSAwICYmICh1ID0gdS51c2hsbihoMiksIHMuaXVzaGxuKGgyKSwgYyA9IHUud29yZHNbdS5sZW5ndGggLSAxXSB8IDApOwogICAgICAgIHZhciBsID0gcy5sZW5ndGggLSB1Lmxlbmd0aCwgbjsKICAgICAgICBpZiAoYSAhPT0gIm1vZCIpIHsKICAgICAgICAgIG4gPSBuZXcgZihudWxsKSwgbi5sZW5ndGggPSBsICsgMSwgbi53b3JkcyA9IG5ldyBBcnJheShuLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKHZhciBkID0gMDtkIDwgbi5sZW5ndGg7IGQrKykKICAgICAgICAgICAgbi53b3Jkc1tkXSA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciB3ID0gcy5jbG9uZSgpLl9pc2hsbnN1Ym11bCh1LCAxLCBsKTsKICAgICAgICB3Lm5lZ2F0aXZlID09PSAwICYmIChzID0gdywgbiAmJiAobi53b3Jkc1tsXSA9IDEpKTsKICAgICAgICBmb3IgKHZhciBnID0gbCAtIDE7ZyA+PSAwOyBnLS0pIHsKICAgICAgICAgIHZhciBfMiA9IChzLndvcmRzW3UubGVuZ3RoICsgZ10gfCAwKSAqIDY3MTA4ODY0ICsgKHMud29yZHNbdS5sZW5ndGggKyBnIC0gMV0gfCAwKTsKICAgICAgICAgIGZvciAoXzIgPSBNYXRoLm1pbihfMiAvIGMgfCAwLCA2NzEwODg2MyksIHMuX2lzaGxuc3VibXVsKHUsIF8yLCBnKTtzLm5lZ2F0aXZlICE9PSAwOyApCiAgICAgICAgICAgIF8yLS0sIHMubmVnYXRpdmUgPSAwLCBzLl9pc2hsbnN1Ym11bCh1LCAxLCBnKSwgcy5pc1plcm8oKSB8fCAocy5uZWdhdGl2ZSBePSAxKTsKICAgICAgICAgIG4gJiYgKG4ud29yZHNbZ10gPSBfMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuICYmIG4uc3RyaXAoKSwgcy5zdHJpcCgpLCBhICE9PSAiZGl2IiAmJiBoMiAhPT0gMCAmJiBzLml1c2hybihoMiksIHsgZGl2OiBuIHx8IG51bGwsIG1vZDogcyB9OwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmIChyKCFpLmlzWmVybygpKSwgdGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiB7IGRpdjogbmV3IGYoMCksIG1vZDogbmV3IGYoMCkgfTsKICAgICAgICB2YXIgcywgdSwgYzsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwID8gKGMgPSB0aGlzLm5lZygpLmRpdm1vZChpLCBhKSwgYSAhPT0gIm1vZCIgJiYgKHMgPSBjLmRpdi5uZWcoKSksIGEgIT09ICJkaXYiICYmICh1ID0gYy5tb2QubmVnKCksIGgyICYmIHUubmVnYXRpdmUgIT09IDAgJiYgdS5pYWRkKGkpKSwgeyBkaXY6IHMsIG1vZDogdSB9KSA6IHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCA/IChjID0gdGhpcy5kaXZtb2QoaS5uZWcoKSwgYSksIGEgIT09ICJtb2QiICYmIChzID0gYy5kaXYubmVnKCkpLCB7IGRpdjogcywgbW9kOiBjLm1vZCB9KSA6ICh0aGlzLm5lZ2F0aXZlICYgaS5uZWdhdGl2ZSkgIT09IDAgPyAoYyA9IHRoaXMubmVnKCkuZGl2bW9kKGkubmVnKCksIGEpLCBhICE9PSAiZGl2IiAmJiAodSA9IGMubW9kLm5lZygpLCBoMiAmJiB1Lm5lZ2F0aXZlICE9PSAwICYmIHUuaXN1YihpKSksIHsgZGl2OiBjLmRpdiwgbW9kOiB1IH0pIDogaS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChpKSA8IDAgPyB7IGRpdjogbmV3IGYoMCksIG1vZDogdGhpcyB9IDogaS5sZW5ndGggPT09IDEgPyBhID09PSAiZGl2IiA/IHsgZGl2OiB0aGlzLmRpdm4oaS53b3Jkc1swXSksIG1vZDogbnVsbCB9IDogYSA9PT0gIm1vZCIgPyB7IGRpdjogbnVsbCwgbW9kOiBuZXcgZih0aGlzLm1vZG4oaS53b3Jkc1swXSkpIH0gOiB7IGRpdjogdGhpcy5kaXZuKGkud29yZHNbMF0pLCBtb2Q6IG5ldyBmKHRoaXMubW9kbihpLndvcmRzWzBdKSkgfSA6IHRoaXMuX3dvcmREaXYoaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgImRpdiIsIGZhbHNlKS5kaXY7CiAgICAgIH0sIGYucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgIm1vZCIsIGZhbHNlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJtb2QiLCB0cnVlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5kaXZtb2QoaSk7CiAgICAgICAgaWYgKGEubW9kLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGEuZGl2OwogICAgICAgIHZhciBoMiA9IGEuZGl2Lm5lZ2F0aXZlICE9PSAwID8gYS5tb2QuaXN1YihpKSA6IGEubW9kLCBzID0gaS51c2hybigxKSwgdSA9IGkuYW5kbG4oMSksIGMgPSBoMi5jbXAocyk7CiAgICAgICAgcmV0dXJuIGMgPCAwIHx8IHUgPT09IDEgJiYgYyA9PT0gMCA/IGEuZGl2IDogYS5kaXYubmVnYXRpdmUgIT09IDAgPyBhLmRpdi5pc3VibigxKSA6IGEuZGl2LmlhZGRuKDEpOwogICAgICB9LCBmLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaSA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYSA9ICgxIDw8IDI2KSAlIGksIGgyID0gMCwgcyA9IHRoaXMubGVuZ3RoIC0gMTtzID49IDA7IHMtLSkKICAgICAgICAgIGgyID0gKGEgKiBoMiArICh0aGlzLndvcmRzW3NdIHwgMCkpICUgaTsKICAgICAgICByZXR1cm4gaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaSA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gdGhpcy5sZW5ndGggLSAxO2gyID49IDA7IGgyLS0pIHsKICAgICAgICAgIHZhciBzID0gKHRoaXMud29yZHNbaDJdIHwgMCkgKyBhICogNjcxMDg4NjQ7CiAgICAgICAgICB0aGlzLndvcmRzW2gyXSA9IHMgLyBpIHwgMCwgYSA9IHMgJSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwKSwgcighaS5pc1plcm8oKSk7CiAgICAgICAgdmFyIGEgPSB0aGlzLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlICE9PSAwID8gYSA9IGEudW1vZChpKSA6IGEgPSBhLmNsb25lKCk7CiAgICAgICAgZm9yICh2YXIgcyA9IG5ldyBmKDEpLCB1ID0gbmV3IGYoMCksIGMgPSBuZXcgZigwKSwgYjIgPSBuZXcgZigxKSwgbCA9IDA7YS5pc0V2ZW4oKSAmJiBoMi5pc0V2ZW4oKTsgKQogICAgICAgICAgYS5pdXNocm4oMSksIGgyLml1c2hybigxKSwgKytsOwogICAgICAgIGZvciAodmFyIG4gPSBoMi5jbG9uZSgpLCBkID0gYS5jbG9uZSgpOyFhLmlzWmVybygpOyApIHsKICAgICAgICAgIGZvciAodmFyIHcgPSAwLCBnID0gMTsoYS53b3Jkc1swXSAmIGcpID09PSAwICYmIHcgPCAyNjsgKyt3LCBnIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAodyA+IDApCiAgICAgICAgICAgIGZvciAoYS5pdXNocm4odyk7dy0tID4gMDsgKQogICAgICAgICAgICAgIChzLmlzT2RkKCkgfHwgdS5pc09kZCgpKSAmJiAocy5pYWRkKG4pLCB1LmlzdWIoZCkpLCBzLml1c2hybigxKSwgdS5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKHZhciBfMiA9IDAsIEEyID0gMTsoaDIud29yZHNbMF0gJiBBMikgPT09IDAgJiYgXzIgPCAyNjsgKytfMiwgQTIgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChfMiA+IDApCiAgICAgICAgICAgIGZvciAoaDIuaXVzaHJuKF8yKTtfMi0tID4gMDsgKQogICAgICAgICAgICAgIChjLmlzT2RkKCkgfHwgYjIuaXNPZGQoKSkgJiYgKGMuaWFkZChuKSwgYjIuaXN1YihkKSksIGMuaXVzaHJuKDEpLCBiMi5pdXNocm4oMSk7CiAgICAgICAgICBhLmNtcChoMikgPj0gMCA/IChhLmlzdWIoaDIpLCBzLmlzdWIoYyksIHUuaXN1YihiMikpIDogKGgyLmlzdWIoYSksIGMuaXN1YihzKSwgYjIuaXN1Yih1KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGE6IGMsIGI6IGIyLCBnY2Q6IGgyLml1c2hsbihsKSB9OwogICAgICB9LCBmLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwKSwgcighaS5pc1plcm8oKSk7CiAgICAgICAgdmFyIGEgPSB0aGlzLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlICE9PSAwID8gYSA9IGEudW1vZChpKSA6IGEgPSBhLmNsb25lKCk7CiAgICAgICAgZm9yICh2YXIgcyA9IG5ldyBmKDEpLCB1ID0gbmV3IGYoMCksIGMgPSBoMi5jbG9uZSgpO2EuY21wbigxKSA+IDAgJiYgaDIuY21wbigxKSA+IDA7ICkgewogICAgICAgICAgZm9yICh2YXIgYjIgPSAwLCBsID0gMTsoYS53b3Jkc1swXSAmIGwpID09PSAwICYmIGIyIDwgMjY7ICsrYjIsIGwgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChiMiA+IDApCiAgICAgICAgICAgIGZvciAoYS5pdXNocm4oYjIpO2IyLS0gPiAwOyApCiAgICAgICAgICAgICAgcy5pc09kZCgpICYmIHMuaWFkZChjKSwgcy5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKHZhciBuID0gMCwgZCA9IDE7KGgyLndvcmRzWzBdICYgZCkgPT09IDAgJiYgbiA8IDI2OyArK24sIGQgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChuID4gMCkKICAgICAgICAgICAgZm9yIChoMi5pdXNocm4obik7bi0tID4gMDsgKQogICAgICAgICAgICAgIHUuaXNPZGQoKSAmJiB1LmlhZGQoYyksIHUuaXVzaHJuKDEpOwogICAgICAgICAgYS5jbXAoaDIpID49IDAgPyAoYS5pc3ViKGgyKSwgcy5pc3ViKHUpKSA6IChoMi5pc3ViKGEpLCB1LmlzdWIocykpOwogICAgICAgIH0KICAgICAgICB2YXIgdzsKICAgICAgICByZXR1cm4gYS5jbXBuKDEpID09PSAwID8gdyA9IHMgOiB3ID0gdSwgdy5jbXBuKDApIDwgMCAmJiB3LmlhZGQoaSksIHc7CiAgICAgIH0sIGYucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLmFicygpOwogICAgICAgIGlmIChpLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHRoaXMuYWJzKCk7CiAgICAgICAgdmFyIGEgPSB0aGlzLmNsb25lKCksIGgyID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgPSAwLCBoMi5uZWdhdGl2ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7YS5pc0V2ZW4oKSAmJiBoMi5pc0V2ZW4oKTsgcysrKQogICAgICAgICAgYS5pdXNocm4oMSksIGgyLml1c2hybigxKTsKICAgICAgICBkbyB7CiAgICAgICAgICBmb3IgKDthLmlzRXZlbigpOyApCiAgICAgICAgICAgIGEuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICg7aDIuaXNFdmVuKCk7ICkKICAgICAgICAgICAgaDIuaXVzaHJuKDEpOwogICAgICAgICAgdmFyIHUgPSBhLmNtcChoMik7CiAgICAgICAgICBpZiAodSA8IDApIHsKICAgICAgICAgICAgdmFyIGMgPSBhOwogICAgICAgICAgICBhID0gaDIsIGgyID0gYzsKICAgICAgICAgIH0gZWxzZSBpZiAodSA9PT0gMCB8fCBoMi5jbXBuKDEpID09PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGEuaXN1YihoMik7CiAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgICAgcmV0dXJuIGgyLml1c2hsbihzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5lZ2NkKGkpLmEudW1vZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgaTsKICAgICAgfSwgZi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIik7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2LCBzID0gMSA8PCBhOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSBoMikKICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoaDIgKyAxKSwgdGhpcy53b3Jkc1toMl0gfD0gcywgdGhpczsKICAgICAgICBmb3IgKHZhciB1ID0gcywgYyA9IGgyO3UgIT09IDAgJiYgYyA8IHRoaXMubGVuZ3RoOyBjKyspIHsKICAgICAgICAgIHZhciBiMiA9IHRoaXMud29yZHNbY10gfCAwOwogICAgICAgICAgYjIgKz0gdSwgdSA9IGIyID4+PiAyNiwgYjIgJj0gNjcxMDg4NjMsIHRoaXMud29yZHNbY10gPSBiMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHUgIT09IDAgJiYgKHRoaXMud29yZHNbY10gPSB1LCB0aGlzLmxlbmd0aCsrKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpIDwgMDsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhYSkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBhKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICAgIHZhciBoMjsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAxKQogICAgICAgICAgaDIgPSAxOwogICAgICAgIGVsc2UgewogICAgICAgICAgYSAmJiAoaSA9IC1pKSwgcihpIDw9IDY3MTA4ODYzLCAiTnVtYmVyIGlzIHRvbyBiaWciKTsKICAgICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1swXSB8IDA7CiAgICAgICAgICBoMiA9IHMgPT09IGkgPyAwIDogcyA8IGkgPyAtMSA6IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWgyIHwgMCA6IGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgdmFyIGEgPSB0aGlzLnVjbXAoaSk7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtYSB8IDAgOiBhOwogICAgICB9LCBmLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGkubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgaS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gdGhpcy5sZW5ndGggLSAxO2gyID49IDA7IGgyLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1toMl0gfCAwLCB1ID0gaS53b3Jkc1toMl0gfCAwOwogICAgICAgICAgaWYgKHMgIT09IHUpIHsKICAgICAgICAgICAgcyA8IHUgPyBhID0gLTEgOiBzID4gdSAmJiAoYSA9IDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA+PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID49IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAtMTsKICAgICAgfSwgZi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAtMTsKICAgICAgfSwgZi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpIDw9IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPD0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmVxID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gMDsKICAgICAgfSwgZi5yZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsICJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIGkuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZCA9IGksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgdGhpcy5fZm9yY2VSZWQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuYWRkKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuaWFkZCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5zdWIodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5pc3ViKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLnNobCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBpKSwgdGhpcy5yZWQubXVsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBpKSwgdGhpcy5yZWQuaW11bCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5zcXIodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pc3FyKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FydCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmludm0odGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQubmVnKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQgJiYgIWkucmVkLCAicmVkUG93KG5vcm1hbE51bSkiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnBvdyh0aGlzLCBpKTsKICAgICAgfTsKICAgICAgdmFyIHdlID0geyBrMjU2OiBudWxsLCBwMjI0OiBudWxsLCBwMTkyOiBudWxsLCBwMjU1MTk6IG51bGwgfTsKICAgICAgZnVuY3Rpb24geWUodiwgaSkgewogICAgICAgIHRoaXMubmFtZSA9IHYsIHRoaXMucCA9IG5ldyBmKGksIDE2KSwgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpLCB0aGlzLmsgPSBuZXcgZigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7CiAgICAgIH0KICAgICAgeWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBpLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpLCBpOwogICAgICB9LCB5ZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGksIGgyOwogICAgICAgIGRvCiAgICAgICAgICB0aGlzLnNwbGl0KGEsIHRoaXMudG1wKSwgYSA9IHRoaXMuaW11bEsoYSksIGEgPSBhLmlhZGQodGhpcy50bXApLCBoMiA9IGEuYml0TGVuZ3RoKCk7CiAgICAgICAgd2hpbGUgKGgyID4gdGhpcy5uKTsKICAgICAgICB2YXIgcyA9IGgyIDwgdGhpcy5uID8gLTEgOiBhLnVjbXAodGhpcy5wKTsKICAgICAgICByZXR1cm4gcyA9PT0gMCA/IChhLndvcmRzWzBdID0gMCwgYS5sZW5ndGggPSAxKSA6IHMgPiAwID8gYS5pc3ViKHRoaXMucCkgOiBhLnN0cmlwICE9PSB1bmRlZmluZWQgPyBhLnN0cmlwKCkgOiBhLl9zdHJpcCgpLCBhOwogICAgICB9LCB5ZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaS5pdXNocm4odGhpcy5uLCAwLCBhKTsKICAgICAgfSwgeWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpLmltdWwodGhpcy5rKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24geGUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAiazI1NiIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpOwogICAgICB9CiAgICAgIG8oeGUsIHllKSwgeGUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGZvciAodmFyIGgyID0gNDE5NDMwMywgcyA9IE1hdGgubWluKGkubGVuZ3RoLCA5KSwgdSA9IDA7dSA8IHM7IHUrKykKICAgICAgICAgIGEud29yZHNbdV0gPSBpLndvcmRzW3VdOwogICAgICAgIGlmIChhLmxlbmd0aCA9IHMsIGkubGVuZ3RoIDw9IDkpIHsKICAgICAgICAgIGkud29yZHNbMF0gPSAwLCBpLmxlbmd0aCA9IDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBjID0gaS53b3Jkc1s5XTsKICAgICAgICBmb3IgKGEud29yZHNbYS5sZW5ndGgrK10gPSBjICYgaDIsIHUgPSAxMDt1IDwgaS5sZW5ndGg7IHUrKykgewogICAgICAgICAgdmFyIGIyID0gaS53b3Jkc1t1XSB8IDA7CiAgICAgICAgICBpLndvcmRzW3UgLSAxMF0gPSAoYjIgJiBoMikgPDwgNCB8IGMgPj4+IDIyLCBjID0gYjI7CiAgICAgICAgfQogICAgICAgIGMgPj4+PSAyMiwgaS53b3Jkc1t1IC0gMTBdID0gYywgYyA9PT0gMCAmJiBpLmxlbmd0aCA+IDEwID8gaS5sZW5ndGggLT0gMTAgOiBpLmxlbmd0aCAtPSA5OwogICAgICB9LCB4ZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaS53b3Jkc1tpLmxlbmd0aF0gPSAwLCBpLndvcmRzW2kubGVuZ3RoICsgMV0gPSAwLCBpLmxlbmd0aCArPSAyOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IDA7aDIgPCBpLmxlbmd0aDsgaDIrKykgewogICAgICAgICAgdmFyIHMgPSBpLndvcmRzW2gyXSB8IDA7CiAgICAgICAgICBhICs9IHMgKiA5NzcsIGkud29yZHNbaDJdID0gYSAmIDY3MTA4ODYzLCBhID0gcyAqIDY0ICsgKGEgLyA2NzEwODg2NCB8IDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaS53b3Jkc1tpLmxlbmd0aCAtIDFdID09PSAwICYmIChpLmxlbmd0aC0tLCBpLndvcmRzW2kubGVuZ3RoIC0gMV0gPT09IDAgJiYgaS5sZW5ndGgtLSksIGk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFJlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgInAyMjQiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiKTsKICAgICAgfQogICAgICBvKFJlLCB5ZSk7CiAgICAgIGZ1bmN0aW9uIEVlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgInAxOTIiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKTsKICAgICAgfQogICAgICBvKEVlLCB5ZSk7CiAgICAgIGZ1bmN0aW9uIEFlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgIjI1NTE5IiwgIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKTsKICAgICAgfQogICAgICBvKEFlLCB5ZSksIEFlLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSAwO2gyIDwgaS5sZW5ndGg7IGgyKyspIHsKICAgICAgICAgIHZhciBzID0gKGkud29yZHNbaDJdIHwgMCkgKiAxOSArIGEsIHUgPSBzICYgNjcxMDg4NjM7CiAgICAgICAgICBzID4+Pj0gMjYsIGkud29yZHNbaDJdID0gdSwgYSA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhICE9PSAwICYmIChpLndvcmRzW2kubGVuZ3RoKytdID0gYSksIGk7CiAgICAgIH0sIGYuX3ByaW1lID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh3ZVtpXSkKICAgICAgICAgIHJldHVybiB3ZVtpXTsKICAgICAgICB2YXIgYTsKICAgICAgICBpZiAoaSA9PT0gImsyNTYiKQogICAgICAgICAgYSA9IG5ldyB4ZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDIyNCIpCiAgICAgICAgICBhID0gbmV3IFJlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMTkyIikKICAgICAgICAgIGEgPSBuZXcgRWU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAyNTUxOSIpCiAgICAgICAgICBhID0gbmV3IEFlOwogICAgICAgIGVsc2UKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiICsgaSk7CiAgICAgICAgcmV0dXJuIHdlW2ldID0gYSwgYTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gUCh2KSB7CiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgaSA9IGYuX3ByaW1lKHYpOwogICAgICAgICAgdGhpcy5tID0gaS5wLCB0aGlzLnByaW1lID0gaTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHIodi5ndG4oMSksICJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSwgdGhpcy5tID0gdiwgdGhpcy5wcmltZSA9IG51bGw7CiAgICAgIH0KICAgICAgUC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihpLnJlZCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKTsKICAgICAgfSwgUC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcigoaS5uZWdhdGl2ZSB8IGEubmVnYXRpdmUpID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihpLnJlZCAmJiBpLnJlZCA9PT0gYS5yZWQsICJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIik7CiAgICAgIH0sIFAucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWUgPyB0aGlzLnByaW1lLmlyZWR1Y2UoaSkuX2ZvcmNlUmVkKHRoaXMpIDogaS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkuaXNaZXJvKCkgPyBpLmNsb25lKCkgOiB0aGlzLm0uc3ViKGkpLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5hZGQoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcCh0aGlzLm0pID49IDAgJiYgaDIuaXN1Yih0aGlzLm0pLCBoMi5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDIgPSBpLmlhZGQoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcCh0aGlzLm0pID49IDAgJiYgaDIuaXN1Yih0aGlzLm0pLCBoMjsKICAgICAgfSwgUC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5zdWIoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcG4oMCkgPCAwICYmIGgyLmlhZGQodGhpcy5tKSwgaDIuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5pc3ViKGEpOwogICAgICAgIHJldHVybiBoMi5jbXBuKDApIDwgMCAmJiBoMi5pYWRkKHRoaXMubSksIGgyOwogICAgICB9LCBQLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTEoaSksIHRoaXMuaW1vZChpLnVzaGxuKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihpLCBhKSwgdGhpcy5pbW9kKGkuaW11bChhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihpLCBhKSwgdGhpcy5pbW9kKGkubXVsKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbXVsKGksIGkuY2xvbmUoKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWwoaSwgaSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS5jbG9uZSgpOwogICAgICAgIHZhciBhID0gdGhpcy5tLmFuZGxuKDMpOwogICAgICAgIGlmIChyKGEgJSAyID09PSAxKSwgYSA9PT0gMykgewogICAgICAgICAgdmFyIGgyID0gdGhpcy5tLmFkZChuZXcgZigxKSkuaXVzaHJuKDIpOwogICAgICAgICAgcmV0dXJuIHRoaXMucG93KGksIGgyKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgcyA9IHRoaXMubS5zdWJuKDEpLCB1ID0gMDshcy5pc1plcm8oKSAmJiBzLmFuZGxuKDEpID09PSAwOyApCiAgICAgICAgICB1KyssIHMuaXVzaHJuKDEpOwogICAgICAgIHIoIXMuaXNaZXJvKCkpOwogICAgICAgIHZhciBjID0gbmV3IGYoMSkudG9SZWQodGhpcyksIGIyID0gYy5yZWROZWcoKSwgbCA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKSwgbiA9IHRoaXMubS5iaXRMZW5ndGgoKTsKICAgICAgICBmb3IgKG4gPSBuZXcgZigyICogbiAqIG4pLnRvUmVkKHRoaXMpO3RoaXMucG93KG4sIGwpLmNtcChiMikgIT09IDA7ICkKICAgICAgICAgIG4ucmVkSUFkZChiMik7CiAgICAgICAgZm9yICh2YXIgZCA9IHRoaXMucG93KG4sIHMpLCB3ID0gdGhpcy5wb3coaSwgcy5hZGRuKDEpLml1c2hybigxKSksIGcgPSB0aGlzLnBvdyhpLCBzKSwgXzIgPSB1O2cuY21wKGMpICE9PSAwOyApIHsKICAgICAgICAgIGZvciAodmFyIEEyID0gZywgUjIgPSAwO0EyLmNtcChjKSAhPT0gMDsgUjIrKykKICAgICAgICAgICAgQTIgPSBBMi5yZWRTcXIoKTsKICAgICAgICAgIHIoUjIgPCBfMik7CiAgICAgICAgICB2YXIgSSA9IHRoaXMucG93KGQsIG5ldyBmKDEpLml1c2hsbihfMiAtIFIyIC0gMSkpOwogICAgICAgICAgdyA9IHcucmVkTXVsKEkpLCBkID0gSS5yZWRTcXIoKSwgZyA9IGcucmVkTXVsKGQpLCBfMiA9IFIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdzsKICAgICAgfSwgUC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkuX2ludm1wKHRoaXMubSk7CiAgICAgICAgcmV0dXJuIGEubmVnYXRpdmUgIT09IDAgPyAoYS5uZWdhdGl2ZSA9IDAsIHRoaXMuaW1vZChhKS5yZWROZWcoKSkgOiB0aGlzLmltb2QoYSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBuZXcgZigxKS50b1JlZCh0aGlzKTsKICAgICAgICBpZiAoYS5jbXBuKDEpID09PSAwKQogICAgICAgICAgcmV0dXJuIGkuY2xvbmUoKTsKICAgICAgICB2YXIgaDIgPSA0LCBzID0gbmV3IEFycmF5KDEgPDwgaDIpOwogICAgICAgIHNbMF0gPSBuZXcgZigxKS50b1JlZCh0aGlzKSwgc1sxXSA9IGk7CiAgICAgICAgZm9yICh2YXIgdSA9IDI7dSA8IHMubGVuZ3RoOyB1KyspCiAgICAgICAgICBzW3VdID0gdGhpcy5tdWwoc1t1IC0gMV0sIGkpOwogICAgICAgIHZhciBjID0gc1swXSwgYjIgPSAwLCBsID0gMCwgbiA9IGEuYml0TGVuZ3RoKCkgJSAyNjsKICAgICAgICBmb3IgKG4gPT09IDAgJiYgKG4gPSAyNiksIHUgPSBhLmxlbmd0aCAtIDE7dSA+PSAwOyB1LS0pIHsKICAgICAgICAgIGZvciAodmFyIGQgPSBhLndvcmRzW3VdLCB3ID0gbiAtIDE7dyA+PSAwOyB3LS0pIHsKICAgICAgICAgICAgdmFyIGcgPSBkID4+IHcgJiAxOwogICAgICAgICAgICBpZiAoYyAhPT0gc1swXSAmJiAoYyA9IHRoaXMuc3FyKGMpKSwgZyA9PT0gMCAmJiBiMiA9PT0gMCkgewogICAgICAgICAgICAgIGwgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGIyIDw8PSAxLCBiMiB8PSBnLCBsKyssICEobCAhPT0gaDIgJiYgKHUgIT09IDAgfHwgdyAhPT0gMCkpICYmIChjID0gdGhpcy5tdWwoYywgc1tiMl0pLCBsID0gMCwgYjIgPSAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG4gPSAyNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH0sIFAucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkudW1vZCh0aGlzLm0pOwogICAgICAgIHJldHVybiBhID09PSBpID8gYS5jbG9uZSgpIDogYTsKICAgICAgfSwgUC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLmNsb25lKCk7CiAgICAgICAgcmV0dXJuIGEucmVkID0gbnVsbCwgYTsKICAgICAgfSwgZi5tb250ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBuZXcgU2UoaSk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFNlKHYpIHsKICAgICAgICBQLmNhbGwodGhpcywgdiksIHRoaXMuc2hpZnQgPSB0aGlzLm0uYml0TGVuZ3RoKCksIHRoaXMuc2hpZnQgJSAyNiAhPT0gMCAmJiAodGhpcy5zaGlmdCArPSAyNiAtIHRoaXMuc2hpZnQgJSAyNiksIHRoaXMuciA9IG5ldyBmKDEpLml1c2hsbih0aGlzLnNoaWZ0KSwgdGhpcy5yMiA9IHRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLCB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSksIHRoaXMubWludiA9IHRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSwgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKSwgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpOwogICAgICB9CiAgICAgIG8oU2UsIFApLCBTZS5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmltb2QoaS51c2hsbih0aGlzLnNoaWZ0KSk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuaW1vZChpLm11bCh0aGlzLnJpbnYpKTsKICAgICAgICByZXR1cm4gYS5yZWQgPSBudWxsLCBhOwogICAgICB9LCBTZS5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSB8fCBhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkud29yZHNbMF0gPSAwLCBpLmxlbmd0aCA9IDEsIGk7CiAgICAgICAgdmFyIGgyID0gaS5pbXVsKGEpLCBzID0gaDIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLCB1ID0gaDIuaXN1YihzKS5pdXNocm4odGhpcy5zaGlmdCksIGMgPSB1OwogICAgICAgIHJldHVybiB1LmNtcCh0aGlzLm0pID49IDAgPyBjID0gdS5pc3ViKHRoaXMubSkgOiB1LmNtcG4oMCkgPCAwICYmIChjID0gdS5pYWRkKHRoaXMubSkpLCBjLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgU2UucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSB8fCBhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDApLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgICB2YXIgaDIgPSBpLm11bChhKSwgcyA9IGgyLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSwgdSA9IGgyLmlzdWIocykuaXVzaHJuKHRoaXMuc2hpZnQpLCBjID0gdTsKICAgICAgICByZXR1cm4gdS5jbXAodGhpcy5tKSA+PSAwID8gYyA9IHUuaXN1Yih0aGlzLm0pIDogdS5jbXBuKDApIDwgMCAmJiAoYyA9IHUuaWFkZCh0aGlzLm0pKSwgYy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5pbW9kKGkuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTsKICAgICAgICByZXR1cm4gYS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH07CiAgICB9KSh0eXBlb2YgWHUgPiAidSIgfHwgWHUsIEdtKTsKICB9KTsKICBYbSA9IFQyKCgpID0+IHsKICB9KTsKICBBcyA9IFQyKCgkVCwgZWwpID0+IHsKICAgIHZhciBKdTsKICAgIGVsLmV4cG9ydHMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBKdSB8fCAoSnUgPSBuZXcgWmkobnVsbCkpLCBKdS5nZW5lcmF0ZShlKTsKICAgIH07CiAgICBmdW5jdGlvbiBaaSh0KSB7CiAgICAgIHRoaXMucmFuZCA9IHQ7CiAgICB9CiAgICBlbC5leHBvcnRzLlJhbmQgPSBaaTsKICAgIFppLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JhbmQoZSk7CiAgICB9OwogICAgWmkucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKQogICAgICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMoZSk7CiAgICAgIGZvciAodmFyIHIgPSBuZXcgVWludDhBcnJheShlKSwgbyA9IDA7byA8IHIubGVuZ3RoOyBvKyspCiAgICAgICAgcltvXSA9IHRoaXMucmFuZC5nZXRCeXRlKCk7CiAgICAgIHJldHVybiByOwogICAgfTsKICAgIGlmICh0eXBlb2Ygc2VsZiA9PSAib2JqZWN0IikKICAgICAgc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID8gWmkucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24oZSkgewogICAgICAgIHZhciByID0gbmV3IFVpbnQ4QXJyYXkoZSk7CiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyKSwgcjsKICAgICAgfSA6IHNlbGYubXNDcnlwdG8gJiYgc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMgPyBaaS5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIHIgPSBuZXcgVWludDhBcnJheShlKTsKICAgICAgICByZXR1cm4gc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMociksIHI7CiAgICAgIH0gOiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIChaaS5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICAgfSk7CiAgICBlbHNlCiAgICAgIHRyeSB7CiAgICAgICAgaWYgKFF1ID0gWG0oKSwgdHlwZW9mIFF1LnJhbmRvbUJ5dGVzICE9ICJmdW5jdGlvbiIpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICBaaS5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICByZXR1cm4gUXUucmFuZG9tQnl0ZXMoZSk7CiAgICAgICAgfTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIHZhciBRdTsKICB9KTsKICB0bCA9IFQyKChHVCwgSm0pID0+IHsKICAgIHZhciBJbiA9IFltKCksIFE5ID0gQXMoKTsKICAgIGZ1bmN0aW9uIFRuKHQpIHsKICAgICAgdGhpcy5yYW5kID0gdCB8fCBuZXcgUTkuUmFuZDsKICAgIH0KICAgIEptLmV4cG9ydHMgPSBUbjsKICAgIFRuLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIG5ldyBUbihlKTsKICAgIH07CiAgICBUbi5wcm90b3R5cGUuX3JhbmRiZWxvdyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSBlLmJpdExlbmd0aCgpLCBvID0gTWF0aC5jZWlsKHIgLyA4KTsKICAgICAgZG8KICAgICAgICB2YXIgZiA9IG5ldyBJbih0aGlzLnJhbmQuZ2VuZXJhdGUobykpOwogICAgICB3aGlsZSAoZi5jbXAoZSkgPj0gMCk7CiAgICAgIHJldHVybiBmOwogICAgfTsKICAgIFRuLnByb3RvdHlwZS5fcmFuZHJhbmdlID0gZnVuY3Rpb24oZSwgcikgewogICAgICB2YXIgbyA9IHIuc3ViKGUpOwogICAgICByZXR1cm4gZS5hZGQodGhpcy5fcmFuZGJlbG93KG8pKTsKICAgIH07CiAgICBUbi5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdmFyIGYgPSBlLmJpdExlbmd0aCgpLCBwID0gSW4ubW9udChlKSwgbTIgPSBuZXcgSW4oMSkudG9SZWQocCk7CiAgICAgIHIgfHwgKHIgPSBNYXRoLm1heCgxLCBmIC8gNDggfCAwKSk7CiAgICAgIGZvciAodmFyIHkyID0gZS5zdWJuKDEpLCBNID0gMDsheTIudGVzdG4oTSk7IE0rKykKICAgICAgICA7CiAgICAgIGZvciAodmFyIHggPSBlLnNocm4oTSksIFMgPSB5Mi50b1JlZChwKSwgRTIgPSB0cnVlO3IgPiAwOyByLS0pIHsKICAgICAgICB2YXIgQiA9IHRoaXMuX3JhbmRyYW5nZShuZXcgSW4oMiksIHkyKTsKICAgICAgICBvICYmIG8oQik7CiAgICAgICAgdmFyIHEyID0gQi50b1JlZChwKS5yZWRQb3coeCk7CiAgICAgICAgaWYgKCEocTIuY21wKG0yKSA9PT0gMCB8fCBxMi5jbXAoUykgPT09IDApKSB7CiAgICAgICAgICBmb3IgKHZhciBMMiA9IDE7TDIgPCBNOyBMMisrKSB7CiAgICAgICAgICAgIGlmIChxMiA9IHEyLnJlZFNxcigpLCBxMi5jbXAobTIpID09PSAwKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHEyLmNtcChTKSA9PT0gMCkKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChMMiA9PT0gTSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gRTI7CiAgICB9OwogICAgVG4ucHJvdG90eXBlLmdldERpdmlzb3IgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHZhciBvID0gZS5iaXRMZW5ndGgoKSwgZiA9IEluLm1vbnQoZSksIHAgPSBuZXcgSW4oMSkudG9SZWQoZik7CiAgICAgIHIgfHwgKHIgPSBNYXRoLm1heCgxLCBvIC8gNDggfCAwKSk7CiAgICAgIGZvciAodmFyIG0yID0gZS5zdWJuKDEpLCB5MiA9IDA7IW0yLnRlc3RuKHkyKTsgeTIrKykKICAgICAgICA7CiAgICAgIGZvciAodmFyIE0gPSBlLnNocm4oeTIpLCB4ID0gbTIudG9SZWQoZik7ciA+IDA7IHItLSkgewogICAgICAgIHZhciBTID0gdGhpcy5fcmFuZHJhbmdlKG5ldyBJbigyKSwgbTIpLCBFMiA9IGUuZ2NkKFMpOwogICAgICAgIGlmIChFMi5jbXBuKDEpICE9PSAwKQogICAgICAgICAgcmV0dXJuIEUyOwogICAgICAgIHZhciBCID0gUy50b1JlZChmKS5yZWRQb3coTSk7CiAgICAgICAgaWYgKCEoQi5jbXAocCkgPT09IDAgfHwgQi5jbXAoeCkgPT09IDApKSB7CiAgICAgICAgICBmb3IgKHZhciBxMiA9IDE7cTIgPCB5MjsgcTIrKykgewogICAgICAgICAgICBpZiAoQiA9IEIucmVkU3FyKCksIEIuY21wKHApID09PSAwKQogICAgICAgICAgICAgIHJldHVybiBCLmZyb21SZWQoKS5zdWJuKDEpLmdjZChlKTsKICAgICAgICAgICAgaWYgKEIuY21wKHgpID09PSAwKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHEyID09PSB5MikKICAgICAgICAgICAgcmV0dXJuIEIgPSBCLnJlZFNxcigpLCBCLmZyb21SZWQoKS5zdWJuKDEpLmdjZChlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICB9KTsKICBvbCA9IFQyKChlaywgdGcpID0+IHsKICAgIHZhciBlUyA9IG9uKCk7CiAgICB0Zy5leHBvcnRzID0gYWw7CiAgICBhbC5zaW1wbGVTaWV2ZSA9IG5sOwogICAgYWwuZmVybWF0VGVzdCA9IGZsOwogICAgdmFyIEh0ID0gWXUoKSwgdFMgPSBuZXcgSHQoMjQpLCByUyA9IHRsKCksIFFtID0gbmV3IHJTLCBpUyA9IG5ldyBIdCgxKSwgaWwgPSBuZXcgSHQoMiksIG5TID0gbmV3IEh0KDUpLCBZVCA9IG5ldyBIdCgxNiksIFhUID0gbmV3IEh0KDgpLCBmUyA9IG5ldyBIdCgxMCksIGFTID0gbmV3IEh0KDMpLCBKVCA9IG5ldyBIdCg3KSwgb1MgPSBuZXcgSHQoMTEpLCBlZyA9IG5ldyBIdCg0KSwgUVQgPSBuZXcgSHQoMTIpLCBybCA9IG51bGw7CiAgICBmdW5jdGlvbiBzUygpIHsKICAgICAgaWYgKHJsICE9PSBudWxsKQogICAgICAgIHJldHVybiBybDsKICAgICAgdmFyIHQgPSAxMDQ4NTc2LCBlID0gW107CiAgICAgIGVbMF0gPSAyOwogICAgICBmb3IgKHZhciByID0gMSwgbyA9IDM7byA8IHQ7IG8gKz0gMikgewogICAgICAgIGZvciAodmFyIGYgPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KG8pKSwgcCA9IDA7cCA8IHIgJiYgZVtwXSA8PSBmICYmIG8gJSBlW3BdICE9PSAwOyBwKyspCiAgICAgICAgICA7CiAgICAgICAgciAhPT0gcCAmJiBlW3BdIDw9IGYgfHwgKGVbcisrXSA9IG8pOwogICAgICB9CiAgICAgIHJldHVybiBybCA9IGUsIGU7CiAgICB9CiAgICBmdW5jdGlvbiBubCh0KSB7CiAgICAgIGZvciAodmFyIGUgPSBzUygpLCByID0gMDtyIDwgZS5sZW5ndGg7IHIrKykKICAgICAgICBpZiAodC5tb2RuKGVbcl0pID09PSAwKQogICAgICAgICAgcmV0dXJuIHQuY21wbihlW3JdKSA9PT0gMDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBmbCh0KSB7CiAgICAgIHZhciBlID0gSHQubW9udCh0KTsKICAgICAgcmV0dXJuIGlsLnRvUmVkKGUpLnJlZFBvdyh0LnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpID09PSAwOwogICAgfQogICAgZnVuY3Rpb24gYWwodCwgZSkgewogICAgICBpZiAodCA8IDE2KQogICAgICAgIHJldHVybiBlID09PSAyIHx8IGUgPT09IDUgPyBuZXcgSHQoWzE0MCwgMTIzXSkgOiBuZXcgSHQoWzE0MCwgMzldKTsKICAgICAgZSA9IG5ldyBIdChlKTsKICAgICAgZm9yICh2YXIgciwgbzs7ICkgewogICAgICAgIGZvciAociA9IG5ldyBIdChlUyhNYXRoLmNlaWwodCAvIDgpKSk7ci5iaXRMZW5ndGgoKSA+IHQ7ICkKICAgICAgICAgIHIuaXNocm4oMSk7CiAgICAgICAgaWYgKHIuaXNFdmVuKCkgJiYgci5pYWRkKGlTKSwgci50ZXN0bigxKSB8fCByLmlhZGQoaWwpLCBlLmNtcChpbCkpIHsKICAgICAgICAgIGlmICghZS5jbXAoblMpKQogICAgICAgICAgICBmb3IgKDtyLm1vZChmUykuY21wKGFTKTsgKQogICAgICAgICAgICAgIHIuaWFkZChlZyk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBmb3IgKDtyLm1vZCh0UykuY21wKG9TKTsgKQogICAgICAgICAgICByLmlhZGQoZWcpOwogICAgICAgIGlmIChvID0gci5zaHJuKDEpLCBubChvKSAmJiBubChyKSAmJiBmbChvKSAmJiBmbChyKSAmJiBRbS50ZXN0KG8pICYmIFFtLnRlc3QocikpCiAgICAgICAgICByZXR1cm4gcjsKICAgICAgfQogICAgfQogIH0pOwogIHJnID0gVDIoKHRrLCBoUykgPT4gewogICAgaFMuZXhwb3J0cyA9IHsgbW9kcDE6IHsgZ2VuOiAiMDIiLCBwcmltZTogImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2M2EzNjIwZmZmZmZmZmZmZmZmZmZmZiIgfSwgbW9kcDI6IHsgZ2VuOiAiMDIiLCBwcmltZTogImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U2NTM4MWZmZmZmZmZmZmZmZmZmZmYiIH0sIG1vZHA1OiB7IGdlbjogIjAyIiwgcHJpbWU6ICJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTIzNzMyN2ZmZmZmZmZmZmZmZmZmZmYiIH0sIG1vZHAxNDogeyBnZW46ICIwMiIsIHByaW1lOiAiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFjYWE2OGZmZmZmZmZmZmZmZmZmZmYiIH0sIG1vZHAxNTogeyBnZW46ICIwMiIsIHByaW1lOiAiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkzYWQyY2FmZmZmZmZmZmZmZmZmZmZmIiB9LCBtb2RwMTY6IHsgZ2VuOiAiMDIiLCBwcmltZTogImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDA2MzE5OWZmZmZmZmZmZmZmZmZmZmYiIH0sIG1vZHAxNzogeyBnZW46ICIwMiIsIHByaW1lOiAiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzN2VkNmIwYmZmNWNiNmY0MDZiN2VkZWUzODZiZmI1YTg5OWZhNWFlOWYyNDExN2M0YjFmZTY0OTI4NjY1MWVjZTQ1YjNkYzIwMDdjYjhhMTYzYmYwNTk4ZGE0ODM2MWM1NWQzOWE2OTE2M2ZhOGZkMjRjZjVmODM2NTVkMjNkY2EzYWQ5NjFjNjJmMzU2MjA4NTUyYmI5ZWQ1MjkwNzcwOTY5NjZkNjcwYzM1NGU0YWJjOTgwNGYxNzQ2YzA4Y2ExODIxN2MzMjkwNWU0NjJlMzZjZTNiZTM5ZTc3MmMxODBlODYwMzliMjc4M2EyZWMwN2EyOGZiNWM1NWRmMDZmNGM1MmM5ZGUyYmNiZjY5NTU4MTcxODM5OTU0OTdjZWE5NTZhZTUxNWQyMjYxODk4ZmEwNTEwMTU3MjhlNWE4YWFhYzQyZGFkMzMxNzBkMDQ1MDdhMzNhODU1MjFhYmRmMWNiYTY0ZWNmYjg1MDQ1OGRiZWYwYThhZWE3MTU3NWQwNjBjN2RiMzk3MGY4NWE2ZTFlNGM3YWJmNWFlOGNkYjA5MzNkNzFlOGM5NGUwNGEyNTYxOWRjZWUzZDIyNjFhZDJlZTZiZjEyZmZhMDZkOThhMDg2NGQ4NzYwMjczM2VjODZhNjQ1MjFmMmIxODE3N2IyMDBjYmJlMTE3NTc3YTYxNWQ2Yzc3MDk4OGMwYmFkOTQ2ZTIwOGUyNGZhMDc0ZTVhYjMxNDNkYjViZmNlMGZkMTA4ZTRiODJkMTIwYTkyMTA4MDExYTcyM2MxMmE3ODdlNmQ3ODg3MTlhMTBiZGJhNWIyNjk5YzMyNzE4NmFmNGUyM2MxYTk0NjgzNGI2MTUwYmRhMjU4M2U5Y2EyYWQ0NGNlOGRiYmJjMmRiMDRkZThlZjkyZThlZmMxNDFmYmVjYWE2Mjg3YzU5NDc0ZTZiYzA1ZDk5YjI5NjRmYTA5MGMzYTIyMzNiYTE4NjUxNWJlN2VkMWY2MTI5NzBjZWUyZDdhZmI4MWJkZDc2MjE3MDQ4MWNkMDA2OTEyN2Q1YjA1YWE5OTNiNGVhOTg4ZDhmZGRjMTg2ZmZiN2RjOTBhNmMwOGY0ZGY0MzVjOTM0MDI4NDkyMzZjM2ZhYjRkMjdjNzAyNmMxZDRkY2IyNjAyNjQ2ZGVjOTc1MWU3NjNkYmEzN2JkZjhmZjk0MDZhZDllNTMwZWU1ZGIzODJmNDEzMDAxYWViMDZhNTNlZDkwMjdkODMxMTc5NzI3YjA4NjVhODkxOGRhM2VkYmViY2Y5YjE0ZWQ0NGNlNmNiYWNlZDRiYjFiZGI3ZjE0NDdlNmNjMjU0YjMzMjA1MTUxMmJkN2FmNDI2ZmI4ZjQwMTM3OGNkMmJmNTk4M2NhMDFjNjRiOTJlY2YwMzJlYTE1ZDE3MjFkMDNmNDgyZDdjZTZlNzRmZWY2ZDU1ZTcwMmY0Njk4MGM4MmI1YTg0MDMxOTAwYjFjOWU1OWU3Yzk3ZmJlYzdlOGYzMjNhOTdhN2UzNmNjODhiZTBmMWQ0NWI3ZmY1ODVhYzU0YmQ0MDdiMjJiNDE1NGFhY2M4ZjZkN2ViZjQ4ZTFkODE0Y2M1ZWQyMGY4MDM3ZTBhNzk3MTVlZWYyOWJlMzI4MDZhMWQ1OGJiN2M1ZGE3NmY1NTBhYTNkOGExZmJmZjBlYjE5Y2NiMWEzMTNkNTVjZGE1NmM5ZWMyZWYyOTYzMjM4N2ZlOGQ3NmUzYzA0NjgwNDNlOGY2NjNmNDg2MGVlMTJiZjJkNWIwYjc0NzRkNmU2OTRmOTFlNmRjYzQwMjRmZmZmZmZmZmZmZmZmZmZmIiB9LCBtb2RwMTg6IHsgZ2VuOiAiMDIiLCBwcmltZTogImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDAyODQ5MjM2YzNmYWI0ZDI3YzcwMjZjMWQ0ZGNiMjYwMjY0NmRlYzk3NTFlNzYzZGJhMzdiZGY4ZmY5NDA2YWQ5ZTUzMGVlNWRiMzgyZjQxMzAwMWFlYjA2YTUzZWQ5MDI3ZDgzMTE3OTcyN2IwODY1YTg5MThkYTNlZGJlYmNmOWIxNGVkNDRjZTZjYmFjZWQ0YmIxYmRiN2YxNDQ3ZTZjYzI1NGIzMzIwNTE1MTJiZDdhZjQyNmZiOGY0MDEzNzhjZDJiZjU5ODNjYTAxYzY0YjkyZWNmMDMyZWExNWQxNzIxZDAzZjQ4MmQ3Y2U2ZTc0ZmVmNmQ1NWU3MDJmNDY5ODBjODJiNWE4NDAzMTkwMGIxYzllNTllN2M5N2ZiZWM3ZThmMzIzYTk3YTdlMzZjYzg4YmUwZjFkNDViN2ZmNTg1YWM1NGJkNDA3YjIyYjQxNTRhYWNjOGY2ZDdlYmY0OGUxZDgxNGNjNWVkMjBmODAzN2UwYTc5NzE1ZWVmMjliZTMyODA2YTFkNThiYjdjNWRhNzZmNTUwYWEzZDhhMWZiZmYwZWIxOWNjYjFhMzEzZDU1Y2RhNTZjOWVjMmVmMjk2MzIzODdmZThkNzZlM2MwNDY4MDQzZThmNjYzZjQ4NjBlZTEyYmYyZDViMGI3NDc0ZDZlNjk0ZjkxZTZkYmUxMTU5NzRhMzkyNmYxMmZlZTVlNDM4Nzc3Y2I2YTkzMmRmOGNkOGJlYzRkMDczYjkzMWJhM2JjODMyYjY4ZDlkZDMwMDc0MWZhN2JmOGFmYzQ3ZWQyNTc2ZjY5MzZiYTQyNDY2M2FhYjYzOWM1YWU0ZjU2ODM0MjNiNDc0MmJmMWM5NzgyMzhmMTZjYmUzOWQ2NTJkZTNmZGI4YmVmYzg0OGFkOTIyMjIyZTA0YTQwMzdjMDcxM2ViNTdhODFhMjNmMGM3MzQ3M2ZjNjQ2Y2VhMzA2YjRiY2JjODg2MmY4Mzg1ZGRmYTlkNGI3ZmEyYzA4N2U4Nzk2ODMzMDNlZDViZGQzYTA2MmIzY2Y1YjNhMjc4YTY2ZDJhMTNmODNmNDRmODJkZGYzMTBlZTA3NGFiNmEzNjQ1OTdlODk5YTAyNTVkYzE2NGYzMWNjNTA4NDY4NTFkZjlhYjQ4MTk1ZGVkN2VhMWIxZDUxMGJkN2VlNzRkNzNmYWYzNmJjMzFlY2ZhMjY4MzU5MDQ2ZjRlYjg3OWY5MjQwMDk0MzhiNDgxYzZjZDc4ODlhMDAyZWQ1ZWUzODJiYzkxOTBkYTZmYzAyNmU0Nzk1NThlNDQ3NTY3N2U5YWE5ZTMwNTBlMjc2NTY5NGRmYzgxZjU2ZTg4MGI5NmU3MTYwYzk4MGRkOThlZGQzZGZmZmZmZmZmZmZmZmZmZmZmIiB9IH07CiAgfSk7CiAgYWcgPSBUMigocmssIGZnKSA9PiB7CiAgICB2YXIgeXIgPSBZdSgpLCB1UyA9IHRsKCksIGlnID0gbmV3IHVTLCBsUyA9IG5ldyB5cigyNCksIGRTID0gbmV3IHlyKDExKSwgY1MgPSBuZXcgeXIoMTApLCBwUyA9IG5ldyB5cigzKSwgdlMgPSBuZXcgeXIoNyksIG5nID0gb2woKSwgYlMgPSBvbigpOwogICAgZmcuZXhwb3J0cyA9IFNpOwogICAgZnVuY3Rpb24gbVModCwgZSkgewogICAgICByZXR1cm4gZSA9IGUgfHwgInV0ZjgiLCBCdWZmZXIuaXNCdWZmZXIodCkgfHwgKHQgPSBuZXcgQnVmZmVyKHQsIGUpKSwgdGhpcy5fcHViID0gbmV3IHlyKHQpLCB0aGlzOwogICAgfQogICAgZnVuY3Rpb24gZ1ModCwgZSkgewogICAgICByZXR1cm4gZSA9IGUgfHwgInV0ZjgiLCBCdWZmZXIuaXNCdWZmZXIodCkgfHwgKHQgPSBuZXcgQnVmZmVyKHQsIGUpKSwgdGhpcy5fcHJpdiA9IG5ldyB5cih0KSwgdGhpczsKICAgIH0KICAgIHZhciBScyA9IHt9OwogICAgZnVuY3Rpb24geVModCwgZSkgewogICAgICB2YXIgciA9IGUudG9TdHJpbmcoImhleCIpLCBvID0gW3IsIHQudG9TdHJpbmcoMTYpXS5qb2luKCJfIik7CiAgICAgIGlmIChvIGluIFJzKQogICAgICAgIHJldHVybiBSc1tvXTsKICAgICAgdmFyIGYgPSAwOwogICAgICBpZiAodC5pc0V2ZW4oKSB8fCAhbmcuc2ltcGxlU2lldmUgfHwgIW5nLmZlcm1hdFRlc3QodCkgfHwgIWlnLnRlc3QodCkpCiAgICAgICAgcmV0dXJuIGYgKz0gMSwgciA9PT0gIjAyIiB8fCByID09PSAiMDUiID8gZiArPSA4IDogZiArPSA0LCBSc1tvXSA9IGYsIGY7CiAgICAgIGlnLnRlc3QodC5zaHJuKDEpKSB8fCAoZiArPSAyKTsKICAgICAgdmFyIHA7CiAgICAgIHN3aXRjaCAocikgewogICAgICAgIGNhc2UgIjAyIjoKICAgICAgICAgIHQubW9kKGxTKS5jbXAoZFMpICYmIChmICs9IDgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiMDUiOgogICAgICAgICAgcCA9IHQubW9kKGNTKSwgcC5jbXAocFMpICYmIHAuY21wKHZTKSAmJiAoZiArPSA4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBmICs9IDQ7CiAgICAgIH0KICAgICAgcmV0dXJuIFJzW29dID0gZiwgZjsKICAgIH0KICAgIGZ1bmN0aW9uIFNpKHQsIGUsIHIpIHsKICAgICAgdGhpcy5zZXRHZW5lcmF0b3IoZSksIHRoaXMuX19wcmltZSA9IG5ldyB5cih0KSwgdGhpcy5fcHJpbWUgPSB5ci5tb250KHRoaXMuX19wcmltZSksIHRoaXMuX3ByaW1lTGVuID0gdC5sZW5ndGgsIHRoaXMuX3B1YiA9IHVuZGVmaW5lZCwgdGhpcy5fcHJpdiA9IHVuZGVmaW5lZCwgdGhpcy5fcHJpbWVDb2RlID0gdW5kZWZpbmVkLCByID8gKHRoaXMuc2V0UHVibGljS2V5ID0gbVMsIHRoaXMuc2V0UHJpdmF0ZUtleSA9IGdTKSA6IHRoaXMuX3ByaW1lQ29kZSA9IDg7CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2kucHJvdG90eXBlLCAidmVyaWZ5RXJyb3IiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcHJpbWVDb2RlICE9ICJudW1iZXIiICYmICh0aGlzLl9wcmltZUNvZGUgPSB5Uyh0aGlzLl9fcHJpbWUsIHRoaXMuX19nZW4pKSwgdGhpcy5fcHJpbWVDb2RlOwogICAgfSB9KTsKICAgIFNpLnByb3RvdHlwZS5nZW5lcmF0ZUtleXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3ByaXYgfHwgKHRoaXMuX3ByaXYgPSBuZXcgeXIoYlModGhpcy5fcHJpbWVMZW4pKSksIHRoaXMuX3B1YiA9IHRoaXMuX2dlbi50b1JlZCh0aGlzLl9wcmltZSkucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKSwgdGhpcy5nZXRQdWJsaWNLZXkoKTsKICAgIH07CiAgICBTaS5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdCA9IG5ldyB5cih0KSwgdCA9IHQudG9SZWQodGhpcy5fcHJpbWUpOwogICAgICB2YXIgZSA9IHQucmVkUG93KHRoaXMuX3ByaXYpLmZyb21SZWQoKSwgciA9IG5ldyBCdWZmZXIoZS50b0FycmF5KCkpLCBvID0gdGhpcy5nZXRQcmltZSgpOwogICAgICBpZiAoci5sZW5ndGggPCBvLmxlbmd0aCkgewogICAgICAgIHZhciBmID0gbmV3IEJ1ZmZlcihvLmxlbmd0aCAtIHIubGVuZ3RoKTsKICAgICAgICBmLmZpbGwoMCksIHIgPSBCdWZmZXIuY29uY2F0KFtmLCByXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9OwogICAgU2kucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIEJzKHRoaXMuX3B1YiwgZSk7CiAgICB9OwogICAgU2kucHJvdG90eXBlLmdldFByaXZhdGVLZXkgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBCcyh0aGlzLl9wcml2LCBlKTsKICAgIH07CiAgICBTaS5wcm90b3R5cGUuZ2V0UHJpbWUgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBCcyh0aGlzLl9fcHJpbWUsIHQpOwogICAgfTsKICAgIFNpLnByb3RvdHlwZS5nZXRHZW5lcmF0b3IgPSBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiBCcyh0aGlzLl9nZW4sIHQpOwogICAgfTsKICAgIFNpLnByb3RvdHlwZS5zZXRHZW5lcmF0b3IgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiBlID0gZSB8fCAidXRmOCIsIEJ1ZmZlci5pc0J1ZmZlcih0KSB8fCAodCA9IG5ldyBCdWZmZXIodCwgZSkpLCB0aGlzLl9fZ2VuID0gdCwgdGhpcy5fZ2VuID0gbmV3IHlyKHQpLCB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIEJzKHQsIGUpIHsKICAgICAgdmFyIHIgPSBuZXcgQnVmZmVyKHQudG9BcnJheSgpKTsKICAgICAgcmV0dXJuIGUgPyByLnRvU3RyaW5nKGUpIDogcjsKICAgIH0KICB9KTsKICBoZyA9IFQyKChfZikgPT4gewogICAgdmFyIHdTID0gb2woKSwgb2cgPSByZygpLCBzbCA9IGFnKCk7CiAgICBmdW5jdGlvbiBNUyh0KSB7CiAgICAgIHZhciBlID0gbmV3IEJ1ZmZlcihvZ1t0XS5wcmltZSwgImhleCIpLCByID0gbmV3IEJ1ZmZlcihvZ1t0XS5nZW4sICJoZXgiKTsKICAgICAgcmV0dXJuIG5ldyBzbChlLCByKTsKICAgIH0KICAgIHZhciBfUyA9IHsgYmluYXJ5OiB0cnVlLCBoZXg6IHRydWUsIGJhc2U2NDogdHJ1ZSB9OwogICAgZnVuY3Rpb24gc2codCwgZSwgciwgbykgewogICAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGUpIHx8IF9TW2VdID09PSB1bmRlZmluZWQgPyBzZyh0LCAiYmluYXJ5IiwgZSwgcikgOiAoZSA9IGUgfHwgImJpbmFyeSIsIG8gPSBvIHx8ICJiaW5hcnkiLCByID0gciB8fCBuZXcgQnVmZmVyKFsyXSksIEJ1ZmZlci5pc0J1ZmZlcihyKSB8fCAociA9IG5ldyBCdWZmZXIociwgbykpLCB0eXBlb2YgdCA9PSAibnVtYmVyIiA/IG5ldyBzbCh3Uyh0LCByKSwgciwgdHJ1ZSkgOiAoQnVmZmVyLmlzQnVmZmVyKHQpIHx8ICh0ID0gbmV3IEJ1ZmZlcih0LCBlKSksIG5ldyBzbCh0LCByLCB0cnVlKSkpOwogICAgfQogICAgX2YuRGlmZmllSGVsbG1hbkdyb3VwID0gX2YuY3JlYXRlRGlmZmllSGVsbG1hbkdyb3VwID0gX2YuZ2V0RGlmZmllSGVsbG1hbiA9IE1TOwogICAgX2YuY3JlYXRlRGlmZmllSGVsbG1hbiA9IF9mLkRpZmZpZUhlbGxtYW4gPSBzZzsKICB9KTsKICBobCA9IFQyKChuaywgdWcpID0+IHsKICAgIHVnLmV4cG9ydHMgPSBraSgpLkV2ZW50RW1pdHRlcjsKICB9KTsKICBwZyA9IFQyKChmaywgY2cpID0+IHsKICAgIGZ1bmN0aW9uIGxnKHQsIGUpIHsKICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyh0KTsKICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7CiAgICAgICAgZSAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uKGYpIHsKICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGYpLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBmdW5jdGlvbiB4Uyh0KSB7CiAgICAgIGZvciAodmFyIGUgPSAxO2UgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1tlXSAhPSBudWxsID8gYXJndW1lbnRzW2VdIDoge307CiAgICAgICAgZSAlIDIgPyBsZyhPYmplY3QociksIHRydWUpLmZvckVhY2goZnVuY3Rpb24obykgewogICAgICAgICAgU1ModCwgbywgcltvXSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGxnKE9iamVjdChyKSkuZm9yRWFjaChmdW5jdGlvbihvKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgbywgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBvKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICBmdW5jdGlvbiBTUyh0LCBlLCByKSB7CiAgICAgIHJldHVybiBlIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgeyB2YWx1ZTogciwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KSA6IHRbZV0gPSByLCB0OwogICAgfQogICAgZnVuY3Rpb24gRVModCwgZSkgewogICAgICBpZiAoISh0IGluc3RhbmNlb2YgZSkpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBmdW5jdGlvbiBkZyh0LCBlKSB7CiAgICAgIGZvciAodmFyIHIgPSAwO3IgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgdmFyIG8gPSBlW3JdOwogICAgICAgIG8uZW51bWVyYWJsZSA9IG8uZW51bWVyYWJsZSB8fCBmYWxzZSwgby5jb25maWd1cmFibGUgPSB0cnVlLCAidmFsdWUiIGluIG8gJiYgKG8ud3JpdGFibGUgPSB0cnVlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIG8ua2V5LCBvKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gQVModCwgZSwgcikgewogICAgICByZXR1cm4gZSAmJiBkZyh0LnByb3RvdHlwZSwgZSksIHIgJiYgZGcodCwgciksIHQ7CiAgICB9CiAgICB2YXIgUlMgPSBVdCgpLCBxcyA9IFJTLkJ1ZmZlciwgQlMgPSAkZigpLCB1bCA9IEJTLmluc3BlY3QsIHFTID0gdWwgJiYgdWwuY3VzdG9tIHx8ICJpbnNwZWN0IjsKICAgIGZ1bmN0aW9uIElTKHQsIGUsIHIpIHsKICAgICAgcXMucHJvdG90eXBlLmNvcHkuY2FsbCh0LCBlLCByKTsKICAgIH0KICAgIGNnLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICBFUyh0aGlzLCB0KSwgdGhpcy5oZWFkID0gbnVsbCwgdGhpcy50YWlsID0gbnVsbCwgdGhpcy5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIHJldHVybiBBUyh0LCBbeyBrZXk6ICJwdXNoIiwgdmFsdWU6IGZ1bmN0aW9uKHIpIHsKICAgICAgICB2YXIgbyA9IHsgZGF0YTogciwgbmV4dDogbnVsbCB9OwogICAgICAgIHRoaXMubGVuZ3RoID4gMCA/IHRoaXMudGFpbC5uZXh0ID0gbyA6IHRoaXMuaGVhZCA9IG8sIHRoaXMudGFpbCA9IG8sICsrdGhpcy5sZW5ndGg7CiAgICAgIH0gfSwgeyBrZXk6ICJ1bnNoaWZ0IiwgdmFsdWU6IGZ1bmN0aW9uKHIpIHsKICAgICAgICB2YXIgbyA9IHsgZGF0YTogciwgbmV4dDogdGhpcy5oZWFkIH07CiAgICAgICAgdGhpcy5sZW5ndGggPT09IDAgJiYgKHRoaXMudGFpbCA9IG8pLCB0aGlzLmhlYWQgPSBvLCArK3RoaXMubGVuZ3RoOwogICAgICB9IH0sIHsga2V5OiAic2hpZnQiLCB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICB2YXIgciA9IHRoaXMuaGVhZC5kYXRhOwogICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxID8gdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbCA6IHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0LCAtLXRoaXMubGVuZ3RoLCByOwogICAgICAgIH0KICAgICAgfSB9LCB7IGtleTogImNsZWFyIiwgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGwsIHRoaXMubGVuZ3RoID0gMDsKICAgICAgfSB9LCB7IGtleTogImpvaW4iLCB2YWx1ZTogZnVuY3Rpb24ocikgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBmb3IgKHZhciBvID0gdGhpcy5oZWFkLCBmID0gIiIgKyBvLmRhdGE7byA9IG8ubmV4dDsgKQogICAgICAgICAgZiArPSByICsgby5kYXRhOwogICAgICAgIHJldHVybiBmOwogICAgICB9IH0sIHsga2V5OiAiY29uY2F0IiwgdmFsdWU6IGZ1bmN0aW9uKHIpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gcXMuYWxsb2MoMCk7CiAgICAgICAgZm9yICh2YXIgbyA9IHFzLmFsbG9jVW5zYWZlKHIgPj4+IDApLCBmID0gdGhpcy5oZWFkLCBwID0gMDtmOyApCiAgICAgICAgICBJUyhmLmRhdGEsIG8sIHApLCBwICs9IGYuZGF0YS5sZW5ndGgsIGYgPSBmLm5leHQ7CiAgICAgICAgcmV0dXJuIG87CiAgICAgIH0gfSwgeyBrZXk6ICJjb25zdW1lIiwgdmFsdWU6IGZ1bmN0aW9uKHIsIG8pIHsKICAgICAgICB2YXIgZjsKICAgICAgICByZXR1cm4gciA8IHRoaXMuaGVhZC5kYXRhLmxlbmd0aCA/IChmID0gdGhpcy5oZWFkLmRhdGEuc2xpY2UoMCwgciksIHRoaXMuaGVhZC5kYXRhID0gdGhpcy5oZWFkLmRhdGEuc2xpY2UocikpIDogciA9PT0gdGhpcy5oZWFkLmRhdGEubGVuZ3RoID8gZiA9IHRoaXMuc2hpZnQoKSA6IGYgPSBvID8gdGhpcy5fZ2V0U3RyaW5nKHIpIDogdGhpcy5fZ2V0QnVmZmVyKHIpLCBmOwogICAgICB9IH0sIHsga2V5OiAiZmlyc3QiLCB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZC5kYXRhOwogICAgICB9IH0sIHsga2V5OiAiX2dldFN0cmluZyIsIHZhbHVlOiBmdW5jdGlvbihyKSB7CiAgICAgICAgdmFyIG8gPSB0aGlzLmhlYWQsIGYgPSAxLCBwID0gby5kYXRhOwogICAgICAgIGZvciAociAtPSBwLmxlbmd0aDtvID0gby5uZXh0OyApIHsKICAgICAgICAgIHZhciBtMiA9IG8uZGF0YSwgeTIgPSByID4gbTIubGVuZ3RoID8gbTIubGVuZ3RoIDogcjsKICAgICAgICAgIGlmICh5MiA9PT0gbTIubGVuZ3RoID8gcCArPSBtMiA6IHAgKz0gbTIuc2xpY2UoMCwgciksIHIgLT0geTIsIHIgPT09IDApIHsKICAgICAgICAgICAgeTIgPT09IG0yLmxlbmd0aCA/ICgrK2YsIG8ubmV4dCA/IHRoaXMuaGVhZCA9IG8ubmV4dCA6IHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGwpIDogKHRoaXMuaGVhZCA9IG8sIG8uZGF0YSA9IG0yLnNsaWNlKHkyKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgKytmOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggLT0gZiwgcDsKICAgICAgfSB9LCB7IGtleTogIl9nZXRCdWZmZXIiLCB2YWx1ZTogZnVuY3Rpb24ocikgewogICAgICAgIHZhciBvID0gcXMuYWxsb2NVbnNhZmUociksIGYgPSB0aGlzLmhlYWQsIHAgPSAxOwogICAgICAgIGZvciAoZi5kYXRhLmNvcHkobyksIHIgLT0gZi5kYXRhLmxlbmd0aDtmID0gZi5uZXh0OyApIHsKICAgICAgICAgIHZhciBtMiA9IGYuZGF0YSwgeTIgPSByID4gbTIubGVuZ3RoID8gbTIubGVuZ3RoIDogcjsKICAgICAgICAgIGlmIChtMi5jb3B5KG8sIG8ubGVuZ3RoIC0gciwgMCwgeTIpLCByIC09IHkyLCByID09PSAwKSB7CiAgICAgICAgICAgIHkyID09PSBtMi5sZW5ndGggPyAoKytwLCBmLm5leHQgPyB0aGlzLmhlYWQgPSBmLm5leHQgOiB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsKSA6ICh0aGlzLmhlYWQgPSBmLCBmLmRhdGEgPSBtMi5zbGljZSh5MikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgICsrcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC09IHAsIG87CiAgICAgIH0gfSwgeyBrZXk6IHFTLCB2YWx1ZTogZnVuY3Rpb24ociwgbykgewogICAgICAgIHJldHVybiB1bCh0aGlzLCB4Uyh7fSwgbywgeyBkZXB0aDogMCwgY3VzdG9tSW5zcGVjdDogZmFsc2UgfSkpOwogICAgICB9IH1dKSwgdDsKICAgIH0oKTsKICB9KTsKICBkbCA9IFQyKChhaywgYmcpID0+IHsKICAgIGZ1bmN0aW9uIFRTKHQsIGUpIHsKICAgICAgdmFyIHIgPSB0aGlzLCBvID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCwgZiA9IHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7CiAgICAgIHJldHVybiBvIHx8IGYgPyAoZSA/IGUodCkgOiB0ICYmICh0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgfHwgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZSwgcHJvY2Vzcy5uZXh0VGljayhsbCwgdGhpcywgdCkpIDogcHJvY2Vzcy5uZXh0VGljayhsbCwgdGhpcywgdCkpLCB0aGlzKSA6ICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWUpLCB0aGlzLl93cml0YWJsZVN0YXRlICYmICh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWUpLCB0aGlzLl9kZXN0cm95KHQgfHwgbnVsbCwgZnVuY3Rpb24ocCkgewogICAgICAgICFlICYmIHAgPyByLl93cml0YWJsZVN0YXRlID8gci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPyBwcm9jZXNzLm5leHRUaWNrKElzLCByKSA6IChyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWUsIHByb2Nlc3MubmV4dFRpY2sodmcsIHIsIHApKSA6IHByb2Nlc3MubmV4dFRpY2sodmcsIHIsIHApIDogZSA/IChwcm9jZXNzLm5leHRUaWNrKElzLCByKSwgZShwKSkgOiBwcm9jZXNzLm5leHRUaWNrKElzLCByKTsKICAgICAgfSksIHRoaXMpOwogICAgfQogICAgZnVuY3Rpb24gdmcodCwgZSkgewogICAgICBsbCh0LCBlKSwgSXModCk7CiAgICB9CiAgICBmdW5jdGlvbiBJcyh0KSB7CiAgICAgIHQuX3dyaXRhYmxlU3RhdGUgJiYgIXQuX3dyaXRhYmxlU3RhdGUuZW1pdENsb3NlIHx8IHQuX3JlYWRhYmxlU3RhdGUgJiYgIXQuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlIHx8IHQuZW1pdCgiY2xvc2UiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGtTKCkgewogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlICYmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGZhbHNlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQgPSBmYWxzZSksIHRoaXMuX3dyaXRhYmxlU3RhdGUgJiYgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2UsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQgPSBmYWxzZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSBmYWxzZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZCA9IGZhbHNlLCB0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkID0gZmFsc2UsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSBmYWxzZSwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSBmYWxzZSk7CiAgICB9CiAgICBmdW5jdGlvbiBsbCh0LCBlKSB7CiAgICAgIHQuZW1pdCgiZXJyb3IiLCBlKTsKICAgIH0KICAgIGZ1bmN0aW9uIExTKHQsIGUpIHsKICAgICAgdmFyIHsgX3JlYWRhYmxlU3RhdGU6IHIsIF93cml0YWJsZVN0YXRlOiBvIH0gPSB0OwogICAgICByICYmIHIuYXV0b0Rlc3Ryb3kgfHwgbyAmJiBvLmF1dG9EZXN0cm95ID8gdC5kZXN0cm95KGUpIDogdC5lbWl0KCJlcnJvciIsIGUpOwogICAgfQogICAgYmcuZXhwb3J0cyA9IHsgZGVzdHJveTogVFMsIHVuZGVzdHJveToga1MsIGVycm9yT3JEZXN0cm95OiBMUyB9OwogIH0pOwogIGtuID0gVDIoKG9rLCB5ZykgPT4gewogICAgZnVuY3Rpb24gTlModCwgZSkgewogICAgICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLCB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQsIHQuX19wcm90b19fID0gZTsKICAgIH0KICAgIHZhciBnZyA9IHt9OwogICAgZnVuY3Rpb24gd3IodCwgZSwgcikgewogICAgICByIHx8IChyID0gRXJyb3IpOwogICAgICBmdW5jdGlvbiBvKHAsIG0yLCB5MikgewogICAgICAgIHJldHVybiB0eXBlb2YgZSA9PSAic3RyaW5nIiA/IGUgOiBlKHAsIG0yLCB5Mik7CiAgICAgIH0KICAgICAgdmFyIGYgPSBmdW5jdGlvbihwKSB7CiAgICAgICAgTlMobTIsIHApOwogICAgICAgIGZ1bmN0aW9uIG0yKHkyLCBNLCB4KSB7CiAgICAgICAgICByZXR1cm4gcC5jYWxsKHRoaXMsIG8oeTIsIE0sIHgpKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbTI7CiAgICAgIH0ocik7CiAgICAgIGYucHJvdG90eXBlLm5hbWUgPSByLm5hbWUsIGYucHJvdG90eXBlLmNvZGUgPSB0LCBnZ1t0XSA9IGY7CiAgICB9CiAgICBmdW5jdGlvbiBtZyh0LCBlKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSB7CiAgICAgICAgdmFyIHIgPSB0Lmxlbmd0aDsKICAgICAgICByZXR1cm4gdCA9IHQubWFwKGZ1bmN0aW9uKG8pIHsKICAgICAgICAgIHJldHVybiBTdHJpbmcobyk7CiAgICAgICAgfSksIHIgPiAyID8gIm9uZSBvZiAiLmNvbmNhdChlLCAiICIpLmNvbmNhdCh0LnNsaWNlKDAsIHIgLSAxKS5qb2luKCIsICIpLCAiLCBvciAiKSArIHRbciAtIDFdIDogciA9PT0gMiA/ICJvbmUgb2YgIi5jb25jYXQoZSwgIiAiKS5jb25jYXQodFswXSwgIiBvciAiKS5jb25jYXQodFsxXSkgOiAib2YgIi5jb25jYXQoZSwgIiAiKS5jb25jYXQodFswXSk7CiAgICAgIH0gZWxzZQogICAgICAgIHJldHVybiAib2YgIi5jb25jYXQoZSwgIiAiKS5jb25jYXQoU3RyaW5nKHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIERTKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQuc3Vic3RyKCFyIHx8IHIgPCAwID8gMCA6ICtyLCBlLmxlbmd0aCkgPT09IGU7CiAgICB9CiAgICBmdW5jdGlvbiBQUyh0LCBlLCByKSB7CiAgICAgIHJldHVybiAociA9PT0gdW5kZWZpbmVkIHx8IHIgPiB0Lmxlbmd0aCkgJiYgKHIgPSB0Lmxlbmd0aCksIHQuc3Vic3RyaW5nKHIgLSBlLmxlbmd0aCwgcikgPT09IGU7CiAgICB9CiAgICBmdW5jdGlvbiBDUyh0LCBlLCByKSB7CiAgICAgIHJldHVybiB0eXBlb2YgciAhPSAibnVtYmVyIiAmJiAociA9IDApLCByICsgZS5sZW5ndGggPiB0Lmxlbmd0aCA/IGZhbHNlIDogdC5pbmRleE9mKGUsIHIpICE9PSAtMTsKICAgIH0KICAgIHdyKCJFUlJfSU5WQUxJRF9PUFRfVkFMVUUiLCBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiAnVGhlIHZhbHVlICInICsgZSArICciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAiJyArIHQgKyAnIic7CiAgICB9LCBUeXBlRXJyb3IpOwogICAgd3IoIkVSUl9JTlZBTElEX0FSR19UWVBFIiwgZnVuY3Rpb24odCwgZSwgcikgewogICAgICB2YXIgbzsKICAgICAgdHlwZW9mIGUgPT0gInN0cmluZyIgJiYgRFMoZSwgIm5vdCAiKSA/IChvID0gIm11c3Qgbm90IGJlIiwgZSA9IGUucmVwbGFjZSgvXm5vdCAvLCAiIikpIDogbyA9ICJtdXN0IGJlIjsKICAgICAgdmFyIGY7CiAgICAgIGlmIChQUyh0LCAiIGFyZ3VtZW50IikpCiAgICAgICAgZiA9ICJUaGUgIi5jb25jYXQodCwgIiAiKS5jb25jYXQobywgIiAiKS5jb25jYXQobWcoZSwgInR5cGUiKSk7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBwID0gQ1ModCwgIi4iKSA/ICJwcm9wZXJ0eSIgOiAiYXJndW1lbnQiOwogICAgICAgIGYgPSAnVGhlICInLmNvbmNhdCh0LCAnIiAnKS5jb25jYXQocCwgIiAiKS5jb25jYXQobywgIiAiKS5jb25jYXQobWcoZSwgInR5cGUiKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGYgKz0gIi4gUmVjZWl2ZWQgdHlwZSAiLmNvbmNhdCh0eXBlb2YgciksIGY7CiAgICB9LCBUeXBlRXJyb3IpOwogICAgd3IoIkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YiLCAic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTsKICAgIHdyKCJFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCIsIGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuICJUaGUgIiArIHQgKyAiIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQiOwogICAgfSk7CiAgICB3cigiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UiLCAiUHJlbWF0dXJlIGNsb3NlIik7CiAgICB3cigiRVJSX1NUUkVBTV9ERVNUUk9ZRUQiLCBmdW5jdGlvbih0KSB7CiAgICAgIHJldHVybiAiQ2Fubm90IGNhbGwgIiArIHQgKyAiIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQiOwogICAgfSk7CiAgICB3cigiRVJSX01VTFRJUExFX0NBTExCQUNLIiwgIkNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpOwogICAgd3IoIkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUiLCAiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpOwogICAgd3IoIkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EIiwgIndyaXRlIGFmdGVyIGVuZCIpOwogICAgd3IoIkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMiLCAiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iLCBUeXBlRXJyb3IpOwogICAgd3IoIkVSUl9VTktOT1dOX0VOQ09ESU5HIiwgZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gIlVua25vd24gZW5jb2Rpbmc6ICIgKyB0OwogICAgfSwgVHlwZUVycm9yKTsKICAgIHdyKCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UIiwgInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7CiAgICB5Zy5leHBvcnRzLmNvZGVzID0gZ2c7CiAgfSk7CiAgY2wgPSBUMigoc2ssIHdnKSA9PiB7CiAgICB2YXIgT1MgPSBrbigpLmNvZGVzLkVSUl9JTlZBTElEX09QVF9WQUxVRTsKICAgIGZ1bmN0aW9uIEZTKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQuaGlnaFdhdGVyTWFyayAhPSBudWxsID8gdC5oaWdoV2F0ZXJNYXJrIDogZSA/IHRbcl0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gVVModCwgZSwgciwgbykgewogICAgICB2YXIgZiA9IEZTKGUsIG8sIHIpOwogICAgICBpZiAoZiAhPSBudWxsKSB7CiAgICAgICAgaWYgKCEoaXNGaW5pdGUoZikgJiYgTWF0aC5mbG9vcihmKSA9PT0gZikgfHwgZiA8IDApIHsKICAgICAgICAgIHZhciBwID0gbyA/IHIgOiAiaGlnaFdhdGVyTWFyayI7CiAgICAgICAgICB0aHJvdyBuZXcgT1MocCwgZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmZsb29yKGYpOwogICAgICB9CiAgICAgIHJldHVybiB0Lm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDsKICAgIH0KICAgIHdnLmV4cG9ydHMgPSB7IGdldEhpZ2hXYXRlck1hcms6IFVTIH07CiAgfSk7CiAgYmwgPSBUMigoaGssIEFnKSA9PiB7CiAgICBBZy5leHBvcnRzID0gdXQ7CiAgICBmdW5jdGlvbiBfZyh0KSB7CiAgICAgIHZhciBlID0gdGhpczsKICAgICAgdGhpcy5uZXh0ID0gbnVsbCwgdGhpcy5lbnRyeSA9IG51bGwsIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgY0UoZSwgdCk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgeGY7CiAgICB1dC5Xcml0YWJsZVN0YXRlID0ga2E7CiAgICB2YXIgelMgPSB7IGRlcHJlY2F0ZTogRzAoKSB9LCB4ZyA9IGhsKCksIGtzID0gVXQoKS5CdWZmZXIsIEhTID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24oKSB7CiAgICB9OwogICAgZnVuY3Rpb24gV1ModCkgewogICAgICByZXR1cm4ga3MuZnJvbSh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIEtTKHQpIHsKICAgICAgcmV0dXJuIGtzLmlzQnVmZmVyKHQpIHx8IHQgaW5zdGFuY2VvZiBIUzsKICAgIH0KICAgIHZhciB2bCA9IGRsKCksIGpTID0gY2woKSwgWlMgPSBqUy5nZXRIaWdoV2F0ZXJNYXJrLCBWaSA9IGtuKCkuY29kZXMsIFZTID0gVmkuRVJSX0lOVkFMSURfQVJHX1RZUEUsICRTID0gVmkuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsIEdTID0gVmkuRVJSX01VTFRJUExFX0NBTExCQUNLLCBZUyA9IFZpLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsIFhTID0gVmkuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsIEpTID0gVmkuRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUywgUVMgPSBWaS5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCwgZUUgPSBWaS5FUlJfVU5LTk9XTl9FTkNPRElORywgU2YgPSB2bC5lcnJvck9yRGVzdHJveTsKICAgIEllKCkodXQsIHhnKTsKICAgIGZ1bmN0aW9uIHRFKCkgewogICAgfQogICAgZnVuY3Rpb24ga2EodCwgZSwgcikgewogICAgICB4ZiA9IHhmIHx8IExuKCksIHQgPSB0IHx8IHt9LCB0eXBlb2YgciAhPSAiYm9vbGVhbiIgJiYgKHIgPSBlIGluc3RhbmNlb2YgeGYpLCB0aGlzLm9iamVjdE1vZGUgPSAhIXQub2JqZWN0TW9kZSwgciAmJiAodGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhdC53cml0YWJsZU9iamVjdE1vZGUpLCB0aGlzLmhpZ2hXYXRlck1hcmsgPSBaUyh0aGlzLCB0LCAid3JpdGFibGVIaWdoV2F0ZXJNYXJrIiwgciksIHRoaXMuZmluYWxDYWxsZWQgPSBmYWxzZSwgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZSwgdGhpcy5lbmRpbmcgPSBmYWxzZSwgdGhpcy5lbmRlZCA9IGZhbHNlLCB0aGlzLmZpbmlzaGVkID0gZmFsc2UsIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7CiAgICAgIHZhciBvID0gdC5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTsKICAgICAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW8sIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gdC5kZWZhdWx0RW5jb2RpbmcgfHwgInV0ZjgiLCB0aGlzLmxlbmd0aCA9IDAsIHRoaXMud3JpdGluZyA9IGZhbHNlLCB0aGlzLmNvcmtlZCA9IDAsIHRoaXMuc3luYyA9IHRydWUsIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlLCB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbihmKSB7CiAgICAgICAgc0UoZSwgZik7CiAgICAgIH0sIHRoaXMud3JpdGVjYiA9IG51bGwsIHRoaXMud3JpdGVsZW4gPSAwLCB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGwsIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGwsIHRoaXMucGVuZGluZ2NiID0gMCwgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlLCB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlLCB0aGlzLmVtaXRDbG9zZSA9IHQuZW1pdENsb3NlICE9PSBmYWxzZSwgdGhpcy5hdXRvRGVzdHJveSA9ICEhdC5hdXRvRGVzdHJveSwgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDAsIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IF9nKHRoaXMpOwogICAgfQogICAga2EucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBlID0gdGhpcy5idWZmZXJlZFJlcXVlc3QsIHIgPSBbXTtlOyApCiAgICAgICAgci5wdXNoKGUpLCBlID0gZS5uZXh0OwogICAgICByZXR1cm4gcjsKICAgIH07CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGthLnByb3RvdHlwZSwgImJ1ZmZlciIsIHsgZ2V0OiB6Uy5kZXByZWNhdGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTsKICAgICAgICB9LCAiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iLCAiREVQMDAwMyIpIH0pOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfSkoKTsKICAgIHZhciBUczsKICAgIHR5cGVvZiBTeW1ib2wgPT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09ICJmdW5jdGlvbiIgPyAoVHMgPSBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHV0LCBTeW1ib2wuaGFzSW5zdGFuY2UsIHsgdmFsdWU6IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIFRzLmNhbGwodGhpcywgZSkgPyB0cnVlIDogdGhpcyAhPT0gdXQgPyBmYWxzZSA6IGUgJiYgZS5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIGthOwogICAgfSB9KSkgOiBUcyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIHV0KHQpIHsKICAgICAgeGYgPSB4ZiB8fCBMbigpOwogICAgICB2YXIgZSA9IHRoaXMgaW5zdGFuY2VvZiB4ZjsKICAgICAgaWYgKCFlICYmICFUcy5jYWxsKHV0LCB0aGlzKSkKICAgICAgICByZXR1cm4gbmV3IHV0KHQpOwogICAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IGthKHQsIHRoaXMsIGUpLCB0aGlzLndyaXRhYmxlID0gdHJ1ZSwgdCAmJiAodHlwZW9mIHQud3JpdGUgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fd3JpdGUgPSB0LndyaXRlKSwgdHlwZW9mIHQud3JpdGV2ID09ICJmdW5jdGlvbiIgJiYgKHRoaXMuX3dyaXRldiA9IHQud3JpdGV2KSwgdHlwZW9mIHQuZGVzdHJveSA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9kZXN0cm95ID0gdC5kZXN0cm95KSwgdHlwZW9mIHQuZmluYWwgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fZmluYWwgPSB0LmZpbmFsKSksIHhnLmNhbGwodGhpcyk7CiAgICB9CiAgICB1dC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkgewogICAgICBTZih0aGlzLCBuZXcgWVMpOwogICAgfTsKICAgIGZ1bmN0aW9uIHJFKHQsIGUpIHsKICAgICAgdmFyIHIgPSBuZXcgUVM7CiAgICAgIFNmKHQsIHIpLCBwcm9jZXNzLm5leHRUaWNrKGUsIHIpOwogICAgfQogICAgZnVuY3Rpb24gaUUodCwgZSwgciwgbykgewogICAgICB2YXIgZjsKICAgICAgcmV0dXJuIHIgPT09IG51bGwgPyBmID0gbmV3IEpTIDogdHlwZW9mIHIgIT0gInN0cmluZyIgJiYgIWUub2JqZWN0TW9kZSAmJiAoZiA9IG5ldyBWUygiY2h1bmsiLCBbInN0cmluZyIsICJCdWZmZXIiXSwgcikpLCBmID8gKFNmKHQsIGYpLCBwcm9jZXNzLm5leHRUaWNrKG8sIGYpLCBmYWxzZSkgOiB0cnVlOwogICAgfQogICAgdXQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICB2YXIgbyA9IHRoaXMuX3dyaXRhYmxlU3RhdGUsIGYgPSBmYWxzZSwgcCA9ICFvLm9iamVjdE1vZGUgJiYgS1ModCk7CiAgICAgIHJldHVybiBwICYmICFrcy5pc0J1ZmZlcih0KSAmJiAodCA9IFdTKHQpKSwgdHlwZW9mIGUgPT0gImZ1bmN0aW9uIiAmJiAociA9IGUsIGUgPSBudWxsKSwgcCA/IGUgPSAiYnVmZmVyIiA6IGUgfHwgKGUgPSBvLmRlZmF1bHRFbmNvZGluZyksIHR5cGVvZiByICE9ICJmdW5jdGlvbiIgJiYgKHIgPSB0RSksIG8uZW5kaW5nID8gckUodGhpcywgcikgOiAocCB8fCBpRSh0aGlzLCBvLCB0LCByKSkgJiYgKG8ucGVuZGluZ2NiKyssIGYgPSBmRSh0aGlzLCBvLCBwLCB0LCBlLCByKSksIGY7CiAgICB9OwogICAgdXQucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrKzsKICAgIH07CiAgICB1dC5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ID0gdGhpcy5fd3JpdGFibGVTdGF0ZTsKICAgICAgdC5jb3JrZWQgJiYgKHQuY29ya2VkLS0sICF0LndyaXRpbmcgJiYgIXQuY29ya2VkICYmICF0LmJ1ZmZlclByb2Nlc3NpbmcgJiYgdC5idWZmZXJlZFJlcXVlc3QgJiYgU2codGhpcywgdCkpOwogICAgfTsKICAgIHV0LnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbihlKSB7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IGUudG9Mb3dlckNhc2UoKSksICEoWyJoZXgiLCAidXRmOCIsICJ1dGYtOCIsICJhc2NpaSIsICJiaW5hcnkiLCAiYmFzZTY0IiwgInVjczIiLCAidWNzLTIiLCAidXRmMTZsZSIsICJ1dGYtMTZsZSIsICJyYXciXS5pbmRleE9mKChlICsgIiIpLnRvTG93ZXJDYXNlKCkpID4gLTEpKQogICAgICAgIHRocm93IG5ldyBlRShlKTsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZSwgdGhpczsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXQucHJvdG90eXBlLCAid3JpdGFibGVCdWZmZXIiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpOwogICAgfSB9KTsKICAgIGZ1bmN0aW9uIG5FKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuICF0Lm9iamVjdE1vZGUgJiYgdC5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IGtzLmZyb20oZSwgcikpLCBlOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHV0LnByb3RvdHlwZSwgIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7CiAgICB9IH0pOwogICAgZnVuY3Rpb24gZkUodCwgZSwgciwgbywgZiwgcCkgewogICAgICBpZiAoIXIpIHsKICAgICAgICB2YXIgbTIgPSBuRShlLCBvLCBmKTsKICAgICAgICBvICE9PSBtMiAmJiAociA9IHRydWUsIGYgPSAiYnVmZmVyIiwgbyA9IG0yKTsKICAgICAgfQogICAgICB2YXIgeTIgPSBlLm9iamVjdE1vZGUgPyAxIDogby5sZW5ndGg7CiAgICAgIGUubGVuZ3RoICs9IHkyOwogICAgICB2YXIgTSA9IGUubGVuZ3RoIDwgZS5oaWdoV2F0ZXJNYXJrOwogICAgICBpZiAoTSB8fCAoZS5uZWVkRHJhaW4gPSB0cnVlKSwgZS53cml0aW5nIHx8IGUuY29ya2VkKSB7CiAgICAgICAgdmFyIHggPSBlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7CiAgICAgICAgZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0geyBjaHVuazogbywgZW5jb2Rpbmc6IGYsIGlzQnVmOiByLCBjYWxsYmFjazogcCwgbmV4dDogbnVsbCB9LCB4ID8geC5uZXh0ID0gZS5sYXN0QnVmZmVyZWRSZXF1ZXN0IDogZS5idWZmZXJlZFJlcXVlc3QgPSBlLmxhc3RCdWZmZXJlZFJlcXVlc3QsIGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTsKICAgICAgfSBlbHNlCiAgICAgICAgcGwodCwgZSwgZmFsc2UsIHkyLCBvLCBmLCBwKTsKICAgICAgcmV0dXJuIE07CiAgICB9CiAgICBmdW5jdGlvbiBwbCh0LCBlLCByLCBvLCBmLCBwLCBtMikgewogICAgICBlLndyaXRlbGVuID0gbywgZS53cml0ZWNiID0gbTIsIGUud3JpdGluZyA9IHRydWUsIGUuc3luYyA9IHRydWUsIGUuZGVzdHJveWVkID8gZS5vbndyaXRlKG5ldyBYUygid3JpdGUiKSkgOiByID8gdC5fd3JpdGV2KGYsIGUub253cml0ZSkgOiB0Ll93cml0ZShmLCBwLCBlLm9ud3JpdGUpLCBlLnN5bmMgPSBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGFFKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgLS1lLnBlbmRpbmdjYiwgciA/IChwcm9jZXNzLm5leHRUaWNrKGYsIG8pLCBwcm9jZXNzLm5leHRUaWNrKFRhLCB0LCBlKSwgdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlLCBTZih0LCBvKSkgOiAoZihvKSwgdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlLCBTZih0LCBvKSwgVGEodCwgZSkpOwogICAgfQogICAgZnVuY3Rpb24gb0UodCkgewogICAgICB0LndyaXRpbmcgPSBmYWxzZSwgdC53cml0ZWNiID0gbnVsbCwgdC5sZW5ndGggLT0gdC53cml0ZWxlbiwgdC53cml0ZWxlbiA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBzRSh0LCBlKSB7CiAgICAgIHZhciByID0gdC5fd3JpdGFibGVTdGF0ZSwgbyA9IHIuc3luYywgZiA9IHIud3JpdGVjYjsKICAgICAgaWYgKHR5cGVvZiBmICE9ICJmdW5jdGlvbiIpCiAgICAgICAgdGhyb3cgbmV3IEdTOwogICAgICBpZiAob0UociksIGUpCiAgICAgICAgYUUodCwgciwgbywgZSwgZik7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBwID0gRWcocikgfHwgdC5kZXN0cm95ZWQ7CiAgICAgICAgIXAgJiYgIXIuY29ya2VkICYmICFyLmJ1ZmZlclByb2Nlc3NpbmcgJiYgci5idWZmZXJlZFJlcXVlc3QgJiYgU2codCwgciksIG8gPyBwcm9jZXNzLm5leHRUaWNrKE1nLCB0LCByLCBwLCBmKSA6IE1nKHQsIHIsIHAsIGYpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBNZyh0LCBlLCByLCBvKSB7CiAgICAgIHIgfHwgaEUodCwgZSksIGUucGVuZGluZ2NiLS0sIG8oKSwgVGEodCwgZSk7CiAgICB9CiAgICBmdW5jdGlvbiBoRSh0LCBlKSB7CiAgICAgIGUubGVuZ3RoID09PSAwICYmIGUubmVlZERyYWluICYmIChlLm5lZWREcmFpbiA9IGZhbHNlLCB0LmVtaXQoImRyYWluIikpOwogICAgfQogICAgZnVuY3Rpb24gU2codCwgZSkgewogICAgICBlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlOwogICAgICB2YXIgciA9IGUuYnVmZmVyZWRSZXF1ZXN0OwogICAgICBpZiAodC5fd3JpdGV2ICYmIHIgJiYgci5uZXh0KSB7CiAgICAgICAgdmFyIG8gPSBlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LCBmID0gbmV3IEFycmF5KG8pLCBwID0gZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7CiAgICAgICAgcC5lbnRyeSA9IHI7CiAgICAgICAgZm9yICh2YXIgbTIgPSAwLCB5MiA9IHRydWU7cjsgKQogICAgICAgICAgZlttMl0gPSByLCByLmlzQnVmIHx8ICh5MiA9IGZhbHNlKSwgciA9IHIubmV4dCwgbTIgKz0gMTsKICAgICAgICBmLmFsbEJ1ZmZlcnMgPSB5MiwgcGwodCwgZSwgdHJ1ZSwgZS5sZW5ndGgsIGYsICIiLCBwLmZpbmlzaCksIGUucGVuZGluZ2NiKyssIGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGwsIHAubmV4dCA/IChlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IHAubmV4dCwgcC5uZXh0ID0gbnVsbCkgOiBlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBfZyhlKSwgZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICg7cjsgKSB7CiAgICAgICAgICB2YXIgeyBjaHVuazogTSwgZW5jb2Rpbmc6IHgsIGNhbGxiYWNrOiBTIH0gPSByLCBFMiA9IGUub2JqZWN0TW9kZSA/IDEgOiBNLmxlbmd0aDsKICAgICAgICAgIGlmIChwbCh0LCBlLCBmYWxzZSwgRTIsIE0sIHgsIFMpLCByID0gci5uZXh0LCBlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS0sIGUud3JpdGluZykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHIgPT09IG51bGwgJiYgKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGwpOwogICAgICB9CiAgICAgIGUuYnVmZmVyZWRSZXF1ZXN0ID0gciwgZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7CiAgICB9CiAgICB1dC5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICByKG5ldyAkUygiX3dyaXRlKCkiKSk7CiAgICB9OwogICAgdXQucHJvdG90eXBlLl93cml0ZXYgPSBudWxsOwogICAgdXQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSB0aGlzLl93cml0YWJsZVN0YXRlOwogICAgICByZXR1cm4gdHlwZW9mIHQgPT0gImZ1bmN0aW9uIiA/IChyID0gdCwgdCA9IG51bGwsIGUgPSBudWxsKSA6IHR5cGVvZiBlID09ICJmdW5jdGlvbiIgJiYgKHIgPSBlLCBlID0gbnVsbCksIHQgIT0gbnVsbCAmJiB0aGlzLndyaXRlKHQsIGUpLCBvLmNvcmtlZCAmJiAoby5jb3JrZWQgPSAxLCB0aGlzLnVuY29yaygpKSwgby5lbmRpbmcgfHwgZEUodGhpcywgbywgciksIHRoaXM7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHV0LnByb3RvdHlwZSwgIndyaXRhYmxlTGVuZ3RoIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoOwogICAgfSB9KTsKICAgIGZ1bmN0aW9uIEVnKHQpIHsKICAgICAgcmV0dXJuIHQuZW5kaW5nICYmIHQubGVuZ3RoID09PSAwICYmIHQuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICF0LmZpbmlzaGVkICYmICF0LndyaXRpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB1RSh0LCBlKSB7CiAgICAgIHQuX2ZpbmFsKGZ1bmN0aW9uKHIpIHsKICAgICAgICBlLnBlbmRpbmdjYi0tLCByICYmIFNmKHQsIHIpLCBlLnByZWZpbmlzaGVkID0gdHJ1ZSwgdC5lbWl0KCJwcmVmaW5pc2giKSwgVGEodCwgZSk7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbEUodCwgZSkgewogICAgICAhZS5wcmVmaW5pc2hlZCAmJiAhZS5maW5hbENhbGxlZCAmJiAodHlwZW9mIHQuX2ZpbmFsID09ICJmdW5jdGlvbiIgJiYgIWUuZGVzdHJveWVkID8gKGUucGVuZGluZ2NiKyssIGUuZmluYWxDYWxsZWQgPSB0cnVlLCBwcm9jZXNzLm5leHRUaWNrKHVFLCB0LCBlKSkgOiAoZS5wcmVmaW5pc2hlZCA9IHRydWUsIHQuZW1pdCgicHJlZmluaXNoIikpKTsKICAgIH0KICAgIGZ1bmN0aW9uIFRhKHQsIGUpIHsKICAgICAgdmFyIHIgPSBFZyhlKTsKICAgICAgaWYgKHIgJiYgKGxFKHQsIGUpLCBlLnBlbmRpbmdjYiA9PT0gMCAmJiAoZS5maW5pc2hlZCA9IHRydWUsIHQuZW1pdCgiZmluaXNoIiksIGUuYXV0b0Rlc3Ryb3kpKSkgewogICAgICAgIHZhciBvID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgICAoIW8gfHwgby5hdXRvRGVzdHJveSAmJiBvLmVuZEVtaXR0ZWQpICYmIHQuZGVzdHJveSgpOwogICAgICB9CiAgICAgIHJldHVybiByOwogICAgfQogICAgZnVuY3Rpb24gZEUodCwgZSwgcikgewogICAgICBlLmVuZGluZyA9IHRydWUsIFRhKHQsIGUpLCByICYmIChlLmZpbmlzaGVkID8gcHJvY2Vzcy5uZXh0VGljayhyKSA6IHQub25jZSgiZmluaXNoIiwgcikpLCBlLmVuZGVkID0gdHJ1ZSwgdC53cml0YWJsZSA9IGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY0UodCwgZSwgcikgewogICAgICB2YXIgbyA9IHQuZW50cnk7CiAgICAgIGZvciAodC5lbnRyeSA9IG51bGw7bzsgKSB7CiAgICAgICAgdmFyIGYgPSBvLmNhbGxiYWNrOwogICAgICAgIGUucGVuZGluZ2NiLS0sIGYociksIG8gPSBvLm5leHQ7CiAgICAgIH0KICAgICAgZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IHQ7CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXQucHJvdG90eXBlLCAiZGVzdHJveWVkIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7CiAgICB9LCBzZXQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgIXRoaXMuX3dyaXRhYmxlU3RhdGUgfHwgKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZSk7CiAgICB9IH0pOwogICAgdXQucHJvdG90eXBlLmRlc3Ryb3kgPSB2bC5kZXN0cm95OwogICAgdXQucHJvdG90eXBlLl91bmRlc3Ryb3kgPSB2bC51bmRlc3Ryb3k7CiAgICB1dC5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIGUodCk7CiAgICB9OwogIH0pOwogIExuID0gVDIoKHVrLCBCZykgPT4gewogICAgdmFyIHBFID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IFtdOwogICAgICBmb3IgKHZhciByIGluIHQpCiAgICAgICAgZS5wdXNoKHIpOwogICAgICByZXR1cm4gZTsKICAgIH07CiAgICBCZy5leHBvcnRzID0gdGk7CiAgICB2YXIgUmcgPSB5bCgpLCBnbCA9IGJsKCk7CiAgICBJZSgpKHRpLCBSZyk7CiAgICBmb3IgKG1sID0gcEUoZ2wucHJvdG90eXBlKSwgTHMgPSAwO0xzIDwgbWwubGVuZ3RoOyBMcysrKQogICAgICBOcyA9IG1sW0xzXSwgdGkucHJvdG90eXBlW05zXSB8fCAodGkucHJvdG90eXBlW05zXSA9IGdsLnByb3RvdHlwZVtOc10pOwogICAgdmFyIG1sLCBOcywgTHM7CiAgICBmdW5jdGlvbiB0aSh0KSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aSkpCiAgICAgICAgcmV0dXJuIG5ldyB0aSh0KTsKICAgICAgUmcuY2FsbCh0aGlzLCB0KSwgZ2wuY2FsbCh0aGlzLCB0KSwgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZSwgdCAmJiAodC5yZWFkYWJsZSA9PT0gZmFsc2UgJiYgKHRoaXMucmVhZGFibGUgPSBmYWxzZSksIHQud3JpdGFibGUgPT09IGZhbHNlICYmICh0aGlzLndyaXRhYmxlID0gZmFsc2UpLCB0LmFsbG93SGFsZk9wZW4gPT09IGZhbHNlICYmICh0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZSwgdGhpcy5vbmNlKCJlbmQiLCB2RSkpKTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aS5wcm90b3R5cGUsICJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrOwogICAgfSB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aS5wcm90b3R5cGUsICJ3cml0YWJsZUJ1ZmZlciIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCk7CiAgICB9IH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRpLnByb3RvdHlwZSwgIndyaXRhYmxlTGVuZ3RoIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoOwogICAgfSB9KTsKICAgIGZ1bmN0aW9uIHZFKCkgewogICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkIHx8IHByb2Nlc3MubmV4dFRpY2soYkUsIHRoaXMpOwogICAgfQogICAgZnVuY3Rpb24gYkUodCkgewogICAgICB0LmVuZCgpOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRpLnByb3RvdHlwZSwgImRlc3Ryb3llZCIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDsKICAgIH0sIHNldDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8ICh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGUsIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZSk7CiAgICB9IH0pOwogIH0pOwogIERzID0gVDIoKGxrLCBUZykgPT4gewogICAgdmFyIHFnID0ga24oKS5jb2Rlcy5FUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTsKICAgIGZ1bmN0aW9uIG1FKHQpIHsKICAgICAgdmFyIGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghZSkgewogICAgICAgICAgZSA9IHRydWU7CiAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbyA9IG5ldyBBcnJheShyKSwgZiA9IDA7ZiA8IHI7IGYrKykKICAgICAgICAgICAgb1tmXSA9IGFyZ3VtZW50c1tmXTsKICAgICAgICAgIHQuYXBwbHkodGhpcywgbyk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gZ0UoKSB7CiAgICB9CiAgICBmdW5jdGlvbiB5RSh0KSB7CiAgICAgIHJldHVybiB0LnNldEhlYWRlciAmJiB0eXBlb2YgdC5hYm9ydCA9PSAiZnVuY3Rpb24iOwogICAgfQogICAgZnVuY3Rpb24gSWcodCwgZSwgcikgewogICAgICBpZiAodHlwZW9mIGUgPT0gImZ1bmN0aW9uIikKICAgICAgICByZXR1cm4gSWcodCwgbnVsbCwgZSk7CiAgICAgIGUgfHwgKGUgPSB7fSksIHIgPSBtRShyIHx8IGdFKTsKICAgICAgdmFyIG8gPSBlLnJlYWRhYmxlIHx8IGUucmVhZGFibGUgIT09IGZhbHNlICYmIHQucmVhZGFibGUsIGYgPSBlLndyaXRhYmxlIHx8IGUud3JpdGFibGUgIT09IGZhbHNlICYmIHQud3JpdGFibGUsIHAgPSBmdW5jdGlvbigpIHsKICAgICAgICB0LndyaXRhYmxlIHx8IHkyKCk7CiAgICAgIH0sIG0yID0gdC5fd3JpdGFibGVTdGF0ZSAmJiB0Ll93cml0YWJsZVN0YXRlLmZpbmlzaGVkLCB5MiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGYgPSBmYWxzZSwgbTIgPSB0cnVlLCBvIHx8IHIuY2FsbCh0KTsKICAgICAgfSwgTSA9IHQuX3JlYWRhYmxlU3RhdGUgJiYgdC5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLCB4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbyA9IGZhbHNlLCBNID0gdHJ1ZSwgZiB8fCByLmNhbGwodCk7CiAgICAgIH0sIFMgPSBmdW5jdGlvbihMMikgewogICAgICAgIHIuY2FsbCh0LCBMMik7CiAgICAgIH0sIEUyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIEwyOwogICAgICAgIGlmIChvICYmICFNKQogICAgICAgICAgcmV0dXJuICghdC5fcmVhZGFibGVTdGF0ZSB8fCAhdC5fcmVhZGFibGVTdGF0ZS5lbmRlZCkgJiYgKEwyID0gbmV3IHFnKSwgci5jYWxsKHQsIEwyKTsKICAgICAgICBpZiAoZiAmJiAhbTIpCiAgICAgICAgICByZXR1cm4gKCF0Ll93cml0YWJsZVN0YXRlIHx8ICF0Ll93cml0YWJsZVN0YXRlLmVuZGVkKSAmJiAoTDIgPSBuZXcgcWcpLCByLmNhbGwodCwgTDIpOwogICAgICB9LCBCID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdC5yZXEub24oImZpbmlzaCIsIHkyKTsKICAgICAgfTsKICAgICAgcmV0dXJuIHlFKHQpID8gKHQub24oImNvbXBsZXRlIiwgeTIpLCB0Lm9uKCJhYm9ydCIsIEUyKSwgdC5yZXEgPyBCKCkgOiB0Lm9uKCJyZXF1ZXN0IiwgQikpIDogZiAmJiAhdC5fd3JpdGFibGVTdGF0ZSAmJiAodC5vbigiZW5kIiwgcCksIHQub24oImNsb3NlIiwgcCkpLCB0Lm9uKCJlbmQiLCB4KSwgdC5vbigiZmluaXNoIiwgeTIpLCBlLmVycm9yICE9PSBmYWxzZSAmJiB0Lm9uKCJlcnJvciIsIFMpLCB0Lm9uKCJjbG9zZSIsIEUyKSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdC5yZW1vdmVMaXN0ZW5lcigiY29tcGxldGUiLCB5MiksIHQucmVtb3ZlTGlzdGVuZXIoImFib3J0IiwgRTIpLCB0LnJlbW92ZUxpc3RlbmVyKCJyZXF1ZXN0IiwgQiksIHQucmVxICYmIHQucmVxLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCB5MiksIHQucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHApLCB0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIHApLCB0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCB5MiksIHQucmVtb3ZlTGlzdGVuZXIoImVuZCIsIHgpLCB0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsIFMpLCB0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIEUyKTsKICAgICAgfTsKICAgIH0KICAgIFRnLmV4cG9ydHMgPSBJZzsKICB9KTsKICBMZyA9IFQyKChkaywga2cpID0+IHsKICAgIHZhciBQczsKICAgIGZ1bmN0aW9uICRpKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIGUgaW4gdCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7IHZhbHVlOiByLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pIDogdFtlXSA9IHIsIHQ7CiAgICB9CiAgICB2YXIgd0UgPSBEcygpLCBHaSA9IFN5bWJvbCgibGFzdFJlc29sdmUiKSwgTm4gPSBTeW1ib2woImxhc3RSZWplY3QiKSwgTGEgPSBTeW1ib2woImVycm9yIiksIENzID0gU3ltYm9sKCJlbmRlZCIpLCBEbiA9IFN5bWJvbCgibGFzdFByb21pc2UiKSwgd2wgPSBTeW1ib2woImhhbmRsZVByb21pc2UiKSwgUG4gPSBTeW1ib2woInN0cmVhbSIpOwogICAgZnVuY3Rpb24gWWkodCwgZSkgewogICAgICByZXR1cm4geyB2YWx1ZTogdCwgZG9uZTogZSB9OwogICAgfQogICAgZnVuY3Rpb24gTUUodCkgewogICAgICB2YXIgZSA9IHRbR2ldOwogICAgICBpZiAoZSAhPT0gbnVsbCkgewogICAgICAgIHZhciByID0gdFtQbl0ucmVhZCgpOwogICAgICAgIHIgIT09IG51bGwgJiYgKHRbRG5dID0gbnVsbCwgdFtHaV0gPSBudWxsLCB0W05uXSA9IG51bGwsIGUoWWkociwgZmFsc2UpKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9FKHQpIHsKICAgICAgcHJvY2Vzcy5uZXh0VGljayhNRSwgdCk7CiAgICB9CiAgICBmdW5jdGlvbiB4RSh0LCBlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihyLCBvKSB7CiAgICAgICAgdC50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGVbQ3NdKSB7CiAgICAgICAgICAgIHIoWWkodW5kZWZpbmVkLCB0cnVlKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGVbd2xdKHIsIG8pOwogICAgICAgIH0sIG8pOwogICAgICB9OwogICAgfQogICAgdmFyIFNFID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCkgewogICAgfSksIEVFID0gT2JqZWN0LnNldFByb3RvdHlwZU9mKChQcyA9IHsgZ2V0IHN0cmVhbSgpIHsKICAgICAgcmV0dXJuIHRoaXNbUG5dOwogICAgfSwgbmV4dDogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpcywgciA9IHRoaXNbTGFdOwogICAgICBpZiAociAhPT0gbnVsbCkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qocik7CiAgICAgIGlmICh0aGlzW0NzXSkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFlpKHVuZGVmaW5lZCwgdHJ1ZSkpOwogICAgICBpZiAodGhpc1tQbl0uZGVzdHJveWVkKQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihtMiwgeTIpIHsKICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVbTGFdID8geTIoZVtMYV0pIDogbTIoWWkodW5kZWZpbmVkLCB0cnVlKSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgdmFyIG8gPSB0aGlzW0RuXSwgZjsKICAgICAgaWYgKG8pCiAgICAgICAgZiA9IG5ldyBQcm9taXNlKHhFKG8sIHRoaXMpKTsKICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHAgPSB0aGlzW1BuXS5yZWFkKCk7CiAgICAgICAgaWYgKHAgIT09IG51bGwpCiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFlpKHAsIGZhbHNlKSk7CiAgICAgICAgZiA9IG5ldyBQcm9taXNlKHRoaXNbd2xdKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpc1tEbl0gPSBmLCBmOwogICAgfSB9LCAkaShQcywgU3ltYm9sLmFzeW5jSXRlcmF0b3IsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pLCAkaShQcywgInJldHVybiIsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgZSA9IHRoaXM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLCBvKSB7CiAgICAgICAgZVtQbl0uZGVzdHJveShudWxsLCBmdW5jdGlvbihmKSB7CiAgICAgICAgICBpZiAoZikgewogICAgICAgICAgICBvKGYpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICByKFlpKHVuZGVmaW5lZCwgdHJ1ZSkpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pLCBQcyksIFNFKSwgQUUgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciByLCBvID0gT2JqZWN0LmNyZWF0ZShFRSwgKHIgPSB7fSwgJGkociwgUG4sIHsgdmFsdWU6IGUsIHdyaXRhYmxlOiB0cnVlIH0pLCAkaShyLCBHaSwgeyB2YWx1ZTogbnVsbCwgd3JpdGFibGU6IHRydWUgfSksICRpKHIsIE5uLCB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9KSwgJGkociwgTGEsIHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlIH0pLCAkaShyLCBDcywgeyB2YWx1ZTogZS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLCB3cml0YWJsZTogdHJ1ZSB9KSwgJGkociwgd2wsIHsgdmFsdWU6IGZ1bmN0aW9uKHAsIG0yKSB7CiAgICAgICAgdmFyIHkyID0gb1tQbl0ucmVhZCgpOwogICAgICAgIHkyID8gKG9bRG5dID0gbnVsbCwgb1tHaV0gPSBudWxsLCBvW05uXSA9IG51bGwsIHAoWWkoeTIsIGZhbHNlKSkpIDogKG9bR2ldID0gcCwgb1tObl0gPSBtMik7CiAgICAgIH0sIHdyaXRhYmxlOiB0cnVlIH0pLCByKSk7CiAgICAgIHJldHVybiBvW0RuXSA9IG51bGwsIHdFKGUsIGZ1bmN0aW9uKGYpIHsKICAgICAgICBpZiAoZiAmJiBmLmNvZGUgIT09ICJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIpIHsKICAgICAgICAgIHZhciBwID0gb1tObl07CiAgICAgICAgICBwICE9PSBudWxsICYmIChvW0RuXSA9IG51bGwsIG9bR2ldID0gbnVsbCwgb1tObl0gPSBudWxsLCBwKGYpKSwgb1tMYV0gPSBmOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgbTIgPSBvW0dpXTsKICAgICAgICBtMiAhPT0gbnVsbCAmJiAob1tEbl0gPSBudWxsLCBvW0dpXSA9IG51bGwsIG9bTm5dID0gbnVsbCwgbTIoWWkodW5kZWZpbmVkLCB0cnVlKSkpLCBvW0NzXSA9IHRydWU7CiAgICAgIH0pLCBlLm9uKCJyZWFkYWJsZSIsIF9FLmJpbmQobnVsbCwgbykpLCBvOwogICAgfTsKICAgIGtnLmV4cG9ydHMgPSBBRTsKICB9KTsKICBEZyA9IFQyKChjaywgTmcpID0+IHsKICAgIE5nLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIiKTsKICAgIH07CiAgfSk7CiAgeWwgPSBUMigodmssIGpnKSA9PiB7CiAgICBqZy5leHBvcnRzID0gT2U7CiAgICB2YXIgRWY7CiAgICBPZS5SZWFkYWJsZVN0YXRlID0gRmc7CiAgICB2YXIgcGsgPSBraSgpLkV2ZW50RW1pdHRlciwgT2cgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBlLmxpc3RlbmVycyhyKS5sZW5ndGg7CiAgICB9LCBEYSA9IGhsKCksIE9zID0gVXQoKS5CdWZmZXIsIFJFID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24oKSB7CiAgICB9OwogICAgZnVuY3Rpb24gQkUodCkgewogICAgICByZXR1cm4gT3MuZnJvbSh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHFFKHQpIHsKICAgICAgcmV0dXJuIE9zLmlzQnVmZmVyKHQpIHx8IHQgaW5zdGFuY2VvZiBSRTsKICAgIH0KICAgIHZhciBNbCA9ICRmKCksIERlOwogICAgTWwgJiYgTWwuZGVidWdsb2cgPyBEZSA9IE1sLmRlYnVnbG9nKCJzdHJlYW0iKSA6IERlID0gZnVuY3Rpb24oKSB7CiAgICB9OwogICAgdmFyIElFID0gcGcoKSwgQmwgPSBkbCgpLCBURSA9IGNsKCksIGtFID0gVEUuZ2V0SGlnaFdhdGVyTWFyaywgRnMgPSBrbigpLmNvZGVzLCBMRSA9IEZzLkVSUl9JTlZBTElEX0FSR19UWVBFLCBORSA9IEZzLkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YsIERFID0gRnMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsIFBFID0gRnMuRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCwgQWYsIF9sLCB4bDsKICAgIEllKCkoT2UsIERhKTsKICAgIHZhciBOYSA9IEJsLmVycm9yT3JEZXN0cm95LCBTbCA9IFsiZXJyb3IiLCAiY2xvc2UiLCAiZGVzdHJveSIsICJwYXVzZSIsICJyZXN1bWUiXTsKICAgIGZ1bmN0aW9uIENFKHQsIGUsIHIpIHsKICAgICAgaWYgKHR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lciA9PSAiZnVuY3Rpb24iKQogICAgICAgIHJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLCByKTsKICAgICAgIXQuX2V2ZW50cyB8fCAhdC5fZXZlbnRzW2VdID8gdC5vbihlLCByKSA6IEFycmF5LmlzQXJyYXkodC5fZXZlbnRzW2VdKSA/IHQuX2V2ZW50c1tlXS51bnNoaWZ0KHIpIDogdC5fZXZlbnRzW2VdID0gW3IsIHQuX2V2ZW50c1tlXV07CiAgICB9CiAgICBmdW5jdGlvbiBGZyh0LCBlLCByKSB7CiAgICAgIEVmID0gRWYgfHwgTG4oKSwgdCA9IHQgfHwge30sIHR5cGVvZiByICE9ICJib29sZWFuIiAmJiAociA9IGUgaW5zdGFuY2VvZiBFZiksIHRoaXMub2JqZWN0TW9kZSA9ICEhdC5vYmplY3RNb2RlLCByICYmICh0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISF0LnJlYWRhYmxlT2JqZWN0TW9kZSksIHRoaXMuaGlnaFdhdGVyTWFyayA9IGtFKHRoaXMsIHQsICJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLCByKSwgdGhpcy5idWZmZXIgPSBuZXcgSUUsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5waXBlcyA9IG51bGwsIHRoaXMucGlwZXNDb3VudCA9IDAsIHRoaXMuZmxvd2luZyA9IG51bGwsIHRoaXMuZW5kZWQgPSBmYWxzZSwgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2UsIHRoaXMucmVhZGluZyA9IGZhbHNlLCB0aGlzLnN5bmMgPSB0cnVlLCB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlLCB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlLCB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2UsIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2UsIHRoaXMucGF1c2VkID0gdHJ1ZSwgdGhpcy5lbWl0Q2xvc2UgPSB0LmVtaXRDbG9zZSAhPT0gZmFsc2UsIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhIXQuYXV0b0Rlc3Ryb3ksIHRoaXMuZGVzdHJveWVkID0gZmFsc2UsIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gdC5kZWZhdWx0RW5jb2RpbmcgfHwgInV0ZjgiLCB0aGlzLmF3YWl0RHJhaW4gPSAwLCB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2UsIHRoaXMuZGVjb2RlciA9IG51bGwsIHRoaXMuZW5jb2RpbmcgPSBudWxsLCB0LmVuY29kaW5nICYmIChBZiB8fCAoQWYgPSAoUWYoKSwgdXIoSmYpKS5TdHJpbmdEZWNvZGVyKSwgdGhpcy5kZWNvZGVyID0gbmV3IEFmKHQuZW5jb2RpbmcpLCB0aGlzLmVuY29kaW5nID0gdC5lbmNvZGluZyk7CiAgICB9CiAgICBmdW5jdGlvbiBPZSh0KSB7CiAgICAgIGlmIChFZiA9IEVmIHx8IExuKCksICEodGhpcyBpbnN0YW5jZW9mIE9lKSkKICAgICAgICByZXR1cm4gbmV3IE9lKHQpOwogICAgICB2YXIgZSA9IHRoaXMgaW5zdGFuY2VvZiBFZjsKICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBGZyh0LCB0aGlzLCBlKSwgdGhpcy5yZWFkYWJsZSA9IHRydWUsIHQgJiYgKHR5cGVvZiB0LnJlYWQgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fcmVhZCA9IHQucmVhZCksIHR5cGVvZiB0LmRlc3Ryb3kgPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fZGVzdHJveSA9IHQuZGVzdHJveSkpLCBEYS5jYWxsKHRoaXMpOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9lLnByb3RvdHlwZSwgImRlc3Ryb3llZCIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkOwogICAgfSwgc2V0OiBmdW5jdGlvbihlKSB7CiAgICAgICF0aGlzLl9yZWFkYWJsZVN0YXRlIHx8ICh0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IGUpOwogICAgfSB9KTsKICAgIE9lLnByb3RvdHlwZS5kZXN0cm95ID0gQmwuZGVzdHJveTsKICAgIE9lLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gQmwudW5kZXN0cm95OwogICAgT2UucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24odCwgZSkgewogICAgICBlKHQpOwogICAgfTsKICAgIE9lLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IHRoaXMuX3JlYWRhYmxlU3RhdGUsIG87CiAgICAgIHJldHVybiByLm9iamVjdE1vZGUgPyBvID0gdHJ1ZSA6IHR5cGVvZiB0ID09ICJzdHJpbmciICYmIChlID0gZSB8fCByLmRlZmF1bHRFbmNvZGluZywgZSAhPT0gci5lbmNvZGluZyAmJiAodCA9IE9zLmZyb20odCwgZSksIGUgPSAiIiksIG8gPSB0cnVlKSwgVWcodGhpcywgdCwgZSwgZmFsc2UsIG8pOwogICAgfTsKICAgIE9lLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gVWcodGhpcywgdCwgbnVsbCwgdHJ1ZSwgZmFsc2UpOwogICAgfTsKICAgIGZ1bmN0aW9uIFVnKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgRGUoInJlYWRhYmxlQWRkQ2h1bmsiLCBlKTsKICAgICAgdmFyIHAgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBpZiAoZSA9PT0gbnVsbCkKICAgICAgICBwLnJlYWRpbmcgPSBmYWxzZSwgVUUodCwgcCk7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBtMjsKICAgICAgICBpZiAoZiB8fCAobTIgPSBPRShwLCBlKSksIG0yKQogICAgICAgICAgTmEodCwgbTIpOwogICAgICAgIGVsc2UgaWYgKHAub2JqZWN0TW9kZSB8fCBlICYmIGUubGVuZ3RoID4gMCkKICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSAic3RyaW5nIiAmJiAhcC5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSAhPT0gT3MucHJvdG90eXBlICYmIChlID0gQkUoZSkpLCBvKQogICAgICAgICAgICBwLmVuZEVtaXR0ZWQgPyBOYSh0LCBuZXcgUEUpIDogRWwodCwgcCwgZSwgdHJ1ZSk7CiAgICAgICAgICBlbHNlIGlmIChwLmVuZGVkKQogICAgICAgICAgICBOYSh0LCBuZXcgTkUpOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChwLmRlc3Ryb3llZCkKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHAucmVhZGluZyA9IGZhbHNlLCBwLmRlY29kZXIgJiYgIXIgPyAoZSA9IHAuZGVjb2Rlci53cml0ZShlKSwgcC5vYmplY3RNb2RlIHx8IGUubGVuZ3RoICE9PSAwID8gRWwodCwgcCwgZSwgZmFsc2UpIDogUmwodCwgcCkpIDogRWwodCwgcCwgZSwgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIG8gfHwgKHAucmVhZGluZyA9IGZhbHNlLCBSbCh0LCBwKSk7CiAgICAgIH0KICAgICAgcmV0dXJuICFwLmVuZGVkICYmIChwLmxlbmd0aCA8IHAuaGlnaFdhdGVyTWFyayB8fCBwLmxlbmd0aCA9PT0gMCk7CiAgICB9CiAgICBmdW5jdGlvbiBFbCh0LCBlLCByLCBvKSB7CiAgICAgIGUuZmxvd2luZyAmJiBlLmxlbmd0aCA9PT0gMCAmJiAhZS5zeW5jID8gKGUuYXdhaXREcmFpbiA9IDAsIHQuZW1pdCgiZGF0YSIsIHIpKSA6IChlLmxlbmd0aCArPSBlLm9iamVjdE1vZGUgPyAxIDogci5sZW5ndGgsIG8gPyBlLmJ1ZmZlci51bnNoaWZ0KHIpIDogZS5idWZmZXIucHVzaChyKSwgZS5uZWVkUmVhZGFibGUgJiYgVXModCkpLCBSbCh0LCBlKTsKICAgIH0KICAgIGZ1bmN0aW9uIE9FKHQsIGUpIHsKICAgICAgdmFyIHI7CiAgICAgIHJldHVybiAhcUUoZSkgJiYgdHlwZW9mIGUgIT0gInN0cmluZyIgJiYgZSAhPT0gdW5kZWZpbmVkICYmICF0Lm9iamVjdE1vZGUgJiYgKHIgPSBuZXcgTEUoImNodW5rIiwgWyJzdHJpbmciLCAiQnVmZmVyIiwgIlVpbnQ4QXJyYXkiXSwgZSkpLCByOwogICAgfQogICAgT2UucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlOwogICAgfTsKICAgIE9lLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uKHQpIHsKICAgICAgQWYgfHwgKEFmID0gKFFmKCksIHVyKEpmKSkuU3RyaW5nRGVjb2Rlcik7CiAgICAgIHZhciBlID0gbmV3IEFmKHQpOwogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBlLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nOwogICAgICBmb3IgKHZhciByID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZCwgbyA9ICIiO3IgIT09IG51bGw7ICkKICAgICAgICBvICs9IGUud3JpdGUoci5kYXRhKSwgciA9IHIubmV4dDsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCksIG8gIT09ICIiICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLnB1c2gobyksIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoID0gby5sZW5ndGgsIHRoaXM7CiAgICB9OwogICAgdmFyIFBnID0gMTA3Mzc0MTgyNDsKICAgIGZ1bmN0aW9uIEZFKHQpIHsKICAgICAgcmV0dXJuIHQgPj0gUGcgPyB0ID0gUGcgOiAodC0tLCB0IHw9IHQgPj4+IDEsIHQgfD0gdCA+Pj4gMiwgdCB8PSB0ID4+PiA0LCB0IHw9IHQgPj4+IDgsIHQgfD0gdCA+Pj4gMTYsIHQrKyksIHQ7CiAgICB9CiAgICBmdW5jdGlvbiBDZyh0LCBlKSB7CiAgICAgIHJldHVybiB0IDw9IDAgfHwgZS5sZW5ndGggPT09IDAgJiYgZS5lbmRlZCA/IDAgOiBlLm9iamVjdE1vZGUgPyAxIDogdCAhPT0gdCA/IGUuZmxvd2luZyAmJiBlLmxlbmd0aCA/IGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGggOiBlLmxlbmd0aCA6ICh0ID4gZS5oaWdoV2F0ZXJNYXJrICYmIChlLmhpZ2hXYXRlck1hcmsgPSBGRSh0KSksIHQgPD0gZS5sZW5ndGggPyB0IDogZS5lbmRlZCA/IGUubGVuZ3RoIDogKGUubmVlZFJlYWRhYmxlID0gdHJ1ZSwgMCkpOwogICAgfQogICAgT2UucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbih0KSB7CiAgICAgIERlKCJyZWFkIiwgdCksIHQgPSBwYXJzZUludCh0LCAxMCk7CiAgICAgIHZhciBlID0gdGhpcy5fcmVhZGFibGVTdGF0ZSwgciA9IHQ7CiAgICAgIGlmICh0ICE9PSAwICYmIChlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlKSwgdCA9PT0gMCAmJiBlLm5lZWRSZWFkYWJsZSAmJiAoKGUuaGlnaFdhdGVyTWFyayAhPT0gMCA/IGUubGVuZ3RoID49IGUuaGlnaFdhdGVyTWFyayA6IGUubGVuZ3RoID4gMCkgfHwgZS5lbmRlZCkpCiAgICAgICAgcmV0dXJuIERlKCJyZWFkOiBlbWl0UmVhZGFibGUiLCBlLmxlbmd0aCwgZS5lbmRlZCksIGUubGVuZ3RoID09PSAwICYmIGUuZW5kZWQgPyBBbCh0aGlzKSA6IFVzKHRoaXMpLCBudWxsOwogICAgICBpZiAodCA9IENnKHQsIGUpLCB0ID09PSAwICYmIGUuZW5kZWQpCiAgICAgICAgcmV0dXJuIGUubGVuZ3RoID09PSAwICYmIEFsKHRoaXMpLCBudWxsOwogICAgICB2YXIgbyA9IGUubmVlZFJlYWRhYmxlOwogICAgICBEZSgibmVlZCByZWFkYWJsZSIsIG8pLCAoZS5sZW5ndGggPT09IDAgfHwgZS5sZW5ndGggLSB0IDwgZS5oaWdoV2F0ZXJNYXJrKSAmJiAobyA9IHRydWUsIERlKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsIG8pKSwgZS5lbmRlZCB8fCBlLnJlYWRpbmcgPyAobyA9IGZhbHNlLCBEZSgicmVhZGluZyBvciBlbmRlZCIsIG8pKSA6IG8gJiYgKERlKCJkbyByZWFkIiksIGUucmVhZGluZyA9IHRydWUsIGUuc3luYyA9IHRydWUsIGUubGVuZ3RoID09PSAwICYmIChlLm5lZWRSZWFkYWJsZSA9IHRydWUpLCB0aGlzLl9yZWFkKGUuaGlnaFdhdGVyTWFyayksIGUuc3luYyA9IGZhbHNlLCBlLnJlYWRpbmcgfHwgKHQgPSBDZyhyLCBlKSkpOwogICAgICB2YXIgZjsKICAgICAgcmV0dXJuIHQgPiAwID8gZiA9IFdnKHQsIGUpIDogZiA9IG51bGwsIGYgPT09IG51bGwgPyAoZS5uZWVkUmVhZGFibGUgPSBlLmxlbmd0aCA8PSBlLmhpZ2hXYXRlck1hcmssIHQgPSAwKSA6IChlLmxlbmd0aCAtPSB0LCBlLmF3YWl0RHJhaW4gPSAwKSwgZS5sZW5ndGggPT09IDAgJiYgKGUuZW5kZWQgfHwgKGUubmVlZFJlYWRhYmxlID0gdHJ1ZSksIHIgIT09IHQgJiYgZS5lbmRlZCAmJiBBbCh0aGlzKSksIGYgIT09IG51bGwgJiYgdGhpcy5lbWl0KCJkYXRhIiwgZiksIGY7CiAgICB9OwogICAgZnVuY3Rpb24gVUUodCwgZSkgewogICAgICBpZiAoRGUoIm9uRW9mQ2h1bmsiKSwgIWUuZW5kZWQpIHsKICAgICAgICBpZiAoZS5kZWNvZGVyKSB7CiAgICAgICAgICB2YXIgciA9IGUuZGVjb2Rlci5lbmQoKTsKICAgICAgICAgIHIgJiYgci5sZW5ndGggJiYgKGUuYnVmZmVyLnB1c2gociksIGUubGVuZ3RoICs9IGUub2JqZWN0TW9kZSA/IDEgOiByLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGUuZW5kZWQgPSB0cnVlLCBlLnN5bmMgPyBVcyh0KSA6IChlLm5lZWRSZWFkYWJsZSA9IGZhbHNlLCBlLmVtaXR0ZWRSZWFkYWJsZSB8fCAoZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlLCB6Zyh0KSkpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBVcyh0KSB7CiAgICAgIHZhciBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgRGUoImVtaXRSZWFkYWJsZSIsIGUubmVlZFJlYWRhYmxlLCBlLmVtaXR0ZWRSZWFkYWJsZSksIGUubmVlZFJlYWRhYmxlID0gZmFsc2UsIGUuZW1pdHRlZFJlYWRhYmxlIHx8IChEZSgiZW1pdFJlYWRhYmxlIiwgZS5mbG93aW5nKSwgZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlLCBwcm9jZXNzLm5leHRUaWNrKHpnLCB0KSk7CiAgICB9CiAgICBmdW5jdGlvbiB6Zyh0KSB7CiAgICAgIHZhciBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgRGUoImVtaXRSZWFkYWJsZV8iLCBlLmRlc3Ryb3llZCwgZS5sZW5ndGgsIGUuZW5kZWQpLCAhZS5kZXN0cm95ZWQgJiYgKGUubGVuZ3RoIHx8IGUuZW5kZWQpICYmICh0LmVtaXQoInJlYWRhYmxlIiksIGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2UpLCBlLm5lZWRSZWFkYWJsZSA9ICFlLmZsb3dpbmcgJiYgIWUuZW5kZWQgJiYgZS5sZW5ndGggPD0gZS5oaWdoV2F0ZXJNYXJrLCBxbCh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIFJsKHQsIGUpIHsKICAgICAgZS5yZWFkaW5nTW9yZSB8fCAoZS5yZWFkaW5nTW9yZSA9IHRydWUsIHByb2Nlc3MubmV4dFRpY2soekUsIHQsIGUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHpFKHQsIGUpIHsKICAgICAgZm9yICg7IWUucmVhZGluZyAmJiAhZS5lbmRlZCAmJiAoZS5sZW5ndGggPCBlLmhpZ2hXYXRlck1hcmsgfHwgZS5mbG93aW5nICYmIGUubGVuZ3RoID09PSAwKTsgKSB7CiAgICAgICAgdmFyIHIgPSBlLmxlbmd0aDsKICAgICAgICBpZiAoRGUoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksIHQucmVhZCgwKSwgciA9PT0gZS5sZW5ndGgpCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlLnJlYWRpbmdNb3JlID0gZmFsc2U7CiAgICB9CiAgICBPZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbih0KSB7CiAgICAgIE5hKHRoaXMsIG5ldyBERSgiX3JlYWQoKSIpKTsKICAgIH07CiAgICBPZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgdmFyIHIgPSB0aGlzLCBvID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgICAgc3dpdGNoIChvLnBpcGVzQ291bnQpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBvLnBpcGVzID0gdDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIG8ucGlwZXMgPSBbby5waXBlcywgdF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgby5waXBlcy5wdXNoKHQpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgby5waXBlc0NvdW50ICs9IDEsIERlKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLCBvLnBpcGVzQ291bnQsIGUpOwogICAgICB2YXIgZiA9ICghZSB8fCBlLmVuZCAhPT0gZmFsc2UpICYmIHQgIT09IHByb2Nlc3Muc3Rkb3V0ICYmIHQgIT09IHByb2Nlc3Muc3RkZXJyLCBwID0gZiA/IHkyIDogZ2U7CiAgICAgIG8uZW5kRW1pdHRlZCA/IHByb2Nlc3MubmV4dFRpY2socCkgOiByLm9uY2UoImVuZCIsIHApLCB0Lm9uKCJ1bnBpcGUiLCBtMik7CiAgICAgIGZ1bmN0aW9uIG0yKF9lLCBOKSB7CiAgICAgICAgRGUoIm9udW5waXBlIiksIF9lID09PSByICYmIE4gJiYgTi5oYXNVbnBpcGVkID09PSBmYWxzZSAmJiAoTi5oYXNVbnBpcGVkID0gdHJ1ZSwgUygpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5MigpIHsKICAgICAgICBEZSgib25lbmQiKSwgdC5lbmQoKTsKICAgICAgfQogICAgICB2YXIgTSA9IEhFKHIpOwogICAgICB0Lm9uKCJkcmFpbiIsIE0pOwogICAgICB2YXIgeCA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBTKCkgewogICAgICAgIERlKCJjbGVhbnVwIiksIHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwgcTIpLCB0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLCBMMiksIHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIiwgTSksIHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgQiksIHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsIG0yKSwgci5yZW1vdmVMaXN0ZW5lcigiZW5kIiwgeTIpLCByLnJlbW92ZUxpc3RlbmVyKCJlbmQiLCBnZSksIHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLCBFMiksIHggPSB0cnVlLCBvLmF3YWl0RHJhaW4gJiYgKCF0Ll93cml0YWJsZVN0YXRlIHx8IHQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSAmJiBNKCk7CiAgICAgIH0KICAgICAgci5vbigiZGF0YSIsIEUyKTsKICAgICAgZnVuY3Rpb24gRTIoX2UpIHsKICAgICAgICBEZSgib25kYXRhIik7CiAgICAgICAgdmFyIE4gPSB0LndyaXRlKF9lKTsKICAgICAgICBEZSgiZGVzdC53cml0ZSIsIE4pLCBOID09PSBmYWxzZSAmJiAoKG8ucGlwZXNDb3VudCA9PT0gMSAmJiBvLnBpcGVzID09PSB0IHx8IG8ucGlwZXNDb3VudCA+IDEgJiYgS2coby5waXBlcywgdCkgIT09IC0xKSAmJiAheCAmJiAoRGUoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsIG8uYXdhaXREcmFpbiksIG8uYXdhaXREcmFpbisrKSwgci5wYXVzZSgpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBCKF9lKSB7CiAgICAgICAgRGUoIm9uZXJyb3IiLCBfZSksIGdlKCksIHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIiwgQiksIE9nKHQsICJlcnJvciIpID09PSAwICYmIE5hKHQsIF9lKTsKICAgICAgfQogICAgICBDRSh0LCAiZXJyb3IiLCBCKTsKICAgICAgZnVuY3Rpb24gcTIoKSB7CiAgICAgICAgdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIiwgTDIpLCBnZSgpOwogICAgICB9CiAgICAgIHQub25jZSgiY2xvc2UiLCBxMik7CiAgICAgIGZ1bmN0aW9uIEwyKCkgewogICAgICAgIERlKCJvbmZpbmlzaCIpLCB0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsIHEyKSwgZ2UoKTsKICAgICAgfQogICAgICB0Lm9uY2UoImZpbmlzaCIsIEwyKTsKICAgICAgZnVuY3Rpb24gZ2UoKSB7CiAgICAgICAgRGUoInVucGlwZSIpLCByLnVucGlwZSh0KTsKICAgICAgfQogICAgICByZXR1cm4gdC5lbWl0KCJwaXBlIiwgciksIG8uZmxvd2luZyB8fCAoRGUoInBpcGUgcmVzdW1lIiksIHIucmVzdW1lKCkpLCB0OwogICAgfTsKICAgIGZ1bmN0aW9uIEhFKHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgICBEZSgicGlwZU9uRHJhaW4iLCByLmF3YWl0RHJhaW4pLCByLmF3YWl0RHJhaW4gJiYgci5hd2FpdERyYWluLS0sIHIuYXdhaXREcmFpbiA9PT0gMCAmJiBPZyh0LCAiZGF0YSIpICYmIChyLmZsb3dpbmcgPSB0cnVlLCBxbCh0KSk7CiAgICAgIH07CiAgICB9CiAgICBPZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24odCkgewogICAgICB2YXIgZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGUsIHIgPSB7IGhhc1VucGlwZWQ6IGZhbHNlIH07CiAgICAgIGlmIChlLnBpcGVzQ291bnQgPT09IDApCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGlmIChlLnBpcGVzQ291bnQgPT09IDEpCiAgICAgICAgcmV0dXJuIHQgJiYgdCAhPT0gZS5waXBlcyA/IHRoaXMgOiAodCB8fCAodCA9IGUucGlwZXMpLCBlLnBpcGVzID0gbnVsbCwgZS5waXBlc0NvdW50ID0gMCwgZS5mbG93aW5nID0gZmFsc2UsIHQgJiYgdC5lbWl0KCJ1bnBpcGUiLCB0aGlzLCByKSwgdGhpcyk7CiAgICAgIGlmICghdCkgewogICAgICAgIHZhciB7IHBpcGVzOiBvLCBwaXBlc0NvdW50OiBmIH0gPSBlOwogICAgICAgIGUucGlwZXMgPSBudWxsLCBlLnBpcGVzQ291bnQgPSAwLCBlLmZsb3dpbmcgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBwID0gMDtwIDwgZjsgcCsrKQogICAgICAgICAgb1twXS5lbWl0KCJ1bnBpcGUiLCB0aGlzLCB7IGhhc1VucGlwZWQ6IGZhbHNlIH0pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIHZhciBtMiA9IEtnKGUucGlwZXMsIHQpOwogICAgICByZXR1cm4gbTIgPT09IC0xID8gdGhpcyA6IChlLnBpcGVzLnNwbGljZShtMiwgMSksIGUucGlwZXNDb3VudCAtPSAxLCBlLnBpcGVzQ291bnQgPT09IDEgJiYgKGUucGlwZXMgPSBlLnBpcGVzWzBdKSwgdC5lbWl0KCJ1bnBpcGUiLCB0aGlzLCByKSwgdGhpcyk7CiAgICB9OwogICAgT2UucHJvdG90eXBlLm9uID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IERhLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIHQsIGUpLCBvID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgICAgcmV0dXJuIHQgPT09ICJkYXRhIiA/IChvLnJlYWRhYmxlTGlzdGVuaW5nID0gdGhpcy5saXN0ZW5lckNvdW50KCJyZWFkYWJsZSIpID4gMCwgby5mbG93aW5nICE9PSBmYWxzZSAmJiB0aGlzLnJlc3VtZSgpKSA6IHQgPT09ICJyZWFkYWJsZSIgJiYgIW8uZW5kRW1pdHRlZCAmJiAhby5yZWFkYWJsZUxpc3RlbmluZyAmJiAoby5yZWFkYWJsZUxpc3RlbmluZyA9IG8ubmVlZFJlYWRhYmxlID0gdHJ1ZSwgby5mbG93aW5nID0gZmFsc2UsIG8uZW1pdHRlZFJlYWRhYmxlID0gZmFsc2UsIERlKCJvbiByZWFkYWJsZSIsIG8ubGVuZ3RoLCBvLnJlYWRpbmcpLCBvLmxlbmd0aCA/IFVzKHRoaXMpIDogby5yZWFkaW5nIHx8IHByb2Nlc3MubmV4dFRpY2soV0UsIHRoaXMpKSwgcjsKICAgIH07CiAgICBPZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBPZS5wcm90b3R5cGUub247CiAgICBPZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHZhciByID0gRGEucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcywgdCwgZSk7CiAgICAgIHJldHVybiB0ID09PSAicmVhZGFibGUiICYmIHByb2Nlc3MubmV4dFRpY2soSGcsIHRoaXMpLCByOwogICAgfTsKICAgIE9lLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlID0gRGEucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICByZXR1cm4gKHQgPT09ICJyZWFkYWJsZSIgfHwgdCA9PT0gdW5kZWZpbmVkKSAmJiBwcm9jZXNzLm5leHRUaWNrKEhnLCB0aGlzKSwgZTsKICAgIH07CiAgICBmdW5jdGlvbiBIZyh0KSB7CiAgICAgIHZhciBlID0gdC5fcmVhZGFibGVTdGF0ZTsKICAgICAgZS5yZWFkYWJsZUxpc3RlbmluZyA9IHQubGlzdGVuZXJDb3VudCgicmVhZGFibGUiKSA+IDAsIGUucmVzdW1lU2NoZWR1bGVkICYmICFlLnBhdXNlZCA/IGUuZmxvd2luZyA9IHRydWUgOiB0Lmxpc3RlbmVyQ291bnQoImRhdGEiKSA+IDAgJiYgdC5yZXN1bWUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIFdFKHQpIHsKICAgICAgRGUoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLCB0LnJlYWQoMCk7CiAgICB9CiAgICBPZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB0ID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgICAgcmV0dXJuIHQuZmxvd2luZyB8fCAoRGUoInJlc3VtZSIpLCB0LmZsb3dpbmcgPSAhdC5yZWFkYWJsZUxpc3RlbmluZywgS0UodGhpcywgdCkpLCB0LnBhdXNlZCA9IGZhbHNlLCB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIEtFKHQsIGUpIHsKICAgICAgZS5yZXN1bWVTY2hlZHVsZWQgfHwgKGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZSwgcHJvY2Vzcy5uZXh0VGljayhqRSwgdCwgZSkpOwogICAgfQogICAgZnVuY3Rpb24gakUodCwgZSkgewogICAgICBEZSgicmVzdW1lIiwgZS5yZWFkaW5nKSwgZS5yZWFkaW5nIHx8IHQucmVhZCgwKSwgZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZSwgdC5lbWl0KCJyZXN1bWUiKSwgcWwodCksIGUuZmxvd2luZyAmJiAhZS5yZWFkaW5nICYmIHQucmVhZCgwKTsKICAgIH0KICAgIE9lLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gRGUoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UgJiYgKERlKCJwYXVzZSIpLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZSwgdGhpcy5lbWl0KCJwYXVzZSIpKSwgdGhpcy5fcmVhZGFibGVTdGF0ZS5wYXVzZWQgPSB0cnVlLCB0aGlzOwogICAgfTsKICAgIGZ1bmN0aW9uIHFsKHQpIHsKICAgICAgdmFyIGUgPSB0Ll9yZWFkYWJsZVN0YXRlOwogICAgICBmb3IgKERlKCJmbG93IiwgZS5mbG93aW5nKTtlLmZsb3dpbmcgJiYgdC5yZWFkKCkgIT09IG51bGw7ICkKICAgICAgICA7CiAgICB9CiAgICBPZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgdmFyIGUgPSB0aGlzLCByID0gdGhpcy5fcmVhZGFibGVTdGF0ZSwgbyA9IGZhbHNlOwogICAgICB0Lm9uKCJlbmQiLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoRGUoIndyYXBwZWQgZW5kIiksIHIuZGVjb2RlciAmJiAhci5lbmRlZCkgewogICAgICAgICAgdmFyIG0yID0gci5kZWNvZGVyLmVuZCgpOwogICAgICAgICAgbTIgJiYgbTIubGVuZ3RoICYmIGUucHVzaChtMik7CiAgICAgICAgfQogICAgICAgIGUucHVzaChudWxsKTsKICAgICAgfSksIHQub24oImRhdGEiLCBmdW5jdGlvbihtMikgewogICAgICAgIGlmIChEZSgid3JhcHBlZCBkYXRhIiksIHIuZGVjb2RlciAmJiAobTIgPSByLmRlY29kZXIud3JpdGUobTIpKSwgIShyLm9iamVjdE1vZGUgJiYgbTIgPT0gbnVsbCkgJiYgISghci5vYmplY3RNb2RlICYmICghbTIgfHwgIW0yLmxlbmd0aCkpKSB7CiAgICAgICAgICB2YXIgeTIgPSBlLnB1c2gobTIpOwogICAgICAgICAgeTIgfHwgKG8gPSB0cnVlLCB0LnBhdXNlKCkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGZvciAodmFyIGYgaW4gdCkKICAgICAgICB0aGlzW2ZdID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRbZl0gPT0gImZ1bmN0aW9uIiAmJiAodGhpc1tmXSA9IGZ1bmN0aW9uKHkyKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0W3kyXS5hcHBseSh0LCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICB9KGYpKTsKICAgICAgZm9yICh2YXIgcCA9IDA7cCA8IFNsLmxlbmd0aDsgcCsrKQogICAgICAgIHQub24oU2xbcF0sIHRoaXMuZW1pdC5iaW5kKHRoaXMsIFNsW3BdKSk7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkID0gZnVuY3Rpb24obTIpIHsKICAgICAgICBEZSgid3JhcHBlZCBfcmVhZCIsIG0yKSwgbyAmJiAobyA9IGZhbHNlLCB0LnJlc3VtZSgpKTsKICAgICAgfSwgdGhpczsKICAgIH07CiAgICB0eXBlb2YgU3ltYm9sID09ICJmdW5jdGlvbiIgJiYgKE9lLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9sID09PSB1bmRlZmluZWQgJiYgKF9sID0gTGcoKSksIF9sKHRoaXMpOwogICAgfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2UucHJvdG90eXBlLCAicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyazsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2UucHJvdG90eXBlLCAicmVhZGFibGVCdWZmZXIiLCB7IGVudW1lcmFibGU6IGZhbHNlLCBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlcjsKICAgIH0gfSk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2UucHJvdG90eXBlLCAicmVhZGFibGVGbG93aW5nIiwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZzsKICAgIH0sIHNldDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlICYmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBlKTsKICAgIH0gfSk7CiAgICBPZS5fZnJvbUxpc3QgPSBXZzsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPZS5wcm90b3R5cGUsICJyZWFkYWJsZUxlbmd0aCIsIHsgZW51bWVyYWJsZTogZmFsc2UsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aDsKICAgIH0gfSk7CiAgICBmdW5jdGlvbiBXZyh0LCBlKSB7CiAgICAgIGlmIChlLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgdmFyIHI7CiAgICAgIHJldHVybiBlLm9iamVjdE1vZGUgPyByID0gZS5idWZmZXIuc2hpZnQoKSA6ICF0IHx8IHQgPj0gZS5sZW5ndGggPyAoZS5kZWNvZGVyID8gciA9IGUuYnVmZmVyLmpvaW4oIiIpIDogZS5idWZmZXIubGVuZ3RoID09PSAxID8gciA9IGUuYnVmZmVyLmZpcnN0KCkgOiByID0gZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSwgZS5idWZmZXIuY2xlYXIoKSkgOiByID0gZS5idWZmZXIuY29uc3VtZSh0LCBlLmRlY29kZXIpLCByOwogICAgfQogICAgZnVuY3Rpb24gQWwodCkgewogICAgICB2YXIgZSA9IHQuX3JlYWRhYmxlU3RhdGU7CiAgICAgIERlKCJlbmRSZWFkYWJsZSIsIGUuZW5kRW1pdHRlZCksIGUuZW5kRW1pdHRlZCB8fCAoZS5lbmRlZCA9IHRydWUsIHByb2Nlc3MubmV4dFRpY2soWkUsIGUsIHQpKTsKICAgIH0KICAgIGZ1bmN0aW9uIFpFKHQsIGUpIHsKICAgICAgaWYgKERlKCJlbmRSZWFkYWJsZU5UIiwgdC5lbmRFbWl0dGVkLCB0Lmxlbmd0aCksICF0LmVuZEVtaXR0ZWQgJiYgdC5sZW5ndGggPT09IDAgJiYgKHQuZW5kRW1pdHRlZCA9IHRydWUsIGUucmVhZGFibGUgPSBmYWxzZSwgZS5lbWl0KCJlbmQiKSwgdC5hdXRvRGVzdHJveSkpIHsKICAgICAgICB2YXIgciA9IGUuX3dyaXRhYmxlU3RhdGU7CiAgICAgICAgKCFyIHx8IHIuYXV0b0Rlc3Ryb3kgJiYgci5maW5pc2hlZCkgJiYgZS5kZXN0cm95KCk7CiAgICAgIH0KICAgIH0KICAgIHR5cGVvZiBTeW1ib2wgPT0gImZ1bmN0aW9uIiAmJiAoT2UuZnJvbSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIHhsID09PSB1bmRlZmluZWQgJiYgKHhsID0gRGcoKSksIHhsKE9lLCB0LCBlKTsKICAgIH0pOwogICAgZnVuY3Rpb24gS2codCwgZSkgewogICAgICBmb3IgKHZhciByID0gMCwgbyA9IHQubGVuZ3RoO3IgPCBvOyByKyspCiAgICAgICAgaWYgKHRbcl0gPT09IGUpCiAgICAgICAgICByZXR1cm4gcjsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIH0pOwogIElsID0gVDIoKGJrLCBWZykgPT4gewogICAgVmcuZXhwb3J0cyA9IEVpOwogICAgdmFyIHpzID0ga24oKS5jb2RlcywgVkUgPSB6cy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCwgJEUgPSB6cy5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssIEdFID0genMuRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORywgWUUgPSB6cy5FUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAsIEhzID0gTG4oKTsKICAgIEllKCkoRWksIEhzKTsKICAgIGZ1bmN0aW9uIFhFKHQsIGUpIHsKICAgICAgdmFyIHIgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTsKICAgICAgci50cmFuc2Zvcm1pbmcgPSBmYWxzZTsKICAgICAgdmFyIG8gPSByLndyaXRlY2I7CiAgICAgIGlmIChvID09PSBudWxsKQogICAgICAgIHJldHVybiB0aGlzLmVtaXQoImVycm9yIiwgbmV3ICRFKTsKICAgICAgci53cml0ZWNodW5rID0gbnVsbCwgci53cml0ZWNiID0gbnVsbCwgZSAhPSBudWxsICYmIHRoaXMucHVzaChlKSwgbyh0KTsKICAgICAgdmFyIGYgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOwogICAgICBmLnJlYWRpbmcgPSBmYWxzZSwgKGYubmVlZFJlYWRhYmxlIHx8IGYubGVuZ3RoIDwgZi5oaWdoV2F0ZXJNYXJrKSAmJiB0aGlzLl9yZWFkKGYuaGlnaFdhdGVyTWFyayk7CiAgICB9CiAgICBmdW5jdGlvbiBFaSh0KSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFaSkpCiAgICAgICAgcmV0dXJuIG5ldyBFaSh0KTsKICAgICAgSHMuY2FsbCh0aGlzLCB0KSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7IGFmdGVyVHJhbnNmb3JtOiBYRS5iaW5kKHRoaXMpLCBuZWVkVHJhbnNmb3JtOiBmYWxzZSwgdHJhbnNmb3JtaW5nOiBmYWxzZSwgd3JpdGVjYjogbnVsbCwgd3JpdGVjaHVuazogbnVsbCwgd3JpdGVlbmNvZGluZzogbnVsbCB9LCB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWUsIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlLCB0ICYmICh0eXBlb2YgdC50cmFuc2Zvcm0gPT0gImZ1bmN0aW9uIiAmJiAodGhpcy5fdHJhbnNmb3JtID0gdC50cmFuc2Zvcm0pLCB0eXBlb2YgdC5mbHVzaCA9PSAiZnVuY3Rpb24iICYmICh0aGlzLl9mbHVzaCA9IHQuZmx1c2gpKSwgdGhpcy5vbigicHJlZmluaXNoIiwgSkUpOwogICAgfQogICAgZnVuY3Rpb24gSkUoKSB7CiAgICAgIHZhciB0ID0gdGhpczsKICAgICAgdHlwZW9mIHRoaXMuX2ZsdXNoID09ICJmdW5jdGlvbiIgJiYgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID8gdGhpcy5fZmx1c2goZnVuY3Rpb24oZSwgcikgewogICAgICAgIFpnKHQsIGUsIHIpOwogICAgICB9KSA6IFpnKHRoaXMsIG51bGwsIG51bGwpOwogICAgfQogICAgRWkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbih0LCBlKSB7CiAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2UsIEhzLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgdCwgZSk7CiAgICB9OwogICAgRWkucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbih0LCBlLCByKSB7CiAgICAgIHIobmV3IFZFKCJfdHJhbnNmb3JtKCkiKSk7CiAgICB9OwogICAgRWkucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTsKICAgICAgaWYgKG8ud3JpdGVjYiA9IHIsIG8ud3JpdGVjaHVuayA9IHQsIG8ud3JpdGVlbmNvZGluZyA9IGUsICFvLnRyYW5zZm9ybWluZykgewogICAgICAgIHZhciBmID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsKICAgICAgICAoby5uZWVkVHJhbnNmb3JtIHx8IGYubmVlZFJlYWRhYmxlIHx8IGYubGVuZ3RoIDwgZi5oaWdoV2F0ZXJNYXJrKSAmJiB0aGlzLl9yZWFkKGYuaGlnaFdhdGVyTWFyayk7CiAgICAgIH0KICAgIH07CiAgICBFaS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBlID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7CiAgICAgIGUud3JpdGVjaHVuayAhPT0gbnVsbCAmJiAhZS50cmFuc2Zvcm1pbmcgPyAoZS50cmFuc2Zvcm1pbmcgPSB0cnVlLCB0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLCBlLndyaXRlZW5jb2RpbmcsIGUuYWZ0ZXJUcmFuc2Zvcm0pKSA6IGUubmVlZFRyYW5zZm9ybSA9IHRydWU7CiAgICB9OwogICAgRWkucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24odCwgZSkgewogICAgICBIcy5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCB0LCBmdW5jdGlvbihyKSB7CiAgICAgICAgZShyKTsKICAgICAgfSk7CiAgICB9OwogICAgZnVuY3Rpb24gWmcodCwgZSwgcikgewogICAgICBpZiAoZSkKICAgICAgICByZXR1cm4gdC5lbWl0KCJlcnJvciIsIGUpOwogICAgICBpZiAociAhPSBudWxsICYmIHQucHVzaChyKSwgdC5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFlFOwogICAgICBpZiAodC5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKQogICAgICAgIHRocm93IG5ldyBHRTsKICAgICAgcmV0dXJuIHQucHVzaChudWxsKTsKICAgIH0KICB9KTsKICBZZyA9IFQyKChtaywgR2cpID0+IHsKICAgIEdnLmV4cG9ydHMgPSBQYTsKICAgIHZhciAkZyA9IElsKCk7CiAgICBJZSgpKFBhLCAkZyk7CiAgICBmdW5jdGlvbiBQYSh0KSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYSkpCiAgICAgICAgcmV0dXJuIG5ldyBQYSh0KTsKICAgICAgJGcuY2FsbCh0aGlzLCB0KTsKICAgIH0KICAgIFBhLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24odCwgZSwgcikgewogICAgICByKG51bGwsIHQpOwogICAgfTsKICB9KTsKICB0MiA9IFQyKChnaywgZTIpID0+IHsKICAgIHZhciBUbDsKICAgIGZ1bmN0aW9uIFFFKHQpIHsKICAgICAgdmFyIGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGUgfHwgKGUgPSB0cnVlLCB0LmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKSk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgUWcgPSBrbigpLmNvZGVzLCBlQSA9IFFnLkVSUl9NSVNTSU5HX0FSR1MsIHRBID0gUWcuRVJSX1NUUkVBTV9ERVNUUk9ZRUQ7CiAgICBmdW5jdGlvbiBYZyh0KSB7CiAgICAgIGlmICh0KQogICAgICAgIHRocm93IHQ7CiAgICB9CiAgICBmdW5jdGlvbiByQSh0KSB7CiAgICAgIHJldHVybiB0LnNldEhlYWRlciAmJiB0eXBlb2YgdC5hYm9ydCA9PSAiZnVuY3Rpb24iOwogICAgfQogICAgZnVuY3Rpb24gaUEodCwgZSwgciwgbykgewogICAgICBvID0gUUUobyk7CiAgICAgIHZhciBmID0gZmFsc2U7CiAgICAgIHQub24oImNsb3NlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgZiA9IHRydWU7CiAgICAgIH0pLCBUbCA9PT0gdW5kZWZpbmVkICYmIChUbCA9IERzKCkpLCBUbCh0LCB7IHJlYWRhYmxlOiBlLCB3cml0YWJsZTogciB9LCBmdW5jdGlvbihtMikgewogICAgICAgIGlmIChtMikKICAgICAgICAgIHJldHVybiBvKG0yKTsKICAgICAgICBmID0gdHJ1ZSwgbygpOwogICAgICB9KTsKICAgICAgdmFyIHAgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG0yKSB7CiAgICAgICAgaWYgKCFmICYmICFwKSB7CiAgICAgICAgICBpZiAocCA9IHRydWUsIHJBKHQpKQogICAgICAgICAgICByZXR1cm4gdC5hYm9ydCgpOwogICAgICAgICAgaWYgKHR5cGVvZiB0LmRlc3Ryb3kgPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgcmV0dXJuIHQuZGVzdHJveSgpOwogICAgICAgICAgbyhtMiB8fCBuZXcgdEEoInBpcGUiKSk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gSmcodCkgewogICAgICB0KCk7CiAgICB9CiAgICBmdW5jdGlvbiBuQSh0LCBlKSB7CiAgICAgIHJldHVybiB0LnBpcGUoZSk7CiAgICB9CiAgICBmdW5jdGlvbiBmQSh0KSB7CiAgICAgIHJldHVybiAhdC5sZW5ndGggfHwgdHlwZW9mIHRbdC5sZW5ndGggLSAxXSAhPSAiZnVuY3Rpb24iID8gWGcgOiB0LnBvcCgpOwogICAgfQogICAgZnVuY3Rpb24gYUEoKSB7CiAgICAgIGZvciAodmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoLCBlID0gbmV3IEFycmF5KHQpLCByID0gMDtyIDwgdDsgcisrKQogICAgICAgIGVbcl0gPSBhcmd1bWVudHNbcl07CiAgICAgIHZhciBvID0gZkEoZSk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVbMF0pICYmIChlID0gZVswXSksIGUubGVuZ3RoIDwgMikKICAgICAgICB0aHJvdyBuZXcgZUEoInN0cmVhbXMiKTsKICAgICAgdmFyIGYsIHAgPSBlLm1hcChmdW5jdGlvbihtMiwgeTIpIHsKICAgICAgICB2YXIgTSA9IHkyIDwgZS5sZW5ndGggLSAxLCB4ID0geTIgPiAwOwogICAgICAgIHJldHVybiBpQShtMiwgTSwgeCwgZnVuY3Rpb24oUykgewogICAgICAgICAgZiB8fCAoZiA9IFMpLCBTICYmIHAuZm9yRWFjaChKZyksICFNICYmIChwLmZvckVhY2goSmcpLCBvKGYpKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybiBlLnJlZHVjZShuQSk7CiAgICB9CiAgICBlMi5leHBvcnRzID0gYUE7CiAgfSk7CiAgaTIgPSBUMigoTXIsIHIyKSA9PiB7CiAgICBNciA9IHIyLmV4cG9ydHMgPSB5bCgpOwogICAgTXIuU3RyZWFtID0gTXI7CiAgICBNci5SZWFkYWJsZSA9IE1yOwogICAgTXIuV3JpdGFibGUgPSBibCgpOwogICAgTXIuRHVwbGV4ID0gTG4oKTsKICAgIE1yLlRyYW5zZm9ybSA9IElsKCk7CiAgICBNci5QYXNzVGhyb3VnaCA9IFlnKCk7CiAgICBNci5maW5pc2hlZCA9IERzKCk7CiAgICBNci5waXBlbGluZSA9IHQyKCk7CiAgfSk7CiAgV3MgPSBUMigobjIsIGtsKSA9PiB7CiAgICAoZnVuY3Rpb24odCwgZSkgewogICAgICBmdW5jdGlvbiByKGgyLCBzKSB7CiAgICAgICAgaWYgKCFoMikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzIHx8ICJBc3NlcnRpb24gZmFpbGVkIik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbyhoMiwgcykgewogICAgICAgIGgyLnN1cGVyXyA9IHM7CiAgICAgICAgdmFyIHUgPSBmdW5jdGlvbigpIHsKICAgICAgICB9OwogICAgICAgIHUucHJvdG90eXBlID0gcy5wcm90b3R5cGUsIGgyLnByb3RvdHlwZSA9IG5ldyB1LCBoMi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBoMjsKICAgICAgfQogICAgICBmdW5jdGlvbiBmKGgyLCBzLCB1KSB7CiAgICAgICAgaWYgKGYuaXNCTihoMikpCiAgICAgICAgICByZXR1cm4gaDI7CiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMud29yZHMgPSBudWxsLCB0aGlzLmxlbmd0aCA9IDAsIHRoaXMucmVkID0gbnVsbCwgaDIgIT09IG51bGwgJiYgKChzID09PSAibGUiIHx8IHMgPT09ICJiZSIpICYmICh1ID0gcywgcyA9IDEwKSwgdGhpcy5faW5pdChoMiB8fCAwLCBzIHx8IDEwLCB1IHx8ICJiZSIpKTsKICAgICAgfQogICAgICB0eXBlb2YgdCA9PSAib2JqZWN0IiA/IHQuZXhwb3J0cyA9IGYgOiBlLkJOID0gZiwgZi5CTiA9IGYsIGYud29yZFNpemUgPSAyNjsKICAgICAgdmFyIHA7CiAgICAgIHRyeSB7CiAgICAgICAgdHlwZW9mIHdpbmRvdyA8ICJ1IiAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciA8ICJ1IiA/IHAgPSB3aW5kb3cuQnVmZmVyIDogcCA9IGppKCkuQnVmZmVyOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgICBmLmlzQk4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHMgaW5zdGFuY2VvZiBmID8gdHJ1ZSA6IHMgIT09IG51bGwgJiYgdHlwZW9mIHMgPT0gIm9iamVjdCIgJiYgcy5jb25zdHJ1Y3Rvci53b3JkU2l6ZSA9PT0gZi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KHMud29yZHMpOwogICAgICB9LCBmLm1heCA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICByZXR1cm4gcy5jbXAodSkgPiAwID8gcyA6IHU7CiAgICAgIH0sIGYubWluID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHJldHVybiBzLmNtcCh1KSA8IDAgPyBzIDogdTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbihzLCB1LCBjKSB7CiAgICAgICAgaWYgKHR5cGVvZiBzID09ICJudW1iZXIiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIocywgdSwgYyk7CiAgICAgICAgaWYgKHR5cGVvZiBzID09ICJvYmplY3QiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShzLCB1LCBjKTsKICAgICAgICB1ID09PSAiaGV4IiAmJiAodSA9IDE2KSwgcih1ID09PSAodSB8IDApICYmIHUgPj0gMiAmJiB1IDw9IDM2KSwgcyA9IHMudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywgIiIpOwogICAgICAgIHZhciBiMiA9IDA7CiAgICAgICAgc1swXSA9PT0gIi0iICYmIChiMisrLCB0aGlzLm5lZ2F0aXZlID0gMSksIGIyIDwgcy5sZW5ndGggJiYgKHUgPT09IDE2ID8gdGhpcy5fcGFyc2VIZXgocywgYjIsIGMpIDogKHRoaXMuX3BhcnNlQmFzZShzLCB1LCBiMiksIGMgPT09ICJsZSIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCB1LCBjKSkpOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICBzIDwgMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDEsIHMgPSAtcyksIHMgPCA2NzEwODg2NCA/ICh0aGlzLndvcmRzID0gW3MgJiA2NzEwODg2M10sIHRoaXMubGVuZ3RoID0gMSkgOiBzIDwgNDUwMzU5OTYyNzM3MDQ5NiA/ICh0aGlzLndvcmRzID0gW3MgJiA2NzEwODg2MywgcyAvIDY3MTA4ODY0ICYgNjcxMDg4NjNdLCB0aGlzLmxlbmd0aCA9IDIpIDogKHIocyA8IDkwMDcxOTkyNTQ3NDA5OTIpLCB0aGlzLndvcmRzID0gW3MgJiA2NzEwODg2MywgcyAvIDY3MTA4ODY0ICYgNjcxMDg4NjMsIDFdLCB0aGlzLmxlbmd0aCA9IDMpLCBjID09PSAibGUiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgdSwgYyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbihzLCB1LCBjKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIHMubGVuZ3RoID09ICJudW1iZXIiKSwgcy5sZW5ndGggPD0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXM7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwocy5sZW5ndGggLyAzKSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgYjIgPSAwO2IyIDwgdGhpcy5sZW5ndGg7IGIyKyspCiAgICAgICAgICB0aGlzLndvcmRzW2IyXSA9IDA7CiAgICAgICAgdmFyIGwsIG4sIGQgPSAwOwogICAgICAgIGlmIChjID09PSAiYmUiKQogICAgICAgICAgZm9yIChiMiA9IHMubGVuZ3RoIC0gMSwgbCA9IDA7YjIgPj0gMDsgYjIgLT0gMykKICAgICAgICAgICAgbiA9IHNbYjJdIHwgc1tiMiAtIDFdIDw8IDggfCBzW2IyIC0gMl0gPDwgMTYsIHRoaXMud29yZHNbbF0gfD0gbiA8PCBkICYgNjcxMDg4NjMsIHRoaXMud29yZHNbbCArIDFdID0gbiA+Pj4gMjYgLSBkICYgNjcxMDg4NjMsIGQgKz0gMjQsIGQgPj0gMjYgJiYgKGQgLT0gMjYsIGwrKyk7CiAgICAgICAgZWxzZSBpZiAoYyA9PT0gImxlIikKICAgICAgICAgIGZvciAoYjIgPSAwLCBsID0gMDtiMiA8IHMubGVuZ3RoOyBiMiArPSAzKQogICAgICAgICAgICBuID0gc1tiMl0gfCBzW2IyICsgMV0gPDwgOCB8IHNbYjIgKyAyXSA8PCAxNiwgdGhpcy53b3Jkc1tsXSB8PSBuIDw8IGQgJiA2NzEwODg2MywgdGhpcy53b3Jkc1tsICsgMV0gPSBuID4+PiAyNiAtIGQgJiA2NzEwODg2MywgZCArPSAyNCwgZCA+PSAyNiAmJiAoZCAtPSAyNiwgbCsrKTsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gbTIoaDIsIHMpIHsKICAgICAgICB2YXIgdSA9IGgyLmNoYXJDb2RlQXQocyk7CiAgICAgICAgaWYgKHUgPj0gNDggJiYgdSA8PSA1NykKICAgICAgICAgIHJldHVybiB1IC0gNDg7CiAgICAgICAgaWYgKHUgPj0gNjUgJiYgdSA8PSA3MCkKICAgICAgICAgIHJldHVybiB1IC0gNTU7CiAgICAgICAgaWYgKHUgPj0gOTcgJiYgdSA8PSAxMDIpCiAgICAgICAgICByZXR1cm4gdSAtIDg3OwogICAgICAgIHIoZmFsc2UsICJJbnZhbGlkIGNoYXJhY3RlciBpbiAiICsgaDIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHkyKGgyLCBzLCB1KSB7CiAgICAgICAgdmFyIGMgPSBtMihoMiwgdSk7CiAgICAgICAgcmV0dXJuIHUgLSAxID49IHMgJiYgKGMgfD0gbTIoaDIsIHUgLSAxKSA8PCA0KSwgYzsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbihzLCB1LCBjKSB7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKHMubGVuZ3RoIC0gdSkgLyA2KSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgYjIgPSAwO2IyIDwgdGhpcy5sZW5ndGg7IGIyKyspCiAgICAgICAgICB0aGlzLndvcmRzW2IyXSA9IDA7CiAgICAgICAgdmFyIGwgPSAwLCBuID0gMCwgZDsKICAgICAgICBpZiAoYyA9PT0gImJlIikKICAgICAgICAgIGZvciAoYjIgPSBzLmxlbmd0aCAtIDE7YjIgPj0gdTsgYjIgLT0gMikKICAgICAgICAgICAgZCA9IHkyKHMsIHUsIGIyKSA8PCBsLCB0aGlzLndvcmRzW25dIHw9IGQgJiA2NzEwODg2MywgbCA+PSAxOCA/IChsIC09IDE4LCBuICs9IDEsIHRoaXMud29yZHNbbl0gfD0gZCA+Pj4gMjYpIDogbCArPSA4OwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIHcgPSBzLmxlbmd0aCAtIHU7CiAgICAgICAgICBmb3IgKGIyID0gdyAlIDIgPT09IDAgPyB1ICsgMSA6IHU7YjIgPCBzLmxlbmd0aDsgYjIgKz0gMikKICAgICAgICAgICAgZCA9IHkyKHMsIHUsIGIyKSA8PCBsLCB0aGlzLndvcmRzW25dIHw9IGQgJiA2NzEwODg2MywgbCA+PSAxOCA/IChsIC09IDE4LCBuICs9IDEsIHRoaXMud29yZHNbbl0gfD0gZCA+Pj4gMjYpIDogbCArPSA4OwogICAgICAgIH0KICAgICAgICB0aGlzLl9zdHJpcCgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBNKGgyLCBzLCB1LCBjKSB7CiAgICAgICAgZm9yICh2YXIgYjIgPSAwLCBsID0gMCwgbiA9IE1hdGgubWluKGgyLmxlbmd0aCwgdSksIGQgPSBzO2QgPCBuOyBkKyspIHsKICAgICAgICAgIHZhciB3ID0gaDIuY2hhckNvZGVBdChkKSAtIDQ4OwogICAgICAgICAgYjIgKj0gYywgdyA+PSA0OSA/IGwgPSB3IC0gNDkgKyAxMCA6IHcgPj0gMTcgPyBsID0gdyAtIDE3ICsgMTAgOiBsID0gdywgcih3ID49IDAgJiYgbCA8IGMsICJJbnZhbGlkIGNoYXJhY3RlciIpLCBiMiArPSBsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjI7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgZm9yICh2YXIgYjIgPSAwLCBsID0gMTtsIDw9IDY3MTA4ODYzOyBsICo9IHUpCiAgICAgICAgICBiMisrOwogICAgICAgIGIyLS0sIGwgPSBsIC8gdSB8IDA7CiAgICAgICAgZm9yICh2YXIgbiA9IHMubGVuZ3RoIC0gYywgZCA9IG4gJSBiMiwgdyA9IE1hdGgubWluKG4sIG4gLSBkKSArIGMsIGcgPSAwLCBfMiA9IGM7XzIgPCB3OyBfMiArPSBiMikKICAgICAgICAgIGcgPSBNKHMsIF8yLCBfMiArIGIyLCB1KSwgdGhpcy5pbXVsbihsKSwgdGhpcy53b3Jkc1swXSArIGcgPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gZyA6IHRoaXMuX2lhZGRuKGcpOwogICAgICAgIGlmIChkICE9PSAwKSB7CiAgICAgICAgICB2YXIgQTIgPSAxOwogICAgICAgICAgZm9yIChnID0gTShzLCBfMiwgcy5sZW5ndGgsIHUpLCBfMiA9IDA7XzIgPCBkOyBfMisrKQogICAgICAgICAgICBBMiAqPSB1OwogICAgICAgICAgdGhpcy5pbXVsbihBMiksIHRoaXMud29yZHNbMF0gKyBnIDwgNjcxMDg4NjQgPyB0aGlzLndvcmRzWzBdICs9IGcgOiB0aGlzLl9pYWRkbihnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciB1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykKICAgICAgICAgIHMud29yZHNbdV0gPSB0aGlzLndvcmRzW3VdOwogICAgICAgIHMubGVuZ3RoID0gdGhpcy5sZW5ndGgsIHMubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlLCBzLnJlZCA9IHRoaXMucmVkOwogICAgICB9OwogICAgICBmdW5jdGlvbiB4KGgyLCBzKSB7CiAgICAgICAgaDIud29yZHMgPSBzLndvcmRzLCBoMi5sZW5ndGggPSBzLmxlbmd0aCwgaDIubmVnYXRpdmUgPSBzLm5lZ2F0aXZlLCBoMi5yZWQgPSBzLnJlZDsKICAgICAgfQogICAgICBpZiAoZi5wcm90b3R5cGUuX21vdmUgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgeChzLCB0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcyA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiB0aGlzLmNvcHkocyksIHM7CiAgICAgIH0sIGYucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPCBzOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuX3N0cmlwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMDsgKQogICAgICAgICAgdGhpcy5sZW5ndGgtLTsKICAgICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDAgJiYgKHRoaXMubmVnYXRpdmUgPSAwKSwgdGhpczsKICAgICAgfSwgdHlwZW9mIFN5bWJvbCA8ICJ1IiAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PSAiZnVuY3Rpb24iKQogICAgICAgIHRyeSB7CiAgICAgICAgICBmLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSA9IFM7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICBmLnByb3RvdHlwZS5pbnNwZWN0ID0gUzsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICBmLnByb3RvdHlwZS5pbnNwZWN0ID0gUzsKICAgICAgZnVuY3Rpb24gUygpIHsKICAgICAgICByZXR1cm4gKHRoaXMucmVkID8gIjxCTi1SOiAiIDogIjxCTjogIikgKyB0aGlzLnRvU3RyaW5nKDE2KSArICI+IjsKICAgICAgfQogICAgICB2YXIgRTIgPSBbIiIsICIwIiwgIjAwIiwgIjAwMCIsICIwMDAwIiwgIjAwMDAwIiwgIjAwMDAwMCIsICIwMDAwMDAwIiwgIjAwMDAwMDAwIiwgIjAwMDAwMDAwMCIsICIwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sIEIgPSBbMCwgMCwgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LCA4LCA3LCA3LCA3LCA3LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1XSwgcTIgPSBbMCwgMCwgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsIDQzMDQ2NzIxLCAxZTcsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LCAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LCAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3Nl07CiAgICAgIGYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHMgPSBzIHx8IDEwLCB1ID0gdSB8IDAgfHwgMTsKICAgICAgICB2YXIgYzsKICAgICAgICBpZiAocyA9PT0gMTYgfHwgcyA9PT0gImhleCIpIHsKICAgICAgICAgIGMgPSAiIjsKICAgICAgICAgIGZvciAodmFyIGIyID0gMCwgbCA9IDAsIG4gPSAwO24gPCB0aGlzLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy53b3Jkc1tuXSwgdyA9ICgoZCA8PCBiMiB8IGwpICYgMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgbCA9IGQgPj4+IDI0IC0gYjIgJiAxNjc3NzIxNSwgYjIgKz0gMiwgYjIgPj0gMjYgJiYgKGIyIC09IDI2LCBuLS0pLCBsICE9PSAwIHx8IG4gIT09IHRoaXMubGVuZ3RoIC0gMSA/IGMgPSBFMls2IC0gdy5sZW5ndGhdICsgdyArIGMgOiBjID0gdyArIGM7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGwgIT09IDAgJiYgKGMgPSBsLnRvU3RyaW5nKDE2KSArIGMpO2MubGVuZ3RoICUgdSAhPT0gMDsgKQogICAgICAgICAgICBjID0gIjAiICsgYzsKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIChjID0gIi0iICsgYyksIGM7CiAgICAgICAgfQogICAgICAgIGlmIChzID09PSAocyB8IDApICYmIHMgPj0gMiAmJiBzIDw9IDM2KSB7CiAgICAgICAgICB2YXIgZyA9IEJbc10sIF8yID0gcTJbc107CiAgICAgICAgICBjID0gIiI7CiAgICAgICAgICB2YXIgQTIgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgICBmb3IgKEEyLm5lZ2F0aXZlID0gMDshQTIuaXNaZXJvKCk7ICkgewogICAgICAgICAgICB2YXIgUjIgPSBBMi5tb2RybihfMikudG9TdHJpbmcocyk7CiAgICAgICAgICAgIEEyID0gQTIuaWRpdm4oXzIpLCBBMi5pc1plcm8oKSA/IGMgPSBSMiArIGMgOiBjID0gRTJbZyAtIFIyLmxlbmd0aF0gKyBSMiArIGM7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHRoaXMuaXNaZXJvKCkgJiYgKGMgPSAiMCIgKyBjKTtjLmxlbmd0aCAlIHUgIT09IDA7ICkKICAgICAgICAgICAgYyA9ICIwIiArIGM7CiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAoYyA9ICItIiArIGMpLCBjOwogICAgICAgIH0KICAgICAgICByKGZhbHNlLCAiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpOwogICAgICB9LCBmLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1swXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDIgPyBzICs9IHRoaXMud29yZHNbMV0gKiA2NzEwODg2NCA6IHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDEgPyBzICs9IDQ1MDM1OTk2MjczNzA0OTYgKyB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA+IDIgJiYgcihmYWxzZSwgIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLCB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLXMgOiBzOwogICAgICB9LCBmLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNiwgMik7CiAgICAgIH0sIHAgJiYgKGYucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKHAsIHMsIHUpOwogICAgICB9KSwgZi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgcywgdSk7CiAgICAgIH07CiAgICAgIHZhciBMMiA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICByZXR1cm4gcy5hbGxvY1Vuc2FmZSA/IHMuYWxsb2NVbnNhZmUodSkgOiBuZXcgcyh1KTsKICAgICAgfTsKICAgICAgZi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbihzLCB1LCBjKSB7CiAgICAgICAgdGhpcy5fc3RyaXAoKTsKICAgICAgICB2YXIgYjIgPSB0aGlzLmJ5dGVMZW5ndGgoKSwgbCA9IGMgfHwgTWF0aC5tYXgoMSwgYjIpOwogICAgICAgIHIoYjIgPD0gbCwgImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgiKSwgcihsID4gMCwgIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpOwogICAgICAgIHZhciBuID0gTDIocywgbCksIGQgPSB1ID09PSAibGUiID8gIkxFIiA6ICJCRSI7CiAgICAgICAgcmV0dXJuIHRoaXNbIl90b0FycmF5TGlrZSIgKyBkXShuLCBiMiksIG47CiAgICAgIH0sIGYucHJvdG90eXBlLl90b0FycmF5TGlrZUxFID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIGZvciAodmFyIGMgPSAwLCBiMiA9IDAsIGwgPSAwLCBuID0gMDtsIDwgdGhpcy5sZW5ndGg7IGwrKykgewogICAgICAgICAgdmFyIGQgPSB0aGlzLndvcmRzW2xdIDw8IG4gfCBiMjsKICAgICAgICAgIHNbYysrXSA9IGQgJiAyNTUsIGMgPCBzLmxlbmd0aCAmJiAoc1tjKytdID0gZCA+PiA4ICYgMjU1KSwgYyA8IHMubGVuZ3RoICYmIChzW2MrK10gPSBkID4+IDE2ICYgMjU1KSwgbiA9PT0gNiA/IChjIDwgcy5sZW5ndGggJiYgKHNbYysrXSA9IGQgPj4gMjQgJiAyNTUpLCBiMiA9IDAsIG4gPSAwKSA6IChiMiA9IGQgPj4+IDI0LCBuICs9IDIpOwogICAgICAgIH0KICAgICAgICBpZiAoYyA8IHMubGVuZ3RoKQogICAgICAgICAgZm9yIChzW2MrK10gPSBiMjtjIDwgcy5sZW5ndGg7ICkKICAgICAgICAgICAgc1tjKytdID0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuX3RvQXJyYXlMaWtlQkUgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgZm9yICh2YXIgYyA9IHMubGVuZ3RoIC0gMSwgYjIgPSAwLCBsID0gMCwgbiA9IDA7bCA8IHRoaXMubGVuZ3RoOyBsKyspIHsKICAgICAgICAgIHZhciBkID0gdGhpcy53b3Jkc1tsXSA8PCBuIHwgYjI7CiAgICAgICAgICBzW2MtLV0gPSBkICYgMjU1LCBjID49IDAgJiYgKHNbYy0tXSA9IGQgPj4gOCAmIDI1NSksIGMgPj0gMCAmJiAoc1tjLS1dID0gZCA+PiAxNiAmIDI1NSksIG4gPT09IDYgPyAoYyA+PSAwICYmIChzW2MtLV0gPSBkID4+IDI0ICYgMjU1KSwgYjIgPSAwLCBuID0gMCkgOiAoYjIgPSBkID4+PiAyNCwgbiArPSAyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGMgPj0gMCkKICAgICAgICAgIGZvciAoc1tjLS1dID0gYjI7YyA+PSAwOyApCiAgICAgICAgICAgIHNbYy0tXSA9IDA7CiAgICAgIH0sIE1hdGguY2x6MzIgPyBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIocyk7CiAgICAgIH0gOiBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1ID0gcywgYyA9IDA7CiAgICAgICAgcmV0dXJuIHUgPj0gNDA5NiAmJiAoYyArPSAxMywgdSA+Pj49IDEzKSwgdSA+PSA2NCAmJiAoYyArPSA3LCB1ID4+Pj0gNyksIHUgPj0gOCAmJiAoYyArPSA0LCB1ID4+Pj0gNCksIHUgPj0gMiAmJiAoYyArPSAyLCB1ID4+Pj0gMiksIGMgKyB1OwogICAgICB9LCBmLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgaWYgKHMgPT09IDApCiAgICAgICAgICByZXR1cm4gMjY7CiAgICAgICAgdmFyIHUgPSBzLCBjID0gMDsKICAgICAgICByZXR1cm4gKHUgJiA4MTkxKSA9PT0gMCAmJiAoYyArPSAxMywgdSA+Pj49IDEzKSwgKHUgJiAxMjcpID09PSAwICYmIChjICs9IDcsIHUgPj4+PSA3KSwgKHUgJiAxNSkgPT09IDAgJiYgKGMgKz0gNCwgdSA+Pj49IDQpLCAodSAmIDMpID09PSAwICYmIChjICs9IDIsIHUgPj4+PSAyKSwgKHUgJiAxKSA9PT0gMCAmJiBjKyssIGM7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdLCB1ID0gdGhpcy5fY291bnRCaXRzKHMpOwogICAgICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgdTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gZ2UoaDIpIHsKICAgICAgICBmb3IgKHZhciBzID0gbmV3IEFycmF5KGgyLmJpdExlbmd0aCgpKSwgdSA9IDA7dSA8IHMubGVuZ3RoOyB1KyspIHsKICAgICAgICAgIHZhciBjID0gdSAvIDI2IHwgMCwgYjIgPSB1ICUgMjY7CiAgICAgICAgICBzW3VdID0gaDIud29yZHNbY10gPj4+IGIyICYgMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykgewogICAgICAgICAgdmFyIGMgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW3VdKTsKICAgICAgICAgIGlmIChzICs9IGMsIGMgIT09IDI2KQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0sIGYucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5hYnMoKS5pbm90bihzKS5pYWRkbigxKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGVzdG4ocyAtIDEpID8gdGhpcy5ub3RuKHMpLmlhZGRuKDEpLmluZWcoKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc1plcm8oKSB8fCAodGhpcy5uZWdhdGl2ZSBePSAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA8IHMubGVuZ3RoOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICBmb3IgKHZhciB1ID0gMDt1IDwgcy5sZW5ndGg7IHUrKykKICAgICAgICAgIHRoaXMud29yZHNbdV0gPSB0aGlzLndvcmRzW3VdIHwgcy53b3Jkc1t1XTsKICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgcy5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1b3Iocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLm9yID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IHMubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlvcihzKSA6IHMuY2xvbmUoKS5pb3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBzLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdW9yKHMpIDogcy5jbG9uZSgpLml1b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1OwogICAgICAgIHRoaXMubGVuZ3RoID4gcy5sZW5ndGggPyB1ID0gcyA6IHUgPSB0aGlzOwogICAgICAgIGZvciAodmFyIGMgPSAwO2MgPCB1Lmxlbmd0aDsgYysrKQogICAgICAgICAgdGhpcy53b3Jkc1tjXSA9IHRoaXMud29yZHNbY10gJiBzLndvcmRzW2NdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IHUubGVuZ3RoLCB0aGlzLl9zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgcy5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1YW5kKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gcy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFuZChzKSA6IHMuY2xvbmUoKS5pYW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IHMubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1YW5kKHMpIDogcy5jbG9uZSgpLml1YW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSwgYzsKICAgICAgICB0aGlzLmxlbmd0aCA+IHMubGVuZ3RoID8gKHUgPSB0aGlzLCBjID0gcykgOiAodSA9IHMsIGMgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBiMiA9IDA7YjIgPCBjLmxlbmd0aDsgYjIrKykKICAgICAgICAgIHRoaXMud29yZHNbYjJdID0gdS53b3Jkc1tiMl0gXiBjLndvcmRzW2IyXTsKICAgICAgICBpZiAodGhpcyAhPT0gdSkKICAgICAgICAgIGZvciAoO2IyIDwgdS5sZW5ndGg7IGIyKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbYjJdID0gdS53b3Jkc1tiMl07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gdS5sZW5ndGgsIHRoaXMuX3N0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBzLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXV4b3Iocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBzLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5peG9yKHMpIDogcy5jbG9uZSgpLml4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gcy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXV4b3IocykgOiBzLmNsb25lKCkuaXV4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24ocykgewogICAgICAgIHIodHlwZW9mIHMgPT0gIm51bWJlciIgJiYgcyA+PSAwKTsKICAgICAgICB2YXIgdSA9IE1hdGguY2VpbChzIC8gMjYpIHwgMCwgYyA9IHMgJSAyNjsKICAgICAgICB0aGlzLl9leHBhbmQodSksIGMgPiAwICYmIHUtLTsKICAgICAgICBmb3IgKHZhciBiMiA9IDA7YjIgPCB1OyBiMisrKQogICAgICAgICAgdGhpcy53b3Jkc1tiMl0gPSB+dGhpcy53b3Jkc1tiMl0gJiA2NzEwODg2MzsKICAgICAgICByZXR1cm4gYyA+IDAgJiYgKHRoaXMud29yZHNbYjJdID0gfnRoaXMud29yZHNbYjJdICYgNjcxMDg4NjMgPj4gMjYgLSBjKSwgdGhpcy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHIodHlwZW9mIHMgPT0gIm51bWJlciIgJiYgcyA+PSAwKTsKICAgICAgICB2YXIgYyA9IHMgLyAyNiB8IDAsIGIyID0gcyAlIDI2OwogICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoYyArIDEpLCB1ID8gdGhpcy53b3Jkc1tjXSA9IHRoaXMud29yZHNbY10gfCAxIDw8IGIyIDogdGhpcy53b3Jkc1tjXSA9IHRoaXMud29yZHNbY10gJiB+KDEgPDwgYjIpLCB0aGlzLl9zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1OwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIHMubmVnYXRpdmUgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHUgPSB0aGlzLmlzdWIocyksIHRoaXMubmVnYXRpdmUgXj0gMSwgdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHMubmVnYXRpdmUgPSAwLCB1ID0gdGhpcy5pc3ViKHMpLCBzLm5lZ2F0aXZlID0gMSwgdS5fbm9ybVNpZ24oKTsKICAgICAgICB2YXIgYywgYjI7CiAgICAgICAgdGhpcy5sZW5ndGggPiBzLmxlbmd0aCA/IChjID0gdGhpcywgYjIgPSBzKSA6IChjID0gcywgYjIgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBsID0gMCwgbiA9IDA7biA8IGIyLmxlbmd0aDsgbisrKQogICAgICAgICAgdSA9IChjLndvcmRzW25dIHwgMCkgKyAoYjIud29yZHNbbl0gfCAwKSArIGwsIHRoaXMud29yZHNbbl0gPSB1ICYgNjcxMDg4NjMsIGwgPSB1ID4+PiAyNjsKICAgICAgICBmb3IgKDtsICE9PSAwICYmIG4gPCBjLmxlbmd0aDsgbisrKQogICAgICAgICAgdSA9IChjLndvcmRzW25dIHwgMCkgKyBsLCB0aGlzLndvcmRzW25dID0gdSAmIDY3MTA4ODYzLCBsID0gdSA+Pj4gMjY7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID0gYy5sZW5ndGgsIGwgIT09IDApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGwsIHRoaXMubGVuZ3RoKys7CiAgICAgICAgZWxzZSBpZiAoYyAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO24gPCBjLmxlbmd0aDsgbisrKQogICAgICAgICAgICB0aGlzLndvcmRzW25dID0gYy53b3Jkc1tuXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1OwogICAgICAgIHJldHVybiBzLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDAgPyAocy5uZWdhdGl2ZSA9IDAsIHUgPSB0aGlzLnN1YihzKSwgcy5uZWdhdGl2ZSBePSAxLCB1KSA6IHMubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/ICh0aGlzLm5lZ2F0aXZlID0gMCwgdSA9IHMuc3ViKHRoaXMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdSkgOiB0aGlzLmxlbmd0aCA+IHMubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhZGQocykgOiBzLmNsb25lKCkuaWFkZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBpZiAocy5uZWdhdGl2ZSAhPT0gMCkgewogICAgICAgICAgcy5uZWdhdGl2ZSA9IDA7CiAgICAgICAgICB2YXIgdSA9IHRoaXMuaWFkZChzKTsKICAgICAgICAgIHJldHVybiBzLm5lZ2F0aXZlID0gMSwgdS5fbm9ybVNpZ24oKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaWFkZChzKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMuX25vcm1TaWduKCk7CiAgICAgICAgdmFyIGMgPSB0aGlzLmNtcChzKTsKICAgICAgICBpZiAoYyA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5sZW5ndGggPSAxLCB0aGlzLndvcmRzWzBdID0gMCwgdGhpczsKICAgICAgICB2YXIgYjIsIGw7CiAgICAgICAgYyA+IDAgPyAoYjIgPSB0aGlzLCBsID0gcykgOiAoYjIgPSBzLCBsID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgbiA9IDAsIGQgPSAwO2QgPCBsLmxlbmd0aDsgZCsrKQogICAgICAgICAgdSA9IChiMi53b3Jkc1tkXSB8IDApIC0gKGwud29yZHNbZF0gfCAwKSArIG4sIG4gPSB1ID4+IDI2LCB0aGlzLndvcmRzW2RdID0gdSAmIDY3MTA4ODYzOwogICAgICAgIGZvciAoO24gIT09IDAgJiYgZCA8IGIyLmxlbmd0aDsgZCsrKQogICAgICAgICAgdSA9IChiMi53b3Jkc1tkXSB8IDApICsgbiwgbiA9IHUgPj4gMjYsIHRoaXMud29yZHNbZF0gPSB1ICYgNjcxMDg4NjM7CiAgICAgICAgaWYgKG4gPT09IDAgJiYgZCA8IGIyLmxlbmd0aCAmJiBiMiAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO2QgPCBiMi5sZW5ndGg7IGQrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tkXSA9IGIyLndvcmRzW2RdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBkKSwgYjIgIT09IHRoaXMgJiYgKHRoaXMubmVnYXRpdmUgPSAxKSwgdGhpcy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihzKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gX2UoaDIsIHMsIHUpIHsKICAgICAgICB1Lm5lZ2F0aXZlID0gcy5uZWdhdGl2ZSBeIGgyLm5lZ2F0aXZlOwogICAgICAgIHZhciBjID0gaDIubGVuZ3RoICsgcy5sZW5ndGggfCAwOwogICAgICAgIHUubGVuZ3RoID0gYywgYyA9IGMgLSAxIHwgMDsKICAgICAgICB2YXIgYjIgPSBoMi53b3Jkc1swXSB8IDAsIGwgPSBzLndvcmRzWzBdIHwgMCwgbiA9IGIyICogbCwgZCA9IG4gJiA2NzEwODg2MywgdyA9IG4gLyA2NzEwODg2NCB8IDA7CiAgICAgICAgdS53b3Jkc1swXSA9IGQ7CiAgICAgICAgZm9yICh2YXIgZyA9IDE7ZyA8IGM7IGcrKykgewogICAgICAgICAgZm9yICh2YXIgXzIgPSB3ID4+PiAyNiwgQTIgPSB3ICYgNjcxMDg4NjMsIFIyID0gTWF0aC5taW4oZywgcy5sZW5ndGggLSAxKSwgSSA9IE1hdGgubWF4KDAsIGcgLSBoMi5sZW5ndGggKyAxKTtJIDw9IFIyOyBJKyspIHsKICAgICAgICAgICAgdmFyIE1lID0gZyAtIEkgfCAwOwogICAgICAgICAgICBiMiA9IGgyLndvcmRzW01lXSB8IDAsIGwgPSBzLndvcmRzW0ldIHwgMCwgbiA9IGIyICogbCArIEEyLCBfMiArPSBuIC8gNjcxMDg4NjQgfCAwLCBBMiA9IG4gJiA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIHUud29yZHNbZ10gPSBBMiB8IDAsIHcgPSBfMiB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3ICE9PSAwID8gdS53b3Jkc1tnXSA9IHcgfCAwIDogdS5sZW5ndGgtLSwgdS5fc3RyaXAoKTsKICAgICAgfQogICAgICB2YXIgTiA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICB2YXIgYjIgPSBzLndvcmRzLCBsID0gdS53b3JkcywgbiA9IGMud29yZHMsIGQgPSAwLCB3LCBnLCBfMiwgQTIgPSBiMlswXSB8IDAsIFIyID0gQTIgJiA4MTkxLCBJID0gQTIgPj4+IDEzLCBNZSA9IGIyWzFdIHwgMCwgayA9IE1lICYgODE5MSwgRDIgPSBNZSA+Pj4gMTMsIG50ID0gYjJbMl0gfCAwLCBDMiA9IG50ICYgODE5MSwgTyA9IG50ID4+PiAxMywgdnQgPSBiMlszXSB8IDAsIEYgPSB2dCAmIDgxOTEsIFUgPSB2dCA+Pj4gMTMsIGJ0ID0gYjJbNF0gfCAwLCB6MiA9IGJ0ICYgODE5MSwgSCA9IGJ0ID4+PiAxMywgbXQgPSBiMls1XSB8IDAsIFcgPSBtdCAmIDgxOTEsIEsgPSBtdCA+Pj4gMTMsIGd0ID0gYjJbNl0gfCAwLCBqID0gZ3QgJiA4MTkxLCBaID0gZ3QgPj4+IDEzLCB5dCA9IGIyWzddIHwgMCwgViA9IHl0ICYgODE5MSwgJCA9IHl0ID4+PiAxMywgd3QgPSBiMls4XSB8IDAsIEcgPSB3dCAmIDgxOTEsIFkgPSB3dCA+Pj4gMTMsIE10ID0gYjJbOV0gfCAwLCBYID0gTXQgJiA4MTkxLCBKID0gTXQgPj4+IDEzLCBfdCA9IGxbMF0gfCAwLCBRID0gX3QgJiA4MTkxLCBlZSA9IF90ID4+PiAxMywgeHQgPSBsWzFdIHwgMCwgdGUgPSB4dCAmIDgxOTEsIHJlID0geHQgPj4+IDEzLCBTdCA9IGxbMl0gfCAwLCBpZSA9IFN0ICYgODE5MSwgbmUgPSBTdCA+Pj4gMTMsIEV0ID0gbFszXSB8IDAsIGZlID0gRXQgJiA4MTkxLCBhZSA9IEV0ID4+PiAxMywgQXQgPSBsWzRdIHwgMCwgb2UgPSBBdCAmIDgxOTEsIHNlID0gQXQgPj4+IDEzLCBSdCA9IGxbNV0gfCAwLCBoZSA9IFJ0ICYgODE5MSwgdWUgPSBSdCA+Pj4gMTMsIEJ0ID0gbFs2XSB8IDAsIGxlID0gQnQgJiA4MTkxLCBkZSA9IEJ0ID4+PiAxMywgcXQgPSBsWzddIHwgMCwgY2UgPSBxdCAmIDgxOTEsIHBlID0gcXQgPj4+IDEzLCBJdCA9IGxbOF0gfCAwLCB2ZSA9IEl0ICYgODE5MSwgYmUgPSBJdCA+Pj4gMTMsIGZ0ID0gbFs5XSB8IDAsIEJlID0gZnQgJiA4MTkxLCBxZSA9IGZ0ID4+PiAxMzsKICAgICAgICBjLm5lZ2F0aXZlID0gcy5uZWdhdGl2ZSBeIHUubmVnYXRpdmUsIGMubGVuZ3RoID0gMTksIHcgPSBNYXRoLmltdWwoUjIsIFEpLCBnID0gTWF0aC5pbXVsKFIyLCBlZSksIGcgPSBnICsgTWF0aC5pbXVsKEksIFEpIHwgMCwgXzIgPSBNYXRoLmltdWwoSSwgZWUpOwogICAgICAgIHZhciB6ZSA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKHplID4+PiAyNikgfCAwLCB6ZSAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChrLCBRKSwgZyA9IE1hdGguaW11bChrLCBlZSksIGcgPSBnICsgTWF0aC5pbXVsKEQyLCBRKSB8IDAsIF8yID0gTWF0aC5pbXVsKEQyLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKFIyLCB0ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChSMiwgcmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSSwgdGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChJLCByZSkgfCAwOwogICAgICAgIHZhciBIZSA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKEhlID4+PiAyNikgfCAwLCBIZSAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChDMiwgUSksIGcgPSBNYXRoLmltdWwoQzIsIGVlKSwgZyA9IGcgKyBNYXRoLmltdWwoTywgUSkgfCAwLCBfMiA9IE1hdGguaW11bChPLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKGssIHRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKGssIHJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEQyLCB0ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEQyLCByZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChSMiwgaWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoUjIsIG5lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEksIGllKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSSwgbmUpIHwgMDsKICAgICAgICB2YXIgV2UgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChXZSA+Pj4gMjYpIHwgMCwgV2UgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoRiwgUSksIGcgPSBNYXRoLmltdWwoRiwgZWUpLCBnID0gZyArIE1hdGguaW11bChVLCBRKSB8IDAsIF8yID0gTWF0aC5pbXVsKFUsIGVlKSwgdyA9IHcgKyBNYXRoLmltdWwoQzIsIHRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEMyLCByZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChPLCB0ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKE8sIHJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKGssIGllKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKGssIG5lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEQyLCBpZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEQyLCBuZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChSMiwgZmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoUjIsIGFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEksIGZlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSSwgYWUpIHwgMDsKICAgICAgICB2YXIgS2UgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChLZSA+Pj4gMjYpIHwgMCwgS2UgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoejIsIFEpLCBnID0gTWF0aC5pbXVsKHoyLCBlZSksIGcgPSBnICsgTWF0aC5pbXVsKEgsIFEpIHwgMCwgXzIgPSBNYXRoLmltdWwoSCwgZWUpLCB3ID0gdyArIE1hdGguaW11bChGLCB0ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCByZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCB0ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIHJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCBpZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgbmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgaWUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCBuZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChrLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChrLCBhZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChEMiwgZmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChEMiwgYWUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoUjIsIG9lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFIyLCBzZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChJLCBvZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEksIHNlKSB8IDA7CiAgICAgICAgdmFyIGplID0gKGQgKyB3IHwgMCkgKyAoKGcgJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGQgPSAoXzIgKyAoZyA+Pj4gMTMpIHwgMCkgKyAoamUgPj4+IDI2KSB8IDAsIGplICY9IDY3MTA4ODYzLCB3ID0gTWF0aC5pbXVsKFcsIFEpLCBnID0gTWF0aC5pbXVsKFcsIGVlKSwgZyA9IGcgKyBNYXRoLmltdWwoSywgUSkgfCAwLCBfMiA9IE1hdGguaW11bChLLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCB0ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6MiwgcmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgdGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCByZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChGLCBpZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCBuZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCBpZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIG5lKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgYWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgZmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCBhZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChrLCBvZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChrLCBzZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChEMiwgb2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChEMiwgc2UpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoUjIsIGhlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFIyLCB1ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChJLCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEksIHVlKSB8IDA7CiAgICAgICAgdmFyIFplID0gKGQgKyB3IHwgMCkgKyAoKGcgJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGQgPSAoXzIgKyAoZyA+Pj4gMTMpIHwgMCkgKyAoWmUgPj4+IDI2KSB8IDAsIFplICY9IDY3MTA4ODYzLCB3ID0gTWF0aC5pbXVsKGosIFEpLCBnID0gTWF0aC5pbXVsKGosIGVlKSwgZyA9IGcgKyBNYXRoLmltdWwoWiwgUSkgfCAwLCBfMiA9IE1hdGguaW11bChaLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKFcsIHRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFcsIHJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEssIHRlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSywgcmUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoejIsIGllKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKHoyLCBuZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChILCBpZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEgsIG5lKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEYsIGZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEYsIGFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFUsIGZlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoVSwgYWUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoQzIsIG9lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEMyLCBzZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChPLCBvZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKE8sIHNlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKGssIGhlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKGssIHVlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEQyLCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEQyLCB1ZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChSMiwgbGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoUjIsIGRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEksIGxlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSSwgZGUpIHwgMDsKICAgICAgICB2YXIgVmUgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChWZSA+Pj4gMjYpIHwgMCwgVmUgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoViwgUSksIGcgPSBNYXRoLmltdWwoViwgZWUpLCBnID0gZyArIE1hdGguaW11bCgkLCBRKSB8IDAsIF8yID0gTWF0aC5pbXVsKCQsIGVlKSwgdyA9IHcgKyBNYXRoLmltdWwoaiwgdGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgcmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgdGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCByZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChXLCBpZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChXLCBuZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChLLCBpZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEssIG5lKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6MiwgYWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgZmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCBhZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChGLCBvZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCBzZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCBvZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIHNlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCBoZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgdWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgaGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCB1ZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChrLCBsZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChrLCBkZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChEMiwgbGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChEMiwgZGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoUjIsIGNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFIyLCBwZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChJLCBjZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEksIHBlKSB8IDA7CiAgICAgICAgdmFyICRlID0gKGQgKyB3IHwgMCkgKyAoKGcgJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGQgPSAoXzIgKyAoZyA+Pj4gMTMpIHwgMCkgKyAoJGUgPj4+IDI2KSB8IDAsICRlICY9IDY3MTA4ODYzLCB3ID0gTWF0aC5pbXVsKEcsIFEpLCBnID0gTWF0aC5pbXVsKEcsIGVlKSwgZyA9IGcgKyBNYXRoLmltdWwoWSwgUSkgfCAwLCBfMiA9IE1hdGguaW11bChZLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKFYsIHRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFYsIHJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKCQsIHRlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoJCwgcmUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoaiwgaWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgbmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgaWUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCBuZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChXLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChXLCBhZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChLLCBmZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEssIGFlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCBvZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6Miwgc2UpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgb2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCBzZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChGLCBoZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCB1ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIHVlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCBsZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgZGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgbGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCBkZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChrLCBjZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChrLCBwZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChEMiwgY2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChEMiwgcGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoUjIsIHZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFIyLCBiZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChJLCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEksIGJlKSB8IDA7CiAgICAgICAgdmFyIEdlID0gKGQgKyB3IHwgMCkgKyAoKGcgJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGQgPSAoXzIgKyAoZyA+Pj4gMTMpIHwgMCkgKyAoR2UgPj4+IDI2KSB8IDAsIEdlICY9IDY3MTA4ODYzLCB3ID0gTWF0aC5pbXVsKFgsIFEpLCBnID0gTWF0aC5pbXVsKFgsIGVlKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgUSkgfCAwLCBfMiA9IE1hdGguaW11bChKLCBlZSksIHcgPSB3ICsgTWF0aC5pbXVsKEcsIHRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEcsIHJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFksIHRlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoWSwgcmUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoViwgaWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoViwgbmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoJCwgaWUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bCgkLCBuZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChqLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChqLCBhZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChaLCBmZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFosIGFlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFcsIG9lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFcsIHNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEssIG9lKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSywgc2UpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoejIsIGhlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKHoyLCB1ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChILCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEgsIHVlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEYsIGxlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEYsIGRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFUsIGxlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoVSwgZGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoQzIsIGNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEMyLCBwZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChPLCBjZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKE8sIHBlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKGssIHZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKGssIGJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEQyLCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEQyLCBiZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChSMiwgQmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoUjIsIHFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEksIEJlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSSwgcWUpIHwgMDsKICAgICAgICB2YXIgWWUgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChZZSA+Pj4gMjYpIHwgMCwgWWUgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoWCwgdGUpLCBnID0gTWF0aC5pbXVsKFgsIHJlKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgdGUpIHwgMCwgXzIgPSBNYXRoLmltdWwoSiwgcmUpLCB3ID0gdyArIE1hdGguaW11bChHLCBpZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChHLCBuZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChZLCBpZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFksIG5lKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFYsIGZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFYsIGFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKCQsIGZlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoJCwgYWUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoaiwgb2UpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgc2UpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgb2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCBzZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChXLCBoZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChXLCB1ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChLLCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEssIHVlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCBsZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6MiwgZGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgbGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCBkZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChGLCBjZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCBwZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCBjZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIHBlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCB2ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgYmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgdmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCBiZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChrLCBCZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChrLCBxZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChEMiwgQmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChEMiwgcWUpIHwgMDsKICAgICAgICB2YXIgWGUgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChYZSA+Pj4gMjYpIHwgMCwgWGUgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoWCwgaWUpLCBnID0gTWF0aC5pbXVsKFgsIG5lKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgaWUpIHwgMCwgXzIgPSBNYXRoLmltdWwoSiwgbmUpLCB3ID0gdyArIE1hdGguaW11bChHLCBmZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChHLCBhZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChZLCBmZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFksIGFlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFYsIG9lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFYsIHNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKCQsIG9lKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoJCwgc2UpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoaiwgaGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgdWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgaGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCB1ZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChXLCBsZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChXLCBkZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChLLCBsZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEssIGRlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCBjZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6MiwgcGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgY2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCBwZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChGLCB2ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChGLCBiZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChVLCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFUsIGJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEMyLCBCZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChDMiwgcWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoTywgQmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChPLCBxZSkgfCAwOwogICAgICAgIHZhciBKZSA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKEplID4+PiAyNikgfCAwLCBKZSAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChYLCBmZSksIGcgPSBNYXRoLmltdWwoWCwgYWUpLCBnID0gZyArIE1hdGguaW11bChKLCBmZSkgfCAwLCBfMiA9IE1hdGguaW11bChKLCBhZSksIHcgPSB3ICsgTWF0aC5pbXVsKEcsIG9lKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEcsIHNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFksIG9lKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoWSwgc2UpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoViwgaGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoViwgdWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoJCwgaGUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bCgkLCB1ZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChqLCBsZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChqLCBkZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChaLCBsZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFosIGRlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFcsIGNlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFcsIHBlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEssIGNlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSywgcGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoejIsIHZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKHoyLCBiZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChILCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEgsIGJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKEYsIEJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEYsIHFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFUsIEJlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoVSwgcWUpIHwgMDsKICAgICAgICB2YXIgUWUgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChRZSA+Pj4gMjYpIHwgMCwgUWUgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoWCwgb2UpLCBnID0gTWF0aC5pbXVsKFgsIHNlKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgb2UpIHwgMCwgXzIgPSBNYXRoLmltdWwoSiwgc2UpLCB3ID0gdyArIE1hdGguaW11bChHLCBoZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChHLCB1ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChZLCBoZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFksIHVlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFYsIGxlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFYsIGRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKCQsIGxlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoJCwgZGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoaiwgY2UpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgcGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgY2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCBwZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChXLCB2ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChXLCBiZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChLLCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKEssIGJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKHoyLCBCZSkgfCAwLCBnID0gZyArIE1hdGguaW11bCh6MiwgcWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoSCwgQmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChILCBxZSkgfCAwOwogICAgICAgIHZhciBldCA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKGV0ID4+PiAyNikgfCAwLCBldCAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChYLCBoZSksIGcgPSBNYXRoLmltdWwoWCwgdWUpLCBnID0gZyArIE1hdGguaW11bChKLCBoZSkgfCAwLCBfMiA9IE1hdGguaW11bChKLCB1ZSksIHcgPSB3ICsgTWF0aC5pbXVsKEcsIGxlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEcsIGRlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFksIGxlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoWSwgZGUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoViwgY2UpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoViwgcGUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoJCwgY2UpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bCgkLCBwZSkgfCAwLCB3ID0gdyArIE1hdGguaW11bChqLCB2ZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChqLCBiZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChaLCB2ZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFosIGJlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFcsIEJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFcsIHFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEssIEJlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoSywgcWUpIHwgMDsKICAgICAgICB2YXIgdHQgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArICh0dCA+Pj4gMjYpIHwgMCwgdHQgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoWCwgbGUpLCBnID0gTWF0aC5pbXVsKFgsIGRlKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgbGUpIHwgMCwgXzIgPSBNYXRoLmltdWwoSiwgZGUpLCB3ID0gdyArIE1hdGguaW11bChHLCBjZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChHLCBwZSkgfCAwLCBnID0gZyArIE1hdGguaW11bChZLCBjZSkgfCAwLCBfMiA9IF8yICsgTWF0aC5pbXVsKFksIHBlKSB8IDAsIHcgPSB3ICsgTWF0aC5pbXVsKFYsIHZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFYsIGJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKCQsIHZlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoJCwgYmUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoaiwgQmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoaiwgcWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoWiwgQmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bChaLCBxZSkgfCAwOwogICAgICAgIHZhciBydCA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKHJ0ID4+PiAyNikgfCAwLCBydCAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChYLCBjZSksIGcgPSBNYXRoLmltdWwoWCwgcGUpLCBnID0gZyArIE1hdGguaW11bChKLCBjZSkgfCAwLCBfMiA9IE1hdGguaW11bChKLCBwZSksIHcgPSB3ICsgTWF0aC5pbXVsKEcsIHZlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEcsIGJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFksIHZlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoWSwgYmUpIHwgMCwgdyA9IHcgKyBNYXRoLmltdWwoViwgQmUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoViwgcWUpIHwgMCwgZyA9IGcgKyBNYXRoLmltdWwoJCwgQmUpIHwgMCwgXzIgPSBfMiArIE1hdGguaW11bCgkLCBxZSkgfCAwOwogICAgICAgIHZhciBTMCA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBkID0gKF8yICsgKGcgPj4+IDEzKSB8IDApICsgKFMwID4+PiAyNikgfCAwLCBTMCAmPSA2NzEwODg2MywgdyA9IE1hdGguaW11bChYLCB2ZSksIGcgPSBNYXRoLmltdWwoWCwgYmUpLCBnID0gZyArIE1hdGguaW11bChKLCB2ZSkgfCAwLCBfMiA9IE1hdGguaW11bChKLCBiZSksIHcgPSB3ICsgTWF0aC5pbXVsKEcsIEJlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKEcsIHFlKSB8IDAsIGcgPSBnICsgTWF0aC5pbXVsKFksIEJlKSB8IDAsIF8yID0gXzIgKyBNYXRoLmltdWwoWSwgcWUpIHwgMDsKICAgICAgICB2YXIgRTAgPSAoZCArIHcgfCAwKSArICgoZyAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChFMCA+Pj4gMjYpIHwgMCwgRTAgJj0gNjcxMDg4NjMsIHcgPSBNYXRoLmltdWwoWCwgQmUpLCBnID0gTWF0aC5pbXVsKFgsIHFlKSwgZyA9IGcgKyBNYXRoLmltdWwoSiwgQmUpIHwgMCwgXzIgPSBNYXRoLmltdWwoSiwgcWUpOwogICAgICAgIHZhciBBMCA9IChkICsgdyB8IDApICsgKChnICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICByZXR1cm4gZCA9IChfMiArIChnID4+PiAxMykgfCAwKSArIChBMCA+Pj4gMjYpIHwgMCwgQTAgJj0gNjcxMDg4NjMsIG5bMF0gPSB6ZSwgblsxXSA9IEhlLCBuWzJdID0gV2UsIG5bM10gPSBLZSwgbls0XSA9IGplLCBuWzVdID0gWmUsIG5bNl0gPSBWZSwgbls3XSA9ICRlLCBuWzhdID0gR2UsIG5bOV0gPSBZZSwgblsxMF0gPSBYZSwgblsxMV0gPSBKZSwgblsxMl0gPSBRZSwgblsxM10gPSBldCwgblsxNF0gPSB0dCwgblsxNV0gPSBydCwgblsxNl0gPSBTMCwgblsxN10gPSBFMCwgblsxOF0gPSBBMCwgZCAhPT0gMCAmJiAoblsxOV0gPSBkLCBjLmxlbmd0aCsrKSwgYzsKICAgICAgfTsKICAgICAgTWF0aC5pbXVsIHx8IChOID0gX2UpOwogICAgICBmdW5jdGlvbiB3ZShoMiwgcywgdSkgewogICAgICAgIHUubmVnYXRpdmUgPSBzLm5lZ2F0aXZlIF4gaDIubmVnYXRpdmUsIHUubGVuZ3RoID0gaDIubGVuZ3RoICsgcy5sZW5ndGg7CiAgICAgICAgZm9yICh2YXIgYyA9IDAsIGIyID0gMCwgbCA9IDA7bCA8IHUubGVuZ3RoIC0gMTsgbCsrKSB7CiAgICAgICAgICB2YXIgbiA9IGIyOwogICAgICAgICAgYjIgPSAwOwogICAgICAgICAgZm9yICh2YXIgZCA9IGMgJiA2NzEwODg2MywgdyA9IE1hdGgubWluKGwsIHMubGVuZ3RoIC0gMSksIGcgPSBNYXRoLm1heCgwLCBsIC0gaDIubGVuZ3RoICsgMSk7ZyA8PSB3OyBnKyspIHsKICAgICAgICAgICAgdmFyIF8yID0gbCAtIGcsIEEyID0gaDIud29yZHNbXzJdIHwgMCwgUjIgPSBzLndvcmRzW2ddIHwgMCwgSSA9IEEyICogUjIsIE1lID0gSSAmIDY3MTA4ODYzOwogICAgICAgICAgICBuID0gbiArIChJIC8gNjcxMDg4NjQgfCAwKSB8IDAsIE1lID0gTWUgKyBkIHwgMCwgZCA9IE1lICYgNjcxMDg4NjMsIG4gPSBuICsgKE1lID4+PiAyNikgfCAwLCBiMiArPSBuID4+PiAyNiwgbiAmPSA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIHUud29yZHNbbF0gPSBkLCBjID0gbiwgbiA9IGIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYyAhPT0gMCA/IHUud29yZHNbbF0gPSBjIDogdS5sZW5ndGgtLSwgdS5fc3RyaXAoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5ZShoMiwgcywgdSkgewogICAgICAgIHJldHVybiB3ZShoMiwgcywgdSk7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgdmFyIGMsIGIyID0gdGhpcy5sZW5ndGggKyBzLmxlbmd0aDsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEwICYmIHMubGVuZ3RoID09PSAxMCA/IGMgPSBOKHRoaXMsIHMsIHUpIDogYjIgPCA2MyA/IGMgPSBfZSh0aGlzLCBzLCB1KSA6IGIyIDwgMTAyNCA/IGMgPSB3ZSh0aGlzLCBzLCB1KSA6IGMgPSB5ZSh0aGlzLCBzLCB1KSwgYzsKICAgICAgfTsKICAgICAgZnVuY3Rpb24geGUoaDIsIHMpIHsKICAgICAgICB0aGlzLnggPSBoMiwgdGhpcy55ID0gczsKICAgICAgfQogICAgICB4ZS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBmb3IgKHZhciB1ID0gbmV3IEFycmF5KHMpLCBjID0gZi5wcm90b3R5cGUuX2NvdW50Qml0cyhzKSAtIDEsIGIyID0gMDtiMiA8IHM7IGIyKyspCiAgICAgICAgICB1W2IyXSA9IHRoaXMucmV2QmluKGIyLCBjLCBzKTsKICAgICAgICByZXR1cm4gdTsKICAgICAgfSwgeGUucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICBpZiAocyA9PT0gMCB8fCBzID09PSBjIC0gMSkKICAgICAgICAgIHJldHVybiBzOwogICAgICAgIGZvciAodmFyIGIyID0gMCwgbCA9IDA7bCA8IHU7IGwrKykKICAgICAgICAgIGIyIHw9IChzICYgMSkgPDwgdSAtIGwgLSAxLCBzID4+PSAxOwogICAgICAgIHJldHVybiBiMjsKICAgICAgfSwgeGUucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbihzLCB1LCBjLCBiMiwgbCwgbikgewogICAgICAgIGZvciAodmFyIGQgPSAwO2QgPCBuOyBkKyspCiAgICAgICAgICBiMltkXSA9IHVbc1tkXV0sIGxbZF0gPSBjW3NbZF1dOwogICAgICB9LCB4ZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24ocywgdSwgYywgYjIsIGwsIG4pIHsKICAgICAgICB0aGlzLnBlcm11dGUobiwgcywgdSwgYywgYjIsIGwpOwogICAgICAgIGZvciAodmFyIGQgPSAxO2QgPCBsOyBkIDw8PSAxKQogICAgICAgICAgZm9yICh2YXIgdyA9IGQgPDwgMSwgZyA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gdyksIF8yID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyB3KSwgQTIgPSAwO0EyIDwgbDsgQTIgKz0gdykKICAgICAgICAgICAgZm9yICh2YXIgUjIgPSBnLCBJID0gXzIsIE1lID0gMDtNZSA8IGQ7IE1lKyspIHsKICAgICAgICAgICAgICB2YXIgayA9IGNbQTIgKyBNZV0sIEQyID0gYjJbQTIgKyBNZV0sIG50ID0gY1tBMiArIE1lICsgZF0sIEMyID0gYjJbQTIgKyBNZSArIGRdLCBPID0gUjIgKiBudCAtIEkgKiBDMjsKICAgICAgICAgICAgICBDMiA9IFIyICogQzIgKyBJICogbnQsIG50ID0gTywgY1tBMiArIE1lXSA9IGsgKyBudCwgYjJbQTIgKyBNZV0gPSBEMiArIEMyLCBjW0EyICsgTWUgKyBkXSA9IGsgLSBudCwgYjJbQTIgKyBNZSArIGRdID0gRDIgLSBDMiwgTWUgIT09IHcgJiYgKE8gPSBnICogUjIgLSBfMiAqIEksIEkgPSBnICogSSArIF8yICogUjIsIFIyID0gTyk7CiAgICAgICAgICAgIH0KICAgICAgfSwgeGUucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHZhciBjID0gTWF0aC5tYXgodSwgcykgfCAxLCBiMiA9IGMgJiAxLCBsID0gMDsKICAgICAgICBmb3IgKGMgPSBjIC8gMiB8IDA7YzsgYyA9IGMgPj4+IDEpCiAgICAgICAgICBsKys7CiAgICAgICAgcmV0dXJuIDEgPDwgbCArIDEgKyBiMjsKICAgICAgfSwgeGUucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICBpZiAoIShjIDw9IDEpKQogICAgICAgICAgZm9yICh2YXIgYjIgPSAwO2IyIDwgYyAvIDI7IGIyKyspIHsKICAgICAgICAgICAgdmFyIGwgPSBzW2IyXTsKICAgICAgICAgICAgc1tiMl0gPSBzW2MgLSBiMiAtIDFdLCBzW2MgLSBiMiAtIDFdID0gbCwgbCA9IHVbYjJdLCB1W2IyXSA9IC11W2MgLSBiMiAtIDFdLCB1W2MgLSBiMiAtIDFdID0gLWw7CiAgICAgICAgICB9CiAgICAgIH0sIHhlLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgZm9yICh2YXIgYyA9IDAsIGIyID0gMDtiMiA8IHUgLyAyOyBiMisrKSB7CiAgICAgICAgICB2YXIgbCA9IE1hdGgucm91bmQoc1syICogYjIgKyAxXSAvIHUpICogODE5MiArIE1hdGgucm91bmQoc1syICogYjJdIC8gdSkgKyBjOwogICAgICAgICAgc1tiMl0gPSBsICYgNjcxMDg4NjMsIGwgPCA2NzEwODg2NCA/IGMgPSAwIDogYyA9IGwgLyA2NzEwODg2NCB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgICB9LCB4ZS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uKHMsIHUsIGMsIGIyKSB7CiAgICAgICAgZm9yICh2YXIgbCA9IDAsIG4gPSAwO24gPCB1OyBuKyspCiAgICAgICAgICBsID0gbCArIChzW25dIHwgMCksIGNbMiAqIG5dID0gbCAmIDgxOTEsIGwgPSBsID4+PiAxMywgY1syICogbiArIDFdID0gbCAmIDgxOTEsIGwgPSBsID4+PiAxMzsKICAgICAgICBmb3IgKG4gPSAyICogdTtuIDwgYjI7ICsrbikKICAgICAgICAgIGNbbl0gPSAwOwogICAgICAgIHIobCA9PT0gMCksIHIoKGwgJiAtODE5MikgPT09IDApOwogICAgICB9LCB4ZS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBmb3IgKHZhciB1ID0gbmV3IEFycmF5KHMpLCBjID0gMDtjIDwgczsgYysrKQogICAgICAgICAgdVtjXSA9IDA7CiAgICAgICAgcmV0dXJuIHU7CiAgICAgIH0sIHhlLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24ocywgdSwgYykgewogICAgICAgIHZhciBiMiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHMubGVuZ3RoLCB1Lmxlbmd0aCksIGwgPSB0aGlzLm1ha2VSQlQoYjIpLCBuID0gdGhpcy5zdHViKGIyKSwgZCA9IG5ldyBBcnJheShiMiksIHcgPSBuZXcgQXJyYXkoYjIpLCBnID0gbmV3IEFycmF5KGIyKSwgXzIgPSBuZXcgQXJyYXkoYjIpLCBBMiA9IG5ldyBBcnJheShiMiksIFIyID0gbmV3IEFycmF5KGIyKSwgSSA9IGMud29yZHM7CiAgICAgICAgSS5sZW5ndGggPSBiMiwgdGhpcy5jb252ZXJ0MTNiKHMud29yZHMsIHMubGVuZ3RoLCBkLCBiMiksIHRoaXMuY29udmVydDEzYih1LndvcmRzLCB1Lmxlbmd0aCwgXzIsIGIyKSwgdGhpcy50cmFuc2Zvcm0oZCwgbiwgdywgZywgYjIsIGwpLCB0aGlzLnRyYW5zZm9ybShfMiwgbiwgQTIsIFIyLCBiMiwgbCk7CiAgICAgICAgZm9yICh2YXIgTWUgPSAwO01lIDwgYjI7IE1lKyspIHsKICAgICAgICAgIHZhciBrID0gd1tNZV0gKiBBMltNZV0gLSBnW01lXSAqIFIyW01lXTsKICAgICAgICAgIGdbTWVdID0gd1tNZV0gKiBSMltNZV0gKyBnW01lXSAqIEEyW01lXSwgd1tNZV0gPSBrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUodywgZywgYjIpLCB0aGlzLnRyYW5zZm9ybSh3LCBnLCBJLCBuLCBiMiwgbCksIHRoaXMuY29uanVnYXRlKEksIG4sIGIyKSwgdGhpcy5ub3JtYWxpemUxM2IoSSwgYjIpLCBjLm5lZ2F0aXZlID0gcy5uZWdhdGl2ZSBeIHUubmVnYXRpdmUsIGMubGVuZ3RoID0gcy5sZW5ndGggKyB1Lmxlbmd0aCwgYy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1ID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIHUud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBzLmxlbmd0aCksIHRoaXMubXVsVG8ocywgdSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgdmFyIHUgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gdS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIHMubGVuZ3RoKSwgeWUodGhpcywgcywgdSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhzLCB0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgdmFyIHUgPSBzIDwgMDsKICAgICAgICB1ICYmIChzID0gLXMpLCByKHR5cGVvZiBzID09ICJudW1iZXIiKSwgcihzIDwgNjcxMDg4NjQpOwogICAgICAgIGZvciAodmFyIGMgPSAwLCBiMiA9IDA7YjIgPCB0aGlzLmxlbmd0aDsgYjIrKykgewogICAgICAgICAgdmFyIGwgPSAodGhpcy53b3Jkc1tiMl0gfCAwKSAqIHMsIG4gPSAobCAmIDY3MTA4ODYzKSArIChjICYgNjcxMDg4NjMpOwogICAgICAgICAgYyA+Pj0gMjYsIGMgKz0gbCAvIDY3MTA4ODY0IHwgMCwgYyArPSBuID4+PiAyNiwgdGhpcy53b3Jkc1tiMl0gPSBuICYgNjcxMDg4NjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjICE9PSAwICYmICh0aGlzLndvcmRzW2IyXSA9IGMsIHRoaXMubGVuZ3RoKyspLCB1ID8gdGhpcy5pbmVnKCkgOiB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1ID0gZ2Uocyk7CiAgICAgICAgaWYgKHUubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpOwogICAgICAgIGZvciAodmFyIGMgPSB0aGlzLCBiMiA9IDA7YjIgPCB1Lmxlbmd0aCAmJiB1W2IyXSA9PT0gMDsgYjIrKywgYyA9IGMuc3FyKCkpCiAgICAgICAgICA7CiAgICAgICAgaWYgKCsrYjIgPCB1Lmxlbmd0aCkKICAgICAgICAgIGZvciAodmFyIGwgPSBjLnNxcigpO2IyIDwgdS5sZW5ndGg7IGIyKyssIGwgPSBsLnNxcigpKQogICAgICAgICAgICB1W2IyXSAhPT0gMCAmJiAoYyA9IGMubXVsKGwpKTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24ocykgewogICAgICAgIHIodHlwZW9mIHMgPT0gIm51bWJlciIgJiYgcyA+PSAwKTsKICAgICAgICB2YXIgdSA9IHMgJSAyNiwgYyA9IChzIC0gdSkgLyAyNiwgYjIgPSA2NzEwODg2MyA+Pj4gMjYgLSB1IDw8IDI2IC0gdSwgbDsKICAgICAgICBpZiAodSAhPT0gMCkgewogICAgICAgICAgdmFyIG4gPSAwOwogICAgICAgICAgZm9yIChsID0gMDtsIDwgdGhpcy5sZW5ndGg7IGwrKykgewogICAgICAgICAgICB2YXIgZCA9IHRoaXMud29yZHNbbF0gJiBiMiwgdyA9ICh0aGlzLndvcmRzW2xdIHwgMCkgLSBkIDw8IHU7CiAgICAgICAgICAgIHRoaXMud29yZHNbbF0gPSB3IHwgbiwgbiA9IGQgPj4+IDI2IC0gdTsKICAgICAgICAgIH0KICAgICAgICAgIG4gJiYgKHRoaXMud29yZHNbbF0gPSBuLCB0aGlzLmxlbmd0aCsrKTsKICAgICAgICB9CiAgICAgICAgaWYgKGMgIT09IDApIHsKICAgICAgICAgIGZvciAobCA9IHRoaXMubGVuZ3RoIC0gMTtsID49IDA7IGwtLSkKICAgICAgICAgICAgdGhpcy53b3Jkc1tsICsgY10gPSB0aGlzLndvcmRzW2xdOwogICAgICAgICAgZm9yIChsID0gMDtsIDwgYzsgbCsrKQogICAgICAgICAgICB0aGlzLndvcmRzW2xdID0gMDsKICAgICAgICAgIHRoaXMubGVuZ3RoICs9IGM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNobG4ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICByKHR5cGVvZiBzID09ICJudW1iZXIiICYmIHMgPj0gMCk7CiAgICAgICAgdmFyIGIyOwogICAgICAgIHUgPyBiMiA9ICh1IC0gdSAlIDI2KSAvIDI2IDogYjIgPSAwOwogICAgICAgIHZhciBsID0gcyAlIDI2LCBuID0gTWF0aC5taW4oKHMgLSBsKSAvIDI2LCB0aGlzLmxlbmd0aCksIGQgPSA2NzEwODg2MyBeIDY3MTA4ODYzID4+PiBsIDw8IGwsIHcgPSBjOwogICAgICAgIGlmIChiMiAtPSBuLCBiMiA9IE1hdGgubWF4KDAsIGIyKSwgdykgewogICAgICAgICAgZm9yICh2YXIgZyA9IDA7ZyA8IG47IGcrKykKICAgICAgICAgICAgdy53b3Jkc1tnXSA9IHRoaXMud29yZHNbZ107CiAgICAgICAgICB3Lmxlbmd0aCA9IG47CiAgICAgICAgfQogICAgICAgIGlmIChuICE9PSAwKQogICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gbikKICAgICAgICAgICAgZm9yICh0aGlzLmxlbmd0aCAtPSBuLCBnID0gMDtnIDwgdGhpcy5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICB0aGlzLndvcmRzW2ddID0gdGhpcy53b3Jkc1tnICsgbl07CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAwLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgdmFyIF8yID0gMDsKICAgICAgICBmb3IgKGcgPSB0aGlzLmxlbmd0aCAtIDE7ZyA+PSAwICYmIChfMiAhPT0gMCB8fCBnID49IGIyKTsgZy0tKSB7CiAgICAgICAgICB2YXIgQTIgPSB0aGlzLndvcmRzW2ddIHwgMDsKICAgICAgICAgIHRoaXMud29yZHNbZ10gPSBfMiA8PCAyNiAtIGwgfCBBMiA+Pj4gbCwgXzIgPSBBMiAmIGQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3ICYmIF8yICE9PSAwICYmICh3LndvcmRzW3cubGVuZ3RoKytdID0gXzIpLCB0aGlzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMSksIHRoaXMuX3N0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24ocywgdSwgYykgewogICAgICAgIHJldHVybiByKHRoaXMubmVnYXRpdmUgPT09IDApLCB0aGlzLml1c2hybihzLCB1LCBjKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcih0eXBlb2YgcyA9PSAibnVtYmVyIiAmJiBzID49IDApOwogICAgICAgIHZhciB1ID0gcyAlIDI2LCBjID0gKHMgLSB1KSAvIDI2LCBiMiA9IDEgPDwgdTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gYykKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgbCA9IHRoaXMud29yZHNbY107CiAgICAgICAgcmV0dXJuICEhKGwgJiBiMik7CiAgICAgIH0sIGYucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByKHR5cGVvZiBzID09ICJudW1iZXIiICYmIHMgPj0gMCk7CiAgICAgICAgdmFyIHUgPSBzICUgMjYsIGMgPSAocyAtIHUpIC8gMjY7CiAgICAgICAgaWYgKHIodGhpcy5uZWdhdGl2ZSA9PT0gMCwgImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycyIpLCB0aGlzLmxlbmd0aCA8PSBjKQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKHUgIT09IDAgJiYgYysrLCB0aGlzLmxlbmd0aCA9IE1hdGgubWluKGMsIHRoaXMubGVuZ3RoKSwgdSAhPT0gMCkgewogICAgICAgICAgdmFyIGIyID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4gdSA8PCB1OwogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IGIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKHR5cGVvZiBzID09ICJudW1iZXIiKSwgcihzIDwgNjcxMDg4NjQpLCBzIDwgMCA/IHRoaXMuaXN1Ym4oLXMpIDogdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPD0gcyA/ICh0aGlzLndvcmRzWzBdID0gcyAtICh0aGlzLndvcmRzWzBdIHwgMCksIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzKSA6ICh0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pc3VibihzKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMpIDogdGhpcy5faWFkZG4ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB0aGlzLndvcmRzWzBdICs9IHM7CiAgICAgICAgZm9yICh2YXIgdSA9IDA7dSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbdV0gPj0gNjcxMDg4NjQ7IHUrKykKICAgICAgICAgIHRoaXMud29yZHNbdV0gLT0gNjcxMDg4NjQsIHUgPT09IHRoaXMubGVuZ3RoIC0gMSA/IHRoaXMud29yZHNbdSArIDFdID0gMSA6IHRoaXMud29yZHNbdSArIDFdKys7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIHUgKyAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIHMgPT0gIm51bWJlciIpLCByKHMgPCA2NzEwODg2NCksIHMgPCAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuaWFkZG4oLXMpOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGRuKHMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpczsKICAgICAgICBpZiAodGhpcy53b3Jkc1swXSAtPSBzLCB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkKICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXSwgdGhpcy5uZWdhdGl2ZSA9IDE7CiAgICAgICAgZWxzZQogICAgICAgICAgZm9yICh2YXIgdSA9IDA7dSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbdV0gPCAwOyB1KyspCiAgICAgICAgICAgIHRoaXMud29yZHNbdV0gKz0gNjcxMDg4NjQsIHRoaXMud29yZHNbdSArIDFdIC09IDE7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24ocywgdSwgYykgewogICAgICAgIHZhciBiMiA9IHMubGVuZ3RoICsgYywgbDsKICAgICAgICB0aGlzLl9leHBhbmQoYjIpOwogICAgICAgIHZhciBuLCBkID0gMDsKICAgICAgICBmb3IgKGwgPSAwO2wgPCBzLmxlbmd0aDsgbCsrKSB7CiAgICAgICAgICBuID0gKHRoaXMud29yZHNbbCArIGNdIHwgMCkgKyBkOwogICAgICAgICAgdmFyIHcgPSAocy53b3Jkc1tsXSB8IDApICogdTsKICAgICAgICAgIG4gLT0gdyAmIDY3MTA4ODYzLCBkID0gKG4gPj4gMjYpIC0gKHcgLyA2NzEwODg2NCB8IDApLCB0aGlzLndvcmRzW2wgKyBjXSA9IG4gJiA2NzEwODg2MzsKICAgICAgICB9CiAgICAgICAgZm9yICg7bCA8IHRoaXMubGVuZ3RoIC0gYzsgbCsrKQogICAgICAgICAgbiA9ICh0aGlzLndvcmRzW2wgKyBjXSB8IDApICsgZCwgZCA9IG4gPj4gMjYsIHRoaXMud29yZHNbbCArIGNdID0gbiAmIDY3MTA4ODYzOwogICAgICAgIGlmIChkID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7CiAgICAgICAgZm9yIChyKGQgPT09IC0xKSwgZCA9IDAsIGwgPSAwO2wgPCB0aGlzLmxlbmd0aDsgbCsrKQogICAgICAgICAgbiA9IC0odGhpcy53b3Jkc1tsXSB8IDApICsgZCwgZCA9IG4gPj4gMjYsIHRoaXMud29yZHNbbF0gPSBuICYgNjcxMDg4NjM7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLl9zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICB2YXIgYyA9IHRoaXMubGVuZ3RoIC0gcy5sZW5ndGgsIGIyID0gdGhpcy5jbG9uZSgpLCBsID0gcywgbiA9IGwud29yZHNbbC5sZW5ndGggLSAxXSB8IDAsIGQgPSB0aGlzLl9jb3VudEJpdHMobik7CiAgICAgICAgYyA9IDI2IC0gZCwgYyAhPT0gMCAmJiAobCA9IGwudXNobG4oYyksIGIyLml1c2hsbihjKSwgbiA9IGwud29yZHNbbC5sZW5ndGggLSAxXSB8IDApOwogICAgICAgIHZhciB3ID0gYjIubGVuZ3RoIC0gbC5sZW5ndGgsIGc7CiAgICAgICAgaWYgKHUgIT09ICJtb2QiKSB7CiAgICAgICAgICBnID0gbmV3IGYobnVsbCksIGcubGVuZ3RoID0gdyArIDEsIGcud29yZHMgPSBuZXcgQXJyYXkoZy5sZW5ndGgpOwogICAgICAgICAgZm9yICh2YXIgXzIgPSAwO18yIDwgZy5sZW5ndGg7IF8yKyspCiAgICAgICAgICAgIGcud29yZHNbXzJdID0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIEEyID0gYjIuY2xvbmUoKS5faXNobG5zdWJtdWwobCwgMSwgdyk7CiAgICAgICAgQTIubmVnYXRpdmUgPT09IDAgJiYgKGIyID0gQTIsIGcgJiYgKGcud29yZHNbd10gPSAxKSk7CiAgICAgICAgZm9yICh2YXIgUjIgPSB3IC0gMTtSMiA+PSAwOyBSMi0tKSB7CiAgICAgICAgICB2YXIgSSA9IChiMi53b3Jkc1tsLmxlbmd0aCArIFIyXSB8IDApICogNjcxMDg4NjQgKyAoYjIud29yZHNbbC5sZW5ndGggKyBSMiAtIDFdIHwgMCk7CiAgICAgICAgICBmb3IgKEkgPSBNYXRoLm1pbihJIC8gbiB8IDAsIDY3MTA4ODYzKSwgYjIuX2lzaGxuc3VibXVsKGwsIEksIFIyKTtiMi5uZWdhdGl2ZSAhPT0gMDsgKQogICAgICAgICAgICBJLS0sIGIyLm5lZ2F0aXZlID0gMCwgYjIuX2lzaGxuc3VibXVsKGwsIDEsIFIyKSwgYjIuaXNaZXJvKCkgfHwgKGIyLm5lZ2F0aXZlIF49IDEpOwogICAgICAgICAgZyAmJiAoZy53b3Jkc1tSMl0gPSBJKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGcgJiYgZy5fc3RyaXAoKSwgYjIuX3N0cmlwKCksIHUgIT09ICJkaXYiICYmIGMgIT09IDAgJiYgYjIuaXVzaHJuKGMpLCB7IGRpdjogZyB8fCBudWxsLCBtb2Q6IGIyIH07CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uKHMsIHUsIGMpIHsKICAgICAgICBpZiAocighcy5pc1plcm8oKSksIHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4geyBkaXY6IG5ldyBmKDApLCBtb2Q6IG5ldyBmKDApIH07CiAgICAgICAgdmFyIGIyLCBsLCBuOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIHMubmVnYXRpdmUgPT09IDAgPyAobiA9IHRoaXMubmVnKCkuZGl2bW9kKHMsIHUpLCB1ICE9PSAibW9kIiAmJiAoYjIgPSBuLmRpdi5uZWcoKSksIHUgIT09ICJkaXYiICYmIChsID0gbi5tb2QubmVnKCksIGMgJiYgbC5uZWdhdGl2ZSAhPT0gMCAmJiBsLmlhZGQocykpLCB7IGRpdjogYjIsIG1vZDogbCB9KSA6IHRoaXMubmVnYXRpdmUgPT09IDAgJiYgcy5uZWdhdGl2ZSAhPT0gMCA/IChuID0gdGhpcy5kaXZtb2Qocy5uZWcoKSwgdSksIHUgIT09ICJtb2QiICYmIChiMiA9IG4uZGl2Lm5lZygpKSwgeyBkaXY6IGIyLCBtb2Q6IG4ubW9kIH0pIDogKHRoaXMubmVnYXRpdmUgJiBzLm5lZ2F0aXZlKSAhPT0gMCA/IChuID0gdGhpcy5uZWcoKS5kaXZtb2Qocy5uZWcoKSwgdSksIHUgIT09ICJkaXYiICYmIChsID0gbi5tb2QubmVnKCksIGMgJiYgbC5uZWdhdGl2ZSAhPT0gMCAmJiBsLmlzdWIocykpLCB7IGRpdjogbi5kaXYsIG1vZDogbCB9KSA6IHMubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAocykgPCAwID8geyBkaXY6IG5ldyBmKDApLCBtb2Q6IHRoaXMgfSA6IHMubGVuZ3RoID09PSAxID8gdSA9PT0gImRpdiIgPyB7IGRpdjogdGhpcy5kaXZuKHMud29yZHNbMF0pLCBtb2Q6IG51bGwgfSA6IHUgPT09ICJtb2QiID8geyBkaXY6IG51bGwsIG1vZDogbmV3IGYodGhpcy5tb2RybihzLndvcmRzWzBdKSkgfSA6IHsgZGl2OiB0aGlzLmRpdm4ocy53b3Jkc1swXSksIG1vZDogbmV3IGYodGhpcy5tb2RybihzLndvcmRzWzBdKSkgfSA6IHRoaXMuX3dvcmREaXYocywgdSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QocywgImRpdiIsIGZhbHNlKS5kaXY7CiAgICAgIH0sIGYucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QocywgIm1vZCIsIGZhbHNlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKHMsICJtb2QiLCB0cnVlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1ID0gdGhpcy5kaXZtb2Qocyk7CiAgICAgICAgaWYgKHUubW9kLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHUuZGl2OwogICAgICAgIHZhciBjID0gdS5kaXYubmVnYXRpdmUgIT09IDAgPyB1Lm1vZC5pc3ViKHMpIDogdS5tb2QsIGIyID0gcy51c2hybigxKSwgbCA9IHMuYW5kbG4oMSksIG4gPSBjLmNtcChiMik7CiAgICAgICAgcmV0dXJuIG4gPCAwIHx8IGwgPT09IDEgJiYgbiA9PT0gMCA/IHUuZGl2IDogdS5kaXYubmVnYXRpdmUgIT09IDAgPyB1LmRpdi5pc3VibigxKSA6IHUuZGl2LmlhZGRuKDEpOwogICAgICB9LCBmLnByb3RvdHlwZS5tb2RybiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHMgPCAwOwogICAgICAgIHUgJiYgKHMgPSAtcyksIHIocyA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYyA9ICgxIDw8IDI2KSAlIHMsIGIyID0gMCwgbCA9IHRoaXMubGVuZ3RoIC0gMTtsID49IDA7IGwtLSkKICAgICAgICAgIGIyID0gKGMgKiBiMiArICh0aGlzLndvcmRzW2xdIHwgMCkpICUgczsKICAgICAgICByZXR1cm4gdSA/IC1iMiA6IGIyOwogICAgICB9LCBmLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLm1vZHJuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHMgPCAwOwogICAgICAgIHUgJiYgKHMgPSAtcyksIHIocyA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYyA9IDAsIGIyID0gdGhpcy5sZW5ndGggLSAxO2IyID49IDA7IGIyLS0pIHsKICAgICAgICAgIHZhciBsID0gKHRoaXMud29yZHNbYjJdIHwgMCkgKyBjICogNjcxMDg4NjQ7CiAgICAgICAgICB0aGlzLndvcmRzW2IyXSA9IGwgLyBzIHwgMCwgYyA9IGwgJSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKSwgdSA/IHRoaXMuaW5lZygpIDogdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24ocykgewogICAgICAgIHIocy5uZWdhdGl2ZSA9PT0gMCksIHIoIXMuaXNaZXJvKCkpOwogICAgICAgIHZhciB1ID0gdGhpcywgYyA9IHMuY2xvbmUoKTsKICAgICAgICB1Lm5lZ2F0aXZlICE9PSAwID8gdSA9IHUudW1vZChzKSA6IHUgPSB1LmNsb25lKCk7CiAgICAgICAgZm9yICh2YXIgYjIgPSBuZXcgZigxKSwgbCA9IG5ldyBmKDApLCBuID0gbmV3IGYoMCksIGQgPSBuZXcgZigxKSwgdyA9IDA7dS5pc0V2ZW4oKSAmJiBjLmlzRXZlbigpOyApCiAgICAgICAgICB1Lml1c2hybigxKSwgYy5pdXNocm4oMSksICsrdzsKICAgICAgICBmb3IgKHZhciBnID0gYy5jbG9uZSgpLCBfMiA9IHUuY2xvbmUoKTshdS5pc1plcm8oKTsgKSB7CiAgICAgICAgICBmb3IgKHZhciBBMiA9IDAsIFIyID0gMTsodS53b3Jkc1swXSAmIFIyKSA9PT0gMCAmJiBBMiA8IDI2OyArK0EyLCBSMiA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKEEyID4gMCkKICAgICAgICAgICAgZm9yICh1Lml1c2hybihBMik7QTItLSA+IDA7ICkKICAgICAgICAgICAgICAoYjIuaXNPZGQoKSB8fCBsLmlzT2RkKCkpICYmIChiMi5pYWRkKGcpLCBsLmlzdWIoXzIpKSwgYjIuaXVzaHJuKDEpLCBsLml1c2hybigxKTsKICAgICAgICAgIGZvciAodmFyIEkgPSAwLCBNZSA9IDE7KGMud29yZHNbMF0gJiBNZSkgPT09IDAgJiYgSSA8IDI2OyArK0ksIE1lIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAoSSA+IDApCiAgICAgICAgICAgIGZvciAoYy5pdXNocm4oSSk7SS0tID4gMDsgKQogICAgICAgICAgICAgIChuLmlzT2RkKCkgfHwgZC5pc09kZCgpKSAmJiAobi5pYWRkKGcpLCBkLmlzdWIoXzIpKSwgbi5pdXNocm4oMSksIGQuaXVzaHJuKDEpOwogICAgICAgICAgdS5jbXAoYykgPj0gMCA/ICh1LmlzdWIoYyksIGIyLmlzdWIobiksIGwuaXN1YihkKSkgOiAoYy5pc3ViKHUpLCBuLmlzdWIoYjIpLCBkLmlzdWIobCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBhOiBuLCBiOiBkLCBnY2Q6IGMuaXVzaGxuKHcpIH07CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByKHMubmVnYXRpdmUgPT09IDApLCByKCFzLmlzWmVybygpKTsKICAgICAgICB2YXIgdSA9IHRoaXMsIGMgPSBzLmNsb25lKCk7CiAgICAgICAgdS5uZWdhdGl2ZSAhPT0gMCA/IHUgPSB1LnVtb2QocykgOiB1ID0gdS5jbG9uZSgpOwogICAgICAgIGZvciAodmFyIGIyID0gbmV3IGYoMSksIGwgPSBuZXcgZigwKSwgbiA9IGMuY2xvbmUoKTt1LmNtcG4oMSkgPiAwICYmIGMuY21wbigxKSA+IDA7ICkgewogICAgICAgICAgZm9yICh2YXIgZCA9IDAsIHcgPSAxOyh1LndvcmRzWzBdICYgdykgPT09IDAgJiYgZCA8IDI2OyArK2QsIHcgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChkID4gMCkKICAgICAgICAgICAgZm9yICh1Lml1c2hybihkKTtkLS0gPiAwOyApCiAgICAgICAgICAgICAgYjIuaXNPZGQoKSAmJiBiMi5pYWRkKG4pLCBiMi5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKHZhciBnID0gMCwgXzIgPSAxOyhjLndvcmRzWzBdICYgXzIpID09PSAwICYmIGcgPCAyNjsgKytnLCBfMiA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKGcgPiAwKQogICAgICAgICAgICBmb3IgKGMuaXVzaHJuKGcpO2ctLSA+IDA7ICkKICAgICAgICAgICAgICBsLmlzT2RkKCkgJiYgbC5pYWRkKG4pLCBsLml1c2hybigxKTsKICAgICAgICAgIHUuY21wKGMpID49IDAgPyAodS5pc3ViKGMpLCBiMi5pc3ViKGwpKSA6IChjLmlzdWIodSksIGwuaXN1YihiMikpOwogICAgICAgIH0KICAgICAgICB2YXIgQTI7CiAgICAgICAgcmV0dXJuIHUuY21wbigxKSA9PT0gMCA/IEEyID0gYjIgOiBBMiA9IGwsIEEyLmNtcG4oMCkgPCAwICYmIEEyLmlhZGQocyksIEEyOwogICAgICB9LCBmLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gcy5hYnMoKTsKICAgICAgICBpZiAocy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiB0aGlzLmFicygpOwogICAgICAgIHZhciB1ID0gdGhpcy5jbG9uZSgpLCBjID0gcy5jbG9uZSgpOwogICAgICAgIHUubmVnYXRpdmUgPSAwLCBjLm5lZ2F0aXZlID0gMDsKICAgICAgICBmb3IgKHZhciBiMiA9IDA7dS5pc0V2ZW4oKSAmJiBjLmlzRXZlbigpOyBiMisrKQogICAgICAgICAgdS5pdXNocm4oMSksIGMuaXVzaHJuKDEpOwogICAgICAgIGRvIHsKICAgICAgICAgIGZvciAoO3UuaXNFdmVuKCk7ICkKICAgICAgICAgICAgdS5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKDtjLmlzRXZlbigpOyApCiAgICAgICAgICAgIGMuaXVzaHJuKDEpOwogICAgICAgICAgdmFyIGwgPSB1LmNtcChjKTsKICAgICAgICAgIGlmIChsIDwgMCkgewogICAgICAgICAgICB2YXIgbiA9IHU7CiAgICAgICAgICAgIHUgPSBjLCBjID0gbjsKICAgICAgICAgIH0gZWxzZSBpZiAobCA9PT0gMCB8fCBjLmNtcG4oMSkgPT09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgdS5pc3ViKGMpOwogICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgIHJldHVybiBjLml1c2hsbihiMik7CiAgICAgIH0sIGYucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWdjZChzKS5hLnVtb2Qocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIHM7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24ocykgewogICAgICAgIHIodHlwZW9mIHMgPT0gIm51bWJlciIpOwogICAgICAgIHZhciB1ID0gcyAlIDI2LCBjID0gKHMgLSB1KSAvIDI2LCBiMiA9IDEgPDwgdTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gYykKICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoYyArIDEpLCB0aGlzLndvcmRzW2NdIHw9IGIyLCB0aGlzOwogICAgICAgIGZvciAodmFyIGwgPSBiMiwgbiA9IGM7bCAhPT0gMCAmJiBuIDwgdGhpcy5sZW5ndGg7IG4rKykgewogICAgICAgICAgdmFyIGQgPSB0aGlzLndvcmRzW25dIHwgMDsKICAgICAgICAgIGQgKz0gbCwgbCA9IGQgPj4+IDI2LCBkICY9IDY3MTA4ODYzLCB0aGlzLndvcmRzW25dID0gZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGwgIT09IDAgJiYgKHRoaXMud29yZHNbbl0gPSBsLCB0aGlzLmxlbmd0aCsrKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgdmFyIHUgPSBzIDwgMDsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhdSkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiB1KQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgdGhpcy5fc3RyaXAoKTsKICAgICAgICB2YXIgYzsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAxKQogICAgICAgICAgYyA9IDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB1ICYmIChzID0gLXMpLCByKHMgPD0gNjcxMDg4NjMsICJOdW1iZXIgaXMgdG9vIGJpZyIpOwogICAgICAgICAgdmFyIGIyID0gdGhpcy53b3Jkc1swXSB8IDA7CiAgICAgICAgICBjID0gYjIgPT09IHMgPyAwIDogYjIgPCBzID8gLTEgOiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1jIHwgMCA6IGM7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBzLm5lZ2F0aXZlID09PSAwKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIHMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB2YXIgdSA9IHRoaXMudWNtcChzKTsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC11IHwgMCA6IHU7CiAgICAgIH0sIGYucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gcy5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPCBzLmxlbmd0aCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBmb3IgKHZhciB1ID0gMCwgYyA9IHRoaXMubGVuZ3RoIC0gMTtjID49IDA7IGMtLSkgewogICAgICAgICAgdmFyIGIyID0gdGhpcy53b3Jkc1tjXSB8IDAsIGwgPSBzLndvcmRzW2NdIHwgMDsKICAgICAgICAgIGlmIChiMiAhPT0gbCkgewogICAgICAgICAgICBiMiA8IGwgPyB1ID0gLTEgOiBiMiA+IGwgJiYgKHUgPSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB1OwogICAgICB9LCBmLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihzKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKHMpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4ocykgPj0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmNtcChzKSA+PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihzKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiB0aGlzLmNtcChzKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihzKSA8PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKHMpIDw9IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKHMpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAocykgPT09IDA7CiAgICAgIH0sIGYucmVkID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiBuZXcgaShzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHIoIXRoaXMucmVkLCAiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCByKHRoaXMubmVnYXRpdmUgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCBzLmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWQgPSBzLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsICJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHRoaXMuX2ZvcmNlUmVkKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmFkZCh0aGlzLCBzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmlhZGQodGhpcywgcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuc3ViKHRoaXMsIHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuaXN1Yih0aGlzLCBzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5zaGwodGhpcywgcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgcyksIHRoaXMucmVkLm11bCh0aGlzLCBzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgcyksIHRoaXMucmVkLmltdWwodGhpcywgcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FyKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuaXNxcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnNxcnQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pbnZtKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLm5lZyh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiByKHRoaXMucmVkICYmICFzLnJlZCwgInJlZFBvdyhub3JtYWxOdW0pIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5wb3codGhpcywgcyk7CiAgICAgIH07CiAgICAgIHZhciBSZSA9IHsgazI1NjogbnVsbCwgcDIyNDogbnVsbCwgcDE5MjogbnVsbCwgcDI1NTE5OiBudWxsIH07CiAgICAgIGZ1bmN0aW9uIEVlKGgyLCBzKSB7CiAgICAgICAgdGhpcy5uYW1lID0gaDIsIHRoaXMucCA9IG5ldyBmKHMsIDE2KSwgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpLCB0aGlzLmsgPSBuZXcgZigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7CiAgICAgIH0KICAgICAgRWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcyA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBzLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpLCBzOwogICAgICB9LCBFZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHMsIGM7CiAgICAgICAgZG8KICAgICAgICAgIHRoaXMuc3BsaXQodSwgdGhpcy50bXApLCB1ID0gdGhpcy5pbXVsSyh1KSwgdSA9IHUuaWFkZCh0aGlzLnRtcCksIGMgPSB1LmJpdExlbmd0aCgpOwogICAgICAgIHdoaWxlIChjID4gdGhpcy5uKTsKICAgICAgICB2YXIgYjIgPSBjIDwgdGhpcy5uID8gLTEgOiB1LnVjbXAodGhpcy5wKTsKICAgICAgICByZXR1cm4gYjIgPT09IDAgPyAodS53b3Jkc1swXSA9IDAsIHUubGVuZ3RoID0gMSkgOiBiMiA+IDAgPyB1LmlzdWIodGhpcy5wKSA6IHUuc3RyaXAgIT09IHVuZGVmaW5lZCA/IHUuc3RyaXAoKSA6IHUuX3N0cmlwKCksIHU7CiAgICAgIH0sIEVlLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICBzLml1c2hybih0aGlzLm4sIDAsIHUpOwogICAgICB9LCBFZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHMuaW11bCh0aGlzLmspOwogICAgICB9OwogICAgICBmdW5jdGlvbiBBZSgpIHsKICAgICAgICBFZS5jYWxsKHRoaXMsICJrMjU2IiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIik7CiAgICAgIH0KICAgICAgbyhBZSwgRWUpLCBBZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgZm9yICh2YXIgYyA9IDQxOTQzMDMsIGIyID0gTWF0aC5taW4ocy5sZW5ndGgsIDkpLCBsID0gMDtsIDwgYjI7IGwrKykKICAgICAgICAgIHUud29yZHNbbF0gPSBzLndvcmRzW2xdOwogICAgICAgIGlmICh1Lmxlbmd0aCA9IGIyLCBzLmxlbmd0aCA8PSA5KSB7CiAgICAgICAgICBzLndvcmRzWzBdID0gMCwgcy5sZW5ndGggPSAxOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgbiA9IHMud29yZHNbOV07CiAgICAgICAgZm9yICh1LndvcmRzW3UubGVuZ3RoKytdID0gbiAmIGMsIGwgPSAxMDtsIDwgcy5sZW5ndGg7IGwrKykgewogICAgICAgICAgdmFyIGQgPSBzLndvcmRzW2xdIHwgMDsKICAgICAgICAgIHMud29yZHNbbCAtIDEwXSA9IChkICYgYykgPDwgNCB8IG4gPj4+IDIyLCBuID0gZDsKICAgICAgICB9CiAgICAgICAgbiA+Pj49IDIyLCBzLndvcmRzW2wgLSAxMF0gPSBuLCBuID09PSAwICYmIHMubGVuZ3RoID4gMTAgPyBzLmxlbmd0aCAtPSAxMCA6IHMubGVuZ3RoIC09IDk7CiAgICAgIH0sIEFlLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICBzLndvcmRzW3MubGVuZ3RoXSA9IDAsIHMud29yZHNbcy5sZW5ndGggKyAxXSA9IDAsIHMubGVuZ3RoICs9IDI7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICB2YXIgYjIgPSBzLndvcmRzW2NdIHwgMDsKICAgICAgICAgIHUgKz0gYjIgKiA5NzcsIHMud29yZHNbY10gPSB1ICYgNjcxMDg4NjMsIHUgPSBiMiAqIDY0ICsgKHUgLyA2NzEwODg2NCB8IDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcy53b3Jkc1tzLmxlbmd0aCAtIDFdID09PSAwICYmIChzLmxlbmd0aC0tLCBzLndvcmRzW3MubGVuZ3RoIC0gMV0gPT09IDAgJiYgcy5sZW5ndGgtLSksIHM7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFAoKSB7CiAgICAgICAgRWUuY2FsbCh0aGlzLCAicDIyNCIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpOwogICAgICB9CiAgICAgIG8oUCwgRWUpOwogICAgICBmdW5jdGlvbiBTZSgpIHsKICAgICAgICBFZS5jYWxsKHRoaXMsICJwMTkyIiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIik7CiAgICAgIH0KICAgICAgbyhTZSwgRWUpOwogICAgICBmdW5jdGlvbiB2KCkgewogICAgICAgIEVlLmNhbGwodGhpcywgIjI1NTE5IiwgIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKTsKICAgICAgfQogICAgICBvKHYsIEVlKSwgdi5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICB2YXIgYjIgPSAocy53b3Jkc1tjXSB8IDApICogMTkgKyB1LCBsID0gYjIgJiA2NzEwODg2MzsKICAgICAgICAgIGIyID4+Pj0gMjYsIHMud29yZHNbY10gPSBsLCB1ID0gYjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1ICE9PSAwICYmIChzLndvcmRzW3MubGVuZ3RoKytdID0gdSksIHM7CiAgICAgIH0sIGYuX3ByaW1lID0gZnVuY3Rpb24ocykgewogICAgICAgIGlmIChSZVtzXSkKICAgICAgICAgIHJldHVybiBSZVtzXTsKICAgICAgICB2YXIgdTsKICAgICAgICBpZiAocyA9PT0gImsyNTYiKQogICAgICAgICAgdSA9IG5ldyBBZTsKICAgICAgICBlbHNlIGlmIChzID09PSAicDIyNCIpCiAgICAgICAgICB1ID0gbmV3IFA7CiAgICAgICAgZWxzZSBpZiAocyA9PT0gInAxOTIiKQogICAgICAgICAgdSA9IG5ldyBTZTsKICAgICAgICBlbHNlIGlmIChzID09PSAicDI1NTE5IikKICAgICAgICAgIHUgPSBuZXcgdjsKICAgICAgICBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcHJpbWUgIiArIHMpOwogICAgICAgIHJldHVybiBSZVtzXSA9IHUsIHU7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIGkoaDIpIHsKICAgICAgICBpZiAodHlwZW9mIGgyID09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgcyA9IGYuX3ByaW1lKGgyKTsKICAgICAgICAgIHRoaXMubSA9IHMucCwgdGhpcy5wcmltZSA9IHM7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICByKGgyLmd0bigxKSwgIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLCB0aGlzLm0gPSBoMiwgdGhpcy5wcmltZSA9IG51bGw7CiAgICAgIH0KICAgICAgaS5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcihzLm5lZ2F0aXZlID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihzLnJlZCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKTsKICAgICAgfSwgaS5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgcigocy5uZWdhdGl2ZSB8IHUubmVnYXRpdmUpID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihzLnJlZCAmJiBzLnJlZCA9PT0gdS5yZWQsICJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIik7CiAgICAgIH0sIGkucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWUgPyB0aGlzLnByaW1lLmlyZWR1Y2UocykuX2ZvcmNlUmVkKHRoaXMpIDogKHgocywgcy51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpKSwgcyk7CiAgICAgIH0sIGkucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gcy5pc1plcm8oKSA/IHMuY2xvbmUoKSA6IHRoaXMubS5zdWIocykuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBpLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihzLCB1KTsKICAgICAgICB2YXIgYyA9IHMuYWRkKHUpOwogICAgICAgIHJldHVybiBjLmNtcCh0aGlzLm0pID49IDAgJiYgYy5pc3ViKHRoaXMubSksIGMuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBpLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIocywgdSk7CiAgICAgICAgdmFyIGMgPSBzLmlhZGQodSk7CiAgICAgICAgcmV0dXJuIGMuY21wKHRoaXMubSkgPj0gMCAmJiBjLmlzdWIodGhpcy5tKSwgYzsKICAgICAgfSwgaS5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIocywgdSk7CiAgICAgICAgdmFyIGMgPSBzLnN1Yih1KTsKICAgICAgICByZXR1cm4gYy5jbXBuKDApIDwgMCAmJiBjLmlhZGQodGhpcy5tKSwgYy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIGkucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihzLCB1KTsKICAgICAgICB2YXIgYyA9IHMuaXN1Yih1KTsKICAgICAgICByZXR1cm4gYy5jbXBuKDApIDwgMCAmJiBjLmlhZGQodGhpcy5tKSwgYzsKICAgICAgfSwgaS5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkxKHMpLCB0aGlzLmltb2Qocy51c2hsbih1KSk7CiAgICAgIH0sIGkucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIocywgdSksIHRoaXMuaW1vZChzLmltdWwodSkpOwogICAgICB9LCBpLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihzLCB1KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIocywgdSksIHRoaXMuaW1vZChzLm11bCh1KSk7CiAgICAgIH0sIGkucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW11bChzLCBzLmNsb25lKCkpOwogICAgICB9LCBpLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsKHMsIHMpOwogICAgICB9LCBpLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24ocykgewogICAgICAgIGlmIChzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHMuY2xvbmUoKTsKICAgICAgICB2YXIgdSA9IHRoaXMubS5hbmRsbigzKTsKICAgICAgICBpZiAocih1ICUgMiA9PT0gMSksIHUgPT09IDMpIHsKICAgICAgICAgIHZhciBjID0gdGhpcy5tLmFkZChuZXcgZigxKSkuaXVzaHJuKDIpOwogICAgICAgICAgcmV0dXJuIHRoaXMucG93KHMsIGMpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBiMiA9IHRoaXMubS5zdWJuKDEpLCBsID0gMDshYjIuaXNaZXJvKCkgJiYgYjIuYW5kbG4oMSkgPT09IDA7ICkKICAgICAgICAgIGwrKywgYjIuaXVzaHJuKDEpOwogICAgICAgIHIoIWIyLmlzWmVybygpKTsKICAgICAgICB2YXIgbiA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBkID0gbi5yZWROZWcoKSwgdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKSwgZyA9IHRoaXMubS5iaXRMZW5ndGgoKTsKICAgICAgICBmb3IgKGcgPSBuZXcgZigyICogZyAqIGcpLnRvUmVkKHRoaXMpO3RoaXMucG93KGcsIHcpLmNtcChkKSAhPT0gMDsgKQogICAgICAgICAgZy5yZWRJQWRkKGQpOwogICAgICAgIGZvciAodmFyIF8yID0gdGhpcy5wb3coZywgYjIpLCBBMiA9IHRoaXMucG93KHMsIGIyLmFkZG4oMSkuaXVzaHJuKDEpKSwgUjIgPSB0aGlzLnBvdyhzLCBiMiksIEkgPSBsO1IyLmNtcChuKSAhPT0gMDsgKSB7CiAgICAgICAgICBmb3IgKHZhciBNZSA9IFIyLCBrID0gMDtNZS5jbXAobikgIT09IDA7IGsrKykKICAgICAgICAgICAgTWUgPSBNZS5yZWRTcXIoKTsKICAgICAgICAgIHIoayA8IEkpOwogICAgICAgICAgdmFyIEQyID0gdGhpcy5wb3coXzIsIG5ldyBmKDEpLml1c2hsbihJIC0gayAtIDEpKTsKICAgICAgICAgIEEyID0gQTIucmVkTXVsKEQyKSwgXzIgPSBEMi5yZWRTcXIoKSwgUjIgPSBSMi5yZWRNdWwoXzIpLCBJID0gazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEEyOwogICAgICB9LCBpLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24ocykgewogICAgICAgIHZhciB1ID0gcy5faW52bXAodGhpcy5tKTsKICAgICAgICByZXR1cm4gdS5uZWdhdGl2ZSAhPT0gMCA/ICh1Lm5lZ2F0aXZlID0gMCwgdGhpcy5pbW9kKHUpLnJlZE5lZygpKSA6IHRoaXMuaW1vZCh1KTsKICAgICAgfSwgaS5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIGlmICh1LmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpLnRvUmVkKHRoaXMpOwogICAgICAgIGlmICh1LmNtcG4oMSkgPT09IDApCiAgICAgICAgICByZXR1cm4gcy5jbG9uZSgpOwogICAgICAgIHZhciBjID0gNCwgYjIgPSBuZXcgQXJyYXkoMSA8PCBjKTsKICAgICAgICBiMlswXSA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBiMlsxXSA9IHM7CiAgICAgICAgZm9yICh2YXIgbCA9IDI7bCA8IGIyLmxlbmd0aDsgbCsrKQogICAgICAgICAgYjJbbF0gPSB0aGlzLm11bChiMltsIC0gMV0sIHMpOwogICAgICAgIHZhciBuID0gYjJbMF0sIGQgPSAwLCB3ID0gMCwgZyA9IHUuYml0TGVuZ3RoKCkgJSAyNjsKICAgICAgICBmb3IgKGcgPT09IDAgJiYgKGcgPSAyNiksIGwgPSB1Lmxlbmd0aCAtIDE7bCA+PSAwOyBsLS0pIHsKICAgICAgICAgIGZvciAodmFyIF8yID0gdS53b3Jkc1tsXSwgQTIgPSBnIC0gMTtBMiA+PSAwOyBBMi0tKSB7CiAgICAgICAgICAgIHZhciBSMiA9IF8yID4+IEEyICYgMTsKICAgICAgICAgICAgaWYgKG4gIT09IGIyWzBdICYmIChuID0gdGhpcy5zcXIobikpLCBSMiA9PT0gMCAmJiBkID09PSAwKSB7CiAgICAgICAgICAgICAgdyA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZCA8PD0gMSwgZCB8PSBSMiwgdysrLCAhKHcgIT09IGMgJiYgKGwgIT09IDAgfHwgQTIgIT09IDApKSAmJiAobiA9IHRoaXMubXVsKG4sIGIyW2RdKSwgdyA9IDAsIGQgPSAwKTsKICAgICAgICAgIH0KICAgICAgICAgIGcgPSAyNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0sIGkucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHMudW1vZCh0aGlzLm0pOwogICAgICAgIHJldHVybiB1ID09PSBzID8gdS5jbG9uZSgpIDogdTsKICAgICAgfSwgaS5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbihzKSB7CiAgICAgICAgdmFyIHUgPSBzLmNsb25lKCk7CiAgICAgICAgcmV0dXJuIHUucmVkID0gbnVsbCwgdTsKICAgICAgfSwgZi5tb250ID0gZnVuY3Rpb24ocykgewogICAgICAgIHJldHVybiBuZXcgYShzKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gYShoMikgewogICAgICAgIGkuY2FsbCh0aGlzLCBoMiksIHRoaXMuc2hpZnQgPSB0aGlzLm0uYml0TGVuZ3RoKCksIHRoaXMuc2hpZnQgJSAyNiAhPT0gMCAmJiAodGhpcy5zaGlmdCArPSAyNiAtIHRoaXMuc2hpZnQgJSAyNiksIHRoaXMuciA9IG5ldyBmKDEpLml1c2hsbih0aGlzLnNoaWZ0KSwgdGhpcy5yMiA9IHRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLCB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSksIHRoaXMubWludiA9IHRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSwgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKSwgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpOwogICAgICB9CiAgICAgIG8oYSwgaSksIGEucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbW9kKHMudXNobG4odGhpcy5zaGlmdCkpOwogICAgICB9LCBhLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHRoaXMuaW1vZChzLm11bCh0aGlzLnJpbnYpKTsKICAgICAgICByZXR1cm4gdS5yZWQgPSBudWxsLCB1OwogICAgICB9LCBhLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24ocywgdSkgewogICAgICAgIGlmIChzLmlzWmVybygpIHx8IHUuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gcy53b3Jkc1swXSA9IDAsIHMubGVuZ3RoID0gMSwgczsKICAgICAgICB2YXIgYyA9IHMuaW11bCh1KSwgYjIgPSBjLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSwgbCA9IGMuaXN1YihiMikuaXVzaHJuKHRoaXMuc2hpZnQpLCBuID0gbDsKICAgICAgICByZXR1cm4gbC5jbXAodGhpcy5tKSA+PSAwID8gbiA9IGwuaXN1Yih0aGlzLm0pIDogbC5jbXBuKDApIDwgMCAmJiAobiA9IGwuaWFkZCh0aGlzLm0pKSwgbi5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIGEucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKHMsIHUpIHsKICAgICAgICBpZiAocy5pc1plcm8oKSB8fCB1LmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDApLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgICB2YXIgYyA9IHMubXVsKHUpLCBiMiA9IGMubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLCBsID0gYy5pc3ViKGIyKS5pdXNocm4odGhpcy5zaGlmdCksIG4gPSBsOwogICAgICAgIHJldHVybiBsLmNtcCh0aGlzLm0pID49IDAgPyBuID0gbC5pc3ViKHRoaXMubSkgOiBsLmNtcG4oMCkgPCAwICYmIChuID0gbC5pYWRkKHRoaXMubSkpLCBuLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgYS5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgdSA9IHRoaXMuaW1vZChzLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7CiAgICAgICAgcmV0dXJuIHUuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9OwogICAgfSkodHlwZW9mIGtsID4gInUiIHx8IGtsLCBuMik7CiAgfSk7CiAgS3MgPSBUMigoeWssIG8yKSA9PiB7CiAgICB2YXIgUmYgPSBXcygpLCBvQSA9IG9uKCk7CiAgICBmdW5jdGlvbiBzQSh0KSB7CiAgICAgIHZhciBlID0gZjIodCksIHIgPSBlLnRvUmVkKFJmLm1vbnQodC5tb2R1bHVzKSkucmVkUG93KG5ldyBSZih0LnB1YmxpY0V4cG9uZW50KSkuZnJvbVJlZCgpOwogICAgICByZXR1cm4geyBibGluZGVyOiByLCB1bmJsaW5kZXI6IGUuaW52bSh0Lm1vZHVsdXMpIH07CiAgICB9CiAgICBmdW5jdGlvbiBmMih0KSB7CiAgICAgIHZhciBlID0gdC5tb2R1bHVzLmJ5dGVMZW5ndGgoKSwgcjsKICAgICAgZG8KICAgICAgICByID0gbmV3IFJmKG9BKGUpKTsKICAgICAgd2hpbGUgKHIuY21wKHQubW9kdWx1cykgPj0gMCB8fCAhci51bW9kKHQucHJpbWUxKSB8fCAhci51bW9kKHQucHJpbWUyKSk7CiAgICAgIHJldHVybiByOwogICAgfQogICAgZnVuY3Rpb24gYTIodCwgZSkgewogICAgICB2YXIgciA9IHNBKGUpLCBvID0gZS5tb2R1bHVzLmJ5dGVMZW5ndGgoKSwgZiA9IG5ldyBSZih0KS5tdWwoci5ibGluZGVyKS51bW9kKGUubW9kdWx1cyksIHAgPSBmLnRvUmVkKFJmLm1vbnQoZS5wcmltZTEpKSwgbTIgPSBmLnRvUmVkKFJmLm1vbnQoZS5wcmltZTIpKSwgeTIgPSBlLmNvZWZmaWNpZW50LCBNID0gZS5wcmltZTEsIHggPSBlLnByaW1lMiwgUyA9IHAucmVkUG93KGUuZXhwb25lbnQxKS5mcm9tUmVkKCksIEUyID0gbTIucmVkUG93KGUuZXhwb25lbnQyKS5mcm9tUmVkKCksIEIgPSBTLmlzdWIoRTIpLmltdWwoeTIpLnVtb2QoTSkuaW11bCh4KTsKICAgICAgcmV0dXJuIEUyLmlhZGQoQikuaW11bChyLnVuYmxpbmRlcikudW1vZChlLm1vZHVsdXMpLnRvQXJyYXlMaWtlKEJ1ZmZlciwgImJlIiwgbyk7CiAgICB9CiAgICBhMi5nZXRyID0gZjI7CiAgICBvMi5leHBvcnRzID0gYTI7CiAgfSk7CiAgczIgPSBUMigod2ssIGhBKSA9PiB7CiAgICBoQS5leHBvcnRzID0geyBuYW1lOiAiZWxsaXB0aWMiLCB2ZXJzaW9uOiAiNi41LjQiLCBkZXNjcmlwdGlvbjogIkVDIGNyeXB0b2dyYXBoeSIsIG1haW46ICJsaWIvZWxsaXB0aWMuanMiLCBmaWxlczogWyJsaWIiXSwgc2NyaXB0czogeyBsaW50OiAiZXNsaW50IGxpYiB0ZXN0IiwgImxpbnQ6Zml4IjogIm5wbSBydW4gbGludCAtLSAtLWZpeCIsIHVuaXQ6ICJpc3RhbmJ1bCB0ZXN0IF9tb2NoYSAtLXJlcG9ydGVyPXNwZWMgdGVzdC9pbmRleC5qcyIsIHRlc3Q6ICJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biB1bml0IiwgdmVyc2lvbjogImdydW50IGRpc3QgJiYgZ2l0IGFkZCBkaXN0LyIgfSwgcmVwb3NpdG9yeTogeyB0eXBlOiAiZ2l0IiwgdXJsOiAiZ2l0QGdpdGh1Yi5jb206aW5kdXRueS9lbGxpcHRpYyIgfSwga2V5d29yZHM6IFsiRUMiLCAiRWxsaXB0aWMiLCAiY3VydmUiLCAiQ3J5cHRvZ3JhcGh5Il0sIGF1dGhvcjogIkZlZG9yIEluZHV0bnkgPGZlZG9yQGluZHV0bnkuY29tPiIsIGxpY2Vuc2U6ICJNSVQiLCBidWdzOiB7IHVybDogImh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2VsbGlwdGljL2lzc3VlcyIgfSwgaG9tZXBhZ2U6ICJodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9lbGxpcHRpYyIsIGRldkRlcGVuZGVuY2llczogeyBicmZzOiAiXjIuMC4yIiwgY292ZXJhbGxzOiAiXjMuMS4wIiwgZXNsaW50OiAiXjcuNi4wIiwgZ3J1bnQ6ICJeMS4yLjEiLCAiZ3J1bnQtYnJvd3NlcmlmeSI6ICJeNS4zLjAiLCAiZ3J1bnQtY2xpIjogIl4xLjMuMiIsICJncnVudC1jb250cmliLWNvbm5lY3QiOiAiXjMuMC4wIiwgImdydW50LWNvbnRyaWItY29weSI6ICJeMS4wLjAiLCAiZ3J1bnQtY29udHJpYi11Z2xpZnkiOiAiXjUuMC4wIiwgImdydW50LW1vY2hhLWlzdGFuYnVsIjogIl41LjAuMiIsICJncnVudC1zYXVjZWxhYnMiOiAiXjkuMC4xIiwgaXN0YW5idWw6ICJeMC40LjUiLCBtb2NoYTogIl44LjAuMSIgfSwgZGVwZW5kZW5jaWVzOiB7ICJibi5qcyI6ICJeNC4xMS45IiwgYnJvcmFuZDogIl4xLjEuMCIsICJoYXNoLmpzIjogIl4xLjAuMCIsICJobWFjLWRyYmciOiAiXjEuMC4xIiwgaW5oZXJpdHM6ICJeMi4wLjQiLCAibWluaW1hbGlzdGljLWFzc2VydCI6ICJeMS4wLjEiLCAibWluaW1hbGlzdGljLWNyeXB0by11dGlscyI6ICJeMS4wLjEiIH0gfTsKICB9KTsKICByaSA9IFQyKChoMiwgTGwpID0+IHsKICAgIChmdW5jdGlvbih0LCBlKSB7CiAgICAgIGZ1bmN0aW9uIHIodiwgaSkgewogICAgICAgIGlmICghdikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpIHx8ICJBc3NlcnRpb24gZmFpbGVkIik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbyh2LCBpKSB7CiAgICAgICAgdi5zdXBlcl8gPSBpOwogICAgICAgIHZhciBhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgfTsKICAgICAgICBhLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCB2LnByb3RvdHlwZSA9IG5ldyBhLCB2LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHY7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZih2LCBpLCBhKSB7CiAgICAgICAgaWYgKGYuaXNCTih2KSkKICAgICAgICAgIHJldHVybiB2OwogICAgICAgIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLndvcmRzID0gbnVsbCwgdGhpcy5sZW5ndGggPSAwLCB0aGlzLnJlZCA9IG51bGwsIHYgIT09IG51bGwgJiYgKChpID09PSAibGUiIHx8IGkgPT09ICJiZSIpICYmIChhID0gaSwgaSA9IDEwKSwgdGhpcy5faW5pdCh2IHx8IDAsIGkgfHwgMTAsIGEgfHwgImJlIikpOwogICAgICB9CiAgICAgIHR5cGVvZiB0ID09ICJvYmplY3QiID8gdC5leHBvcnRzID0gZiA6IGUuQk4gPSBmLCBmLkJOID0gZiwgZi53b3JkU2l6ZSA9IDI2OwogICAgICB2YXIgcDsKICAgICAgdHJ5IHsKICAgICAgICB0eXBlb2Ygd2luZG93IDwgInUiICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyIDwgInUiID8gcCA9IHdpbmRvdy5CdWZmZXIgOiBwID0gamkoKS5CdWZmZXI7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICAgIGYuaXNCTiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaSBpbnN0YW5jZW9mIGYgPyB0cnVlIDogaSAhPT0gbnVsbCAmJiB0eXBlb2YgaSA9PSAib2JqZWN0IiAmJiBpLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBmLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkoaS53b3Jkcyk7CiAgICAgIH0sIGYubWF4ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiBpLmNtcChhKSA+IDAgPyBpIDogYTsKICAgICAgfSwgZi5taW4gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIGkuY21wKGEpIDwgMCA/IGkgOiBhOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgaWYgKHR5cGVvZiBpID09ICJudW1iZXIiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIoaSwgYSwgaDMpOwogICAgICAgIGlmICh0eXBlb2YgaSA9PSAib2JqZWN0IikKICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkoaSwgYSwgaDMpOwogICAgICAgIGEgPT09ICJoZXgiICYmIChhID0gMTYpLCByKGEgPT09IChhIHwgMCkgJiYgYSA+PSAyICYmIGEgPD0gMzYpLCBpID0gaS50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCAiIik7CiAgICAgICAgdmFyIHMgPSAwOwogICAgICAgIGlbMF0gPT09ICItIiAmJiAocysrLCB0aGlzLm5lZ2F0aXZlID0gMSksIHMgPCBpLmxlbmd0aCAmJiAoYSA9PT0gMTYgPyB0aGlzLl9wYXJzZUhleChpLCBzLCBoMykgOiAodGhpcy5fcGFyc2VCYXNlKGksIGEsIHMpLCBoMyA9PT0gImxlIiAmJiB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGEsIGgzKSkpOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgaSA8IDAgJiYgKHRoaXMubmVnYXRpdmUgPSAxLCBpID0gLWkpLCBpIDwgNjcxMDg4NjQgPyAodGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjNdLCB0aGlzLmxlbmd0aCA9IDEpIDogaSA8IDQ1MDM1OTk2MjczNzA0OTYgPyAodGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjMsIGkgLyA2NzEwODg2NCAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAyKSA6IChyKGkgPCA5MDA3MTk5MjU0NzQwOTkyKSwgdGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjMsIGkgLyA2NzEwODg2NCAmIDY3MTA4ODYzLCAxXSwgdGhpcy5sZW5ndGggPSAzKSwgaDMgPT09ICJsZSIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBhLCBoMyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbihpLCBhLCBoMykgewogICAgICAgIGlmIChyKHR5cGVvZiBpLmxlbmd0aCA9PSAibnVtYmVyIiksIGkubGVuZ3RoIDw9IDApCiAgICAgICAgICByZXR1cm4gdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxLCB0aGlzOwogICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKGkubGVuZ3RoIC8gMyksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCB0aGlzLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IDA7CiAgICAgICAgdmFyIHUsIGMsIGIyID0gMDsKICAgICAgICBpZiAoaDMgPT09ICJiZSIpCiAgICAgICAgICBmb3IgKHMgPSBpLmxlbmd0aCAtIDEsIHUgPSAwO3MgPj0gMDsgcyAtPSAzKQogICAgICAgICAgICBjID0gaVtzXSB8IGlbcyAtIDFdIDw8IDggfCBpW3MgLSAyXSA8PCAxNiwgdGhpcy53b3Jkc1t1XSB8PSBjIDw8IGIyICYgNjcxMDg4NjMsIHRoaXMud29yZHNbdSArIDFdID0gYyA+Pj4gMjYgLSBiMiAmIDY3MTA4ODYzLCBiMiArPSAyNCwgYjIgPj0gMjYgJiYgKGIyIC09IDI2LCB1KyspOwogICAgICAgIGVsc2UgaWYgKGgzID09PSAibGUiKQogICAgICAgICAgZm9yIChzID0gMCwgdSA9IDA7cyA8IGkubGVuZ3RoOyBzICs9IDMpCiAgICAgICAgICAgIGMgPSBpW3NdIHwgaVtzICsgMV0gPDwgOCB8IGlbcyArIDJdIDw8IDE2LCB0aGlzLndvcmRzW3VdIHw9IGMgPDwgYjIgJiA2NzEwODg2MywgdGhpcy53b3Jkc1t1ICsgMV0gPSBjID4+PiAyNiAtIGIyICYgNjcxMDg4NjMsIGIyICs9IDI0LCBiMiA+PSAyNiAmJiAoYjIgLT0gMjYsIHUrKyk7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gbTIodiwgaSkgewogICAgICAgIHZhciBhID0gdi5jaGFyQ29kZUF0KGkpOwogICAgICAgIHJldHVybiBhID49IDY1ICYmIGEgPD0gNzAgPyBhIC0gNTUgOiBhID49IDk3ICYmIGEgPD0gMTAyID8gYSAtIDg3IDogYSAtIDQ4ICYgMTU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geTIodiwgaSwgYSkgewogICAgICAgIHZhciBoMyA9IG0yKHYsIGEpOwogICAgICAgIHJldHVybiBhIC0gMSA+PSBpICYmIChoMyB8PSBtMih2LCBhIC0gMSkgPDwgNCksIGgzOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKGkubGVuZ3RoIC0gYSkgLyA2KSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IHRoaXMubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gMDsKICAgICAgICB2YXIgdSA9IDAsIGMgPSAwLCBiMjsKICAgICAgICBpZiAoaDMgPT09ICJiZSIpCiAgICAgICAgICBmb3IgKHMgPSBpLmxlbmd0aCAtIDE7cyA+PSBhOyBzIC09IDIpCiAgICAgICAgICAgIGIyID0geTIoaSwgYSwgcykgPDwgdSwgdGhpcy53b3Jkc1tjXSB8PSBiMiAmIDY3MTA4ODYzLCB1ID49IDE4ID8gKHUgLT0gMTgsIGMgKz0gMSwgdGhpcy53b3Jkc1tjXSB8PSBiMiA+Pj4gMjYpIDogdSArPSA4OwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGwgPSBpLmxlbmd0aCAtIGE7CiAgICAgICAgICBmb3IgKHMgPSBsICUgMiA9PT0gMCA/IGEgKyAxIDogYTtzIDwgaS5sZW5ndGg7IHMgKz0gMikKICAgICAgICAgICAgYjIgPSB5MihpLCBhLCBzKSA8PCB1LCB0aGlzLndvcmRzW2NdIHw9IGIyICYgNjcxMDg4NjMsIHUgPj0gMTggPyAodSAtPSAxOCwgYyArPSAxLCB0aGlzLndvcmRzW2NdIHw9IGIyID4+PiAyNikgOiB1ICs9IDg7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gTSh2LCBpLCBhLCBoMykgewogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gTWF0aC5taW4odi5sZW5ndGgsIGEpLCBjID0gaTtjIDwgdTsgYysrKSB7CiAgICAgICAgICB2YXIgYjIgPSB2LmNoYXJDb2RlQXQoYykgLSA0ODsKICAgICAgICAgIHMgKj0gaDMsIGIyID49IDQ5ID8gcyArPSBiMiAtIDQ5ICsgMTAgOiBiMiA+PSAxNyA/IHMgKz0gYjIgLSAxNyArIDEwIDogcyArPSBiMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxOwogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMTt1IDw9IDY3MTA4ODYzOyB1ICo9IGEpCiAgICAgICAgICBzKys7CiAgICAgICAgcy0tLCB1ID0gdSAvIGEgfCAwOwogICAgICAgIGZvciAodmFyIGMgPSBpLmxlbmd0aCAtIGgzLCBiMiA9IGMgJSBzLCBsID0gTWF0aC5taW4oYywgYyAtIGIyKSArIGgzLCBuID0gMCwgZCA9IGgzO2QgPCBsOyBkICs9IHMpCiAgICAgICAgICBuID0gTShpLCBkLCBkICsgcywgYSksIHRoaXMuaW11bG4odSksIHRoaXMud29yZHNbMF0gKyBuIDwgNjcxMDg4NjQgPyB0aGlzLndvcmRzWzBdICs9IG4gOiB0aGlzLl9pYWRkbihuKTsKICAgICAgICBpZiAoYjIgIT09IDApIHsKICAgICAgICAgIHZhciB3ID0gMTsKICAgICAgICAgIGZvciAobiA9IE0oaSwgZCwgaS5sZW5ndGgsIGEpLCBkID0gMDtkIDwgYjI7IGQrKykKICAgICAgICAgICAgdyAqPSBhOwogICAgICAgICAgdGhpcy5pbXVsbih3KSwgdGhpcy53b3Jkc1swXSArIG4gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbiA6IHRoaXMuX2lhZGRuKG4pOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoOyBhKyspCiAgICAgICAgICBpLndvcmRzW2FdID0gdGhpcy53b3Jkc1thXTsKICAgICAgICBpLmxlbmd0aCA9IHRoaXMubGVuZ3RoLCBpLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSwgaS5yZWQgPSB0aGlzLnJlZDsKICAgICAgfSwgZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiB0aGlzLmNvcHkoaSksIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPCBpOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwOyApCiAgICAgICAgICB0aGlzLmxlbmd0aC0tOwogICAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpOwogICAgICB9LCBmLnByb3RvdHlwZS5fbm9ybVNpZ24gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDApLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnJlZCA/ICI8Qk4tUjogIiA6ICI8Qk46ICIpICsgdGhpcy50b1N0cmluZygxNikgKyAiPiI7CiAgICAgIH07CiAgICAgIHZhciB4ID0gWyIiLCAiMCIsICIwMCIsICIwMDAiLCAiMDAwMCIsICIwMDAwMCIsICIwMDAwMDAiLCAiMDAwMDAwMCIsICIwMDAwMDAwMCIsICIwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJdLCBTID0gWzAsIDAsIDI1LCAxNiwgMTIsIDExLCAxMCwgOSwgOCwgOCwgNywgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNV0sIEUyID0gWzAsIDAsIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LCA0MzA0NjcyMSwgMWU3LCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSwgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLCA2NDM2MzQzLCA3OTYyNjI0LCA5NzY1NjI1LCAxMTg4MTM3NiwgMTQzNDg5MDcsIDE3MjEwMzY4LCAyMDUxMTE0OSwgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZdOwogICAgICBmLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpID0gaSB8fCAxMCwgYSA9IGEgfCAwIHx8IDE7CiAgICAgICAgdmFyIGgzOwogICAgICAgIGlmIChpID09PSAxNiB8fCBpID09PSAiaGV4IikgewogICAgICAgICAgaDMgPSAiIjsKICAgICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMCwgYyA9IDA7YyA8IHRoaXMubGVuZ3RoOyBjKyspIHsKICAgICAgICAgICAgdmFyIGIyID0gdGhpcy53b3Jkc1tjXSwgbCA9ICgoYjIgPDwgcyB8IHUpICYgMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgdSA9IGIyID4+PiAyNCAtIHMgJiAxNjc3NzIxNSwgdSAhPT0gMCB8fCBjICE9PSB0aGlzLmxlbmd0aCAtIDEgPyBoMyA9IHhbNiAtIGwubGVuZ3RoXSArIGwgKyBoMyA6IGgzID0gbCArIGgzLCBzICs9IDIsIHMgPj0gMjYgJiYgKHMgLT0gMjYsIGMtLSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHUgIT09IDAgJiYgKGgzID0gdS50b1N0cmluZygxNikgKyBoMyk7aDMubGVuZ3RoICUgYSAhPT0gMDsgKQogICAgICAgICAgICBoMyA9ICIwIiArIGgzOwogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKGgzID0gIi0iICsgaDMpLCBoMzsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT09IChpIHwgMCkgJiYgaSA+PSAyICYmIGkgPD0gMzYpIHsKICAgICAgICAgIHZhciBuID0gU1tpXSwgZCA9IEUyW2ldOwogICAgICAgICAgaDMgPSAiIjsKICAgICAgICAgIHZhciB3ID0gdGhpcy5jbG9uZSgpOwogICAgICAgICAgZm9yICh3Lm5lZ2F0aXZlID0gMDshdy5pc1plcm8oKTsgKSB7CiAgICAgICAgICAgIHZhciBnID0gdy5tb2RuKGQpLnRvU3RyaW5nKGkpOwogICAgICAgICAgICB3ID0gdy5pZGl2bihkKSwgdy5pc1plcm8oKSA/IGgzID0gZyArIGgzIDogaDMgPSB4W24gLSBnLmxlbmd0aF0gKyBnICsgaDM7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHRoaXMuaXNaZXJvKCkgJiYgKGgzID0gIjAiICsgaDMpO2gzLmxlbmd0aCAlIGEgIT09IDA7ICkKICAgICAgICAgICAgaDMgPSAiMCIgKyBoMzsKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIChoMyA9ICItIiArIGgzKSwgaDM7CiAgICAgICAgfQogICAgICAgIHIoZmFsc2UsICJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Iik7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLndvcmRzWzBdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMiA/IGkgKz0gdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMSA/IGkgKz0gNDUwMzU5OTYyNzM3MDQ5NiArIHRoaXMud29yZHNbMV0gKiA2NzEwODg2NCA6IHRoaXMubGVuZ3RoID4gMiAmJiByKGZhbHNlLCAiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzIiksIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtaSA6IGk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHIodHlwZW9mIHAgPCAidSIpLCB0aGlzLnRvQXJyYXlMaWtlKHAsIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbihpLCBhLCBoMykgewogICAgICAgIHZhciBzID0gdGhpcy5ieXRlTGVuZ3RoKCksIHUgPSBoMyB8fCBNYXRoLm1heCgxLCBzKTsKICAgICAgICByKHMgPD0gdSwgImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgiKSwgcih1ID4gMCwgIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpLCB0aGlzLnN0cmlwKCk7CiAgICAgICAgdmFyIGMgPSBhID09PSAibGUiLCBiMiA9IG5ldyBpKHUpLCBsLCBuLCBkID0gdGhpcy5jbG9uZSgpOwogICAgICAgIGlmIChjKSB7CiAgICAgICAgICBmb3IgKG4gPSAwOyFkLmlzWmVybygpOyBuKyspCiAgICAgICAgICAgIGwgPSBkLmFuZGxuKDI1NSksIGQuaXVzaHJuKDgpLCBiMltuXSA9IGw7CiAgICAgICAgICBmb3IgKDtuIDwgdTsgbisrKQogICAgICAgICAgICBiMltuXSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAobiA9IDA7biA8IHUgLSBzOyBuKyspCiAgICAgICAgICAgIGIyW25dID0gMDsKICAgICAgICAgIGZvciAobiA9IDA7IWQuaXNaZXJvKCk7IG4rKykKICAgICAgICAgICAgbCA9IGQuYW5kbG4oMjU1KSwgZC5pdXNocm4oOCksIGIyW3UgLSBuIC0gMV0gPSBsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjI7CiAgICAgIH0sIE1hdGguY2x6MzIgPyBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIoaSk7CiAgICAgIH0gOiBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSwgaDMgPSAwOwogICAgICAgIHJldHVybiBhID49IDQwOTYgJiYgKGgzICs9IDEzLCBhID4+Pj0gMTMpLCBhID49IDY0ICYmIChoMyArPSA3LCBhID4+Pj0gNyksIGEgPj0gOCAmJiAoaDMgKz0gNCwgYSA+Pj49IDQpLCBhID49IDIgJiYgKGgzICs9IDIsIGEgPj4+PSAyKSwgaDMgKyBhOwogICAgICB9LCBmLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICByZXR1cm4gMjY7CiAgICAgICAgdmFyIGEgPSBpLCBoMyA9IDA7CiAgICAgICAgcmV0dXJuIChhICYgODE5MSkgPT09IDAgJiYgKGgzICs9IDEzLCBhID4+Pj0gMTMpLCAoYSAmIDEyNykgPT09IDAgJiYgKGgzICs9IDcsIGEgPj4+PSA3KSwgKGEgJiAxNSkgPT09IDAgJiYgKGgzICs9IDQsIGEgPj4+PSA0KSwgKGEgJiAzKSA9PT0gMCAmJiAoaDMgKz0gMiwgYSA+Pj49IDIpLCAoYSAmIDEpID09PSAwICYmIGgzKyssIGgzOwogICAgICB9LCBmLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSwgYSA9IHRoaXMuX2NvdW50Qml0cyhpKTsKICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGE7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIEIodikgewogICAgICAgIGZvciAodmFyIGkgPSBuZXcgQXJyYXkodi5iaXRMZW5ndGgoKSksIGEgPSAwO2EgPCBpLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICB2YXIgaDMgPSBhIC8gMjYgfCAwLCBzID0gYSAlIDI2OwogICAgICAgICAgaVthXSA9ICh2LndvcmRzW2gzXSAmIDEgPDwgcykgPj4+IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBmb3IgKHZhciBpID0gMCwgYSA9IDA7YSA8IHRoaXMubGVuZ3RoOyBhKyspIHsKICAgICAgICAgIHZhciBoMyA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbYV0pOwogICAgICAgICAgaWYgKGkgKz0gaDMsIGgzICE9PSAyNikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9LCBmLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IHRoaXMuYWJzKCkuaW5vdG4oaSkuaWFkZG4oMSkgOiB0aGlzLmNsb25lKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnRlc3RuKGkgLSAxKSA/IHRoaXMubm90bihpKS5pYWRkbigxKS5pbmVnKCkgOiB0aGlzLmNsb25lKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNaZXJvKCkgfHwgKHRoaXMubmVnYXRpdmUgXj0gMSksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPCBpLmxlbmd0aDsgKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IGkubGVuZ3RoOyBhKyspCiAgICAgICAgICB0aGlzLndvcmRzW2FdID0gdGhpcy53b3Jkc1thXSB8IGkud29yZHNbYV07CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1b3IoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlvcihpKSA6IGkuY2xvbmUoKS5pb3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdW9yKGkpIDogaS5jbG9uZSgpLml1b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyBhID0gaSA6IGEgPSB0aGlzOwogICAgICAgIGZvciAodmFyIGgzID0gMDtoMyA8IGEubGVuZ3RoOyBoMysrKQogICAgICAgICAgdGhpcy53b3Jkc1toM10gPSB0aGlzLndvcmRzW2gzXSAmIGkud29yZHNbaDNdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXVhbmQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pYW5kKGkpIDogaS5jbG9uZSgpLmlhbmQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVhbmQoaSkgOiBpLmNsb25lKCkuaXVhbmQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhLCBoMzsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gKGEgPSB0aGlzLCBoMyA9IGkpIDogKGEgPSBpLCBoMyA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBoMy5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSBhLndvcmRzW3NdIF4gaDMud29yZHNbc107CiAgICAgICAgaWYgKHRoaXMgIT09IGEpCiAgICAgICAgICBmb3IgKDtzIDwgYS5sZW5ndGg7IHMrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IGEud29yZHNbc107CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gYS5sZW5ndGgsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdXhvcihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml4b3IoaSkgOiBpLmNsb25lKCkuaXhvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdXhvcihpKSA6IGkuY2xvbmUoKS5pdXhvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gTWF0aC5jZWlsKGkgLyAyNikgfCAwLCBoMyA9IGkgJSAyNjsKICAgICAgICB0aGlzLl9leHBhbmQoYSksIGgzID4gMCAmJiBhLS07CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGE7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSB+dGhpcy53b3Jkc1tzXSAmIDY3MTA4ODYzOwogICAgICAgIHJldHVybiBoMyA+IDAgJiYgKHRoaXMud29yZHNbc10gPSB+dGhpcy53b3Jkc1tzXSAmIDY3MTA4ODYzID4+IDI2IC0gaDMpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGgzID0gaSAvIDI2IHwgMCwgcyA9IGkgJSAyNjsKICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKGgzICsgMSksIGEgPyB0aGlzLndvcmRzW2gzXSA9IHRoaXMud29yZHNbaDNdIHwgMSA8PCBzIDogdGhpcy53b3Jkc1toM10gPSB0aGlzLndvcmRzW2gzXSAmIH4oMSA8PCBzKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLmlzdWIoaSksIHRoaXMubmVnYXRpdmUgXj0gMSwgdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5pc3ViKGkpLCBpLm5lZ2F0aXZlID0gMSwgYS5fbm9ybVNpZ24oKTsKICAgICAgICB2YXIgaDMsIHM7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IChoMyA9IHRoaXMsIHMgPSBpKSA6IChoMyA9IGksIHMgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciB1ID0gMCwgYyA9IDA7YyA8IHMubGVuZ3RoOyBjKyspCiAgICAgICAgICBhID0gKGgzLndvcmRzW2NdIHwgMCkgKyAocy53b3Jkc1tjXSB8IDApICsgdSwgdGhpcy53b3Jkc1tjXSA9IGEgJiA2NzEwODg2MywgdSA9IGEgPj4+IDI2OwogICAgICAgIGZvciAoO3UgIT09IDAgJiYgYyA8IGgzLmxlbmd0aDsgYysrKQogICAgICAgICAgYSA9IChoMy53b3Jkc1tjXSB8IDApICsgdSwgdGhpcy53b3Jkc1tjXSA9IGEgJiA2NzEwODg2MywgdSA9IGEgPj4+IDI2OwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9IGgzLmxlbmd0aCwgdSAhPT0gMCkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gdSwgdGhpcy5sZW5ndGgrKzsKICAgICAgICBlbHNlIGlmIChoMyAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO2MgPCBoMy5sZW5ndGg7IGMrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tjXSA9IGgzLndvcmRzW2NdOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCA/IChpLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuc3ViKGkpLCBpLm5lZ2F0aXZlIF49IDEsIGEpIDogaS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gKHRoaXMubmVnYXRpdmUgPSAwLCBhID0gaS5zdWIodGhpcyksIHRoaXMubmVnYXRpdmUgPSAxLCBhKSA6IHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFkZChpKSA6IGkuY2xvbmUoKS5pYWRkKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpLm5lZ2F0aXZlICE9PSAwKSB7CiAgICAgICAgICBpLm5lZ2F0aXZlID0gMDsKICAgICAgICAgIHZhciBhID0gdGhpcy5pYWRkKGkpOwogICAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgPSAxLCBhLl9ub3JtU2lnbigpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgICB2YXIgaDMgPSB0aGlzLmNtcChpKTsKICAgICAgICBpZiAoaDMgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMubGVuZ3RoID0gMSwgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXM7CiAgICAgICAgdmFyIHMsIHU7CiAgICAgICAgaDMgPiAwID8gKHMgPSB0aGlzLCB1ID0gaSkgOiAocyA9IGksIHUgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBjID0gMCwgYjIgPSAwO2IyIDwgdS5sZW5ndGg7IGIyKyspCiAgICAgICAgICBhID0gKHMud29yZHNbYjJdIHwgMCkgLSAodS53b3Jkc1tiMl0gfCAwKSArIGMsIGMgPSBhID4+IDI2LCB0aGlzLndvcmRzW2IyXSA9IGEgJiA2NzEwODg2MzsKICAgICAgICBmb3IgKDtjICE9PSAwICYmIGIyIDwgcy5sZW5ndGg7IGIyKyspCiAgICAgICAgICBhID0gKHMud29yZHNbYjJdIHwgMCkgKyBjLCBjID0gYSA+PiAyNiwgdGhpcy53b3Jkc1tiMl0gPSBhICYgNjcxMDg4NjM7CiAgICAgICAgaWYgKGMgPT09IDAgJiYgYjIgPCBzLmxlbmd0aCAmJiBzICE9PSB0aGlzKQogICAgICAgICAgZm9yICg7YjIgPCBzLmxlbmd0aDsgYjIrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tiMl0gPSBzLndvcmRzW2IyXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgYjIpLCBzICE9PSB0aGlzICYmICh0aGlzLm5lZ2F0aXZlID0gMSksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihpKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gcTIodiwgaSwgYSkgewogICAgICAgIGEubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gdi5uZWdhdGl2ZTsKICAgICAgICB2YXIgaDMgPSB2Lmxlbmd0aCArIGkubGVuZ3RoIHwgMDsKICAgICAgICBhLmxlbmd0aCA9IGgzLCBoMyA9IGgzIC0gMSB8IDA7CiAgICAgICAgdmFyIHMgPSB2LndvcmRzWzBdIHwgMCwgdSA9IGkud29yZHNbMF0gfCAwLCBjID0gcyAqIHUsIGIyID0gYyAmIDY3MTA4ODYzLCBsID0gYyAvIDY3MTA4ODY0IHwgMDsKICAgICAgICBhLndvcmRzWzBdID0gYjI7CiAgICAgICAgZm9yICh2YXIgbiA9IDE7biA8IGgzOyBuKyspIHsKICAgICAgICAgIGZvciAodmFyIGQgPSBsID4+PiAyNiwgdyA9IGwgJiA2NzEwODg2MywgZyA9IE1hdGgubWluKG4sIGkubGVuZ3RoIC0gMSksIF8yID0gTWF0aC5tYXgoMCwgbiAtIHYubGVuZ3RoICsgMSk7XzIgPD0gZzsgXzIrKykgewogICAgICAgICAgICB2YXIgQTIgPSBuIC0gXzIgfCAwOwogICAgICAgICAgICBzID0gdi53b3Jkc1tBMl0gfCAwLCB1ID0gaS53b3Jkc1tfMl0gfCAwLCBjID0gcyAqIHUgKyB3LCBkICs9IGMgLyA2NzEwODg2NCB8IDAsIHcgPSBjICYgNjcxMDg4NjM7CiAgICAgICAgICB9CiAgICAgICAgICBhLndvcmRzW25dID0gdyB8IDAsIGwgPSBkIHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGwgIT09IDAgPyBhLndvcmRzW25dID0gbCB8IDAgOiBhLmxlbmd0aC0tLCBhLnN0cmlwKCk7CiAgICAgIH0KICAgICAgdmFyIEwyID0gZnVuY3Rpb24oaSwgYSwgaDMpIHsKICAgICAgICB2YXIgcyA9IGkud29yZHMsIHUgPSBhLndvcmRzLCBjID0gaDMud29yZHMsIGIyID0gMCwgbCwgbiwgZCwgdyA9IHNbMF0gfCAwLCBnID0gdyAmIDgxOTEsIF8yID0gdyA+Pj4gMTMsIEEyID0gc1sxXSB8IDAsIFIyID0gQTIgJiA4MTkxLCBJID0gQTIgPj4+IDEzLCBNZSA9IHNbMl0gfCAwLCBrID0gTWUgJiA4MTkxLCBEMiA9IE1lID4+PiAxMywgbnQgPSBzWzNdIHwgMCwgQzIgPSBudCAmIDgxOTEsIE8gPSBudCA+Pj4gMTMsIHZ0ID0gc1s0XSB8IDAsIEYgPSB2dCAmIDgxOTEsIFUgPSB2dCA+Pj4gMTMsIGJ0ID0gc1s1XSB8IDAsIHoyID0gYnQgJiA4MTkxLCBIID0gYnQgPj4+IDEzLCBtdCA9IHNbNl0gfCAwLCBXID0gbXQgJiA4MTkxLCBLID0gbXQgPj4+IDEzLCBndCA9IHNbN10gfCAwLCBqID0gZ3QgJiA4MTkxLCBaID0gZ3QgPj4+IDEzLCB5dCA9IHNbOF0gfCAwLCBWID0geXQgJiA4MTkxLCAkID0geXQgPj4+IDEzLCB3dCA9IHNbOV0gfCAwLCBHID0gd3QgJiA4MTkxLCBZID0gd3QgPj4+IDEzLCBNdCA9IHVbMF0gfCAwLCBYID0gTXQgJiA4MTkxLCBKID0gTXQgPj4+IDEzLCBfdCA9IHVbMV0gfCAwLCBRID0gX3QgJiA4MTkxLCBlZSA9IF90ID4+PiAxMywgeHQgPSB1WzJdIHwgMCwgdGUgPSB4dCAmIDgxOTEsIHJlID0geHQgPj4+IDEzLCBTdCA9IHVbM10gfCAwLCBpZSA9IFN0ICYgODE5MSwgbmUgPSBTdCA+Pj4gMTMsIEV0ID0gdVs0XSB8IDAsIGZlID0gRXQgJiA4MTkxLCBhZSA9IEV0ID4+PiAxMywgQXQgPSB1WzVdIHwgMCwgb2UgPSBBdCAmIDgxOTEsIHNlID0gQXQgPj4+IDEzLCBSdCA9IHVbNl0gfCAwLCBoZSA9IFJ0ICYgODE5MSwgdWUgPSBSdCA+Pj4gMTMsIEJ0ID0gdVs3XSB8IDAsIGxlID0gQnQgJiA4MTkxLCBkZSA9IEJ0ID4+PiAxMywgcXQgPSB1WzhdIHwgMCwgY2UgPSBxdCAmIDgxOTEsIHBlID0gcXQgPj4+IDEzLCBJdCA9IHVbOV0gfCAwLCB2ZSA9IEl0ICYgODE5MSwgYmUgPSBJdCA+Pj4gMTM7CiAgICAgICAgaDMubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gYS5uZWdhdGl2ZSwgaDMubGVuZ3RoID0gMTksIGwgPSBNYXRoLmltdWwoZywgWCksIG4gPSBNYXRoLmltdWwoZywgSiksIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoXzIsIEopOwogICAgICAgIHZhciBmdCA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChmdCA+Pj4gMjYpIHwgMCwgZnQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoUjIsIFgpLCBuID0gTWF0aC5pbXVsKFIyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEksIEopLCBsID0gbCArIE1hdGguaW11bChnLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBlZSkgfCAwOwogICAgICAgIHZhciBCZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChCZSA+Pj4gMjYpIHwgMCwgQmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoaywgWCksIG4gPSBNYXRoLmltdWwoaywgSiksIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoRDIsIEopLCBsID0gbCArIE1hdGguaW11bChSMiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMiwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzIsIHJlKSB8IDA7CiAgICAgICAgdmFyIHFlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHFlID4+PiAyNikgfCAwLCBxZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChDMiwgWCksIG4gPSBNYXRoLmltdWwoQzIsIEopLCBuID0gbiArIE1hdGguaW11bChPLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoTywgSiksIGwgPSBsICsgTWF0aC5pbXVsKGssIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzIsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8yLCBuZSkgfCAwOwogICAgICAgIHZhciB6ZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArICh6ZSA+Pj4gMjYpIHwgMCwgemUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRiwgWCksIG4gPSBNYXRoLmltdWwoRiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKFUsIFgpIHwgMCwgZCA9IE1hdGguaW11bChVLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgYWUpIHwgMDsKICAgICAgICB2YXIgSGUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoSGUgPj4+IDI2KSB8IDAsIEhlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKHoyLCBYKSwgbiA9IE1hdGguaW11bCh6MiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKEgsIFgpIHwgMCwgZCA9IE1hdGguaW11bChILCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoRiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgc2UpIHwgMDsKICAgICAgICB2YXIgV2UgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoV2UgPj4+IDI2KSB8IDAsIFdlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFcsIFgpLCBuID0gTWF0aC5pbXVsKFcsIEopLCBuID0gbiArIE1hdGguaW11bChLLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSywgSiksIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgdWUpIHwgMDsKICAgICAgICB2YXIgS2UgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoS2UgPj4+IDI2KSB8IDAsIEtlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKGosIFgpLCBuID0gTWF0aC5pbXVsKGosIEopLCBuID0gbiArIE1hdGguaW11bChaLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoWiwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFcsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgZGUpIHwgMDsKICAgICAgICB2YXIgamUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoamUgPj4+IDI2KSB8IDAsIGplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFYsIFgpLCBuID0gTWF0aC5pbXVsKFYsIEopLCBuID0gbiArIE1hdGguaW11bCgkLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoJCwgSiksIGwgPSBsICsgTWF0aC5pbXVsKGosIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgcGUpIHwgMDsKICAgICAgICB2YXIgWmUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWmUgPj4+IDI2KSB8IDAsIFplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIFgpLCBuID0gTWF0aC5pbXVsKEcsIEopLCBuID0gbiArIE1hdGguaW11bChZLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFYsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8yLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMiwgYmUpIHwgMDsKICAgICAgICB2YXIgVmUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoVmUgPj4+IDI2KSB8IDAsIFZlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIFEpLCBuID0gTWF0aC5pbXVsKEcsIGVlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgUSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGVlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBiZSkgfCAwOwogICAgICAgIHZhciAkZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArICgkZSA+Pj4gMjYpIHwgMCwgJGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgdGUpLCBuID0gTWF0aC5pbXVsKEcsIHJlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgdGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCByZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGJlKSB8IDA7CiAgICAgICAgdmFyIEdlID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEdlID4+PiAyNikgfCAwLCBHZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBpZSksIG4gPSBNYXRoLmltdWwoRywgbmUpLCBuID0gbiArIE1hdGguaW11bChZLCBpZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIG5lKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGJlKSB8IDA7CiAgICAgICAgdmFyIFllID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFllID4+PiAyNikgfCAwLCBZZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBmZSksIG4gPSBNYXRoLmltdWwoRywgYWUpLCBuID0gbiArIE1hdGguaW11bChZLCBmZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGFlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBiZSkgfCAwOwogICAgICAgIHZhciBYZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChYZSA+Pj4gMjYpIHwgMCwgWGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgb2UpLCBuID0gTWF0aC5pbXVsKEcsIHNlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgb2UpIHwgMCwgZCA9IE1hdGguaW11bChZLCBzZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgYmUpIHwgMDsKICAgICAgICB2YXIgSmUgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoSmUgPj4+IDI2KSB8IDAsIEplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGhlKSwgbiA9IE1hdGguaW11bChHLCB1ZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGhlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgdWUpLCBsID0gbCArIE1hdGguaW11bChWLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBiZSkgfCAwOwogICAgICAgIHZhciBRZSA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjIgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChRZSA+Pj4gMjYpIHwgMCwgUWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgbGUpLCBuID0gTWF0aC5pbXVsKEcsIGRlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgbGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBkZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGJlKSB8IDA7CiAgICAgICAgdmFyIGV0ID0gKGIyICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMiA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGV0ID4+PiAyNikgfCAwLCBldCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBjZSksIG4gPSBNYXRoLmltdWwoRywgcGUpLCBuID0gbiArIE1hdGguaW11bChZLCBjZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHBlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgYmUpIHwgMDsKICAgICAgICB2YXIgdHQgPSAoYjIgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAodHQgPj4+IDI2KSB8IDAsIHR0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIHZlKSwgbiA9IE1hdGguaW11bChHLCBiZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIHZlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgYmUpOwogICAgICAgIHZhciBydCA9IChiMiArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgcmV0dXJuIGIyID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAocnQgPj4+IDI2KSB8IDAsIHJ0ICY9IDY3MTA4ODYzLCBjWzBdID0gZnQsIGNbMV0gPSBCZSwgY1syXSA9IHFlLCBjWzNdID0gemUsIGNbNF0gPSBIZSwgY1s1XSA9IFdlLCBjWzZdID0gS2UsIGNbN10gPSBqZSwgY1s4XSA9IFplLCBjWzldID0gVmUsIGNbMTBdID0gJGUsIGNbMTFdID0gR2UsIGNbMTJdID0gWWUsIGNbMTNdID0gWGUsIGNbMTRdID0gSmUsIGNbMTVdID0gUWUsIGNbMTZdID0gZXQsIGNbMTddID0gdHQsIGNbMThdID0gcnQsIGIyICE9PSAwICYmIChjWzE5XSA9IGIyLCBoMy5sZW5ndGgrKyksIGgzOwogICAgICB9OwogICAgICBNYXRoLmltdWwgfHwgKEwyID0gcTIpOwogICAgICBmdW5jdGlvbiBnZSh2LCBpLCBhKSB7CiAgICAgICAgYS5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiB2Lm5lZ2F0aXZlLCBhLmxlbmd0aCA9IHYubGVuZ3RoICsgaS5sZW5ndGg7CiAgICAgICAgZm9yICh2YXIgaDMgPSAwLCBzID0gMCwgdSA9IDA7dSA8IGEubGVuZ3RoIC0gMTsgdSsrKSB7CiAgICAgICAgICB2YXIgYyA9IHM7CiAgICAgICAgICBzID0gMDsKICAgICAgICAgIGZvciAodmFyIGIyID0gaDMgJiA2NzEwODg2MywgbCA9IE1hdGgubWluKHUsIGkubGVuZ3RoIC0gMSksIG4gPSBNYXRoLm1heCgwLCB1IC0gdi5sZW5ndGggKyAxKTtuIDw9IGw7IG4rKykgewogICAgICAgICAgICB2YXIgZCA9IHUgLSBuLCB3ID0gdi53b3Jkc1tkXSB8IDAsIGcgPSBpLndvcmRzW25dIHwgMCwgXzIgPSB3ICogZywgQTIgPSBfMiAmIDY3MTA4ODYzOwogICAgICAgICAgICBjID0gYyArIChfMiAvIDY3MTA4ODY0IHwgMCkgfCAwLCBBMiA9IEEyICsgYjIgfCAwLCBiMiA9IEEyICYgNjcxMDg4NjMsIGMgPSBjICsgKEEyID4+PiAyNikgfCAwLCBzICs9IGMgPj4+IDI2LCBjICY9IDY3MTA4ODYzOwogICAgICAgICAgfQogICAgICAgICAgYS53b3Jkc1t1XSA9IGIyLCBoMyA9IGMsIGMgPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaDMgIT09IDAgPyBhLndvcmRzW3VdID0gaDMgOiBhLmxlbmd0aC0tLCBhLnN0cmlwKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2UodiwgaSwgYSkgewogICAgICAgIHZhciBoMyA9IG5ldyBOOwogICAgICAgIHJldHVybiBoMy5tdWxwKHYsIGksIGEpOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMywgcyA9IHRoaXMubGVuZ3RoICsgaS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxMCAmJiBpLmxlbmd0aCA9PT0gMTAgPyBoMyA9IEwyKHRoaXMsIGksIGEpIDogcyA8IDYzID8gaDMgPSBxMih0aGlzLCBpLCBhKSA6IHMgPCAxMDI0ID8gaDMgPSBnZSh0aGlzLCBpLCBhKSA6IGgzID0gX2UodGhpcywgaSwgYSksIGgzOwogICAgICB9OwogICAgICBmdW5jdGlvbiBOKHYsIGkpIHsKICAgICAgICB0aGlzLnggPSB2LCB0aGlzLnkgPSBpOwogICAgICB9CiAgICAgIE4ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IG5ldyBBcnJheShpKSwgaDMgPSBmLnByb3RvdHlwZS5fY291bnRCaXRzKGkpIC0gMSwgcyA9IDA7cyA8IGk7IHMrKykKICAgICAgICAgIGFbc10gPSB0aGlzLnJldkJpbihzLCBoMywgaSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIE4ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gaDMgLSAxKQogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAwO3UgPCBhOyB1KyspCiAgICAgICAgICBzIHw9IChpICYgMSkgPDwgYSAtIHUgLSAxLCBpID4+PSAxOwogICAgICAgIHJldHVybiBzOwogICAgICB9LCBOLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24oaSwgYSwgaDMsIHMsIHUsIGMpIHsKICAgICAgICBmb3IgKHZhciBiMiA9IDA7YjIgPCBjOyBiMisrKQogICAgICAgICAgc1tiMl0gPSBhW2lbYjJdXSwgdVtiMl0gPSBoM1tpW2IyXV07CiAgICAgIH0sIE4ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGksIGEsIGgzLCBzLCB1LCBjKSB7CiAgICAgICAgdGhpcy5wZXJtdXRlKGMsIGksIGEsIGgzLCBzLCB1KTsKICAgICAgICBmb3IgKHZhciBiMiA9IDE7YjIgPCB1OyBiMiA8PD0gMSkKICAgICAgICAgIGZvciAodmFyIGwgPSBiMiA8PCAxLCBuID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKSwgZCA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCksIHcgPSAwO3cgPCB1OyB3ICs9IGwpCiAgICAgICAgICAgIGZvciAodmFyIGcgPSBuLCBfMiA9IGQsIEEyID0gMDtBMiA8IGIyOyBBMisrKSB7CiAgICAgICAgICAgICAgdmFyIFIyID0gaDNbdyArIEEyXSwgSSA9IHNbdyArIEEyXSwgTWUgPSBoM1t3ICsgQTIgKyBiMl0sIGsgPSBzW3cgKyBBMiArIGIyXSwgRDIgPSBnICogTWUgLSBfMiAqIGs7CiAgICAgICAgICAgICAgayA9IGcgKiBrICsgXzIgKiBNZSwgTWUgPSBEMiwgaDNbdyArIEEyXSA9IFIyICsgTWUsIHNbdyArIEEyXSA9IEkgKyBrLCBoM1t3ICsgQTIgKyBiMl0gPSBSMiAtIE1lLCBzW3cgKyBBMiArIGIyXSA9IEkgLSBrLCBBMiAhPT0gbCAmJiAoRDIgPSBuICogZyAtIGQgKiBfMiwgXzIgPSBuICogXzIgKyBkICogZywgZyA9IEQyKTsKICAgICAgICAgICAgfQogICAgICB9LCBOLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDMgPSBNYXRoLm1heChhLCBpKSB8IDEsIHMgPSBoMyAmIDEsIHUgPSAwOwogICAgICAgIGZvciAoaDMgPSBoMyAvIDIgfCAwO2gzOyBoMyA9IGgzID4+PiAxKQogICAgICAgICAgdSsrOwogICAgICAgIHJldHVybiAxIDw8IHUgKyAxICsgczsKICAgICAgfSwgTi5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24oaSwgYSwgaDMpIHsKICAgICAgICBpZiAoIShoMyA8PSAxKSkKICAgICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBoMyAvIDI7IHMrKykgewogICAgICAgICAgICB2YXIgdSA9IGlbc107CiAgICAgICAgICAgIGlbc10gPSBpW2gzIC0gcyAtIDFdLCBpW2gzIC0gcyAtIDFdID0gdSwgdSA9IGFbc10sIGFbc10gPSAtYVtoMyAtIHMgLSAxXSwgYVtoMyAtIHMgLSAxXSA9IC11OwogICAgICAgICAgfQogICAgICB9LCBOLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgZm9yICh2YXIgaDMgPSAwLCBzID0gMDtzIDwgYSAvIDI7IHMrKykgewogICAgICAgICAgdmFyIHUgPSBNYXRoLnJvdW5kKGlbMiAqIHMgKyAxXSAvIGEpICogODE5MiArIE1hdGgucm91bmQoaVsyICogc10gLyBhKSArIGgzOwogICAgICAgICAgaVtzXSA9IHUgJiA2NzEwODg2MywgdSA8IDY3MTA4ODY0ID8gaDMgPSAwIDogaDMgPSB1IC8gNjcxMDg4NjQgfCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfSwgTi5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uKGksIGEsIGgzLCBzKSB7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBhOyBjKyspCiAgICAgICAgICB1ID0gdSArIChpW2NdIHwgMCksIGgzWzIgKiBjXSA9IHUgJiA4MTkxLCB1ID0gdSA+Pj4gMTMsIGgzWzIgKiBjICsgMV0gPSB1ICYgODE5MSwgdSA9IHUgPj4+IDEzOwogICAgICAgIGZvciAoYyA9IDIgKiBhO2MgPCBzOyArK2MpCiAgICAgICAgICBoM1tjXSA9IDA7CiAgICAgICAgcih1ID09PSAwKSwgcigodSAmIC04MTkyKSA9PT0gMCk7CiAgICAgIH0sIE4ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IG5ldyBBcnJheShpKSwgaDMgPSAwO2gzIDwgaTsgaDMrKykKICAgICAgICAgIGFbaDNdID0gMDsKICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgTi5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgdmFyIHMgPSAyICogdGhpcy5ndWVzc0xlbjEzYihpLmxlbmd0aCwgYS5sZW5ndGgpLCB1ID0gdGhpcy5tYWtlUkJUKHMpLCBjID0gdGhpcy5zdHViKHMpLCBiMiA9IG5ldyBBcnJheShzKSwgbCA9IG5ldyBBcnJheShzKSwgbiA9IG5ldyBBcnJheShzKSwgZCA9IG5ldyBBcnJheShzKSwgdyA9IG5ldyBBcnJheShzKSwgZyA9IG5ldyBBcnJheShzKSwgXzIgPSBoMy53b3JkczsKICAgICAgICBfMi5sZW5ndGggPSBzLCB0aGlzLmNvbnZlcnQxM2IoaS53b3JkcywgaS5sZW5ndGgsIGIyLCBzKSwgdGhpcy5jb252ZXJ0MTNiKGEud29yZHMsIGEubGVuZ3RoLCBkLCBzKSwgdGhpcy50cmFuc2Zvcm0oYjIsIGMsIGwsIG4sIHMsIHUpLCB0aGlzLnRyYW5zZm9ybShkLCBjLCB3LCBnLCBzLCB1KTsKICAgICAgICBmb3IgKHZhciBBMiA9IDA7QTIgPCBzOyBBMisrKSB7CiAgICAgICAgICB2YXIgUjIgPSBsW0EyXSAqIHdbQTJdIC0gbltBMl0gKiBnW0EyXTsKICAgICAgICAgIG5bQTJdID0gbFtBMl0gKiBnW0EyXSArIG5bQTJdICogd1tBMl0sIGxbQTJdID0gUjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNvbmp1Z2F0ZShsLCBuLCBzKSwgdGhpcy50cmFuc2Zvcm0obCwgbiwgXzIsIGMsIHMsIHUpLCB0aGlzLmNvbmp1Z2F0ZShfMiwgYywgcyksIHRoaXMubm9ybWFsaXplMTNiKF8yLCBzKSwgaDMubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gYS5uZWdhdGl2ZSwgaDMubGVuZ3RoID0gaS5sZW5ndGggKyBhLmxlbmd0aCwgaDMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGEud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBpLmxlbmd0aCksIHRoaXMubXVsVG8oaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gYS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIGkubGVuZ3RoKSwgX2UodGhpcywgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhpLCB0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDMgPSAwO2gzIDwgdGhpcy5sZW5ndGg7IGgzKyspIHsKICAgICAgICAgIHZhciBzID0gKHRoaXMud29yZHNbaDNdIHwgMCkgKiBpLCB1ID0gKHMgJiA2NzEwODg2MykgKyAoYSAmIDY3MTA4ODYzKTsKICAgICAgICAgIGEgPj49IDI2LCBhICs9IHMgLyA2NzEwODg2NCB8IDAsIGEgKz0gdSA+Pj4gMjYsIHRoaXMud29yZHNbaDNdID0gdSAmIDY3MTA4ODYzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYSAhPT0gMCAmJiAodGhpcy53b3Jkc1toM10gPSBhLCB0aGlzLmxlbmd0aCsrKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IEIoaSk7CiAgICAgICAgaWYgKGEubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpOwogICAgICAgIGZvciAodmFyIGgzID0gdGhpcywgcyA9IDA7cyA8IGEubGVuZ3RoICYmIGFbc10gPT09IDA7IHMrKywgaDMgPSBoMy5zcXIoKSkKICAgICAgICAgIDsKICAgICAgICBpZiAoKytzIDwgYS5sZW5ndGgpCiAgICAgICAgICBmb3IgKHZhciB1ID0gaDMuc3FyKCk7cyA8IGEubGVuZ3RoOyBzKyssIHUgPSB1LnNxcigpKQogICAgICAgICAgICBhW3NdICE9PSAwICYmIChoMyA9IGgzLm11bCh1KSk7CiAgICAgICAgcmV0dXJuIGgzOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMyA9IChpIC0gYSkgLyAyNiwgcyA9IDY3MTA4ODYzID4+PiAyNiAtIGEgPDwgMjYgLSBhLCB1OwogICAgICAgIGlmIChhICE9PSAwKSB7CiAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICBmb3IgKHUgPSAwO3UgPCB0aGlzLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgIHZhciBiMiA9IHRoaXMud29yZHNbdV0gJiBzLCBsID0gKHRoaXMud29yZHNbdV0gfCAwKSAtIGIyIDw8IGE7CiAgICAgICAgICAgIHRoaXMud29yZHNbdV0gPSBsIHwgYywgYyA9IGIyID4+PiAyNiAtIGE7CiAgICAgICAgICB9CiAgICAgICAgICBjICYmICh0aGlzLndvcmRzW3VdID0gYywgdGhpcy5sZW5ndGgrKyk7CiAgICAgICAgfQogICAgICAgIGlmIChoMyAhPT0gMCkgewogICAgICAgICAgZm9yICh1ID0gdGhpcy5sZW5ndGggLSAxO3UgPj0gMDsgdS0tKQogICAgICAgICAgICB0aGlzLndvcmRzW3UgKyBoM10gPSB0aGlzLndvcmRzW3VdOwogICAgICAgICAgZm9yICh1ID0gMDt1IDwgaDM7IHUrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1t1XSA9IDA7CiAgICAgICAgICB0aGlzLmxlbmd0aCArPSBoMzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbihpLCBhLCBoMykgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgczsKICAgICAgICBhID8gcyA9IChhIC0gYSAlIDI2KSAvIDI2IDogcyA9IDA7CiAgICAgICAgdmFyIHUgPSBpICUgMjYsIGMgPSBNYXRoLm1pbigoaSAtIHUpIC8gMjYsIHRoaXMubGVuZ3RoKSwgYjIgPSA2NzEwODg2MyBeIDY3MTA4ODYzID4+PiB1IDw8IHUsIGwgPSBoMzsKICAgICAgICBpZiAocyAtPSBjLCBzID0gTWF0aC5tYXgoMCwgcyksIGwpIHsKICAgICAgICAgIGZvciAodmFyIG4gPSAwO24gPCBjOyBuKyspCiAgICAgICAgICAgIGwud29yZHNbbl0gPSB0aGlzLndvcmRzW25dOwogICAgICAgICAgbC5sZW5ndGggPSBjOwogICAgICAgIH0KICAgICAgICBpZiAoYyAhPT0gMCkKICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGMpCiAgICAgICAgICAgIGZvciAodGhpcy5sZW5ndGggLT0gYywgbiA9IDA7biA8IHRoaXMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgdGhpcy53b3Jkc1tuXSA9IHRoaXMud29yZHNbbiArIGNdOwogICAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxOwogICAgICAgIHZhciBkID0gMDsKICAgICAgICBmb3IgKG4gPSB0aGlzLmxlbmd0aCAtIDE7biA+PSAwICYmIChkICE9PSAwIHx8IG4gPj0gcyk7IG4tLSkgewogICAgICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW25dIHwgMDsKICAgICAgICAgIHRoaXMud29yZHNbbl0gPSBkIDw8IDI2IC0gdSB8IHcgPj4+IHUsIGQgPSB3ICYgYjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsICYmIGQgIT09IDAgJiYgKGwud29yZHNbbC5sZW5ndGgrK10gPSBkKSwgdGhpcy5sZW5ndGggPT09IDAgJiYgKHRoaXMud29yZHNbMF0gPSAwLCB0aGlzLmxlbmd0aCA9IDEpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24oaSwgYSwgaDMpIHsKICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNocm4oaSwgYSwgaDMpOwogICAgICB9LCBmLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgzID0gKGkgLSBhKSAvIDI2LCBzID0gMSA8PCBhOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSBoMykKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgdSA9IHRoaXMud29yZHNbaDNdOwogICAgICAgIHJldHVybiAhISh1ICYgcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgzID0gKGkgLSBhKSAvIDI2OwogICAgICAgIGlmIChyKHRoaXMubmVnYXRpdmUgPT09IDAsICJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMiKSwgdGhpcy5sZW5ndGggPD0gaDMpCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICBpZiAoYSAhPT0gMCAmJiBoMysrLCB0aGlzLmxlbmd0aCA9IE1hdGgubWluKGgzLCB0aGlzLmxlbmd0aCksIGEgIT09IDApIHsKICAgICAgICAgIHZhciBzID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4gYSA8PCBhOwogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KSwgaSA8IDAgPyB0aGlzLmlzdWJuKC1pKSA6IHRoaXMubmVnYXRpdmUgIT09IDAgPyB0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgaSA/ICh0aGlzLndvcmRzWzBdID0gaSAtICh0aGlzLndvcmRzWzBdIHwgMCksIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzKSA6ICh0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pc3VibihpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMpIDogdGhpcy5faWFkZG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB0aGlzLndvcmRzWzBdICs9IGk7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbYV0gPj0gNjcxMDg4NjQ7IGErKykKICAgICAgICAgIHRoaXMud29yZHNbYV0gLT0gNjcxMDg4NjQsIGEgPT09IHRoaXMubGVuZ3RoIC0gMSA/IHRoaXMud29yZHNbYSArIDFdID0gMSA6IHRoaXMud29yZHNbYSArIDFdKys7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGEgKyAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCksIGkgPCAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuaWFkZG4oLWkpOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGRuKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpczsKICAgICAgICBpZiAodGhpcy53b3Jkc1swXSAtPSBpLCB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkKICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXSwgdGhpcy5uZWdhdGl2ZSA9IDE7CiAgICAgICAgZWxzZQogICAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbYV0gPCAwOyBhKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbYV0gKz0gNjcxMDg4NjQsIHRoaXMud29yZHNbYSArIDFdIC09IDE7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpOwogICAgICB9LCBmLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbihpLCBhLCBoMykgewogICAgICAgIHZhciBzID0gaS5sZW5ndGggKyBoMywgdTsKICAgICAgICB0aGlzLl9leHBhbmQocyk7CiAgICAgICAgdmFyIGMsIGIyID0gMDsKICAgICAgICBmb3IgKHUgPSAwO3UgPCBpLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICBjID0gKHRoaXMud29yZHNbdSArIGgzXSB8IDApICsgYjI7CiAgICAgICAgICB2YXIgbCA9IChpLndvcmRzW3VdIHwgMCkgKiBhOwogICAgICAgICAgYyAtPSBsICYgNjcxMDg4NjMsIGIyID0gKGMgPj4gMjYpIC0gKGwgLyA2NzEwODg2NCB8IDApLCB0aGlzLndvcmRzW3UgKyBoM10gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgfQogICAgICAgIGZvciAoO3UgPCB0aGlzLmxlbmd0aCAtIGgzOyB1KyspCiAgICAgICAgICBjID0gKHRoaXMud29yZHNbdSArIGgzXSB8IDApICsgYjIsIGIyID0gYyA+PiAyNiwgdGhpcy53b3Jkc1t1ICsgaDNdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIGlmIChiMiA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgICAgZm9yIChyKGIyID09PSAtMSksIGIyID0gMCwgdSA9IDA7dSA8IHRoaXMubGVuZ3RoOyB1KyspCiAgICAgICAgICBjID0gLSh0aGlzLndvcmRzW3VdIHwgMCkgKyBiMiwgYjIgPSBjID4+IDI2LCB0aGlzLndvcmRzW3VdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDMgPSB0aGlzLmxlbmd0aCAtIGkubGVuZ3RoLCBzID0gdGhpcy5jbG9uZSgpLCB1ID0gaSwgYyA9IHUud29yZHNbdS5sZW5ndGggLSAxXSB8IDAsIGIyID0gdGhpcy5fY291bnRCaXRzKGMpOwogICAgICAgIGgzID0gMjYgLSBiMiwgaDMgIT09IDAgJiYgKHUgPSB1LnVzaGxuKGgzKSwgcy5pdXNobG4oaDMpLCBjID0gdS53b3Jkc1t1Lmxlbmd0aCAtIDFdIHwgMCk7CiAgICAgICAgdmFyIGwgPSBzLmxlbmd0aCAtIHUubGVuZ3RoLCBuOwogICAgICAgIGlmIChhICE9PSAibW9kIikgewogICAgICAgICAgbiA9IG5ldyBmKG51bGwpLCBuLmxlbmd0aCA9IGwgKyAxLCBuLndvcmRzID0gbmV3IEFycmF5KG4ubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGQgPSAwO2QgPCBuLmxlbmd0aDsgZCsrKQogICAgICAgICAgICBuLndvcmRzW2RdID0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIHcgPSBzLmNsb25lKCkuX2lzaGxuc3VibXVsKHUsIDEsIGwpOwogICAgICAgIHcubmVnYXRpdmUgPT09IDAgJiYgKHMgPSB3LCBuICYmIChuLndvcmRzW2xdID0gMSkpOwogICAgICAgIGZvciAodmFyIGcgPSBsIC0gMTtnID49IDA7IGctLSkgewogICAgICAgICAgdmFyIF8yID0gKHMud29yZHNbdS5sZW5ndGggKyBnXSB8IDApICogNjcxMDg4NjQgKyAocy53b3Jkc1t1Lmxlbmd0aCArIGcgLSAxXSB8IDApOwogICAgICAgICAgZm9yIChfMiA9IE1hdGgubWluKF8yIC8gYyB8IDAsIDY3MTA4ODYzKSwgcy5faXNobG5zdWJtdWwodSwgXzIsIGcpO3MubmVnYXRpdmUgIT09IDA7ICkKICAgICAgICAgICAgXzItLSwgcy5uZWdhdGl2ZSA9IDAsIHMuX2lzaGxuc3VibXVsKHUsIDEsIGcpLCBzLmlzWmVybygpIHx8IChzLm5lZ2F0aXZlIF49IDEpOwogICAgICAgICAgbiAmJiAobi53b3Jkc1tnXSA9IF8yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4gJiYgbi5zdHJpcCgpLCBzLnN0cmlwKCksIGEgIT09ICJkaXYiICYmIGgzICE9PSAwICYmIHMuaXVzaHJuKGgzKSwgeyBkaXY6IG4gfHwgbnVsbCwgbW9kOiBzIH07CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uKGksIGEsIGgzKSB7CiAgICAgICAgaWYgKHIoIWkuaXNaZXJvKCkpLCB0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHsgZGl2OiBuZXcgZigwKSwgbW9kOiBuZXcgZigwKSB9OwogICAgICAgIHZhciBzLCB1LCBjOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDAgPyAoYyA9IHRoaXMubmVnKCkuZGl2bW9kKGksIGEpLCBhICE9PSAibW9kIiAmJiAocyA9IGMuZGl2Lm5lZygpKSwgYSAhPT0gImRpdiIgJiYgKHUgPSBjLm1vZC5uZWcoKSwgaDMgJiYgdS5uZWdhdGl2ZSAhPT0gMCAmJiB1LmlhZGQoaSkpLCB7IGRpdjogcywgbW9kOiB1IH0pIDogdGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwID8gKGMgPSB0aGlzLmRpdm1vZChpLm5lZygpLCBhKSwgYSAhPT0gIm1vZCIgJiYgKHMgPSBjLmRpdi5uZWcoKSksIHsgZGl2OiBzLCBtb2Q6IGMubW9kIH0pIDogKHRoaXMubmVnYXRpdmUgJiBpLm5lZ2F0aXZlKSAhPT0gMCA/IChjID0gdGhpcy5uZWcoKS5kaXZtb2QoaS5uZWcoKSwgYSksIGEgIT09ICJkaXYiICYmICh1ID0gYy5tb2QubmVnKCksIGgzICYmIHUubmVnYXRpdmUgIT09IDAgJiYgdS5pc3ViKGkpKSwgeyBkaXY6IGMuZGl2LCBtb2Q6IHUgfSkgOiBpLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKGkpIDwgMCA/IHsgZGl2OiBuZXcgZigwKSwgbW9kOiB0aGlzIH0gOiBpLmxlbmd0aCA9PT0gMSA/IGEgPT09ICJkaXYiID8geyBkaXY6IHRoaXMuZGl2bihpLndvcmRzWzBdKSwgbW9kOiBudWxsIH0gOiBhID09PSAibW9kIiA/IHsgZGl2OiBudWxsLCBtb2Q6IG5ldyBmKHRoaXMubW9kbihpLndvcmRzWzBdKSkgfSA6IHsgZGl2OiB0aGlzLmRpdm4oaS53b3Jkc1swXSksIG1vZDogbmV3IGYodGhpcy5tb2RuKGkud29yZHNbMF0pKSB9IDogdGhpcy5fd29yZERpdihpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAiZGl2IiwgZmFsc2UpLmRpdjsKICAgICAgfSwgZi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAibW9kIiwgZmFsc2UpLm1vZDsKICAgICAgfSwgZi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgIm1vZCIsIHRydWUpLm1vZDsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmRpdm1vZChpKTsKICAgICAgICBpZiAoYS5tb2QuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gYS5kaXY7CiAgICAgICAgdmFyIGgzID0gYS5kaXYubmVnYXRpdmUgIT09IDAgPyBhLm1vZC5pc3ViKGkpIDogYS5tb2QsIHMgPSBpLnVzaHJuKDEpLCB1ID0gaS5hbmRsbigxKSwgYyA9IGgzLmNtcChzKTsKICAgICAgICByZXR1cm4gYyA8IDAgfHwgdSA9PT0gMSAmJiBjID09PSAwID8gYS5kaXYgOiBhLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGEuZGl2LmlzdWJuKDEpIDogYS5kaXYuaWFkZG4oMSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpIDw9IDY3MTA4ODYzKTsKICAgICAgICBmb3IgKHZhciBhID0gKDEgPDwgMjYpICUgaSwgaDMgPSAwLCBzID0gdGhpcy5sZW5ndGggLSAxO3MgPj0gMDsgcy0tKQogICAgICAgICAgaDMgPSAoYSAqIGgzICsgKHRoaXMud29yZHNbc10gfCAwKSkgJSBpOwogICAgICAgIHJldHVybiBoMzsKICAgICAgfSwgZi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpIDw9IDY3MTA4ODYzKTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDMgPSB0aGlzLmxlbmd0aCAtIDE7aDMgPj0gMDsgaDMtLSkgewogICAgICAgICAgdmFyIHMgPSAodGhpcy53b3Jkc1toM10gfCAwKSArIGEgKiA2NzEwODg2NDsKICAgICAgICAgIHRoaXMud29yZHNbaDNdID0gcyAvIGkgfCAwLCBhID0gcyAlIGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDApLCByKCFpLmlzWmVybygpKTsKICAgICAgICB2YXIgYSA9IHRoaXMsIGgzID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgIT09IDAgPyBhID0gYS51bW9kKGkpIDogYSA9IGEuY2xvbmUoKTsKICAgICAgICBmb3IgKHZhciBzID0gbmV3IGYoMSksIHUgPSBuZXcgZigwKSwgYyA9IG5ldyBmKDApLCBiMiA9IG5ldyBmKDEpLCBsID0gMDthLmlzRXZlbigpICYmIGgzLmlzRXZlbigpOyApCiAgICAgICAgICBhLml1c2hybigxKSwgaDMuaXVzaHJuKDEpLCArK2w7CiAgICAgICAgZm9yICh2YXIgbiA9IGgzLmNsb25lKCksIGQgPSBhLmNsb25lKCk7IWEuaXNaZXJvKCk7ICkgewogICAgICAgICAgZm9yICh2YXIgdyA9IDAsIGcgPSAxOyhhLndvcmRzWzBdICYgZykgPT09IDAgJiYgdyA8IDI2OyArK3csIGcgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmICh3ID4gMCkKICAgICAgICAgICAgZm9yIChhLml1c2hybih3KTt3LS0gPiAwOyApCiAgICAgICAgICAgICAgKHMuaXNPZGQoKSB8fCB1LmlzT2RkKCkpICYmIChzLmlhZGQobiksIHUuaXN1YihkKSksIHMuaXVzaHJuKDEpLCB1Lml1c2hybigxKTsKICAgICAgICAgIGZvciAodmFyIF8yID0gMCwgQTIgPSAxOyhoMy53b3Jkc1swXSAmIEEyKSA9PT0gMCAmJiBfMiA8IDI2OyArK18yLCBBMiA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKF8yID4gMCkKICAgICAgICAgICAgZm9yIChoMy5pdXNocm4oXzIpO18yLS0gPiAwOyApCiAgICAgICAgICAgICAgKGMuaXNPZGQoKSB8fCBiMi5pc09kZCgpKSAmJiAoYy5pYWRkKG4pLCBiMi5pc3ViKGQpKSwgYy5pdXNocm4oMSksIGIyLml1c2hybigxKTsKICAgICAgICAgIGEuY21wKGgzKSA+PSAwID8gKGEuaXN1YihoMyksIHMuaXN1YihjKSwgdS5pc3ViKGIyKSkgOiAoaDMuaXN1YihhKSwgYy5pc3ViKHMpLCBiMi5pc3ViKHUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgYTogYywgYjogYjIsIGdjZDogaDMuaXVzaGxuKGwpIH07CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDApLCByKCFpLmlzWmVybygpKTsKICAgICAgICB2YXIgYSA9IHRoaXMsIGgzID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgIT09IDAgPyBhID0gYS51bW9kKGkpIDogYSA9IGEuY2xvbmUoKTsKICAgICAgICBmb3IgKHZhciBzID0gbmV3IGYoMSksIHUgPSBuZXcgZigwKSwgYyA9IGgzLmNsb25lKCk7YS5jbXBuKDEpID4gMCAmJiBoMy5jbXBuKDEpID4gMDsgKSB7CiAgICAgICAgICBmb3IgKHZhciBiMiA9IDAsIGwgPSAxOyhhLndvcmRzWzBdICYgbCkgPT09IDAgJiYgYjIgPCAyNjsgKytiMiwgbCA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKGIyID4gMCkKICAgICAgICAgICAgZm9yIChhLml1c2hybihiMik7YjItLSA+IDA7ICkKICAgICAgICAgICAgICBzLmlzT2RkKCkgJiYgcy5pYWRkKGMpLCBzLml1c2hybigxKTsKICAgICAgICAgIGZvciAodmFyIG4gPSAwLCBkID0gMTsoaDMud29yZHNbMF0gJiBkKSA9PT0gMCAmJiBuIDwgMjY7ICsrbiwgZCA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKG4gPiAwKQogICAgICAgICAgICBmb3IgKGgzLml1c2hybihuKTtuLS0gPiAwOyApCiAgICAgICAgICAgICAgdS5pc09kZCgpICYmIHUuaWFkZChjKSwgdS5pdXNocm4oMSk7CiAgICAgICAgICBhLmNtcChoMykgPj0gMCA/IChhLmlzdWIoaDMpLCBzLmlzdWIodSkpIDogKGgzLmlzdWIoYSksIHUuaXN1YihzKSk7CiAgICAgICAgfQogICAgICAgIHZhciB3OwogICAgICAgIHJldHVybiBhLmNtcG4oMSkgPT09IDAgPyB3ID0gcyA6IHcgPSB1LCB3LmNtcG4oMCkgPCAwICYmIHcuaWFkZChpKSwgdzsKICAgICAgfSwgZi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkuYWJzKCk7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gdGhpcy5hYnMoKTsKICAgICAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKSwgaDMgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSA9IDAsIGgzLm5lZ2F0aXZlID0gMDsKICAgICAgICBmb3IgKHZhciBzID0gMDthLmlzRXZlbigpICYmIGgzLmlzRXZlbigpOyBzKyspCiAgICAgICAgICBhLml1c2hybigxKSwgaDMuaXVzaHJuKDEpOwogICAgICAgIGRvIHsKICAgICAgICAgIGZvciAoO2EuaXNFdmVuKCk7ICkKICAgICAgICAgICAgYS5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKDtoMy5pc0V2ZW4oKTsgKQogICAgICAgICAgICBoMy5pdXNocm4oMSk7CiAgICAgICAgICB2YXIgdSA9IGEuY21wKGgzKTsKICAgICAgICAgIGlmICh1IDwgMCkgewogICAgICAgICAgICB2YXIgYyA9IGE7CiAgICAgICAgICAgIGEgPSBoMywgaDMgPSBjOwogICAgICAgICAgfSBlbHNlIGlmICh1ID09PSAwIHx8IGgzLmNtcG4oMSkgPT09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYS5pc3ViKGgzKTsKICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICByZXR1cm4gaDMuaXVzaGxuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmVnY2QoaSkuYS51bW9kKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBpOwogICAgICB9LCBmLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDMgPSAoaSAtIGEpIC8gMjYsIHMgPSAxIDw8IGE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDw9IGgzKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZChoMyArIDEpLCB0aGlzLndvcmRzW2gzXSB8PSBzLCB0aGlzOwogICAgICAgIGZvciAodmFyIHUgPSBzLCBjID0gaDM7dSAhPT0gMCAmJiBjIDwgdGhpcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgdmFyIGIyID0gdGhpcy53b3Jkc1tjXSB8IDA7CiAgICAgICAgICBiMiArPSB1LCB1ID0gYjIgPj4+IDI2LCBiMiAmPSA2NzEwODg2MywgdGhpcy53b3Jkc1tjXSA9IGIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdSAhPT0gMCAmJiAodGhpcy53b3Jkc1tjXSA9IHUsIHRoaXMubGVuZ3RoKyspLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkgPCAwOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFhKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGEpCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgICAgdmFyIGgzOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpCiAgICAgICAgICBoMyA9IDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBhICYmIChpID0gLWkpLCByKGkgPD0gNjcxMDg4NjMsICJOdW1iZXIgaXMgdG9vIGJpZyIpOwogICAgICAgICAgdmFyIHMgPSB0aGlzLndvcmRzWzBdIHwgMDsKICAgICAgICAgIGgzID0gcyA9PT0gaSA/IDAgOiBzIDwgaSA/IC0xIDogMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtaDMgfCAwIDogaDM7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB2YXIgYSA9IHRoaXMudWNtcChpKTsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1hIHwgMCA6IGE7CiAgICAgIH0sIGYucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gaS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPCBpLmxlbmd0aCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDMgPSB0aGlzLmxlbmd0aCAtIDE7aDMgPj0gMDsgaDMtLSkgewogICAgICAgICAgdmFyIHMgPSB0aGlzLndvcmRzW2gzXSB8IDAsIHUgPSBpLndvcmRzW2gzXSB8IDA7CiAgICAgICAgICBpZiAocyAhPT0gdSkgewogICAgICAgICAgICBzIDwgdSA/IGEgPSAtMSA6IHMgPiB1ICYmIChhID0gMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID49IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPj0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IC0xOwogICAgICB9LCBmLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IC0xOwogICAgICB9LCBmLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPD0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA8PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAwOwogICAgICB9LCBmLnJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gbmV3IFAoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgcih0aGlzLm5lZ2F0aXZlID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgaS5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVkID0gaSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoIXRoaXMucmVkLCAiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCB0aGlzLl9mb3JjZVJlZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5hZGQodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5pYWRkKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLnN1Yih0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmlzdWIodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuc2hsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGkpLCB0aGlzLnJlZC5tdWwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGkpLCB0aGlzLnJlZC5pbXVsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnNxcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmlzcXIodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5zcXJ0KHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuaW52bSh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5uZWcodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCAmJiAhaS5yZWQsICJyZWRQb3cobm9ybWFsTnVtKSIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQucG93KHRoaXMsIGkpOwogICAgICB9OwogICAgICB2YXIgd2UgPSB7IGsyNTY6IG51bGwsIHAyMjQ6IG51bGwsIHAxOTI6IG51bGwsIHAyNTUxOTogbnVsbCB9OwogICAgICBmdW5jdGlvbiB5ZSh2LCBpKSB7CiAgICAgICAgdGhpcy5uYW1lID0gdiwgdGhpcy5wID0gbmV3IGYoaSwgMTYpLCB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCksIHRoaXMuayA9IG5ldyBmKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSwgdGhpcy50bXAgPSB0aGlzLl90bXAoKTsKICAgICAgfQogICAgICB5ZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGkud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSksIGk7CiAgICAgIH0sIHllLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSwgaDM7CiAgICAgICAgZG8KICAgICAgICAgIHRoaXMuc3BsaXQoYSwgdGhpcy50bXApLCBhID0gdGhpcy5pbXVsSyhhKSwgYSA9IGEuaWFkZCh0aGlzLnRtcCksIGgzID0gYS5iaXRMZW5ndGgoKTsKICAgICAgICB3aGlsZSAoaDMgPiB0aGlzLm4pOwogICAgICAgIHZhciBzID0gaDMgPCB0aGlzLm4gPyAtMSA6IGEudWNtcCh0aGlzLnApOwogICAgICAgIHJldHVybiBzID09PSAwID8gKGEud29yZHNbMF0gPSAwLCBhLmxlbmd0aCA9IDEpIDogcyA+IDAgPyBhLmlzdWIodGhpcy5wKSA6IGEuc3RyaXAgIT09IHVuZGVmaW5lZCA/IGEuc3RyaXAoKSA6IGEuX3N0cmlwKCksIGE7CiAgICAgIH0sIHllLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpLml1c2hybih0aGlzLm4sIDAsIGEpOwogICAgICB9LCB5ZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkuaW11bCh0aGlzLmspOwogICAgICB9OwogICAgICBmdW5jdGlvbiB4ZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJrMjU2IiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIik7CiAgICAgIH0KICAgICAgbyh4ZSwgeWUpLCB4ZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgZm9yICh2YXIgaDMgPSA0MTk0MzAzLCBzID0gTWF0aC5taW4oaS5sZW5ndGgsIDkpLCB1ID0gMDt1IDwgczsgdSsrKQogICAgICAgICAgYS53b3Jkc1t1XSA9IGkud29yZHNbdV07CiAgICAgICAgaWYgKGEubGVuZ3RoID0gcywgaS5sZW5ndGggPD0gOSkgewogICAgICAgICAgaS53b3Jkc1swXSA9IDAsIGkubGVuZ3RoID0gMTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGMgPSBpLndvcmRzWzldOwogICAgICAgIGZvciAoYS53b3Jkc1thLmxlbmd0aCsrXSA9IGMgJiBoMywgdSA9IDEwO3UgPCBpLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICB2YXIgYjIgPSBpLndvcmRzW3VdIHwgMDsKICAgICAgICAgIGkud29yZHNbdSAtIDEwXSA9IChiMiAmIGgzKSA8PCA0IHwgYyA+Pj4gMjIsIGMgPSBiMjsKICAgICAgICB9CiAgICAgICAgYyA+Pj49IDIyLCBpLndvcmRzW3UgLSAxMF0gPSBjLCBjID09PSAwICYmIGkubGVuZ3RoID4gMTAgPyBpLmxlbmd0aCAtPSAxMCA6IGkubGVuZ3RoIC09IDk7CiAgICAgIH0sIHhlLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpLndvcmRzW2kubGVuZ3RoXSA9IDAsIGkud29yZHNbaS5sZW5ndGggKyAxXSA9IDAsIGkubGVuZ3RoICs9IDI7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgzID0gMDtoMyA8IGkubGVuZ3RoOyBoMysrKSB7CiAgICAgICAgICB2YXIgcyA9IGkud29yZHNbaDNdIHwgMDsKICAgICAgICAgIGEgKz0gcyAqIDk3NywgaS53b3Jkc1toM10gPSBhICYgNjcxMDg4NjMsIGEgPSBzICogNjQgKyAoYSAvIDY3MTA4ODY0IHwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpLndvcmRzW2kubGVuZ3RoIC0gMV0gPT09IDAgJiYgKGkubGVuZ3RoLS0sIGkud29yZHNbaS5sZW5ndGggLSAxXSA9PT0gMCAmJiBpLmxlbmd0aC0tKSwgaTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gUmUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAicDIyNCIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpOwogICAgICB9CiAgICAgIG8oUmUsIHllKTsKICAgICAgZnVuY3Rpb24gRWUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAicDE5MiIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIpOwogICAgICB9CiAgICAgIG8oRWUsIHllKTsKICAgICAgZnVuY3Rpb24gQWUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAiMjU1MTkiLCAiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIpOwogICAgICB9CiAgICAgIG8oQWUsIHllKSwgQWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMyA9IDA7aDMgPCBpLmxlbmd0aDsgaDMrKykgewogICAgICAgICAgdmFyIHMgPSAoaS53b3Jkc1toM10gfCAwKSAqIDE5ICsgYSwgdSA9IHMgJiA2NzEwODg2MzsKICAgICAgICAgIHMgPj4+PSAyNiwgaS53b3Jkc1toM10gPSB1LCBhID0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGEgIT09IDAgJiYgKGkud29yZHNbaS5sZW5ndGgrK10gPSBhKSwgaTsKICAgICAgfSwgZi5fcHJpbWUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHdlW2ldKQogICAgICAgICAgcmV0dXJuIHdlW2ldOwogICAgICAgIHZhciBhOwogICAgICAgIGlmIChpID09PSAiazI1NiIpCiAgICAgICAgICBhID0gbmV3IHhlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMjI0IikKICAgICAgICAgIGEgPSBuZXcgUmU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAxOTIiKQogICAgICAgICAgYSA9IG5ldyBFZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDI1NTE5IikKICAgICAgICAgIGEgPSBuZXcgQWU7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHByaW1lICIgKyBpKTsKICAgICAgICByZXR1cm4gd2VbaV0gPSBhLCBhOwogICAgICB9OwogICAgICBmdW5jdGlvbiBQKHYpIHsKICAgICAgICBpZiAodHlwZW9mIHYgPT0gInN0cmluZyIpIHsKICAgICAgICAgIHZhciBpID0gZi5fcHJpbWUodik7CiAgICAgICAgICB0aGlzLm0gPSBpLnAsIHRoaXMucHJpbWUgPSBpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgcih2Lmd0bigxKSwgIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLCB0aGlzLm0gPSB2LCB0aGlzLnByaW1lID0gbnVsbDsKICAgICAgfQogICAgICBQLnByb3RvdHlwZS5fdmVyaWZ5MSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCByKGkucmVkLCAicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpOwogICAgICB9LCBQLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByKChpLm5lZ2F0aXZlIHwgYS5uZWdhdGl2ZSkgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCByKGkucmVkICYmIGkucmVkID09PSBhLnJlZCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcmltZSA/IHRoaXMucHJpbWUuaXJlZHVjZShpKS5fZm9yY2VSZWQodGhpcykgOiBpLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaS5pc1plcm8oKSA/IGkuY2xvbmUoKSA6IHRoaXMubS5zdWIoaSkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDMgPSBpLmFkZChhKTsKICAgICAgICByZXR1cm4gaDMuY21wKHRoaXMubSkgPj0gMCAmJiBoMy5pc3ViKHRoaXMubSksIGgzLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMyA9IGkuaWFkZChhKTsKICAgICAgICByZXR1cm4gaDMuY21wKHRoaXMubSkgPj0gMCAmJiBoMy5pc3ViKHRoaXMubSksIGgzOwogICAgICB9LCBQLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDMgPSBpLnN1YihhKTsKICAgICAgICByZXR1cm4gaDMuY21wbigwKSA8IDAgJiYgaDMuaWFkZCh0aGlzLm0pLCBoMy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDMgPSBpLmlzdWIoYSk7CiAgICAgICAgcmV0dXJuIGgzLmNtcG4oMCkgPCAwICYmIGgzLmlhZGQodGhpcy5tKSwgaDM7CiAgICAgIH0sIFAucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MShpKSwgdGhpcy5pbW9kKGkudXNobG4oYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkyKGksIGEpLCB0aGlzLmltb2QoaS5pbXVsKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkyKGksIGEpLCB0aGlzLmltb2QoaS5tdWwoYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmltdWwoaSwgaS5jbG9uZSgpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLm11bChpLCBpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLmNsb25lKCk7CiAgICAgICAgdmFyIGEgPSB0aGlzLm0uYW5kbG4oMyk7CiAgICAgICAgaWYgKHIoYSAlIDIgPT09IDEpLCBhID09PSAzKSB7CiAgICAgICAgICB2YXIgaDMgPSB0aGlzLm0uYWRkKG5ldyBmKDEpKS5pdXNocm4oMik7CiAgICAgICAgICByZXR1cm4gdGhpcy5wb3coaSwgaDMpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBzID0gdGhpcy5tLnN1Ym4oMSksIHUgPSAwOyFzLmlzWmVybygpICYmIHMuYW5kbG4oMSkgPT09IDA7ICkKICAgICAgICAgIHUrKywgcy5pdXNocm4oMSk7CiAgICAgICAgcighcy5pc1plcm8oKSk7CiAgICAgICAgdmFyIGMgPSBuZXcgZigxKS50b1JlZCh0aGlzKSwgYjIgPSBjLnJlZE5lZygpLCBsID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLCBuID0gdGhpcy5tLmJpdExlbmd0aCgpOwogICAgICAgIGZvciAobiA9IG5ldyBmKDIgKiBuICogbikudG9SZWQodGhpcyk7dGhpcy5wb3cobiwgbCkuY21wKGIyKSAhPT0gMDsgKQogICAgICAgICAgbi5yZWRJQWRkKGIyKTsKICAgICAgICBmb3IgKHZhciBkID0gdGhpcy5wb3cobiwgcyksIHcgPSB0aGlzLnBvdyhpLCBzLmFkZG4oMSkuaXVzaHJuKDEpKSwgZyA9IHRoaXMucG93KGksIHMpLCBfMiA9IHU7Zy5jbXAoYykgIT09IDA7ICkgewogICAgICAgICAgZm9yICh2YXIgQTIgPSBnLCBSMiA9IDA7QTIuY21wKGMpICE9PSAwOyBSMisrKQogICAgICAgICAgICBBMiA9IEEyLnJlZFNxcigpOwogICAgICAgICAgcihSMiA8IF8yKTsKICAgICAgICAgIHZhciBJID0gdGhpcy5wb3coZCwgbmV3IGYoMSkuaXVzaGxuKF8yIC0gUjIgLSAxKSk7CiAgICAgICAgICB3ID0gdy5yZWRNdWwoSSksIGQgPSBJLnJlZFNxcigpLCBnID0gZy5yZWRNdWwoZCksIF8yID0gUjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3OwogICAgICB9LCBQLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS5faW52bXAodGhpcy5tKTsKICAgICAgICByZXR1cm4gYS5uZWdhdGl2ZSAhPT0gMCA/IChhLm5lZ2F0aXZlID0gMCwgdGhpcy5pbW9kKGEpLnJlZE5lZygpKSA6IHRoaXMuaW1vZChhKTsKICAgICAgfSwgUC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpLnRvUmVkKHRoaXMpOwogICAgICAgIGlmIChhLmNtcG4oMSkgPT09IDApCiAgICAgICAgICByZXR1cm4gaS5jbG9uZSgpOwogICAgICAgIHZhciBoMyA9IDQsIHMgPSBuZXcgQXJyYXkoMSA8PCBoMyk7CiAgICAgICAgc1swXSA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBzWzFdID0gaTsKICAgICAgICBmb3IgKHZhciB1ID0gMjt1IDwgcy5sZW5ndGg7IHUrKykKICAgICAgICAgIHNbdV0gPSB0aGlzLm11bChzW3UgLSAxXSwgaSk7CiAgICAgICAgdmFyIGMgPSBzWzBdLCBiMiA9IDAsIGwgPSAwLCBuID0gYS5iaXRMZW5ndGgoKSAlIDI2OwogICAgICAgIGZvciAobiA9PT0gMCAmJiAobiA9IDI2KSwgdSA9IGEubGVuZ3RoIC0gMTt1ID49IDA7IHUtLSkgewogICAgICAgICAgZm9yICh2YXIgZCA9IGEud29yZHNbdV0sIHcgPSBuIC0gMTt3ID49IDA7IHctLSkgewogICAgICAgICAgICB2YXIgZyA9IGQgPj4gdyAmIDE7CiAgICAgICAgICAgIGlmIChjICE9PSBzWzBdICYmIChjID0gdGhpcy5zcXIoYykpLCBnID09PSAwICYmIGIyID09PSAwKSB7CiAgICAgICAgICAgICAgbCA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYjIgPDw9IDEsIGIyIHw9IGcsIGwrKywgIShsICE9PSBoMyAmJiAodSAhPT0gMCB8fCB3ICE9PSAwKSkgJiYgKGMgPSB0aGlzLm11bChjLCBzW2IyXSksIGwgPSAwLCBiMiA9IDApOwogICAgICAgICAgfQogICAgICAgICAgbiA9IDI2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYzsKICAgICAgfSwgUC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS51bW9kKHRoaXMubSk7CiAgICAgICAgcmV0dXJuIGEgPT09IGkgPyBhLmNsb25lKCkgOiBhOwogICAgICB9LCBQLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkuY2xvbmUoKTsKICAgICAgICByZXR1cm4gYS5yZWQgPSBudWxsLCBhOwogICAgICB9LCBmLm1vbnQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZShpKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gU2UodikgewogICAgICAgIFAuY2FsbCh0aGlzLCB2KSwgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKSwgdGhpcy5zaGlmdCAlIDI2ICE9PSAwICYmICh0aGlzLnNoaWZ0ICs9IDI2IC0gdGhpcy5zaGlmdCAlIDI2KSwgdGhpcy5yID0gbmV3IGYoMSkuaXVzaGxuKHRoaXMuc2hpZnQpLCB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSksIHRoaXMucmludiA9IHRoaXMuci5faW52bXAodGhpcy5tKSwgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLm1pbnYudW1vZCh0aGlzLnIpLCB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7CiAgICAgIH0KICAgICAgbyhTZSwgUCksIFNlLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW1vZChpLnVzaGxuKHRoaXMuc2hpZnQpKTsKICAgICAgfSwgU2UucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5pbW9kKGkubXVsKHRoaXMucmludikpOwogICAgICAgIHJldHVybiBhLnJlZCA9IG51bGwsIGE7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChpLmlzWmVybygpIHx8IGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS53b3Jkc1swXSA9IDAsIGkubGVuZ3RoID0gMSwgaTsKICAgICAgICB2YXIgaDMgPSBpLmltdWwoYSksIHMgPSBoMy5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIHUgPSBoMy5pc3ViKHMpLml1c2hybih0aGlzLnNoaWZ0KSwgYyA9IHU7CiAgICAgICAgcmV0dXJuIHUuY21wKHRoaXMubSkgPj0gMCA/IGMgPSB1LmlzdWIodGhpcy5tKSA6IHUuY21wbigwKSA8IDAgJiYgKGMgPSB1LmlhZGQodGhpcy5tKSksIGMuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBTZS5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChpLmlzWmVybygpIHx8IGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gbmV3IGYoMCkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICAgIHZhciBoMyA9IGkubXVsKGEpLCBzID0gaDMubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLCB1ID0gaDMuaXN1YihzKS5pdXNocm4odGhpcy5zaGlmdCksIGMgPSB1OwogICAgICAgIHJldHVybiB1LmNtcCh0aGlzLm0pID49IDAgPyBjID0gdS5pc3ViKHRoaXMubSkgOiB1LmNtcG4oMCkgPCAwICYmIChjID0gdS5pYWRkKHRoaXMubSkpLCBjLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgU2UucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmltb2QoaS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpOwogICAgICAgIHJldHVybiBhLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfTsKICAgIH0pKHR5cGVvZiBMbCA+ICJ1IiB8fCBMbCwgaDIpOwogIH0pOwogIE5sID0gVDIoKGQyKSA9PiB7CiAgICB2YXIganMgPSBkMjsKICAgIGZ1bmN0aW9uIHVBKHQsIGUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpCiAgICAgICAgcmV0dXJuIHQuc2xpY2UoKTsKICAgICAgaWYgKCF0KQogICAgICAgIHJldHVybiBbXTsKICAgICAgdmFyIHIgPSBbXTsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJzdHJpbmciKSB7CiAgICAgICAgZm9yICh2YXIgbyA9IDA7byA8IHQubGVuZ3RoOyBvKyspCiAgICAgICAgICByW29dID0gdFtvXSB8IDA7CiAgICAgICAgcmV0dXJuIHI7CiAgICAgIH0KICAgICAgaWYgKGUgPT09ICJoZXgiKSB7CiAgICAgICAgdCA9IHQucmVwbGFjZSgvW15hLXowLTldKy9pZywgIiIpLCB0Lmxlbmd0aCAlIDIgIT09IDAgJiYgKHQgPSAiMCIgKyB0KTsKICAgICAgICBmb3IgKHZhciBvID0gMDtvIDwgdC5sZW5ndGg7IG8gKz0gMikKICAgICAgICAgIHIucHVzaChwYXJzZUludCh0W29dICsgdFtvICsgMV0sIDE2KSk7CiAgICAgIH0gZWxzZQogICAgICAgIGZvciAodmFyIG8gPSAwO28gPCB0Lmxlbmd0aDsgbysrKSB7CiAgICAgICAgICB2YXIgZiA9IHQuY2hhckNvZGVBdChvKSwgcCA9IGYgPj4gOCwgbTIgPSBmICYgMjU1OwogICAgICAgICAgcCA/IHIucHVzaChwLCBtMikgOiByLnB1c2gobTIpOwogICAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBqcy50b0FycmF5ID0gdUE7CiAgICBmdW5jdGlvbiB1Mih0KSB7CiAgICAgIHJldHVybiB0Lmxlbmd0aCA9PT0gMSA/ICIwIiArIHQgOiB0OwogICAgfQogICAganMuemVybzIgPSB1MjsKICAgIGZ1bmN0aW9uIGwyKHQpIHsKICAgICAgZm9yICh2YXIgZSA9ICIiLCByID0gMDtyIDwgdC5sZW5ndGg7IHIrKykKICAgICAgICBlICs9IHUyKHRbcl0udG9TdHJpbmcoMTYpKTsKICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBqcy50b0hleCA9IGwyOwogICAganMuZW5jb2RlID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gciA9PT0gImhleCIgPyBsMihlKSA6IGU7CiAgICB9OwogIH0pOwogIG9yID0gVDIoKGMyKSA9PiB7CiAgICB2YXIgUHIgPSBjMiwgbEEgPSByaSgpLCBkQSA9IGFyKCksIFpzID0gTmwoKTsKICAgIFByLmFzc2VydCA9IGRBOwogICAgUHIudG9BcnJheSA9IFpzLnRvQXJyYXk7CiAgICBQci56ZXJvMiA9IFpzLnplcm8yOwogICAgUHIudG9IZXggPSBacy50b0hleDsKICAgIFByLmVuY29kZSA9IFpzLmVuY29kZTsKICAgIGZ1bmN0aW9uIGNBKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSBuZXcgQXJyYXkoTWF0aC5tYXgodC5iaXRMZW5ndGgoKSwgcikgKyAxKTsKICAgICAgby5maWxsKDApOwogICAgICBmb3IgKHZhciBmID0gMSA8PCBlICsgMSwgcCA9IHQuY2xvbmUoKSwgbTIgPSAwO20yIDwgby5sZW5ndGg7IG0yKyspIHsKICAgICAgICB2YXIgeTIsIE0gPSBwLmFuZGxuKGYgLSAxKTsKICAgICAgICBwLmlzT2RkKCkgPyAoTSA+IChmID4+IDEpIC0gMSA/IHkyID0gKGYgPj4gMSkgLSBNIDogeTIgPSBNLCBwLmlzdWJuKHkyKSkgOiB5MiA9IDAsIG9bbTJdID0geTIsIHAuaXVzaHJuKDEpOwogICAgICB9CiAgICAgIHJldHVybiBvOwogICAgfQogICAgUHIuZ2V0TkFGID0gY0E7CiAgICBmdW5jdGlvbiBwQSh0LCBlKSB7CiAgICAgIHZhciByID0gW1tdLCBbXV07CiAgICAgIHQgPSB0LmNsb25lKCksIGUgPSBlLmNsb25lKCk7CiAgICAgIGZvciAodmFyIG8gPSAwLCBmID0gMCwgcDt0LmNtcG4oLW8pID4gMCB8fCBlLmNtcG4oLWYpID4gMDsgKSB7CiAgICAgICAgdmFyIG0yID0gdC5hbmRsbigzKSArIG8gJiAzLCB5MiA9IGUuYW5kbG4oMykgKyBmICYgMzsKICAgICAgICBtMiA9PT0gMyAmJiAobTIgPSAtMSksIHkyID09PSAzICYmICh5MiA9IC0xKTsKICAgICAgICB2YXIgTTsKICAgICAgICAobTIgJiAxKSA9PT0gMCA/IE0gPSAwIDogKHAgPSB0LmFuZGxuKDcpICsgbyAmIDcsIChwID09PSAzIHx8IHAgPT09IDUpICYmIHkyID09PSAyID8gTSA9IC1tMiA6IE0gPSBtMiksIHJbMF0ucHVzaChNKTsKICAgICAgICB2YXIgeDsKICAgICAgICAoeTIgJiAxKSA9PT0gMCA/IHggPSAwIDogKHAgPSBlLmFuZGxuKDcpICsgZiAmIDcsIChwID09PSAzIHx8IHAgPT09IDUpICYmIG0yID09PSAyID8geCA9IC15MiA6IHggPSB5MiksIHJbMV0ucHVzaCh4KSwgMiAqIG8gPT09IE0gKyAxICYmIChvID0gMSAtIG8pLCAyICogZiA9PT0geCArIDEgJiYgKGYgPSAxIC0gZiksIHQuaXVzaHJuKDEpLCBlLml1c2hybigxKTsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIFByLmdldEpTRiA9IHBBOwogICAgZnVuY3Rpb24gdkEodCwgZSwgcikgewogICAgICB2YXIgbyA9ICJfIiArIGU7CiAgICAgIHQucHJvdG90eXBlW2VdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbb10gIT09IHVuZGVmaW5lZCA/IHRoaXNbb10gOiB0aGlzW29dID0gci5jYWxsKHRoaXMpOwogICAgICB9OwogICAgfQogICAgUHIuY2FjaGVkUHJvcGVydHkgPSB2QTsKICAgIGZ1bmN0aW9uIGJBKHQpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB0ID09ICJzdHJpbmciID8gUHIudG9BcnJheSh0LCAiaGV4IikgOiB0OwogICAgfQogICAgUHIucGFyc2VCeXRlcyA9IGJBOwogICAgZnVuY3Rpb24gbUEodCkgewogICAgICByZXR1cm4gbmV3IGxBKHQsICJoZXgiLCAibGUiKTsKICAgIH0KICAgIFByLmludEZyb21MRSA9IG1BOwogIH0pOwogIE9hID0gVDIoKHhrLCBwMikgPT4gewogICAgdmFyIENuID0gcmkoKSwgQ2EgPSBvcigpLCBWcyA9IENhLmdldE5BRiwgZ0EgPSBDYS5nZXRKU0YsICRzID0gQ2EuYXNzZXJ0OwogICAgZnVuY3Rpb24gWGkodCwgZSkgewogICAgICB0aGlzLnR5cGUgPSB0LCB0aGlzLnAgPSBuZXcgQ24oZS5wLCAxNiksIHRoaXMucmVkID0gZS5wcmltZSA/IENuLnJlZChlLnByaW1lKSA6IENuLm1vbnQodGhpcy5wKSwgdGhpcy56ZXJvID0gbmV3IENuKDApLnRvUmVkKHRoaXMucmVkKSwgdGhpcy5vbmUgPSBuZXcgQ24oMSkudG9SZWQodGhpcy5yZWQpLCB0aGlzLnR3byA9IG5ldyBDbigyKS50b1JlZCh0aGlzLnJlZCksIHRoaXMubiA9IGUubiAmJiBuZXcgQ24oZS5uLCAxNiksIHRoaXMuZyA9IGUuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oZS5nLCBlLmdSZWQpLCB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCksIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KSwgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpLCB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCksIHRoaXMuX2JpdExlbmd0aCA9IHRoaXMubiA/IHRoaXMubi5iaXRMZW5ndGgoKSA6IDA7CiAgICAgIHZhciByID0gdGhpcy5uICYmIHRoaXMucC5kaXYodGhpcy5uKTsKICAgICAgIXIgfHwgci5jbXBuKDEwMCkgPiAwID8gdGhpcy5yZWROID0gbnVsbCA6ICh0aGlzLl9tYXh3ZWxsVHJpY2sgPSB0cnVlLCB0aGlzLnJlZE4gPSB0aGlzLm4udG9SZWQodGhpcy5yZWQpKTsKICAgIH0KICAgIHAyLmV4cG9ydHMgPSBYaTsKICAgIFhpLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOwogICAgfTsKICAgIFhpLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOwogICAgfTsKICAgIFhpLnByb3RvdHlwZS5fZml4ZWROYWZNdWwgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgICRzKGUucHJlY29tcHV0ZWQpOwogICAgICB2YXIgbyA9IGUuX2dldERvdWJsZXMoKSwgZiA9IFZzKHIsIDEsIHRoaXMuX2JpdExlbmd0aCksIHAgPSAoMSA8PCBvLnN0ZXAgKyAxKSAtIChvLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpOwogICAgICBwIC89IDM7CiAgICAgIHZhciBtMiA9IFtdLCB5MiwgTTsKICAgICAgZm9yICh5MiA9IDA7eTIgPCBmLmxlbmd0aDsgeTIgKz0gby5zdGVwKSB7CiAgICAgICAgTSA9IDA7CiAgICAgICAgZm9yICh2YXIgeCA9IHkyICsgby5zdGVwIC0gMTt4ID49IHkyOyB4LS0pCiAgICAgICAgICBNID0gKE0gPDwgMSkgKyBmW3hdOwogICAgICAgIG0yLnB1c2goTSk7CiAgICAgIH0KICAgICAgZm9yICh2YXIgUyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpLCBFMiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpLCBCID0gcDtCID4gMDsgQi0tKSB7CiAgICAgICAgZm9yICh5MiA9IDA7eTIgPCBtMi5sZW5ndGg7IHkyKyspCiAgICAgICAgICBNID0gbTJbeTJdLCBNID09PSBCID8gRTIgPSBFMi5taXhlZEFkZChvLnBvaW50c1t5Ml0pIDogTSA9PT0gLUIgJiYgKEUyID0gRTIubWl4ZWRBZGQoby5wb2ludHNbeTJdLm5lZygpKSk7CiAgICAgICAgUyA9IFMuYWRkKEUyKTsKICAgICAgfQogICAgICByZXR1cm4gUy50b1AoKTsKICAgIH07CiAgICBYaS5wcm90b3R5cGUuX3duYWZNdWwgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHZhciBvID0gNCwgZiA9IGUuX2dldE5BRlBvaW50cyhvKTsKICAgICAgbyA9IGYud25kOwogICAgICBmb3IgKHZhciBwID0gZi5wb2ludHMsIG0yID0gVnMociwgbywgdGhpcy5fYml0TGVuZ3RoKSwgeTIgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKSwgTSA9IG0yLmxlbmd0aCAtIDE7TSA+PSAwOyBNLS0pIHsKICAgICAgICBmb3IgKHZhciB4ID0gMDtNID49IDAgJiYgbTJbTV0gPT09IDA7IE0tLSkKICAgICAgICAgIHgrKzsKICAgICAgICBpZiAoTSA+PSAwICYmIHgrKywgeTIgPSB5Mi5kYmxwKHgpLCBNIDwgMCkKICAgICAgICAgIGJyZWFrOwogICAgICAgIHZhciBTID0gbTJbTV07CiAgICAgICAgJHMoUyAhPT0gMCksIGUudHlwZSA9PT0gImFmZmluZSIgPyBTID4gMCA/IHkyID0geTIubWl4ZWRBZGQocFtTIC0gMSA+PiAxXSkgOiB5MiA9IHkyLm1peGVkQWRkKHBbLVMgLSAxID4+IDFdLm5lZygpKSA6IFMgPiAwID8geTIgPSB5Mi5hZGQocFtTIC0gMSA+PiAxXSkgOiB5MiA9IHkyLmFkZChwWy1TIC0gMSA+PiAxXS5uZWcoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGUudHlwZSA9PT0gImFmZmluZSIgPyB5Mi50b1AoKSA6IHkyOwogICAgfTsKICAgIFhpLnByb3RvdHlwZS5fd25hZk11bEFkZCA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYsIHApIHsKICAgICAgdmFyIG0yID0gdGhpcy5fd25hZlQxLCB5MiA9IHRoaXMuX3duYWZUMiwgTSA9IHRoaXMuX3duYWZUMywgeCA9IDAsIFMsIEUyLCBCOwogICAgICBmb3IgKFMgPSAwO1MgPCBmOyBTKyspIHsKICAgICAgICBCID0gcltTXTsKICAgICAgICB2YXIgcTIgPSBCLl9nZXROQUZQb2ludHMoZSk7CiAgICAgICAgbTJbU10gPSBxMi53bmQsIHkyW1NdID0gcTIucG9pbnRzOwogICAgICB9CiAgICAgIGZvciAoUyA9IGYgLSAxO1MgPj0gMTsgUyAtPSAyKSB7CiAgICAgICAgdmFyIEwyID0gUyAtIDEsIGdlID0gUzsKICAgICAgICBpZiAobTJbTDJdICE9PSAxIHx8IG0yW2dlXSAhPT0gMSkgewogICAgICAgICAgTVtMMl0gPSBWcyhvW0wyXSwgbTJbTDJdLCB0aGlzLl9iaXRMZW5ndGgpLCBNW2dlXSA9IFZzKG9bZ2VdLCBtMltnZV0sIHRoaXMuX2JpdExlbmd0aCksIHggPSBNYXRoLm1heChNW0wyXS5sZW5ndGgsIHgpLCB4ID0gTWF0aC5tYXgoTVtnZV0ubGVuZ3RoLCB4KTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgX2UgPSBbcltMMl0sIG51bGwsIG51bGwsIHJbZ2VdXTsKICAgICAgICByW0wyXS55LmNtcChyW2dlXS55KSA9PT0gMCA/IChfZVsxXSA9IHJbTDJdLmFkZChyW2dlXSksIF9lWzJdID0gcltMMl0udG9KKCkubWl4ZWRBZGQocltnZV0ubmVnKCkpKSA6IHJbTDJdLnkuY21wKHJbZ2VdLnkucmVkTmVnKCkpID09PSAwID8gKF9lWzFdID0gcltMMl0udG9KKCkubWl4ZWRBZGQocltnZV0pLCBfZVsyXSA9IHJbTDJdLmFkZChyW2dlXS5uZWcoKSkpIDogKF9lWzFdID0gcltMMl0udG9KKCkubWl4ZWRBZGQocltnZV0pLCBfZVsyXSA9IHJbTDJdLnRvSigpLm1peGVkQWRkKHJbZ2VdLm5lZygpKSk7CiAgICAgICAgdmFyIE4gPSBbLTMsIC0xLCAtNSwgLTcsIDAsIDcsIDUsIDEsIDNdLCB3ZSA9IGdBKG9bTDJdLCBvW2dlXSk7CiAgICAgICAgZm9yICh4ID0gTWF0aC5tYXgod2VbMF0ubGVuZ3RoLCB4KSwgTVtMMl0gPSBuZXcgQXJyYXkoeCksIE1bZ2VdID0gbmV3IEFycmF5KHgpLCBFMiA9IDA7RTIgPCB4OyBFMisrKSB7CiAgICAgICAgICB2YXIgeWUgPSB3ZVswXVtFMl0gfCAwLCB4ZSA9IHdlWzFdW0UyXSB8IDA7CiAgICAgICAgICBNW0wyXVtFMl0gPSBOWyh5ZSArIDEpICogMyArICh4ZSArIDEpXSwgTVtnZV1bRTJdID0gMCwgeTJbTDJdID0gX2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBSZSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpLCBFZSA9IHRoaXMuX3duYWZUNDsKICAgICAgZm9yIChTID0geDtTID49IDA7IFMtLSkgewogICAgICAgIGZvciAodmFyIEFlID0gMDtTID49IDA7ICkgewogICAgICAgICAgdmFyIFAgPSB0cnVlOwogICAgICAgICAgZm9yIChFMiA9IDA7RTIgPCBmOyBFMisrKQogICAgICAgICAgICBFZVtFMl0gPSBNW0UyXVtTXSB8IDAsIEVlW0UyXSAhPT0gMCAmJiAoUCA9IGZhbHNlKTsKICAgICAgICAgIGlmICghUCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBBZSsrLCBTLS07CiAgICAgICAgfQogICAgICAgIGlmIChTID49IDAgJiYgQWUrKywgUmUgPSBSZS5kYmxwKEFlKSwgUyA8IDApCiAgICAgICAgICBicmVhazsKICAgICAgICBmb3IgKEUyID0gMDtFMiA8IGY7IEUyKyspIHsKICAgICAgICAgIHZhciBTZSA9IEVlW0UyXTsKICAgICAgICAgIFNlICE9PSAwICYmIChTZSA+IDAgPyBCID0geTJbRTJdW1NlIC0gMSA+PiAxXSA6IFNlIDwgMCAmJiAoQiA9IHkyW0UyXVstU2UgLSAxID4+IDFdLm5lZygpKSwgQi50eXBlID09PSAiYWZmaW5lIiA/IFJlID0gUmUubWl4ZWRBZGQoQikgOiBSZSA9IFJlLmFkZChCKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoUyA9IDA7UyA8IGY7IFMrKykKICAgICAgICB5MltTXSA9IG51bGw7CiAgICAgIHJldHVybiBwID8gUmUgOiBSZS50b1AoKTsKICAgIH07CiAgICBmdW5jdGlvbiBfcih0LCBlKSB7CiAgICAgIHRoaXMuY3VydmUgPSB0LCB0aGlzLnR5cGUgPSBlLCB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDsKICAgIH0KICAgIFhpLkJhc2VQb2ludCA9IF9yOwogICAgX3IucHJvdG90eXBlLmVxID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CiAgICB9OwogICAgX3IucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpOwogICAgfTsKICAgIFhpLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZSA9IENhLnRvQXJyYXkoZSwgcik7CiAgICAgIHZhciBvID0gdGhpcy5wLmJ5dGVMZW5ndGgoKTsKICAgICAgaWYgKChlWzBdID09PSA0IHx8IGVbMF0gPT09IDYgfHwgZVswXSA9PT0gNykgJiYgZS5sZW5ndGggLSAxID09PSAyICogbykgewogICAgICAgIGVbMF0gPT09IDYgPyAkcyhlW2UubGVuZ3RoIC0gMV0gJSAyID09PSAwKSA6IGVbMF0gPT09IDcgJiYgJHMoZVtlLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7CiAgICAgICAgdmFyIGYgPSB0aGlzLnBvaW50KGUuc2xpY2UoMSwgMSArIG8pLCBlLnNsaWNlKDEgKyBvLCAxICsgMiAqIG8pKTsKICAgICAgICByZXR1cm4gZjsKICAgICAgfSBlbHNlIGlmICgoZVswXSA9PT0gMiB8fCBlWzBdID09PSAzKSAmJiBlLmxlbmd0aCAtIDEgPT09IG8pCiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRGcm9tWChlLnNsaWNlKDEsIDEgKyBvKSwgZVswXSA9PT0gMyk7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBwb2ludCBmb3JtYXQiKTsKICAgIH07CiAgICBfci5wcm90b3R5cGUuZW5jb2RlQ29tcHJlc3NlZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHRydWUpOwogICAgfTsKICAgIF9yLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgciA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCksIG8gPSB0aGlzLmdldFgoKS50b0FycmF5KCJiZSIsIHIpOwogICAgICByZXR1cm4gZSA/IFt0aGlzLmdldFkoKS5pc0V2ZW4oKSA/IDIgOiAzXS5jb25jYXQobykgOiBbNF0uY29uY2F0KG8sIHRoaXMuZ2V0WSgpLnRvQXJyYXkoImJlIiwgcikpOwogICAgfTsKICAgIF9yLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBDYS5lbmNvZGUodGhpcy5fZW5jb2RlKHIpLCBlKTsKICAgIH07CiAgICBfci5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHRoaXMucHJlY29tcHV0ZWQpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIHZhciByID0geyBkb3VibGVzOiBudWxsLCBuYWY6IG51bGwsIGJldGE6IG51bGwgfTsKICAgICAgcmV0dXJuIHIubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpLCByLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIGUpLCByLmJldGEgPSB0aGlzLl9nZXRCZXRhKCksIHRoaXMucHJlY29tcHV0ZWQgPSByLCB0aGlzOwogICAgfTsKICAgIF9yLnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgdmFyIHIgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7CiAgICAgIHJldHVybiByID8gci5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoZS5iaXRMZW5ndGgoKSArIDEpIC8gci5zdGVwKSA6IGZhbHNlOwogICAgfTsKICAgIF9yLnByb3RvdHlwZS5fZ2V0RG91YmxlcyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKQogICAgICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7CiAgICAgIGZvciAodmFyIG8gPSBbdGhpc10sIGYgPSB0aGlzLCBwID0gMDtwIDwgcjsgcCArPSBlKSB7CiAgICAgICAgZm9yICh2YXIgbTIgPSAwO20yIDwgZTsgbTIrKykKICAgICAgICAgIGYgPSBmLmRibCgpOwogICAgICAgIG8ucHVzaChmKTsKICAgICAgfQogICAgICByZXR1cm4geyBzdGVwOiBlLCBwb2ludHM6IG8gfTsKICAgIH07CiAgICBfci5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5uYWYpCiAgICAgICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQubmFmOwogICAgICBmb3IgKHZhciByID0gW3RoaXNdLCBvID0gKDEgPDwgZSkgLSAxLCBmID0gbyA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpLCBwID0gMTtwIDwgbzsgcCsrKQogICAgICAgIHJbcF0gPSByW3AgLSAxXS5hZGQoZik7CiAgICAgIHJldHVybiB7IHduZDogZSwgcG9pbnRzOiByIH07CiAgICB9OwogICAgX3IucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIF9yLnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24oZSkgewogICAgICBmb3IgKHZhciByID0gdGhpcywgbyA9IDA7byA8IGU7IG8rKykKICAgICAgICByID0gci5kYmwoKTsKICAgICAgcmV0dXJuIHI7CiAgICB9OwogIH0pOwogIGIyID0gVDIoKFNrLCB2MikgPT4gewogICAgdmFyIHlBID0gb3IoKSwgbHQgPSByaSgpLCBEbCA9IEllKCksIEJmID0gT2EoKSwgd0EgPSB5QS5hc3NlcnQ7CiAgICBmdW5jdGlvbiB4cih0KSB7CiAgICAgIEJmLmNhbGwodGhpcywgInNob3J0IiwgdCksIHRoaXMuYSA9IG5ldyBsdCh0LmEsIDE2KS50b1JlZCh0aGlzLnJlZCksIHRoaXMuYiA9IG5ldyBsdCh0LmIsIDE2KS50b1JlZCh0aGlzLnJlZCksIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKSwgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMCwgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwLCB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20odCksIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCksIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7CiAgICB9CiAgICBEbCh4ciwgQmYpOwogICAgdjIuZXhwb3J0cyA9IHhyOwogICAgeHIucHJvdG90eXBlLl9nZXRFbmRvbW9ycGhpc20gPSBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSkpIHsKICAgICAgICB2YXIgciwgbzsKICAgICAgICBpZiAoZS5iZXRhKQogICAgICAgICAgciA9IG5ldyBsdChlLmJldGEsIDE2KS50b1JlZCh0aGlzLnJlZCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgZiA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApOwogICAgICAgICAgciA9IGZbMF0uY21wKGZbMV0pIDwgMCA/IGZbMF0gOiBmWzFdLCByID0gci50b1JlZCh0aGlzLnJlZCk7CiAgICAgICAgfQogICAgICAgIGlmIChlLmxhbWJkYSkKICAgICAgICAgIG8gPSBuZXcgbHQoZS5sYW1iZGEsIDE2KTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBwID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7CiAgICAgICAgICB0aGlzLmcubXVsKHBbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChyKSkgPT09IDAgPyBvID0gcFswXSA6IChvID0gcFsxXSwgd0EodGhpcy5nLm11bChvKS54LmNtcCh0aGlzLmcueC5yZWRNdWwocikpID09PSAwKSk7CiAgICAgICAgfQogICAgICAgIHZhciBtMjsKICAgICAgICByZXR1cm4gZS5iYXNpcyA/IG0yID0gZS5iYXNpcy5tYXAoZnVuY3Rpb24oeTIpIHsKICAgICAgICAgIHJldHVybiB7IGE6IG5ldyBsdCh5Mi5hLCAxNiksIGI6IG5ldyBsdCh5Mi5iLCAxNikgfTsKICAgICAgICB9KSA6IG0yID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKG8pLCB7IGJldGE6IHIsIGxhbWJkYTogbywgYmFzaXM6IG0yIH07CiAgICAgIH0KICAgIH07CiAgICB4ci5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSBlID09PSB0aGlzLnAgPyB0aGlzLnJlZCA6IGx0Lm1vbnQoZSksIG8gPSBuZXcgbHQoMikudG9SZWQocikucmVkSW52bSgpLCBmID0gby5yZWROZWcoKSwgcCA9IG5ldyBsdCgzKS50b1JlZChyKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKG8pLCBtMiA9IGYucmVkQWRkKHApLmZyb21SZWQoKSwgeTIgPSBmLnJlZFN1YihwKS5mcm9tUmVkKCk7CiAgICAgIHJldHVybiBbbTIsIHkyXTsKICAgIH07CiAgICB4ci5wcm90b3R5cGUuX2dldEVuZG9CYXNpcyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZm9yICh2YXIgciA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKSwgbyA9IGUsIGYgPSB0aGlzLm4uY2xvbmUoKSwgcCA9IG5ldyBsdCgxKSwgbTIgPSBuZXcgbHQoMCksIHkyID0gbmV3IGx0KDApLCBNID0gbmV3IGx0KDEpLCB4LCBTLCBFMiwgQiwgcTIsIEwyLCBnZSwgX2UgPSAwLCBOLCB3ZTtvLmNtcG4oMCkgIT09IDA7ICkgewogICAgICAgIHZhciB5ZSA9IGYuZGl2KG8pOwogICAgICAgIE4gPSBmLnN1Yih5ZS5tdWwobykpLCB3ZSA9IHkyLnN1Yih5ZS5tdWwocCkpOwogICAgICAgIHZhciB4ZSA9IE0uc3ViKHllLm11bChtMikpOwogICAgICAgIGlmICghRTIgJiYgTi5jbXAocikgPCAwKQogICAgICAgICAgeCA9IGdlLm5lZygpLCBTID0gcCwgRTIgPSBOLm5lZygpLCBCID0gd2U7CiAgICAgICAgZWxzZSBpZiAoRTIgJiYgKytfZSA9PT0gMikKICAgICAgICAgIGJyZWFrOwogICAgICAgIGdlID0gTiwgZiA9IG8sIG8gPSBOLCB5MiA9IHAsIHAgPSB3ZSwgTSA9IG0yLCBtMiA9IHhlOwogICAgICB9CiAgICAgIHEyID0gTi5uZWcoKSwgTDIgPSB3ZTsKICAgICAgdmFyIFJlID0gRTIuc3FyKCkuYWRkKEIuc3FyKCkpLCBFZSA9IHEyLnNxcigpLmFkZChMMi5zcXIoKSk7CiAgICAgIHJldHVybiBFZS5jbXAoUmUpID49IDAgJiYgKHEyID0geCwgTDIgPSBTKSwgRTIubmVnYXRpdmUgJiYgKEUyID0gRTIubmVnKCksIEIgPSBCLm5lZygpKSwgcTIubmVnYXRpdmUgJiYgKHEyID0gcTIubmVnKCksIEwyID0gTDIubmVnKCkpLCBbeyBhOiBFMiwgYjogQiB9LCB7IGE6IHEyLCBiOiBMMiB9XTsKICAgIH07CiAgICB4ci5wcm90b3R5cGUuX2VuZG9TcGxpdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSB0aGlzLmVuZG8uYmFzaXMsIG8gPSByWzBdLCBmID0gclsxXSwgcCA9IGYuYi5tdWwoZSkuZGl2Um91bmQodGhpcy5uKSwgbTIgPSBvLmIubmVnKCkubXVsKGUpLmRpdlJvdW5kKHRoaXMubiksIHkyID0gcC5tdWwoby5hKSwgTSA9IG0yLm11bChmLmEpLCB4ID0gcC5tdWwoby5iKSwgUyA9IG0yLm11bChmLmIpLCBFMiA9IGUuc3ViKHkyKS5zdWIoTSksIEIgPSB4LmFkZChTKS5uZWcoKTsKICAgICAgcmV0dXJuIHsgazE6IEUyLCBrMjogQiB9OwogICAgfTsKICAgIHhyLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24oZSwgcikgewogICAgICBlID0gbmV3IGx0KGUsIDE2KSwgZS5yZWQgfHwgKGUgPSBlLnRvUmVkKHRoaXMucmVkKSk7CiAgICAgIHZhciBvID0gZS5yZWRTcXIoKS5yZWRNdWwoZSkucmVkSUFkZChlLnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYiksIGYgPSBvLnJlZFNxcnQoKTsKICAgICAgaWYgKGYucmVkU3FyKCkucmVkU3ViKG8pLmNtcCh0aGlzLnplcm8pICE9PSAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpOwogICAgICB2YXIgcCA9IGYuZnJvbVJlZCgpLmlzT2RkKCk7CiAgICAgIHJldHVybiAociAmJiAhcCB8fCAhciAmJiBwKSAmJiAoZiA9IGYucmVkTmVnKCkpLCB0aGlzLnBvaW50KGUsIGYpOwogICAgfTsKICAgIHhyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUuaW5mKQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB2YXIgeyB4OiByLCB5OiBvIH0gPSBlLCBmID0gdGhpcy5hLnJlZE11bChyKSwgcCA9IHIucmVkU3FyKCkucmVkTXVsKHIpLnJlZElBZGQoZikucmVkSUFkZCh0aGlzLmIpOwogICAgICByZXR1cm4gby5yZWRTcXIoKS5yZWRJU3ViKHApLmNtcG4oMCkgPT09IDA7CiAgICB9OwogICAgeHIucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgZm9yICh2YXIgZiA9IHRoaXMuX2VuZG9XbmFmVDEsIHAgPSB0aGlzLl9lbmRvV25hZlQyLCBtMiA9IDA7bTIgPCBlLmxlbmd0aDsgbTIrKykgewogICAgICAgIHZhciB5MiA9IHRoaXMuX2VuZG9TcGxpdChyW20yXSksIE0gPSBlW20yXSwgeCA9IE0uX2dldEJldGEoKTsKICAgICAgICB5Mi5rMS5uZWdhdGl2ZSAmJiAoeTIuazEuaW5lZygpLCBNID0gTS5uZWcodHJ1ZSkpLCB5Mi5rMi5uZWdhdGl2ZSAmJiAoeTIuazIuaW5lZygpLCB4ID0geC5uZWcodHJ1ZSkpLCBmW20yICogMl0gPSBNLCBmW20yICogMiArIDFdID0geCwgcFttMiAqIDJdID0geTIuazEsIHBbbTIgKiAyICsgMV0gPSB5Mi5rMjsKICAgICAgfQogICAgICBmb3IgKHZhciBTID0gdGhpcy5fd25hZk11bEFkZCgxLCBmLCBwLCBtMiAqIDIsIG8pLCBFMiA9IDA7RTIgPCBtMiAqIDI7IEUyKyspCiAgICAgICAgZltFMl0gPSBudWxsLCBwW0UyXSA9IG51bGw7CiAgICAgIHJldHVybiBTOwogICAgfTsKICAgIGZ1bmN0aW9uIEN0KHQsIGUsIHIsIG8pIHsKICAgICAgQmYuQmFzZVBvaW50LmNhbGwodGhpcywgdCwgImFmZmluZSIpLCBlID09PSBudWxsICYmIHIgPT09IG51bGwgPyAodGhpcy54ID0gbnVsbCwgdGhpcy55ID0gbnVsbCwgdGhpcy5pbmYgPSB0cnVlKSA6ICh0aGlzLnggPSBuZXcgbHQoZSwgMTYpLCB0aGlzLnkgPSBuZXcgbHQociwgMTYpLCBvICYmICh0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpLCB0aGlzLnkuZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpKSwgdGhpcy54LnJlZCB8fCAodGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksIHRoaXMueS5yZWQgfHwgKHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLCB0aGlzLmluZiA9IGZhbHNlKTsKICAgIH0KICAgIERsKEN0LCBCZi5CYXNlUG9pbnQpOwogICAgeHIucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gbmV3IEN0KHRoaXMsIGUsIHIsIG8pOwogICAgfTsKICAgIHhyLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gQ3QuZnJvbUpTT04odGhpcywgZSwgcik7CiAgICB9OwogICAgQ3QucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghIXRoaXMuY3VydmUuZW5kbykgewogICAgICAgIHZhciBlID0gdGhpcy5wcmVjb21wdXRlZDsKICAgICAgICBpZiAoZSAmJiBlLmJldGEpCiAgICAgICAgICByZXR1cm4gZS5iZXRhOwogICAgICAgIHZhciByID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTsKICAgICAgICBpZiAoZSkgewogICAgICAgICAgdmFyIG8gPSB0aGlzLmN1cnZlLCBmID0gZnVuY3Rpb24ocCkgewogICAgICAgICAgICByZXR1cm4gby5wb2ludChwLngucmVkTXVsKG8uZW5kby5iZXRhKSwgcC55KTsKICAgICAgICAgIH07CiAgICAgICAgICBlLmJldGEgPSByLCByLnByZWNvbXB1dGVkID0geyBiZXRhOiBudWxsLCBuYWY6IGUubmFmICYmIHsgd25kOiBlLm5hZi53bmQsIHBvaW50czogZS5uYWYucG9pbnRzLm1hcChmKSB9LCBkb3VibGVzOiBlLmRvdWJsZXMgJiYgeyBzdGVwOiBlLmRvdWJsZXMuc3RlcCwgcG9pbnRzOiBlLmRvdWJsZXMucG9pbnRzLm1hcChmKSB9IH07CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgICB9CiAgICB9OwogICAgQ3QucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZCA/IFt0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7IGRvdWJsZXM6IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcyAmJiB7IHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLCBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSkgfSwgbmFmOiB0aGlzLnByZWNvbXB1dGVkLm5hZiAmJiB7IHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLCBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQubmFmLnBvaW50cy5zbGljZSgxKSB9IH1dIDogW3RoaXMueCwgdGhpcy55XTsKICAgIH07CiAgICBDdC5mcm9tSlNPTiA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdHlwZW9mIHIgPT0gInN0cmluZyIgJiYgKHIgPSBKU09OLnBhcnNlKHIpKTsKICAgICAgdmFyIGYgPSBlLnBvaW50KHJbMF0sIHJbMV0sIG8pOwogICAgICBpZiAoIXJbMl0pCiAgICAgICAgcmV0dXJuIGY7CiAgICAgIGZ1bmN0aW9uIHAoeTIpIHsKICAgICAgICByZXR1cm4gZS5wb2ludCh5MlswXSwgeTJbMV0sIG8pOwogICAgICB9CiAgICAgIHZhciBtMiA9IHJbMl07CiAgICAgIHJldHVybiBmLnByZWNvbXB1dGVkID0geyBiZXRhOiBudWxsLCBkb3VibGVzOiBtMi5kb3VibGVzICYmIHsgc3RlcDogbTIuZG91Ymxlcy5zdGVwLCBwb2ludHM6IFtmXS5jb25jYXQobTIuZG91Ymxlcy5wb2ludHMubWFwKHApKSB9LCBuYWY6IG0yLm5hZiAmJiB7IHduZDogbTIubmFmLnduZCwgcG9pbnRzOiBbZl0uY29uY2F0KG0yLm5hZi5wb2ludHMubWFwKHApKSB9IH0sIGY7CiAgICB9OwogICAgQ3QucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpID8gIjxFQyBQb2ludCBJbmZpbml0eT4iIDogIjxFQyBQb2ludCB4OiAiICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAiIHk6ICIgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICI+IjsKICAgIH07CiAgICBDdC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pbmY7CiAgICB9OwogICAgQ3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKHRoaXMuaW5mKQogICAgICAgIHJldHVybiBlOwogICAgICBpZiAoZS5pbmYpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGlmICh0aGlzLmVxKGUpKQogICAgICAgIHJldHVybiB0aGlzLmRibCgpOwogICAgICBpZiAodGhpcy5uZWcoKS5lcShlKSkKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTsKICAgICAgaWYgKHRoaXMueC5jbXAoZS54KSA9PT0gMCkKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTsKICAgICAgdmFyIHIgPSB0aGlzLnkucmVkU3ViKGUueSk7CiAgICAgIHIuY21wbigwKSAhPT0gMCAmJiAociA9IHIucmVkTXVsKHRoaXMueC5yZWRTdWIoZS54KS5yZWRJbnZtKCkpKTsKICAgICAgdmFyIG8gPSByLnJlZFNxcigpLnJlZElTdWIodGhpcy54KS5yZWRJU3ViKGUueCksIGYgPSByLnJlZE11bCh0aGlzLngucmVkU3ViKG8pKS5yZWRJU3ViKHRoaXMueSk7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG8sIGYpOwogICAgfTsKICAgIEN0LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuaW5mKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB2YXIgZSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTsKICAgICAgaWYgKGUuY21wbigwKSA9PT0gMCkKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTsKICAgICAgdmFyIHIgPSB0aGlzLmN1cnZlLmEsIG8gPSB0aGlzLngucmVkU3FyKCksIGYgPSBlLnJlZEludm0oKSwgcCA9IG8ucmVkQWRkKG8pLnJlZElBZGQobykucmVkSUFkZChyKS5yZWRNdWwoZiksIG0yID0gcC5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSksIHkyID0gcC5yZWRNdWwodGhpcy54LnJlZFN1YihtMikpLnJlZElTdWIodGhpcy55KTsKICAgICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobTIsIHkyKTsKICAgIH07CiAgICBDdC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTsKICAgIH07CiAgICBDdC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTsKICAgIH07CiAgICBDdC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSA9IG5ldyBsdChlLCAxNiksIHRoaXMuaXNJbmZpbml0eSgpID8gdGhpcyA6IHRoaXMuX2hhc0RvdWJsZXMoZSkgPyB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBlKSA6IHRoaXMuY3VydmUuZW5kbyA/IHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFt0aGlzXSwgW2VdKSA6IHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgZSk7CiAgICB9OwogICAgQ3QucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdmFyIGYgPSBbdGhpcywgcl0sIHAgPSBbZSwgb107CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmVuZG8gPyB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChmLCBwKSA6IHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgZiwgcCwgMik7CiAgICB9OwogICAgQ3QucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHZhciBmID0gW3RoaXMsIHJdLCBwID0gW2UsIG9dOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5lbmRvID8gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoZiwgcCwgdHJ1ZSkgOiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIGYsIHAsIDIsIHRydWUpOwogICAgfTsKICAgIEN0LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMgPT09IGUgfHwgdGhpcy5pbmYgPT09IGUuaW5mICYmICh0aGlzLmluZiB8fCB0aGlzLnguY21wKGUueCkgPT09IDAgJiYgdGhpcy55LmNtcChlLnkpID09PSAwKTsKICAgIH07CiAgICBDdC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAodGhpcy5pbmYpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIHZhciByID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7CiAgICAgIGlmIChlICYmIHRoaXMucHJlY29tcHV0ZWQpIHsKICAgICAgICB2YXIgbyA9IHRoaXMucHJlY29tcHV0ZWQsIGYgPSBmdW5jdGlvbihwKSB7CiAgICAgICAgICByZXR1cm4gcC5uZWcoKTsKICAgICAgICB9OwogICAgICAgIHIucHJlY29tcHV0ZWQgPSB7IG5hZjogby5uYWYgJiYgeyB3bmQ6IG8ubmFmLnduZCwgcG9pbnRzOiBvLm5hZi5wb2ludHMubWFwKGYpIH0sIGRvdWJsZXM6IG8uZG91YmxlcyAmJiB7IHN0ZXA6IG8uZG91Ymxlcy5zdGVwLCBwb2ludHM6IG8uZG91Ymxlcy5wb2ludHMubWFwKGYpIH0gfTsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH07CiAgICBDdC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmluZikKICAgICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgIHZhciBlID0gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnksIHRoaXMuY3VydmUub25lKTsKICAgICAgcmV0dXJuIGU7CiAgICB9OwogICAgZnVuY3Rpb24gV3QodCwgZSwgciwgbykgewogICAgICBCZi5CYXNlUG9pbnQuY2FsbCh0aGlzLCB0LCAiamFjb2JpYW4iKSwgZSA9PT0gbnVsbCAmJiByID09PSBudWxsICYmIG8gPT09IG51bGwgPyAodGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmUsIHRoaXMueSA9IHRoaXMuY3VydmUub25lLCB0aGlzLnogPSBuZXcgbHQoMCkpIDogKHRoaXMueCA9IG5ldyBsdChlLCAxNiksIHRoaXMueSA9IG5ldyBsdChyLCAxNiksIHRoaXMueiA9IG5ldyBsdChvLCAxNikpLCB0aGlzLngucmVkIHx8ICh0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSwgdGhpcy55LnJlZCB8fCAodGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksIHRoaXMuei5yZWQgfHwgKHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLCB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lOwogICAgfQogICAgRGwoV3QsIEJmLkJhc2VQb2ludCk7CiAgICB4ci5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gbmV3IFd0KHRoaXMsIGUsIHIsIG8pOwogICAgfTsKICAgIFd0LnByb3RvdHlwZS50b1AgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKQogICAgICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOwogICAgICB2YXIgZSA9IHRoaXMuei5yZWRJbnZtKCksIHIgPSBlLnJlZFNxcigpLCBvID0gdGhpcy54LnJlZE11bChyKSwgZiA9IHRoaXMueS5yZWRNdWwocikucmVkTXVsKGUpOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChvLCBmKTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAodGhpcy5pc0luZmluaXR5KCkpCiAgICAgICAgcmV0dXJuIGU7CiAgICAgIGlmIChlLmlzSW5maW5pdHkoKSkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgdmFyIHIgPSBlLnoucmVkU3FyKCksIG8gPSB0aGlzLnoucmVkU3FyKCksIGYgPSB0aGlzLngucmVkTXVsKHIpLCBwID0gZS54LnJlZE11bChvKSwgbTIgPSB0aGlzLnkucmVkTXVsKHIucmVkTXVsKGUueikpLCB5MiA9IGUueS5yZWRNdWwoby5yZWRNdWwodGhpcy56KSksIE0gPSBmLnJlZFN1YihwKSwgeCA9IG0yLnJlZFN1Yih5Mik7CiAgICAgIGlmIChNLmNtcG4oMCkgPT09IDApCiAgICAgICAgcmV0dXJuIHguY21wbigwKSAhPT0gMCA/IHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpIDogdGhpcy5kYmwoKTsKICAgICAgdmFyIFMgPSBNLnJlZFNxcigpLCBFMiA9IFMucmVkTXVsKE0pLCBCID0gZi5yZWRNdWwoUyksIHEyID0geC5yZWRTcXIoKS5yZWRJQWRkKEUyKS5yZWRJU3ViKEIpLnJlZElTdWIoQiksIEwyID0geC5yZWRNdWwoQi5yZWRJU3ViKHEyKSkucmVkSVN1YihtMi5yZWRNdWwoRTIpKSwgZ2UgPSB0aGlzLnoucmVkTXVsKGUueikucmVkTXVsKE0pOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQocTIsIEwyLCBnZSk7CiAgICB9OwogICAgV3QucHJvdG90eXBlLm1peGVkQWRkID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAodGhpcy5pc0luZmluaXR5KCkpCiAgICAgICAgcmV0dXJuIGUudG9KKCk7CiAgICAgIGlmIChlLmlzSW5maW5pdHkoKSkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgdmFyIHIgPSB0aGlzLnoucmVkU3FyKCksIG8gPSB0aGlzLngsIGYgPSBlLngucmVkTXVsKHIpLCBwID0gdGhpcy55LCBtMiA9IGUueS5yZWRNdWwocikucmVkTXVsKHRoaXMueiksIHkyID0gby5yZWRTdWIoZiksIE0gPSBwLnJlZFN1YihtMik7CiAgICAgIGlmICh5Mi5jbXBuKDApID09PSAwKQogICAgICAgIHJldHVybiBNLmNtcG4oMCkgIT09IDAgPyB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKSA6IHRoaXMuZGJsKCk7CiAgICAgIHZhciB4ID0geTIucmVkU3FyKCksIFMgPSB4LnJlZE11bCh5MiksIEUyID0gby5yZWRNdWwoeCksIEIgPSBNLnJlZFNxcigpLnJlZElBZGQoUykucmVkSVN1YihFMikucmVkSVN1YihFMiksIHEyID0gTS5yZWRNdWwoRTIucmVkSVN1YihCKSkucmVkSVN1YihwLnJlZE11bChTKSksIEwyID0gdGhpcy56LnJlZE11bCh5Mik7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChCLCBxMiwgTDIpOwogICAgfTsKICAgIFd0LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAoZSA9PT0gMCkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBpZiAoIWUpCiAgICAgICAgcmV0dXJuIHRoaXMuZGJsKCk7CiAgICAgIHZhciByOwogICAgICBpZiAodGhpcy5jdXJ2ZS56ZXJvQSB8fCB0aGlzLmN1cnZlLnRocmVlQSkgewogICAgICAgIHZhciBvID0gdGhpczsKICAgICAgICBmb3IgKHIgPSAwO3IgPCBlOyByKyspCiAgICAgICAgICBvID0gby5kYmwoKTsKICAgICAgICByZXR1cm4gbzsKICAgICAgfQogICAgICB2YXIgZiA9IHRoaXMuY3VydmUuYSwgcCA9IHRoaXMuY3VydmUudGludiwgbTIgPSB0aGlzLngsIHkyID0gdGhpcy55LCBNID0gdGhpcy56LCB4ID0gTS5yZWRTcXIoKS5yZWRTcXIoKSwgUyA9IHkyLnJlZEFkZCh5Mik7CiAgICAgIGZvciAociA9IDA7ciA8IGU7IHIrKykgewogICAgICAgIHZhciBFMiA9IG0yLnJlZFNxcigpLCBCID0gUy5yZWRTcXIoKSwgcTIgPSBCLnJlZFNxcigpLCBMMiA9IEUyLnJlZEFkZChFMikucmVkSUFkZChFMikucmVkSUFkZChmLnJlZE11bCh4KSksIGdlID0gbTIucmVkTXVsKEIpLCBfZSA9IEwyLnJlZFNxcigpLnJlZElTdWIoZ2UucmVkQWRkKGdlKSksIE4gPSBnZS5yZWRJU3ViKF9lKSwgd2UgPSBMMi5yZWRNdWwoTik7CiAgICAgICAgd2UgPSB3ZS5yZWRJQWRkKHdlKS5yZWRJU3ViKHEyKTsKICAgICAgICB2YXIgeWUgPSBTLnJlZE11bChNKTsKICAgICAgICByICsgMSA8IGUgJiYgKHggPSB4LnJlZE11bChxMikpLCBtMiA9IF9lLCBNID0geWUsIFMgPSB3ZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobTIsIFMucmVkTXVsKHApLCBNKTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzSW5maW5pdHkoKSA/IHRoaXMgOiB0aGlzLmN1cnZlLnplcm9BID8gdGhpcy5femVyb0RibCgpIDogdGhpcy5jdXJ2ZS50aHJlZUEgPyB0aGlzLl90aHJlZURibCgpIDogdGhpcy5fZGJsKCk7CiAgICB9OwogICAgV3QucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlLCByLCBvOwogICAgICBpZiAodGhpcy56T25lKSB7CiAgICAgICAgdmFyIGYgPSB0aGlzLngucmVkU3FyKCksIHAgPSB0aGlzLnkucmVkU3FyKCksIG0yID0gcC5yZWRTcXIoKSwgeTIgPSB0aGlzLngucmVkQWRkKHApLnJlZFNxcigpLnJlZElTdWIoZikucmVkSVN1YihtMik7CiAgICAgICAgeTIgPSB5Mi5yZWRJQWRkKHkyKTsKICAgICAgICB2YXIgTSA9IGYucmVkQWRkKGYpLnJlZElBZGQoZiksIHggPSBNLnJlZFNxcigpLnJlZElTdWIoeTIpLnJlZElTdWIoeTIpLCBTID0gbTIucmVkSUFkZChtMik7CiAgICAgICAgUyA9IFMucmVkSUFkZChTKSwgUyA9IFMucmVkSUFkZChTKSwgZSA9IHgsIHIgPSBNLnJlZE11bCh5Mi5yZWRJU3ViKHgpKS5yZWRJU3ViKFMpLCBvID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBFMiA9IHRoaXMueC5yZWRTcXIoKSwgQiA9IHRoaXMueS5yZWRTcXIoKSwgcTIgPSBCLnJlZFNxcigpLCBMMiA9IHRoaXMueC5yZWRBZGQoQikucmVkU3FyKCkucmVkSVN1YihFMikucmVkSVN1YihxMik7CiAgICAgICAgTDIgPSBMMi5yZWRJQWRkKEwyKTsKICAgICAgICB2YXIgZ2UgPSBFMi5yZWRBZGQoRTIpLnJlZElBZGQoRTIpLCBfZSA9IGdlLnJlZFNxcigpLCBOID0gcTIucmVkSUFkZChxMik7CiAgICAgICAgTiA9IE4ucmVkSUFkZChOKSwgTiA9IE4ucmVkSUFkZChOKSwgZSA9IF9lLnJlZElTdWIoTDIpLnJlZElTdWIoTDIpLCByID0gZ2UucmVkTXVsKEwyLnJlZElTdWIoZSkpLnJlZElTdWIoTiksIG8gPSB0aGlzLnkucmVkTXVsKHRoaXMueiksIG8gPSBvLnJlZElBZGQobyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGUsIHIsIG8pOwogICAgfTsKICAgIFd0LnByb3RvdHlwZS5fdGhyZWVEYmwgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUsIHIsIG87CiAgICAgIGlmICh0aGlzLnpPbmUpIHsKICAgICAgICB2YXIgZiA9IHRoaXMueC5yZWRTcXIoKSwgcCA9IHRoaXMueS5yZWRTcXIoKSwgbTIgPSBwLnJlZFNxcigpLCB5MiA9IHRoaXMueC5yZWRBZGQocCkucmVkU3FyKCkucmVkSVN1YihmKS5yZWRJU3ViKG0yKTsKICAgICAgICB5MiA9IHkyLnJlZElBZGQoeTIpOwogICAgICAgIHZhciBNID0gZi5yZWRBZGQoZikucmVkSUFkZChmKS5yZWRJQWRkKHRoaXMuY3VydmUuYSksIHggPSBNLnJlZFNxcigpLnJlZElTdWIoeTIpLnJlZElTdWIoeTIpOwogICAgICAgIGUgPSB4OwogICAgICAgIHZhciBTID0gbTIucmVkSUFkZChtMik7CiAgICAgICAgUyA9IFMucmVkSUFkZChTKSwgUyA9IFMucmVkSUFkZChTKSwgciA9IE0ucmVkTXVsKHkyLnJlZElTdWIoeCkpLnJlZElTdWIoUyksIG8gPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIEUyID0gdGhpcy56LnJlZFNxcigpLCBCID0gdGhpcy55LnJlZFNxcigpLCBxMiA9IHRoaXMueC5yZWRNdWwoQiksIEwyID0gdGhpcy54LnJlZFN1YihFMikucmVkTXVsKHRoaXMueC5yZWRBZGQoRTIpKTsKICAgICAgICBMMiA9IEwyLnJlZEFkZChMMikucmVkSUFkZChMMik7CiAgICAgICAgdmFyIGdlID0gcTIucmVkSUFkZChxMik7CiAgICAgICAgZ2UgPSBnZS5yZWRJQWRkKGdlKTsKICAgICAgICB2YXIgX2UgPSBnZS5yZWRBZGQoZ2UpOwogICAgICAgIGUgPSBMMi5yZWRTcXIoKS5yZWRJU3ViKF9lKSwgbyA9IHRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKEIpLnJlZElTdWIoRTIpOwogICAgICAgIHZhciBOID0gQi5yZWRTcXIoKTsKICAgICAgICBOID0gTi5yZWRJQWRkKE4pLCBOID0gTi5yZWRJQWRkKE4pLCBOID0gTi5yZWRJQWRkKE4pLCByID0gTDIucmVkTXVsKGdlLnJlZElTdWIoZSkpLnJlZElTdWIoTik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGUsIHIsIG8pOwogICAgfTsKICAgIFd0LnByb3RvdHlwZS5fZGJsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpcy5jdXJ2ZS5hLCByID0gdGhpcy54LCBvID0gdGhpcy55LCBmID0gdGhpcy56LCBwID0gZi5yZWRTcXIoKS5yZWRTcXIoKSwgbTIgPSByLnJlZFNxcigpLCB5MiA9IG8ucmVkU3FyKCksIE0gPSBtMi5yZWRBZGQobTIpLnJlZElBZGQobTIpLnJlZElBZGQoZS5yZWRNdWwocCkpLCB4ID0gci5yZWRBZGQocik7CiAgICAgIHggPSB4LnJlZElBZGQoeCk7CiAgICAgIHZhciBTID0geC5yZWRNdWwoeTIpLCBFMiA9IE0ucmVkU3FyKCkucmVkSVN1YihTLnJlZEFkZChTKSksIEIgPSBTLnJlZElTdWIoRTIpLCBxMiA9IHkyLnJlZFNxcigpOwogICAgICBxMiA9IHEyLnJlZElBZGQocTIpLCBxMiA9IHEyLnJlZElBZGQocTIpLCBxMiA9IHEyLnJlZElBZGQocTIpOwogICAgICB2YXIgTDIgPSBNLnJlZE11bChCKS5yZWRJU3ViKHEyKSwgZ2UgPSBvLnJlZEFkZChvKS5yZWRNdWwoZik7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChFMiwgTDIsIGdlKTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUudHJwbCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXRoaXMuY3VydmUuemVyb0EpCiAgICAgICAgcmV0dXJuIHRoaXMuZGJsKCkuYWRkKHRoaXMpOwogICAgICB2YXIgZSA9IHRoaXMueC5yZWRTcXIoKSwgciA9IHRoaXMueS5yZWRTcXIoKSwgbyA9IHRoaXMuei5yZWRTcXIoKSwgZiA9IHIucmVkU3FyKCksIHAgPSBlLnJlZEFkZChlKS5yZWRJQWRkKGUpLCBtMiA9IHAucmVkU3FyKCksIHkyID0gdGhpcy54LnJlZEFkZChyKS5yZWRTcXIoKS5yZWRJU3ViKGUpLnJlZElTdWIoZik7CiAgICAgIHkyID0geTIucmVkSUFkZCh5MiksIHkyID0geTIucmVkQWRkKHkyKS5yZWRJQWRkKHkyKSwgeTIgPSB5Mi5yZWRJU3ViKG0yKTsKICAgICAgdmFyIE0gPSB5Mi5yZWRTcXIoKSwgeCA9IGYucmVkSUFkZChmKTsKICAgICAgeCA9IHgucmVkSUFkZCh4KSwgeCA9IHgucmVkSUFkZCh4KSwgeCA9IHgucmVkSUFkZCh4KTsKICAgICAgdmFyIFMgPSBwLnJlZElBZGQoeTIpLnJlZFNxcigpLnJlZElTdWIobTIpLnJlZElTdWIoTSkucmVkSVN1Yih4KSwgRTIgPSByLnJlZE11bChTKTsKICAgICAgRTIgPSBFMi5yZWRJQWRkKEUyKSwgRTIgPSBFMi5yZWRJQWRkKEUyKTsKICAgICAgdmFyIEIgPSB0aGlzLngucmVkTXVsKE0pLnJlZElTdWIoRTIpOwogICAgICBCID0gQi5yZWRJQWRkKEIpLCBCID0gQi5yZWRJQWRkKEIpOwogICAgICB2YXIgcTIgPSB0aGlzLnkucmVkTXVsKFMucmVkTXVsKHgucmVkSVN1YihTKSkucmVkSVN1Yih5Mi5yZWRNdWwoTSkpKTsKICAgICAgcTIgPSBxMi5yZWRJQWRkKHEyKSwgcTIgPSBxMi5yZWRJQWRkKHEyKSwgcTIgPSBxMi5yZWRJQWRkKHEyKTsKICAgICAgdmFyIEwyID0gdGhpcy56LnJlZEFkZCh5MikucmVkU3FyKCkucmVkSVN1YihvKS5yZWRJU3ViKE0pOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoQiwgcTIsIEwyKTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSA9IG5ldyBsdChlLCByKSwgdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBlKTsKICAgIH07CiAgICBXdC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChlLnR5cGUgPT09ICJhZmZpbmUiKQogICAgICAgIHJldHVybiB0aGlzLmVxKGUudG9KKCkpOwogICAgICBpZiAodGhpcyA9PT0gZSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgdmFyIHIgPSB0aGlzLnoucmVkU3FyKCksIG8gPSBlLnoucmVkU3FyKCk7CiAgICAgIGlmICh0aGlzLngucmVkTXVsKG8pLnJlZElTdWIoZS54LnJlZE11bChyKSkuY21wbigwKSAhPT0gMCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHZhciBmID0gci5yZWRNdWwodGhpcy56KSwgcCA9IG8ucmVkTXVsKGUueik7CiAgICAgIHJldHVybiB0aGlzLnkucmVkTXVsKHApLnJlZElTdWIoZS55LnJlZE11bChmKSkuY21wbigwKSA9PT0gMDsKICAgIH07CiAgICBXdC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgciA9IHRoaXMuei5yZWRTcXIoKSwgbyA9IGUudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bChyKTsKICAgICAgaWYgKHRoaXMueC5jbXAobykgPT09IDApCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGZvciAodmFyIGYgPSBlLmNsb25lKCksIHAgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHIpOzsgKSB7CiAgICAgICAgaWYgKGYuaWFkZCh0aGlzLmN1cnZlLm4pLCBmLmNtcCh0aGlzLmN1cnZlLnApID49IDApCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKG8ucmVkSUFkZChwKSwgdGhpcy54LmNtcChvKSA9PT0gMCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogICAgV3QucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpID8gIjxFQyBKUG9pbnQgSW5maW5pdHk+IiA6ICI8RUMgSlBvaW50IHg6ICIgKyB0aGlzLngudG9TdHJpbmcoMTYsIDIpICsgIiB5OiAiICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArICIgejogIiArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAiPiI7CiAgICB9OwogICAgV3QucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwOwogICAgfTsKICB9KTsKICB5MiA9IFQyKChFaywgZzIpID0+IHsKICAgIHZhciBxZiA9IHJpKCksIG0yID0gSWUoKSwgR3MgPSBPYSgpLCBNQSA9IG9yKCk7CiAgICBmdW5jdGlvbiBJZih0KSB7CiAgICAgIEdzLmNhbGwodGhpcywgIm1vbnQiLCB0KSwgdGhpcy5hID0gbmV3IHFmKHQuYSwgMTYpLnRvUmVkKHRoaXMucmVkKSwgdGhpcy5iID0gbmV3IHFmKHQuYiwgMTYpLnRvUmVkKHRoaXMucmVkKSwgdGhpcy5pNCA9IG5ldyBxZig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpLCB0aGlzLnR3byA9IG5ldyBxZigyKS50b1JlZCh0aGlzLnJlZCksIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpOwogICAgfQogICAgbTIoSWYsIEdzKTsKICAgIGcyLmV4cG9ydHMgPSBJZjsKICAgIElmLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSBlLm5vcm1hbGl6ZSgpLngsIG8gPSByLnJlZFNxcigpLCBmID0gby5yZWRNdWwocikucmVkQWRkKG8ucmVkTXVsKHRoaXMuYSkpLnJlZEFkZChyKSwgcCA9IGYucmVkU3FydCgpOwogICAgICByZXR1cm4gcC5yZWRTcXIoKS5jbXAoZikgPT09IDA7CiAgICB9OwogICAgZnVuY3Rpb24gT3QodCwgZSwgcikgewogICAgICBHcy5CYXNlUG9pbnQuY2FsbCh0aGlzLCB0LCAicHJvamVjdGl2ZSIpLCBlID09PSBudWxsICYmIHIgPT09IG51bGwgPyAodGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmUsIHRoaXMueiA9IHRoaXMuY3VydmUuemVybykgOiAodGhpcy54ID0gbmV3IHFmKGUsIDE2KSwgdGhpcy56ID0gbmV3IHFmKHIsIDE2KSwgdGhpcy54LnJlZCB8fCAodGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKSksIHRoaXMuei5yZWQgfHwgKHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpKTsKICAgIH0KICAgIG0yKE90LCBHcy5CYXNlUG9pbnQpOwogICAgSWYucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdGhpcy5wb2ludChNQS50b0FycmF5KGUsIHIpLCAxKTsKICAgIH07CiAgICBJZi5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBuZXcgT3QodGhpcywgZSwgcik7CiAgICB9OwogICAgSWYucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBPdC5mcm9tSlNPTih0aGlzLCBlKTsKICAgIH07CiAgICBPdC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIE90LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmdldFgoKS50b0FycmF5KCJiZSIsIHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkpOwogICAgfTsKICAgIE90LmZyb21KU09OID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gbmV3IE90KGUsIHJbMF0sIHJbMV0gfHwgZS5vbmUpOwogICAgfTsKICAgIE90LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzSW5maW5pdHkoKSA/ICI8RUMgUG9pbnQgSW5maW5pdHk+IiA6ICI8RUMgUG9pbnQgeDogIiArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgIiB6OiAiICsgdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAiPiI7CiAgICB9OwogICAgT3QucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwOwogICAgfTsKICAgIE90LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUgPSB0aGlzLngucmVkQWRkKHRoaXMueiksIHIgPSBlLnJlZFNxcigpLCBvID0gdGhpcy54LnJlZFN1Yih0aGlzLnopLCBmID0gby5yZWRTcXIoKSwgcCA9IHIucmVkU3ViKGYpLCBtMyA9IHIucmVkTXVsKGYpLCB5MyA9IHAucmVkTXVsKGYucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChwKSkpOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChtMywgeTMpOwogICAgfTsKICAgIE90LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUiKTsKICAgIH07CiAgICBPdC5wcm90b3R5cGUuZGlmZkFkZCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgdmFyIG8gPSB0aGlzLngucmVkQWRkKHRoaXMueiksIGYgPSB0aGlzLngucmVkU3ViKHRoaXMueiksIHAgPSBlLngucmVkQWRkKGUueiksIG0zID0gZS54LnJlZFN1YihlLnopLCB5MyA9IG0zLnJlZE11bChvKSwgTSA9IHAucmVkTXVsKGYpLCB4ID0gci56LnJlZE11bCh5My5yZWRBZGQoTSkucmVkU3FyKCkpLCBTID0gci54LnJlZE11bCh5My5yZWRJU3ViKE0pLnJlZFNxcigpKTsKICAgICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQoeCwgUyk7CiAgICB9OwogICAgT3QucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZm9yICh2YXIgciA9IGUuY2xvbmUoKSwgbyA9IHRoaXMsIGYgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpLCBwID0gdGhpcywgbTMgPSBbXTtyLmNtcG4oMCkgIT09IDA7IHIuaXVzaHJuKDEpKQogICAgICAgIG0zLnB1c2goci5hbmRsbigxKSk7CiAgICAgIGZvciAodmFyIHkzID0gbTMubGVuZ3RoIC0gMTt5MyA+PSAwOyB5My0tKQogICAgICAgIG0zW3kzXSA9PT0gMCA/IChvID0gby5kaWZmQWRkKGYsIHApLCBmID0gZi5kYmwoKSkgOiAoZiA9IG8uZGlmZkFkZChmLCBwKSwgbyA9IG8uZGJsKCkpOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgICBPdC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIik7CiAgICB9OwogICAgT3QucHJvdG90eXBlLmp1bWxBZGQgPSBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUiKTsKICAgIH07CiAgICBPdC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB0aGlzLmdldFgoKS5jbXAoZS5nZXRYKCkpID09PSAwOwogICAgfTsKICAgIE90LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSksIHRoaXMueiA9IHRoaXMuY3VydmUub25lLCB0aGlzOwogICAgfTsKICAgIE90LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLCB0aGlzLnguZnJvbVJlZCgpOwogICAgfTsKICB9KTsKICBfMiA9IFQyKChBaywgTTIpID0+IHsKICAgIHZhciBfQSA9IG9yKCksIEFpID0gcmkoKSwgdzIgPSBJZSgpLCBZcyA9IE9hKCksIHhBID0gX0EuYXNzZXJ0OwogICAgZnVuY3Rpb24gaWkodCkgewogICAgICB0aGlzLnR3aXN0ZWQgPSAodC5hIHwgMCkgIT09IDEsIHRoaXMubU9uZUEgPSB0aGlzLnR3aXN0ZWQgJiYgKHQuYSB8IDApID09PSAtMSwgdGhpcy5leHRlbmRlZCA9IHRoaXMubU9uZUEsIFlzLmNhbGwodGhpcywgImVkd2FyZHMiLCB0KSwgdGhpcy5hID0gbmV3IEFpKHQuYSwgMTYpLnVtb2QodGhpcy5yZWQubSksIHRoaXMuYSA9IHRoaXMuYS50b1JlZCh0aGlzLnJlZCksIHRoaXMuYyA9IG5ldyBBaSh0LmMsIDE2KS50b1JlZCh0aGlzLnJlZCksIHRoaXMuYzIgPSB0aGlzLmMucmVkU3FyKCksIHRoaXMuZCA9IG5ldyBBaSh0LmQsIDE2KS50b1JlZCh0aGlzLnJlZCksIHRoaXMuZGQgPSB0aGlzLmQucmVkQWRkKHRoaXMuZCksIHhBKCF0aGlzLnR3aXN0ZWQgfHwgdGhpcy5jLmZyb21SZWQoKS5jbXBuKDEpID09PSAwKSwgdGhpcy5vbmVDID0gKHQuYyB8IDApID09PSAxOwogICAgfQogICAgdzIoaWksIFlzKTsKICAgIE0yLmV4cG9ydHMgPSBpaTsKICAgIGlpLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMubU9uZUEgPyBlLnJlZE5lZygpIDogdGhpcy5hLnJlZE11bChlKTsKICAgIH07CiAgICBpaS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB0aGlzLm9uZUMgPyBlIDogdGhpcy5jLnJlZE11bChlKTsKICAgIH07CiAgICBpaS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICByZXR1cm4gdGhpcy5wb2ludChlLCByLCBvLCBmKTsKICAgIH07CiAgICBpaS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZSA9IG5ldyBBaShlLCAxNiksIGUucmVkIHx8IChlID0gZS50b1JlZCh0aGlzLnJlZCkpOwogICAgICB2YXIgbyA9IGUucmVkU3FyKCksIGYgPSB0aGlzLmMyLnJlZFN1Yih0aGlzLmEucmVkTXVsKG8pKSwgcCA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bChvKSksIG0yID0gZi5yZWRNdWwocC5yZWRJbnZtKCkpLCB5MyA9IG0yLnJlZFNxcnQoKTsKICAgICAgaWYgKHkzLnJlZFNxcigpLnJlZFN1YihtMikuY21wKHRoaXMuemVybykgIT09IDApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvaW50Iik7CiAgICAgIHZhciBNID0geTMuZnJvbVJlZCgpLmlzT2RkKCk7CiAgICAgIHJldHVybiAociAmJiAhTSB8fCAhciAmJiBNKSAmJiAoeTMgPSB5My5yZWROZWcoKSksIHRoaXMucG9pbnQoZSwgeTMpOwogICAgfTsKICAgIGlpLnByb3RvdHlwZS5wb2ludEZyb21ZID0gZnVuY3Rpb24oZSwgcikgewogICAgICBlID0gbmV3IEFpKGUsIDE2KSwgZS5yZWQgfHwgKGUgPSBlLnRvUmVkKHRoaXMucmVkKSk7CiAgICAgIHZhciBvID0gZS5yZWRTcXIoKSwgZiA9IG8ucmVkU3ViKHRoaXMuYzIpLCBwID0gby5yZWRNdWwodGhpcy5kKS5yZWRNdWwodGhpcy5jMikucmVkU3ViKHRoaXMuYSksIG0yID0gZi5yZWRNdWwocC5yZWRJbnZtKCkpOwogICAgICBpZiAobTIuY21wKHRoaXMuemVybykgPT09IDApIHsKICAgICAgICBpZiAocikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwb2ludCIpOwogICAgICAgIHJldHVybiB0aGlzLnBvaW50KHRoaXMuemVybywgZSk7CiAgICAgIH0KICAgICAgdmFyIHkzID0gbTIucmVkU3FydCgpOwogICAgICBpZiAoeTMucmVkU3FyKCkucmVkU3ViKG0yKS5jbXAodGhpcy56ZXJvKSAhPT0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9pbnQiKTsKICAgICAgcmV0dXJuIHkzLmZyb21SZWQoKS5pc09kZCgpICE9PSByICYmICh5MyA9IHkzLnJlZE5lZygpKSwgdGhpcy5wb2ludCh5MywgZSk7CiAgICB9OwogICAgaWkucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZSkgewogICAgICBpZiAoZS5pc0luZmluaXR5KCkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGUubm9ybWFsaXplKCk7CiAgICAgIHZhciByID0gZS54LnJlZFNxcigpLCBvID0gZS55LnJlZFNxcigpLCBmID0gci5yZWRNdWwodGhpcy5hKS5yZWRBZGQobyksIHAgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bChyKS5yZWRNdWwobykpKTsKICAgICAgcmV0dXJuIGYuY21wKHApID09PSAwOwogICAgfTsKICAgIGZ1bmN0aW9uIGF0KHQsIGUsIHIsIG8sIGYpIHsKICAgICAgWXMuQmFzZVBvaW50LmNhbGwodGhpcywgdCwgInByb2plY3RpdmUiKSwgZSA9PT0gbnVsbCAmJiByID09PSBudWxsICYmIG8gPT09IG51bGwgPyAodGhpcy54ID0gdGhpcy5jdXJ2ZS56ZXJvLCB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZSwgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmUsIHRoaXMudCA9IHRoaXMuY3VydmUuemVybywgdGhpcy56T25lID0gdHJ1ZSkgOiAodGhpcy54ID0gbmV3IEFpKGUsIDE2KSwgdGhpcy55ID0gbmV3IEFpKHIsIDE2KSwgdGhpcy56ID0gbyA/IG5ldyBBaShvLCAxNikgOiB0aGlzLmN1cnZlLm9uZSwgdGhpcy50ID0gZiAmJiBuZXcgQWkoZiwgMTYpLCB0aGlzLngucmVkIHx8ICh0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSwgdGhpcy55LnJlZCB8fCAodGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksIHRoaXMuei5yZWQgfHwgKHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLCB0aGlzLnQgJiYgIXRoaXMudC5yZWQgJiYgKHRoaXMudCA9IHRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLCB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lLCB0aGlzLmN1cnZlLmV4dGVuZGVkICYmICF0aGlzLnQgJiYgKHRoaXMudCA9IHRoaXMueC5yZWRNdWwodGhpcy55KSwgdGhpcy56T25lIHx8ICh0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpKSkpOwogICAgfQogICAgdzIoYXQsIFlzLkJhc2VQb2ludCk7CiAgICBpaS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGF0LmZyb21KU09OKHRoaXMsIGUpOwogICAgfTsKICAgIGlpLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgcmV0dXJuIG5ldyBhdCh0aGlzLCBlLCByLCBvLCBmKTsKICAgIH07CiAgICBhdC5mcm9tSlNPTiA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIG5ldyBhdChlLCByWzBdLCByWzFdLCByWzJdKTsKICAgIH07CiAgICBhdC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5KCkgPyAiPEVDIFBvaW50IEluZmluaXR5PiIgOiAiPEVDIFBvaW50IHg6ICIgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICIgeTogIiArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgIiB6OiAiICsgdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAiPiI7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmICh0aGlzLnkuY21wKHRoaXMueikgPT09IDAgfHwgdGhpcy56T25lICYmIHRoaXMueS5jbXAodGhpcy5jdXJ2ZS5jKSA9PT0gMCk7CiAgICB9OwogICAgYXQucHJvdG90eXBlLl9leHREYmwgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUgPSB0aGlzLngucmVkU3FyKCksIHIgPSB0aGlzLnkucmVkU3FyKCksIG8gPSB0aGlzLnoucmVkU3FyKCk7CiAgICAgIG8gPSBvLnJlZElBZGQobyk7CiAgICAgIHZhciBmID0gdGhpcy5jdXJ2ZS5fbXVsQShlKSwgcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGUpLnJlZElTdWIociksIG0yID0gZi5yZWRBZGQociksIHkzID0gbTIucmVkU3ViKG8pLCBNID0gZi5yZWRTdWIociksIHggPSBwLnJlZE11bCh5MyksIFMgPSBtMi5yZWRNdWwoTSksIEUyID0gcC5yZWRNdWwoTSksIEIgPSB5My5yZWRNdWwobTIpOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh4LCBTLCBCLCBFMik7CiAgICB9OwogICAgYXQucHJvdG90eXBlLl9wcm9qRGJsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLCByID0gdGhpcy54LnJlZFNxcigpLCBvID0gdGhpcy55LnJlZFNxcigpLCBmLCBwLCBtMiwgeTMsIE0sIHg7CiAgICAgIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHsKICAgICAgICB5MyA9IHRoaXMuY3VydmUuX211bEEocik7CiAgICAgICAgdmFyIFMgPSB5My5yZWRBZGQobyk7CiAgICAgICAgdGhpcy56T25lID8gKGYgPSBlLnJlZFN1YihyKS5yZWRTdWIobykucmVkTXVsKFMucmVkU3ViKHRoaXMuY3VydmUudHdvKSksIHAgPSBTLnJlZE11bCh5My5yZWRTdWIobykpLCBtMiA9IFMucmVkU3FyKCkucmVkU3ViKFMpLnJlZFN1YihTKSkgOiAoTSA9IHRoaXMuei5yZWRTcXIoKSwgeCA9IFMucmVkU3ViKE0pLnJlZElTdWIoTSksIGYgPSBlLnJlZFN1YihyKS5yZWRJU3ViKG8pLnJlZE11bCh4KSwgcCA9IFMucmVkTXVsKHkzLnJlZFN1YihvKSksIG0yID0gUy5yZWRNdWwoeCkpOwogICAgICB9IGVsc2UKICAgICAgICB5MyA9IHIucmVkQWRkKG8pLCBNID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpLCB4ID0geTMucmVkU3ViKE0pLnJlZFN1YihNKSwgZiA9IHRoaXMuY3VydmUuX211bEMoZS5yZWRJU3ViKHkzKSkucmVkTXVsKHgpLCBwID0gdGhpcy5jdXJ2ZS5fbXVsQyh5MykucmVkTXVsKHIucmVkSVN1YihvKSksIG0yID0geTMucmVkTXVsKHgpOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChmLCBwLCBtMik7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5KCkgPyB0aGlzIDogdGhpcy5jdXJ2ZS5leHRlbmRlZCA/IHRoaXMuX2V4dERibCgpIDogdGhpcy5fcHJvakRibCgpOwogICAgfTsKICAgIGF0LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgciA9IHRoaXMueS5yZWRTdWIodGhpcy54KS5yZWRNdWwoZS55LnJlZFN1YihlLngpKSwgbyA9IHRoaXMueS5yZWRBZGQodGhpcy54KS5yZWRNdWwoZS55LnJlZEFkZChlLngpKSwgZiA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKGUudCksIHAgPSB0aGlzLnoucmVkTXVsKGUuei5yZWRBZGQoZS56KSksIG0yID0gby5yZWRTdWIociksIHkzID0gcC5yZWRTdWIoZiksIE0gPSBwLnJlZEFkZChmKSwgeCA9IG8ucmVkQWRkKHIpLCBTID0gbTIucmVkTXVsKHkzKSwgRTIgPSBNLnJlZE11bCh4KSwgQiA9IG0yLnJlZE11bCh4KSwgcTIgPSB5My5yZWRNdWwoTSk7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KFMsIEUyLCBxMiwgQik7CiAgICB9OwogICAgYXQucHJvdG90eXBlLl9wcm9qQWRkID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgciA9IHRoaXMuei5yZWRNdWwoZS56KSwgbyA9IHIucmVkU3FyKCksIGYgPSB0aGlzLngucmVkTXVsKGUueCksIHAgPSB0aGlzLnkucmVkTXVsKGUueSksIG0yID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChmKS5yZWRNdWwocCksIHkzID0gby5yZWRTdWIobTIpLCBNID0gby5yZWRBZGQobTIpLCB4ID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bChlLngucmVkQWRkKGUueSkpLnJlZElTdWIoZikucmVkSVN1YihwKSwgUyA9IHIucmVkTXVsKHkzKS5yZWRNdWwoeCksIEUyLCBCOwogICAgICByZXR1cm4gdGhpcy5jdXJ2ZS50d2lzdGVkID8gKEUyID0gci5yZWRNdWwoTSkucmVkTXVsKHAucmVkU3ViKHRoaXMuY3VydmUuX211bEEoZikpKSwgQiA9IHkzLnJlZE11bChNKSkgOiAoRTIgPSByLnJlZE11bChNKS5yZWRNdWwocC5yZWRTdWIoZikpLCBCID0gdGhpcy5jdXJ2ZS5fbXVsQyh5MykucmVkTXVsKE0pKSwgdGhpcy5jdXJ2ZS5wb2ludChTLCBFMiwgQik7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpID8gZSA6IGUuaXNJbmZpbml0eSgpID8gdGhpcyA6IHRoaXMuY3VydmUuZXh0ZW5kZWQgPyB0aGlzLl9leHRBZGQoZSkgOiB0aGlzLl9wcm9qQWRkKGUpOwogICAgfTsKICAgIGF0LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB0aGlzLl9oYXNEb3VibGVzKGUpID8gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgZSkgOiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGUpOwogICAgfTsKICAgIGF0LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIFt0aGlzLCByXSwgW2UsIG9dLCAyLCBmYWxzZSk7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIFt0aGlzLCByXSwgW2UsIG9dLCAyLCB0cnVlKTsKICAgIH07CiAgICBhdC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnpPbmUpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIHZhciBlID0gdGhpcy56LnJlZEludm0oKTsKICAgICAgcmV0dXJuIHRoaXMueCA9IHRoaXMueC5yZWRNdWwoZSksIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoZSksIHRoaXMudCAmJiAodGhpcy50ID0gdGhpcy50LnJlZE11bChlKSksIHRoaXMueiA9IHRoaXMuY3VydmUub25lLCB0aGlzLnpPbmUgPSB0cnVlLCB0aGlzOwogICAgfTsKICAgIGF0LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE5lZygpLCB0aGlzLnksIHRoaXMueiwgdGhpcy50ICYmIHRoaXMudC5yZWROZWcoKSk7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKCksIHRoaXMueC5mcm9tUmVkKCk7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKCksIHRoaXMueS5mcm9tUmVkKCk7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gdGhpcyA9PT0gZSB8fCB0aGlzLmdldFgoKS5jbXAoZS5nZXRYKCkpID09PSAwICYmIHRoaXMuZ2V0WSgpLmNtcChlLmdldFkoKSkgPT09IDA7CiAgICB9OwogICAgYXQucHJvdG90eXBlLmVxWFRvUCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSBlLnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTsKICAgICAgaWYgKHRoaXMueC5jbXAocikgPT09IDApCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIGZvciAodmFyIG8gPSBlLmNsb25lKCksIGYgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7OyApIHsKICAgICAgICBpZiAoby5pYWRkKHRoaXMuY3VydmUubiksIG8uY21wKHRoaXMuY3VydmUucCkgPj0gMCkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoci5yZWRJQWRkKGYpLCB0aGlzLnguY21wKHIpID09PSAwKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH07CiAgICBhdC5wcm90b3R5cGUudG9QID0gYXQucHJvdG90eXBlLm5vcm1hbGl6ZTsKICAgIGF0LnByb3RvdHlwZS5taXhlZEFkZCA9IGF0LnByb3RvdHlwZS5hZGQ7CiAgfSk7CiAgUGwgPSBUMigoeDIpID0+IHsKICAgIHZhciBYcyA9IHgyOwogICAgWHMuYmFzZSA9IE9hKCk7CiAgICBYcy5zaG9ydCA9IGIyKCk7CiAgICBYcy5tb250ID0geTIoKTsKICAgIFhzLmVkd2FyZHMgPSBfMigpOwogIH0pOwogIENyID0gVDIoKGl0KSA9PiB7CiAgICB2YXIgU0EgPSBhcigpLCBFQSA9IEllKCk7CiAgICBpdC5pbmhlcml0cyA9IEVBOwogICAgZnVuY3Rpb24gQUEodCwgZSkgewogICAgICByZXR1cm4gKHQuY2hhckNvZGVBdChlKSAmIDY0NTEyKSAhPT0gNTUyOTYgfHwgZSA8IDAgfHwgZSArIDEgPj0gdC5sZW5ndGggPyBmYWxzZSA6ICh0LmNoYXJDb2RlQXQoZSArIDEpICYgNjQ1MTIpID09PSA1NjMyMDsKICAgIH0KICAgIGZ1bmN0aW9uIFJBKHQsIGUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpCiAgICAgICAgcmV0dXJuIHQuc2xpY2UoKTsKICAgICAgaWYgKCF0KQogICAgICAgIHJldHVybiBbXTsKICAgICAgdmFyIHIgPSBbXTsKICAgICAgaWYgKHR5cGVvZiB0ID09ICJzdHJpbmciKQogICAgICAgIGlmIChlKSB7CiAgICAgICAgICBpZiAoZSA9PT0gImhleCIpCiAgICAgICAgICAgIGZvciAodCA9IHQucmVwbGFjZSgvW15hLXowLTldKy9pZywgIiIpLCB0Lmxlbmd0aCAlIDIgIT09IDAgJiYgKHQgPSAiMCIgKyB0KSwgZiA9IDA7ZiA8IHQubGVuZ3RoOyBmICs9IDIpCiAgICAgICAgICAgICAgci5wdXNoKHBhcnNlSW50KHRbZl0gKyB0W2YgKyAxXSwgMTYpKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGZvciAodmFyIG8gPSAwLCBmID0gMDtmIDwgdC5sZW5ndGg7IGYrKykgewogICAgICAgICAgICB2YXIgcCA9IHQuY2hhckNvZGVBdChmKTsKICAgICAgICAgICAgcCA8IDEyOCA/IHJbbysrXSA9IHAgOiBwIDwgMjA0OCA/IChyW28rK10gPSBwID4+IDYgfCAxOTIsIHJbbysrXSA9IHAgJiA2MyB8IDEyOCkgOiBBQSh0LCBmKSA/IChwID0gNjU1MzYgKyAoKHAgJiAxMDIzKSA8PCAxMCkgKyAodC5jaGFyQ29kZUF0KCsrZikgJiAxMDIzKSwgcltvKytdID0gcCA+PiAxOCB8IDI0MCwgcltvKytdID0gcCA+PiAxMiAmIDYzIHwgMTI4LCByW28rK10gPSBwID4+IDYgJiA2MyB8IDEyOCwgcltvKytdID0gcCAmIDYzIHwgMTI4KSA6IChyW28rK10gPSBwID4+IDEyIHwgMjI0LCByW28rK10gPSBwID4+IDYgJiA2MyB8IDEyOCwgcltvKytdID0gcCAmIDYzIHwgMTI4KTsKICAgICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIGZvciAoZiA9IDA7ZiA8IHQubGVuZ3RoOyBmKyspCiAgICAgICAgICByW2ZdID0gdFtmXSB8IDA7CiAgICAgIHJldHVybiByOwogICAgfQogICAgaXQudG9BcnJheSA9IFJBOwogICAgZnVuY3Rpb24gQkEodCkgewogICAgICBmb3IgKHZhciBlID0gIiIsIHIgPSAwO3IgPCB0Lmxlbmd0aDsgcisrKQogICAgICAgIGUgKz0gRTIodFtyXS50b1N0cmluZygxNikpOwogICAgICByZXR1cm4gZTsKICAgIH0KICAgIGl0LnRvSGV4ID0gQkE7CiAgICBmdW5jdGlvbiBTMih0KSB7CiAgICAgIHZhciBlID0gdCA+Pj4gMjQgfCB0ID4+PiA4ICYgNjUyODAgfCB0IDw8IDggJiAxNjcxMTY4MCB8ICh0ICYgMjU1KSA8PCAyNDsKICAgICAgcmV0dXJuIGUgPj4+IDA7CiAgICB9CiAgICBpdC5odG9ubCA9IFMyOwogICAgZnVuY3Rpb24gcUEodCwgZSkgewogICAgICBmb3IgKHZhciByID0gIiIsIG8gPSAwO28gPCB0Lmxlbmd0aDsgbysrKSB7CiAgICAgICAgdmFyIGYgPSB0W29dOwogICAgICAgIGUgPT09ICJsaXR0bGUiICYmIChmID0gUzIoZikpLCByICs9IEEyKGYudG9TdHJpbmcoMTYpKTsKICAgICAgfQogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGl0LnRvSGV4MzIgPSBxQTsKICAgIGZ1bmN0aW9uIEUyKHQpIHsKICAgICAgcmV0dXJuIHQubGVuZ3RoID09PSAxID8gIjAiICsgdCA6IHQ7CiAgICB9CiAgICBpdC56ZXJvMiA9IEUyOwogICAgZnVuY3Rpb24gQTIodCkgewogICAgICByZXR1cm4gdC5sZW5ndGggPT09IDcgPyAiMCIgKyB0IDogdC5sZW5ndGggPT09IDYgPyAiMDAiICsgdCA6IHQubGVuZ3RoID09PSA1ID8gIjAwMCIgKyB0IDogdC5sZW5ndGggPT09IDQgPyAiMDAwMCIgKyB0IDogdC5sZW5ndGggPT09IDMgPyAiMDAwMDAiICsgdCA6IHQubGVuZ3RoID09PSAyID8gIjAwMDAwMCIgKyB0IDogdC5sZW5ndGggPT09IDEgPyAiMDAwMDAwMCIgKyB0IDogdDsKICAgIH0KICAgIGl0Lnplcm84ID0gQTI7CiAgICBmdW5jdGlvbiBJQSh0LCBlLCByLCBvKSB7CiAgICAgIHZhciBmID0gciAtIGU7CiAgICAgIFNBKGYgJSA0ID09PSAwKTsKICAgICAgZm9yICh2YXIgcCA9IG5ldyBBcnJheShmIC8gNCksIG0yID0gMCwgeTMgPSBlO20yIDwgcC5sZW5ndGg7IG0yKyssIHkzICs9IDQpIHsKICAgICAgICB2YXIgTTsKICAgICAgICBvID09PSAiYmlnIiA/IE0gPSB0W3kzXSA8PCAyNCB8IHRbeTMgKyAxXSA8PCAxNiB8IHRbeTMgKyAyXSA8PCA4IHwgdFt5MyArIDNdIDogTSA9IHRbeTMgKyAzXSA8PCAyNCB8IHRbeTMgKyAyXSA8PCAxNiB8IHRbeTMgKyAxXSA8PCA4IHwgdFt5M10sIHBbbTJdID0gTSA+Pj4gMDsKICAgICAgfQogICAgICByZXR1cm4gcDsKICAgIH0KICAgIGl0LmpvaW4zMiA9IElBOwogICAgZnVuY3Rpb24gVEEodCwgZSkgewogICAgICBmb3IgKHZhciByID0gbmV3IEFycmF5KHQubGVuZ3RoICogNCksIG8gPSAwLCBmID0gMDtvIDwgdC5sZW5ndGg7IG8rKywgZiArPSA0KSB7CiAgICAgICAgdmFyIHAgPSB0W29dOwogICAgICAgIGUgPT09ICJiaWciID8gKHJbZl0gPSBwID4+PiAyNCwgcltmICsgMV0gPSBwID4+PiAxNiAmIDI1NSwgcltmICsgMl0gPSBwID4+PiA4ICYgMjU1LCByW2YgKyAzXSA9IHAgJiAyNTUpIDogKHJbZiArIDNdID0gcCA+Pj4gMjQsIHJbZiArIDJdID0gcCA+Pj4gMTYgJiAyNTUsIHJbZiArIDFdID0gcCA+Pj4gOCAmIDI1NSwgcltmXSA9IHAgJiAyNTUpOwogICAgICB9CiAgICAgIHJldHVybiByOwogICAgfQogICAgaXQuc3BsaXQzMiA9IFRBOwogICAgZnVuY3Rpb24ga0EodCwgZSkgewogICAgICByZXR1cm4gdCA+Pj4gZSB8IHQgPDwgMzIgLSBlOwogICAgfQogICAgaXQucm90cjMyID0ga0E7CiAgICBmdW5jdGlvbiBMQSh0LCBlKSB7CiAgICAgIHJldHVybiB0IDw8IGUgfCB0ID4+PiAzMiAtIGU7CiAgICB9CiAgICBpdC5yb3RsMzIgPSBMQTsKICAgIGZ1bmN0aW9uIE5BKHQsIGUpIHsKICAgICAgcmV0dXJuIHQgKyBlID4+PiAwOwogICAgfQogICAgaXQuc3VtMzIgPSBOQTsKICAgIGZ1bmN0aW9uIERBKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQgKyBlICsgciA+Pj4gMDsKICAgIH0KICAgIGl0LnN1bTMyXzMgPSBEQTsKICAgIGZ1bmN0aW9uIFBBKHQsIGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIHQgKyBlICsgciArIG8gPj4+IDA7CiAgICB9CiAgICBpdC5zdW0zMl80ID0gUEE7CiAgICBmdW5jdGlvbiBDQSh0LCBlLCByLCBvLCBmKSB7CiAgICAgIHJldHVybiB0ICsgZSArIHIgKyBvICsgZiA+Pj4gMDsKICAgIH0KICAgIGl0LnN1bTMyXzUgPSBDQTsKICAgIGZ1bmN0aW9uIE9BKHQsIGUsIHIsIG8pIHsKICAgICAgdmFyIGYgPSB0W2VdLCBwID0gdFtlICsgMV0sIG0yID0gbyArIHAgPj4+IDAsIHkzID0gKG0yIDwgbyA/IDEgOiAwKSArIHIgKyBmOwogICAgICB0W2VdID0geTMgPj4+IDAsIHRbZSArIDFdID0gbTI7CiAgICB9CiAgICBpdC5zdW02NCA9IE9BOwogICAgZnVuY3Rpb24gRkEodCwgZSwgciwgbykgewogICAgICB2YXIgZiA9IGUgKyBvID4+PiAwLCBwID0gKGYgPCBlID8gMSA6IDApICsgdCArIHI7CiAgICAgIHJldHVybiBwID4+PiAwOwogICAgfQogICAgaXQuc3VtNjRfaGkgPSBGQTsKICAgIGZ1bmN0aW9uIFVBKHQsIGUsIHIsIG8pIHsKICAgICAgdmFyIGYgPSBlICsgbzsKICAgICAgcmV0dXJuIGYgPj4+IDA7CiAgICB9CiAgICBpdC5zdW02NF9sbyA9IFVBOwogICAgZnVuY3Rpb24gekEodCwgZSwgciwgbywgZiwgcCwgbTIsIHkzKSB7CiAgICAgIHZhciBNID0gMCwgeCA9IGU7CiAgICAgIHggPSB4ICsgbyA+Pj4gMCwgTSArPSB4IDwgZSA/IDEgOiAwLCB4ID0geCArIHAgPj4+IDAsIE0gKz0geCA8IHAgPyAxIDogMCwgeCA9IHggKyB5MyA+Pj4gMCwgTSArPSB4IDwgeTMgPyAxIDogMDsKICAgICAgdmFyIFMgPSB0ICsgciArIGYgKyBtMiArIE07CiAgICAgIHJldHVybiBTID4+PiAwOwogICAgfQogICAgaXQuc3VtNjRfNF9oaSA9IHpBOwogICAgZnVuY3Rpb24gSEEodCwgZSwgciwgbywgZiwgcCwgbTIsIHkzKSB7CiAgICAgIHZhciBNID0gZSArIG8gKyBwICsgeTM7CiAgICAgIHJldHVybiBNID4+PiAwOwogICAgfQogICAgaXQuc3VtNjRfNF9sbyA9IEhBOwogICAgZnVuY3Rpb24gV0EodCwgZSwgciwgbywgZiwgcCwgbTIsIHkzLCBNLCB4KSB7CiAgICAgIHZhciBTID0gMCwgRTMgPSBlOwogICAgICBFMyA9IEUzICsgbyA+Pj4gMCwgUyArPSBFMyA8IGUgPyAxIDogMCwgRTMgPSBFMyArIHAgPj4+IDAsIFMgKz0gRTMgPCBwID8gMSA6IDAsIEUzID0gRTMgKyB5MyA+Pj4gMCwgUyArPSBFMyA8IHkzID8gMSA6IDAsIEUzID0gRTMgKyB4ID4+PiAwLCBTICs9IEUzIDwgeCA/IDEgOiAwOwogICAgICB2YXIgQiA9IHQgKyByICsgZiArIG0yICsgTSArIFM7CiAgICAgIHJldHVybiBCID4+PiAwOwogICAgfQogICAgaXQuc3VtNjRfNV9oaSA9IFdBOwogICAgZnVuY3Rpb24gS0EodCwgZSwgciwgbywgZiwgcCwgbTIsIHkzLCBNLCB4KSB7CiAgICAgIHZhciBTID0gZSArIG8gKyBwICsgeTMgKyB4OwogICAgICByZXR1cm4gUyA+Pj4gMDsKICAgIH0KICAgIGl0LnN1bTY0XzVfbG8gPSBLQTsKICAgIGZ1bmN0aW9uIGpBKHQsIGUsIHIpIHsKICAgICAgdmFyIG8gPSBlIDw8IDMyIC0gciB8IHQgPj4+IHI7CiAgICAgIHJldHVybiBvID4+PiAwOwogICAgfQogICAgaXQucm90cjY0X2hpID0gakE7CiAgICBmdW5jdGlvbiBaQSh0LCBlLCByKSB7CiAgICAgIHZhciBvID0gdCA8PCAzMiAtIHIgfCBlID4+PiByOwogICAgICByZXR1cm4gbyA+Pj4gMDsKICAgIH0KICAgIGl0LnJvdHI2NF9sbyA9IFpBOwogICAgZnVuY3Rpb24gVkEodCwgZSwgcikgewogICAgICByZXR1cm4gdCA+Pj4gcjsKICAgIH0KICAgIGl0LnNocjY0X2hpID0gVkE7CiAgICBmdW5jdGlvbiAkQSh0LCBlLCByKSB7CiAgICAgIHZhciBvID0gdCA8PCAzMiAtIHIgfCBlID4+PiByOwogICAgICByZXR1cm4gbyA+Pj4gMDsKICAgIH0KICAgIGl0LnNocjY0X2xvID0gJEE7CiAgfSk7CiAgVGYgPSBUMigoQjIpID0+IHsKICAgIHZhciBSMiA9IENyKCksIEdBID0gYXIoKTsKICAgIGZ1bmN0aW9uIEpzKCkgewogICAgICB0aGlzLnBlbmRpbmcgPSBudWxsLCB0aGlzLnBlbmRpbmdUb3RhbCA9IDAsIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemUsIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZSwgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aCwgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDgsIHRoaXMuZW5kaWFuID0gImJpZyIsIHRoaXMuX2RlbHRhOCA9IHRoaXMuYmxvY2tTaXplIC8gOCwgdGhpcy5fZGVsdGEzMiA9IHRoaXMuYmxvY2tTaXplIC8gMzI7CiAgICB9CiAgICBCMi5CbG9ja0hhc2ggPSBKczsKICAgIEpzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmIChlID0gUjIudG9BcnJheShlLCByKSwgdGhpcy5wZW5kaW5nID8gdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChlKSA6IHRoaXMucGVuZGluZyA9IGUsIHRoaXMucGVuZGluZ1RvdGFsICs9IGUubGVuZ3RoLCB0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkgewogICAgICAgIGUgPSB0aGlzLnBlbmRpbmc7CiAgICAgICAgdmFyIG8gPSBlLmxlbmd0aCAlIHRoaXMuX2RlbHRhODsKICAgICAgICB0aGlzLnBlbmRpbmcgPSBlLnNsaWNlKGUubGVuZ3RoIC0gbywgZS5sZW5ndGgpLCB0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwICYmICh0aGlzLnBlbmRpbmcgPSBudWxsKSwgZSA9IFIyLmpvaW4zMihlLCAwLCBlLmxlbmd0aCAtIG8sIHRoaXMuZW5kaWFuKTsKICAgICAgICBmb3IgKHZhciBmID0gMDtmIDwgZS5sZW5ndGg7IGYgKz0gdGhpcy5fZGVsdGEzMikKICAgICAgICAgIHRoaXMuX3VwZGF0ZShlLCBmLCBmICsgdGhpcy5fZGVsdGEzMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgSnMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKSwgR0EodGhpcy5wZW5kaW5nID09PSBudWxsKSwgdGhpcy5fZGlnZXN0KGUpOwogICAgfTsKICAgIEpzLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpcy5wZW5kaW5nVG90YWwsIHIgPSB0aGlzLl9kZWx0YTgsIG8gPSByIC0gKGUgKyB0aGlzLnBhZExlbmd0aCkgJSByLCBmID0gbmV3IEFycmF5KG8gKyB0aGlzLnBhZExlbmd0aCk7CiAgICAgIGZbMF0gPSAxMjg7CiAgICAgIGZvciAodmFyIHAgPSAxO3AgPCBvOyBwKyspCiAgICAgICAgZltwXSA9IDA7CiAgICAgIGlmIChlIDw8PSAzLCB0aGlzLmVuZGlhbiA9PT0gImJpZyIpIHsKICAgICAgICBmb3IgKHZhciBtMiA9IDg7bTIgPCB0aGlzLnBhZExlbmd0aDsgbTIrKykKICAgICAgICAgIGZbcCsrXSA9IDA7CiAgICAgICAgZltwKytdID0gMCwgZltwKytdID0gMCwgZltwKytdID0gMCwgZltwKytdID0gMCwgZltwKytdID0gZSA+Pj4gMjQgJiAyNTUsIGZbcCsrXSA9IGUgPj4+IDE2ICYgMjU1LCBmW3ArK10gPSBlID4+PiA4ICYgMjU1LCBmW3ArK10gPSBlICYgMjU1OwogICAgICB9IGVsc2UKICAgICAgICBmb3IgKGZbcCsrXSA9IGUgJiAyNTUsIGZbcCsrXSA9IGUgPj4+IDggJiAyNTUsIGZbcCsrXSA9IGUgPj4+IDE2ICYgMjU1LCBmW3ArK10gPSBlID4+PiAyNCAmIDI1NSwgZltwKytdID0gMCwgZltwKytdID0gMCwgZltwKytdID0gMCwgZltwKytdID0gMCwgbTIgPSA4O20yIDwgdGhpcy5wYWRMZW5ndGg7IG0yKyspCiAgICAgICAgICBmW3ArK10gPSAwOwogICAgICByZXR1cm4gZjsKICAgIH07CiAgfSk7CiAgQ2wgPSBUMigoUmkpID0+IHsKICAgIHZhciBZQSA9IENyKCksIG5pID0gWUEucm90cjMyOwogICAgZnVuY3Rpb24gWEEodCwgZSwgciwgbykgewogICAgICBpZiAodCA9PT0gMCkKICAgICAgICByZXR1cm4gcTIoZSwgciwgbyk7CiAgICAgIGlmICh0ID09PSAxIHx8IHQgPT09IDMpCiAgICAgICAgcmV0dXJuIFQyMihlLCByLCBvKTsKICAgICAgaWYgKHQgPT09IDIpCiAgICAgICAgcmV0dXJuIEkyKGUsIHIsIG8pOwogICAgfQogICAgUmkuZnRfMSA9IFhBOwogICAgZnVuY3Rpb24gcTIodCwgZSwgcikgewogICAgICByZXR1cm4gdCAmIGUgXiB+dCAmIHI7CiAgICB9CiAgICBSaS5jaDMyID0gcTI7CiAgICBmdW5jdGlvbiBJMih0LCBlLCByKSB7CiAgICAgIHJldHVybiB0ICYgZSBeIHQgJiByIF4gZSAmIHI7CiAgICB9CiAgICBSaS5tYWozMiA9IEkyOwogICAgZnVuY3Rpb24gVDIyKHQsIGUsIHIpIHsKICAgICAgcmV0dXJuIHQgXiBlIF4gcjsKICAgIH0KICAgIFJpLnAzMiA9IFQyMjsKICAgIGZ1bmN0aW9uIEpBKHQpIHsKICAgICAgcmV0dXJuIG5pKHQsIDIpIF4gbmkodCwgMTMpIF4gbmkodCwgMjIpOwogICAgfQogICAgUmkuczBfMjU2ID0gSkE7CiAgICBmdW5jdGlvbiBRQSh0KSB7CiAgICAgIHJldHVybiBuaSh0LCA2KSBeIG5pKHQsIDExKSBeIG5pKHQsIDI1KTsKICAgIH0KICAgIFJpLnMxXzI1NiA9IFFBOwogICAgZnVuY3Rpb24gZVIodCkgewogICAgICByZXR1cm4gbmkodCwgNykgXiBuaSh0LCAxOCkgXiB0ID4+PiAzOwogICAgfQogICAgUmkuZzBfMjU2ID0gZVI7CiAgICBmdW5jdGlvbiB0Uih0KSB7CiAgICAgIHJldHVybiBuaSh0LCAxNykgXiBuaSh0LCAxOSkgXiB0ID4+PiAxMDsKICAgIH0KICAgIFJpLmcxXzI1NiA9IHRSOwogIH0pOwogIE4yID0gVDIoKFRrLCBMMikgPT4gewogICAgdmFyIGtmID0gQ3IoKSwgclIgPSBUZigpLCBpUiA9IENsKCksIE9sID0ga2Yucm90bDMyLCBGYSA9IGtmLnN1bTMyLCBuUiA9IGtmLnN1bTMyXzUsIGZSID0gaVIuZnRfMSwgazIgPSByUi5CbG9ja0hhc2gsIGFSID0gWzE1MTg1MDAyNDksIDE4NTk3NzUzOTMsIDI0MDA5NTk3MDgsIDMzOTU0Njk3ODJdOwogICAgZnVuY3Rpb24gZmkoKSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBmaSkpCiAgICAgICAgcmV0dXJuIG5ldyBmaTsKICAgICAgazIuY2FsbCh0aGlzKSwgdGhpcy5oID0gWzE3MzI1ODQxOTMsIDQwMjMyMzM0MTcsIDI1NjIzODMxMDIsIDI3MTczMzg3OCwgMzI4NTM3NzUyMF0sIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7CiAgICB9CiAgICBrZi5pbmhlcml0cyhmaSwgazIpOwogICAgTDIuZXhwb3J0cyA9IGZpOwogICAgZmkuYmxvY2tTaXplID0gNTEyOwogICAgZmkub3V0U2l6ZSA9IDE2MDsKICAgIGZpLmhtYWNTdHJlbmd0aCA9IDgwOwogICAgZmkucGFkTGVuZ3RoID0gNjQ7CiAgICBmaS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IHRoaXMuVywgZiA9IDA7ZiA8IDE2OyBmKyspCiAgICAgICAgb1tmXSA9IGVbciArIGZdOwogICAgICBmb3IgKDtmIDwgby5sZW5ndGg7IGYrKykKICAgICAgICBvW2ZdID0gT2wob1tmIC0gM10gXiBvW2YgLSA4XSBeIG9bZiAtIDE0XSBeIG9bZiAtIDE2XSwgMSk7CiAgICAgIHZhciBwID0gdGhpcy5oWzBdLCBtMiA9IHRoaXMuaFsxXSwgeTMgPSB0aGlzLmhbMl0sIE0gPSB0aGlzLmhbM10sIHggPSB0aGlzLmhbNF07CiAgICAgIGZvciAoZiA9IDA7ZiA8IG8ubGVuZ3RoOyBmKyspIHsKICAgICAgICB2YXIgUyA9IH5+KGYgLyAyMCksIEUyID0gblIoT2wocCwgNSksIGZSKFMsIG0yLCB5MywgTSksIHgsIG9bZl0sIGFSW1NdKTsKICAgICAgICB4ID0gTSwgTSA9IHkzLCB5MyA9IE9sKG0yLCAzMCksIG0yID0gcCwgcCA9IEUyOwogICAgICB9CiAgICAgIHRoaXMuaFswXSA9IEZhKHRoaXMuaFswXSwgcCksIHRoaXMuaFsxXSA9IEZhKHRoaXMuaFsxXSwgbTIpLCB0aGlzLmhbMl0gPSBGYSh0aGlzLmhbMl0sIHkzKSwgdGhpcy5oWzNdID0gRmEodGhpcy5oWzNdLCBNKSwgdGhpcy5oWzRdID0gRmEodGhpcy5oWzRdLCB4KTsKICAgIH07CiAgICBmaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8ga2YudG9IZXgzMih0aGlzLmgsICJiaWciKSA6IGtmLnNwbGl0MzIodGhpcy5oLCAiYmlnIik7CiAgICB9OwogIH0pOwogIEZsID0gVDIoKGtrLCBQMikgPT4gewogICAgdmFyIExmID0gQ3IoKSwgb1IgPSBUZigpLCBOZiA9IENsKCksIHNSID0gYXIoKSwgT3IgPSBMZi5zdW0zMiwgaFIgPSBMZi5zdW0zMl80LCB1UiA9IExmLnN1bTMyXzUsIGxSID0gTmYuY2gzMiwgZFIgPSBOZi5tYWozMiwgY1IgPSBOZi5zMF8yNTYsIHBSID0gTmYuczFfMjU2LCB2UiA9IE5mLmcwXzI1NiwgYlIgPSBOZi5nMV8yNTYsIEQyID0gb1IuQmxvY2tIYXNoLCBtUiA9IFsxMTE2MzUyNDA4LCAxODk5NDQ3NDQxLCAzMDQ5MzIzNDcxLCAzOTIxMDA5NTczLCA5NjE5ODcxNjMsIDE1MDg5NzA5OTMsIDI0NTM2MzU3NDgsIDI4NzA3NjMyMjEsIDM2MjQzODEwODAsIDMxMDU5ODQwMSwgNjA3MjI1Mjc4LCAxNDI2ODgxOTg3LCAxOTI1MDc4Mzg4LCAyMTYyMDc4MjA2LCAyNjE0ODg4MTAzLCAzMjQ4MjIyNTgwLCAzODM1MzkwNDAxLCA0MDIyMjI0Nzc0LCAyNjQzNDcwNzgsIDYwNDgwNzYyOCwgNzcwMjU1OTgzLCAxMjQ5MTUwMTIyLCAxNTU1MDgxNjkyLCAxOTk2MDY0OTg2LCAyNTU0MjIwODgyLCAyODIxODM0MzQ5LCAyOTUyOTk2ODA4LCAzMjEwMzEzNjcxLCAzMzM2NTcxODkxLCAzNTg0NTI4NzExLCAxMTM5MjY5OTMsIDMzODI0MTg5NSwgNjY2MzA3MjA1LCA3NzM1Mjk5MTIsIDEyOTQ3NTczNzIsIDEzOTYxODIyOTEsIDE2OTUxODM3MDAsIDE5ODY2NjEwNTEsIDIxNzcwMjYzNTAsIDI0NTY5NTYwMzcsIDI3MzA0ODU5MjEsIDI4MjAzMDI0MTEsIDMyNTk3MzA4MDAsIDMzNDU3NjQ3NzEsIDM1MTYwNjU4MTcsIDM2MDAzNTI4MDQsIDQwOTQ1NzE5MDksIDI3NTQyMzM0NCwgNDMwMjI3NzM0LCA1MDY5NDg2MTYsIDY1OTA2MDU1NiwgODgzOTk3ODc3LCA5NTgxMzk1NzEsIDEzMjI4MjIyMTgsIDE1MzcwMDIwNjMsIDE3NDc4NzM3NzksIDE5NTU1NjIyMjIsIDIwMjQxMDQ4MTUsIDIyMjc3MzA0NTIsIDIzNjE4NTI0MjQsIDI0Mjg0MzY0NzQsIDI3NTY3MzQxODcsIDMyMDQwMzE0NzksIDMzMjkzMjUyOThdOwogICAgZnVuY3Rpb24gYWkoKSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBhaSkpCiAgICAgICAgcmV0dXJuIG5ldyBhaTsKICAgICAgRDIuY2FsbCh0aGlzKSwgdGhpcy5oID0gWzE3NzkwMzM3MDMsIDMxNDQxMzQyNzcsIDEwMTM5MDQyNDIsIDI3NzM0ODA3NjIsIDEzNTk4OTMxMTksIDI2MDA4MjI5MjQsIDUyODczNDYzNSwgMTU0MTQ1OTIyNV0sIHRoaXMuayA9IG1SLCB0aGlzLlcgPSBuZXcgQXJyYXkoNjQpOwogICAgfQogICAgTGYuaW5oZXJpdHMoYWksIEQyKTsKICAgIFAyLmV4cG9ydHMgPSBhaTsKICAgIGFpLmJsb2NrU2l6ZSA9IDUxMjsKICAgIGFpLm91dFNpemUgPSAyNTY7CiAgICBhaS5obWFjU3RyZW5ndGggPSAxOTI7CiAgICBhaS5wYWRMZW5ndGggPSA2NDsKICAgIGFpLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBmb3IgKHZhciBvID0gdGhpcy5XLCBmID0gMDtmIDwgMTY7IGYrKykKICAgICAgICBvW2ZdID0gZVtyICsgZl07CiAgICAgIGZvciAoO2YgPCBvLmxlbmd0aDsgZisrKQogICAgICAgIG9bZl0gPSBoUihiUihvW2YgLSAyXSksIG9bZiAtIDddLCB2UihvW2YgLSAxNV0pLCBvW2YgLSAxNl0pOwogICAgICB2YXIgcCA9IHRoaXMuaFswXSwgbTIgPSB0aGlzLmhbMV0sIHkzID0gdGhpcy5oWzJdLCBNID0gdGhpcy5oWzNdLCB4ID0gdGhpcy5oWzRdLCBTID0gdGhpcy5oWzVdLCBFMiA9IHRoaXMuaFs2XSwgQiA9IHRoaXMuaFs3XTsKICAgICAgZm9yIChzUih0aGlzLmsubGVuZ3RoID09PSBvLmxlbmd0aCksIGYgPSAwO2YgPCBvLmxlbmd0aDsgZisrKSB7CiAgICAgICAgdmFyIHEyID0gdVIoQiwgcFIoeCksIGxSKHgsIFMsIEUyKSwgdGhpcy5rW2ZdLCBvW2ZdKSwgTDIgPSBPcihjUihwKSwgZFIocCwgbTIsIHkzKSk7CiAgICAgICAgQiA9IEUyLCBFMiA9IFMsIFMgPSB4LCB4ID0gT3IoTSwgcTIpLCBNID0geTMsIHkzID0gbTIsIG0yID0gcCwgcCA9IE9yKHEyLCBMMik7CiAgICAgIH0KICAgICAgdGhpcy5oWzBdID0gT3IodGhpcy5oWzBdLCBwKSwgdGhpcy5oWzFdID0gT3IodGhpcy5oWzFdLCBtMiksIHRoaXMuaFsyXSA9IE9yKHRoaXMuaFsyXSwgeTMpLCB0aGlzLmhbM10gPSBPcih0aGlzLmhbM10sIE0pLCB0aGlzLmhbNF0gPSBPcih0aGlzLmhbNF0sIHgpLCB0aGlzLmhbNV0gPSBPcih0aGlzLmhbNV0sIFMpLCB0aGlzLmhbNl0gPSBPcih0aGlzLmhbNl0sIEUyKSwgdGhpcy5oWzddID0gT3IodGhpcy5oWzddLCBCKTsKICAgIH07CiAgICBhaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8gTGYudG9IZXgzMih0aGlzLmgsICJiaWciKSA6IExmLnNwbGl0MzIodGhpcy5oLCAiYmlnIik7CiAgICB9OwogIH0pOwogIEYyID0gVDIoKExrLCBPMikgPT4gewogICAgdmFyIFVsID0gQ3IoKSwgQzIgPSBGbCgpOwogICAgZnVuY3Rpb24gQmkoKSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCaSkpCiAgICAgICAgcmV0dXJuIG5ldyBCaTsKICAgICAgQzIuY2FsbCh0aGlzKSwgdGhpcy5oID0gWzMyMzgzNzEwMzIsIDkxNDE1MDY2MywgODEyNzAyOTk5LCA0MTQ0OTEyNjk3LCA0MjkwNzc1ODU3LCAxNzUwNjAzMDI1LCAxNjk0MDc2ODM5LCAzMjA0MDc1NDI4XTsKICAgIH0KICAgIFVsLmluaGVyaXRzKEJpLCBDMik7CiAgICBPMi5leHBvcnRzID0gQmk7CiAgICBCaS5ibG9ja1NpemUgPSA1MTI7CiAgICBCaS5vdXRTaXplID0gMjI0OwogICAgQmkuaG1hY1N0cmVuZ3RoID0gMTkyOwogICAgQmkucGFkTGVuZ3RoID0gNjQ7CiAgICBCaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8gVWwudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgNyksICJiaWciKSA6IFVsLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAiYmlnIik7CiAgICB9OwogIH0pOwogIFdsID0gVDIoKE5rLCBXMikgPT4gewogICAgdmFyIGlyID0gQ3IoKSwgZ1IgPSBUZigpLCB5UiA9IGFyKCksIG9pID0gaXIucm90cjY0X2hpLCBzaSA9IGlyLnJvdHI2NF9sbywgVTIgPSBpci5zaHI2NF9oaSwgejIgPSBpci5zaHI2NF9sbywgSmkgPSBpci5zdW02NCwgemwgPSBpci5zdW02NF9oaSwgSGwgPSBpci5zdW02NF9sbywgd1IgPSBpci5zdW02NF80X2hpLCBNUiA9IGlyLnN1bTY0XzRfbG8sIF9SID0gaXIuc3VtNjRfNV9oaSwgeFIgPSBpci5zdW02NF81X2xvLCBIMiA9IGdSLkJsb2NrSGFzaCwgU1IgPSBbMTExNjM1MjQwOCwgMzYwOTc2NzQ1OCwgMTg5OTQ0NzQ0MSwgNjAyODkxNzI1LCAzMDQ5MzIzNDcxLCAzOTY0NDg0Mzk5LCAzOTIxMDA5NTczLCAyMTczMjk1NTQ4LCA5NjE5ODcxNjMsIDQwODE2Mjg0NzIsIDE1MDg5NzA5OTMsIDMwNTM4MzQyNjUsIDI0NTM2MzU3NDgsIDI5Mzc2NzE1NzksIDI4NzA3NjMyMjEsIDM2NjQ2MDk1NjAsIDM2MjQzODEwODAsIDI3MzQ4ODMzOTQsIDMxMDU5ODQwMSwgMTE2NDk5NjU0MiwgNjA3MjI1Mjc4LCAxMzIzNjEwNzY0LCAxNDI2ODgxOTg3LCAzNTkwMzA0OTk0LCAxOTI1MDc4Mzg4LCA0MDY4MTgyMzgzLCAyMTYyMDc4MjA2LCA5OTEzMzYxMTMsIDI2MTQ4ODgxMDMsIDYzMzgwMzMxNywgMzI0ODIyMjU4MCwgMzQ3OTc3NDg2OCwgMzgzNTM5MDQwMSwgMjY2NjYxMzQ1OCwgNDAyMjIyNDc3NCwgOTQ0NzExMTM5LCAyNjQzNDcwNzgsIDIzNDEyNjI3NzMsIDYwNDgwNzYyOCwgMjAwNzgwMDkzMywgNzcwMjU1OTgzLCAxNDk1OTkwOTAxLCAxMjQ5MTUwMTIyLCAxODU2NDMxMjM1LCAxNTU1MDgxNjkyLCAzMTc1MjE4MTMyLCAxOTk2MDY0OTg2LCAyMTk4OTUwODM3LCAyNTU0MjIwODgyLCAzOTk5NzE5MzM5LCAyODIxODM0MzQ5LCA3NjY3ODQwMTYsIDI5NTI5OTY4MDgsIDI1NjY1OTQ4NzksIDMyMTAzMTM2NzEsIDMyMDMzMzc5NTYsIDMzMzY1NzE4OTEsIDEwMzQ0NTcwMjYsIDM1ODQ1Mjg3MTEsIDI0NjY5NDg5MDEsIDExMzkyNjk5MywgMzc1ODMyNjM4MywgMzM4MjQxODk1LCAxNjg3MTc5MzYsIDY2NjMwNzIwNSwgMTE4ODE3OTk2NCwgNzczNTI5OTEyLCAxNTQ2MDQ1NzM0LCAxMjk0NzU3MzcyLCAxNTIyODA1NDg1LCAxMzk2MTgyMjkxLCAyNjQzODMzODIzLCAxNjk1MTgzNzAwLCAyMzQzNTI3MzkwLCAxOTg2NjYxMDUxLCAxMDE0NDc3NDgwLCAyMTc3MDI2MzUwLCAxMjA2NzU5MTQyLCAyNDU2OTU2MDM3LCAzNDQwNzc2MjcsIDI3MzA0ODU5MjEsIDEyOTA4NjM0NjAsIDI4MjAzMDI0MTEsIDMxNTg0NTQyNzMsIDMyNTk3MzA4MDAsIDM1MDU5NTI2NTcsIDMzNDU3NjQ3NzEsIDEwNjIxNzAwOCwgMzUxNjA2NTgxNywgMzYwNjAwODM0NCwgMzYwMDM1MjgwNCwgMTQzMjcyNTc3NiwgNDA5NDU3MTkwOSwgMTQ2NzAzMTU5NCwgMjc1NDIzMzQ0LCA4NTExNjk3MjAsIDQzMDIyNzczNCwgMzEwMDgyMzc1MiwgNTA2OTQ4NjE2LCAxMzYzMjU4MTk1LCA2NTkwNjA1NTYsIDM3NTA2ODU1OTMsIDg4Mzk5Nzg3NywgMzc4NTA1MDI4MCwgOTU4MTM5NTcxLCAzMzE4MzA3NDI3LCAxMzIyODIyMjE4LCAzODEyNzIzNDAzLCAxNTM3MDAyMDYzLCAyMDAzMDM0OTk1LCAxNzQ3ODczNzc5LCAzNjAyMDM2ODk5LCAxOTU1NTYyMjIyLCAxNTc1OTkwMDEyLCAyMDI0MTA0ODE1LCAxMTI1NTkyOTI4LCAyMjI3NzMwNDUyLCAyNzE2OTA0MzA2LCAyMzYxODUyNDI0LCA0NDI3NzYwNDQsIDI0Mjg0MzY0NzQsIDU5MzY5ODM0NCwgMjc1NjczNDE4NywgMzczMzExMDI0OSwgMzIwNDAzMTQ3OSwgMjk5OTM1MTU3MywgMzMyOTMyNTI5OCwgMzgxNTkyMDQyNywgMzM5MTU2OTYxNCwgMzkyODM4MzkwMCwgMzUxNTI2NzI3MSwgNTY2MjgwNzExLCAzOTQwMTg3NjA2LCAzNDU0MDY5NTM0LCA0MTE4NjMwMjcxLCA0MDAwMjM5OTkyLCAxMTY0MTg0NzQsIDE5MTQxMzg1NTQsIDE3NDI5MjQyMSwgMjczMTA1NTI3MCwgMjg5MzgwMzU2LCAzMjAzOTkzMDA2LCA0NjAzOTMyNjksIDMyMDYyMDMxNSwgNjg1NDcxNzMzLCA1ODc0OTY4MzYsIDg1MjE0Mjk3MSwgMTA4Njc5Mjg1MSwgMTAxNzAzNjI5OCwgMzY1NTQzMTAwLCAxMTI2MDAwNTgwLCAyNjE4Mjk3Njc2LCAxMjg4MDMzNDcwLCAzNDA5ODU1MTU4LCAxNTAxNTA1OTQ4LCA0MjM0NTA5ODY2LCAxNjA3MTY3OTE1LCA5ODcxNjc0NjgsIDE4MTY0MDIzMTYsIDEyNDYxODk1OTFdOwogICAgZnVuY3Rpb24gRnIoKSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBGcikpCiAgICAgICAgcmV0dXJuIG5ldyBGcjsKICAgICAgSDIuY2FsbCh0aGlzKSwgdGhpcy5oID0gWzE3NzkwMzM3MDMsIDQwODkyMzU3MjAsIDMxNDQxMzQyNzcsIDIyMjc4NzM1OTUsIDEwMTM5MDQyNDIsIDQyNzExNzU3MjMsIDI3NzM0ODA3NjIsIDE1OTU3NTAxMjksIDEzNTk4OTMxMTksIDI5MTc1NjUxMzcsIDI2MDA4MjI5MjQsIDcyNTUxMTE5OSwgNTI4NzM0NjM1LCA0MjE1Mzg5NTQ3LCAxNTQxNDU5MjI1LCAzMjcwMzMyMDldLCB0aGlzLmsgPSBTUiwgdGhpcy5XID0gbmV3IEFycmF5KDE2MCk7CiAgICB9CiAgICBpci5pbmhlcml0cyhGciwgSDIpOwogICAgVzIuZXhwb3J0cyA9IEZyOwogICAgRnIuYmxvY2tTaXplID0gMTAyNDsKICAgIEZyLm91dFNpemUgPSA1MTI7CiAgICBGci5obWFjU3RyZW5ndGggPSAxOTI7CiAgICBGci5wYWRMZW5ndGggPSAxMjg7CiAgICBGci5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IHRoaXMuVywgZiA9IDA7ZiA8IDMyOyBmKyspCiAgICAgICAgb1tmXSA9IGVbciArIGZdOwogICAgICBmb3IgKDtmIDwgby5sZW5ndGg7IGYgKz0gMikgewogICAgICAgIHZhciBwID0gRFIob1tmIC0gNF0sIG9bZiAtIDNdKSwgbTIgPSBQUihvW2YgLSA0XSwgb1tmIC0gM10pLCB5MyA9IG9bZiAtIDE0XSwgTSA9IG9bZiAtIDEzXSwgeCA9IExSKG9bZiAtIDMwXSwgb1tmIC0gMjldKSwgUyA9IE5SKG9bZiAtIDMwXSwgb1tmIC0gMjldKSwgRTIgPSBvW2YgLSAzMl0sIEIgPSBvW2YgLSAzMV07CiAgICAgICAgb1tmXSA9IHdSKHAsIG0yLCB5MywgTSwgeCwgUywgRTIsIEIpLCBvW2YgKyAxXSA9IE1SKHAsIG0yLCB5MywgTSwgeCwgUywgRTIsIEIpOwogICAgICB9CiAgICB9OwogICAgRnIucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHRoaXMuX3ByZXBhcmVCbG9jayhlLCByKTsKICAgICAgdmFyIG8gPSB0aGlzLlcsIGYgPSB0aGlzLmhbMF0sIHAgPSB0aGlzLmhbMV0sIG0yID0gdGhpcy5oWzJdLCB5MyA9IHRoaXMuaFszXSwgTSA9IHRoaXMuaFs0XSwgeCA9IHRoaXMuaFs1XSwgUyA9IHRoaXMuaFs2XSwgRTIgPSB0aGlzLmhbN10sIEIgPSB0aGlzLmhbOF0sIHEyID0gdGhpcy5oWzldLCBMMiA9IHRoaXMuaFsxMF0sIGdlID0gdGhpcy5oWzExXSwgX2UgPSB0aGlzLmhbMTJdLCBOID0gdGhpcy5oWzEzXSwgd2UgPSB0aGlzLmhbMTRdLCB5ZSA9IHRoaXMuaFsxNV07CiAgICAgIHlSKHRoaXMuay5sZW5ndGggPT09IG8ubGVuZ3RoKTsKICAgICAgZm9yICh2YXIgeGUgPSAwO3hlIDwgby5sZW5ndGg7IHhlICs9IDIpIHsKICAgICAgICB2YXIgUmUgPSB3ZSwgRWUgPSB5ZSwgQWUgPSBUUihCLCBxMiksIFAgPSBrUihCLCBxMiksIFNlID0gRVIoQiwgcTIsIEwyLCBnZSwgX2UsIE4pLCB2ID0gQVIoQiwgcTIsIEwyLCBnZSwgX2UsIE4pLCBpID0gdGhpcy5rW3hlXSwgYSA9IHRoaXMua1t4ZSArIDFdLCBoMiA9IG9beGVdLCBzID0gb1t4ZSArIDFdLCB1ID0gX1IoUmUsIEVlLCBBZSwgUCwgU2UsIHYsIGksIGEsIGgyLCBzKSwgYyA9IHhSKFJlLCBFZSwgQWUsIFAsIFNlLCB2LCBpLCBhLCBoMiwgcyk7CiAgICAgICAgUmUgPSBxUihmLCBwKSwgRWUgPSBJUihmLCBwKSwgQWUgPSBSUihmLCBwLCBtMiwgeTMsIE0sIHgpLCBQID0gQlIoZiwgcCwgbTIsIHkzLCBNLCB4KTsKICAgICAgICB2YXIgYjMgPSB6bChSZSwgRWUsIEFlLCBQKSwgbCA9IEhsKFJlLCBFZSwgQWUsIFApOwogICAgICAgIHdlID0gX2UsIHllID0gTiwgX2UgPSBMMiwgTiA9IGdlLCBMMiA9IEIsIGdlID0gcTIsIEIgPSB6bChTLCBFMiwgdSwgYyksIHEyID0gSGwoRTIsIEUyLCB1LCBjKSwgUyA9IE0sIEUyID0geCwgTSA9IG0yLCB4ID0geTMsIG0yID0gZiwgeTMgPSBwLCBmID0gemwodSwgYywgYjMsIGwpLCBwID0gSGwodSwgYywgYjMsIGwpOwogICAgICB9CiAgICAgIEppKHRoaXMuaCwgMCwgZiwgcCksIEppKHRoaXMuaCwgMiwgbTIsIHkzKSwgSmkodGhpcy5oLCA0LCBNLCB4KSwgSmkodGhpcy5oLCA2LCBTLCBFMiksIEppKHRoaXMuaCwgOCwgQiwgcTIpLCBKaSh0aGlzLmgsIDEwLCBMMiwgZ2UpLCBKaSh0aGlzLmgsIDEyLCBfZSwgTiksIEppKHRoaXMuaCwgMTQsIHdlLCB5ZSk7CiAgICB9OwogICAgRnIucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlID09PSAiaGV4IiA/IGlyLnRvSGV4MzIodGhpcy5oLCAiYmlnIikgOiBpci5zcGxpdDMyKHRoaXMuaCwgImJpZyIpOwogICAgfTsKICAgIGZ1bmN0aW9uIEVSKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgdmFyIHAgPSB0ICYgciBeIH50ICYgZjsKICAgICAgcmV0dXJuIHAgPCAwICYmIChwICs9IDQyOTQ5NjcyOTYpLCBwOwogICAgfQogICAgZnVuY3Rpb24gQVIodCwgZSwgciwgbywgZiwgcCkgewogICAgICB2YXIgbTIgPSBlICYgbyBeIH5lICYgcDsKICAgICAgcmV0dXJuIG0yIDwgMCAmJiAobTIgKz0gNDI5NDk2NzI5NiksIG0yOwogICAgfQogICAgZnVuY3Rpb24gUlIodCwgZSwgciwgbywgZikgewogICAgICB2YXIgcCA9IHQgJiByIF4gdCAmIGYgXiByICYgZjsKICAgICAgcmV0dXJuIHAgPCAwICYmIChwICs9IDQyOTQ5NjcyOTYpLCBwOwogICAgfQogICAgZnVuY3Rpb24gQlIodCwgZSwgciwgbywgZiwgcCkgewogICAgICB2YXIgbTIgPSBlICYgbyBeIGUgJiBwIF4gbyAmIHA7CiAgICAgIHJldHVybiBtMiA8IDAgJiYgKG0yICs9IDQyOTQ5NjcyOTYpLCBtMjsKICAgIH0KICAgIGZ1bmN0aW9uIHFSKHQsIGUpIHsKICAgICAgdmFyIHIgPSBvaSh0LCBlLCAyOCksIG8gPSBvaShlLCB0LCAyKSwgZiA9IG9pKGUsIHQsIDcpLCBwID0gciBeIG8gXiBmOwogICAgICByZXR1cm4gcCA8IDAgJiYgKHAgKz0gNDI5NDk2NzI5NiksIHA7CiAgICB9CiAgICBmdW5jdGlvbiBJUih0LCBlKSB7CiAgICAgIHZhciByID0gc2kodCwgZSwgMjgpLCBvID0gc2koZSwgdCwgMiksIGYgPSBzaShlLCB0LCA3KSwgcCA9IHIgXiBvIF4gZjsKICAgICAgcmV0dXJuIHAgPCAwICYmIChwICs9IDQyOTQ5NjcyOTYpLCBwOwogICAgfQogICAgZnVuY3Rpb24gVFIodCwgZSkgewogICAgICB2YXIgciA9IG9pKHQsIGUsIDE0KSwgbyA9IG9pKHQsIGUsIDE4KSwgZiA9IG9pKGUsIHQsIDkpLCBwID0gciBeIG8gXiBmOwogICAgICByZXR1cm4gcCA8IDAgJiYgKHAgKz0gNDI5NDk2NzI5NiksIHA7CiAgICB9CiAgICBmdW5jdGlvbiBrUih0LCBlKSB7CiAgICAgIHZhciByID0gc2kodCwgZSwgMTQpLCBvID0gc2kodCwgZSwgMTgpLCBmID0gc2koZSwgdCwgOSksIHAgPSByIF4gbyBeIGY7CiAgICAgIHJldHVybiBwIDwgMCAmJiAocCArPSA0Mjk0OTY3Mjk2KSwgcDsKICAgIH0KICAgIGZ1bmN0aW9uIExSKHQsIGUpIHsKICAgICAgdmFyIHIgPSBvaSh0LCBlLCAxKSwgbyA9IG9pKHQsIGUsIDgpLCBmID0gVTIodCwgZSwgNyksIHAgPSByIF4gbyBeIGY7CiAgICAgIHJldHVybiBwIDwgMCAmJiAocCArPSA0Mjk0OTY3Mjk2KSwgcDsKICAgIH0KICAgIGZ1bmN0aW9uIE5SKHQsIGUpIHsKICAgICAgdmFyIHIgPSBzaSh0LCBlLCAxKSwgbyA9IHNpKHQsIGUsIDgpLCBmID0gejIodCwgZSwgNyksIHAgPSByIF4gbyBeIGY7CiAgICAgIHJldHVybiBwIDwgMCAmJiAocCArPSA0Mjk0OTY3Mjk2KSwgcDsKICAgIH0KICAgIGZ1bmN0aW9uIERSKHQsIGUpIHsKICAgICAgdmFyIHIgPSBvaSh0LCBlLCAxOSksIG8gPSBvaShlLCB0LCAyOSksIGYgPSBVMih0LCBlLCA2KSwgcCA9IHIgXiBvIF4gZjsKICAgICAgcmV0dXJuIHAgPCAwICYmIChwICs9IDQyOTQ5NjcyOTYpLCBwOwogICAgfQogICAgZnVuY3Rpb24gUFIodCwgZSkgewogICAgICB2YXIgciA9IHNpKHQsIGUsIDE5KSwgbyA9IHNpKGUsIHQsIDI5KSwgZiA9IHoyKHQsIGUsIDYpLCBwID0gciBeIG8gXiBmOwogICAgICByZXR1cm4gcCA8IDAgJiYgKHAgKz0gNDI5NDk2NzI5NiksIHA7CiAgICB9CiAgfSk7CiAgWjIgPSBUMigoRGssIGoyKSA9PiB7CiAgICB2YXIgS2wgPSBDcigpLCBLMiA9IFdsKCk7CiAgICBmdW5jdGlvbiBxaSgpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHFpKSkKICAgICAgICByZXR1cm4gbmV3IHFpOwogICAgICBLMi5jYWxsKHRoaXMpLCB0aGlzLmggPSBbMzQxODA3MDM2NSwgMzIzODM3MTAzMiwgMTY1NDI3MDI1MCwgOTE0MTUwNjYzLCAyNDM4NTI5MzcwLCA4MTI3MDI5OTksIDM1NTQ2MjM2MCwgNDE0NDkxMjY5NywgMTczMTQwNTQxNSwgNDI5MDc3NTg1NywgMjM5NDE4MDIzMSwgMTc1MDYwMzAyNSwgMzY3NTAwODUyNSwgMTY5NDA3NjgzOSwgMTIwMzA2MjgxMywgMzIwNDA3NTQyOF07CiAgICB9CiAgICBLbC5pbmhlcml0cyhxaSwgSzIpOwogICAgajIuZXhwb3J0cyA9IHFpOwogICAgcWkuYmxvY2tTaXplID0gMTAyNDsKICAgIHFpLm91dFNpemUgPSAzODQ7CiAgICBxaS5obWFjU3RyZW5ndGggPSAxOTI7CiAgICBxaS5wYWRMZW5ndGggPSAxMjg7CiAgICBxaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8gS2wudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgMTIpLCAiYmlnIikgOiBLbC5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICJiaWciKTsKICAgIH07CiAgfSk7CiAgVjIgPSBUMigoRGYpID0+IHsKICAgIERmLnNoYTEgPSBOMigpOwogICAgRGYuc2hhMjI0ID0gRjIoKTsKICAgIERmLnNoYTI1NiA9IEZsKCk7CiAgICBEZi5zaGEzODQgPSBaMigpOwogICAgRGYuc2hhNTEyID0gV2woKTsKICB9KTsKICBRMiA9IFQyKChKMikgPT4gewogICAgdmFyIE9uID0gQ3IoKSwgQ1IgPSBUZigpLCBRcyA9IE9uLnJvdGwzMiwgJDIgPSBPbi5zdW0zMiwgVWEgPSBPbi5zdW0zMl8zLCBHMiA9IE9uLnN1bTMyXzQsIFgyID0gQ1IuQmxvY2tIYXNoOwogICAgZnVuY3Rpb24gaGkoKSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBoaSkpCiAgICAgICAgcmV0dXJuIG5ldyBoaTsKICAgICAgWDIuY2FsbCh0aGlzKSwgdGhpcy5oID0gWzE3MzI1ODQxOTMsIDQwMjMyMzM0MTcsIDI1NjIzODMxMDIsIDI3MTczMzg3OCwgMzI4NTM3NzUyMF0sIHRoaXMuZW5kaWFuID0gImxpdHRsZSI7CiAgICB9CiAgICBPbi5pbmhlcml0cyhoaSwgWDIpOwogICAgSjIucmlwZW1kMTYwID0gaGk7CiAgICBoaS5ibG9ja1NpemUgPSA1MTI7CiAgICBoaS5vdXRTaXplID0gMTYwOwogICAgaGkuaG1hY1N0cmVuZ3RoID0gMTkyOwogICAgaGkucGFkTGVuZ3RoID0gNjQ7CiAgICBoaS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IHRoaXMuaFswXSwgZiA9IHRoaXMuaFsxXSwgcCA9IHRoaXMuaFsyXSwgbTIgPSB0aGlzLmhbM10sIHkzID0gdGhpcy5oWzRdLCBNID0gbywgeCA9IGYsIFMgPSBwLCBFMiA9IG0yLCBCID0geTMsIHEyID0gMDtxMiA8IDgwOyBxMisrKSB7CiAgICAgICAgdmFyIEwyID0gJDIoUXMoRzIobywgWTIocTIsIGYsIHAsIG0yKSwgZVtVUltxMl0gKyByXSwgT1IocTIpKSwgSFJbcTJdKSwgeTMpOwogICAgICAgIG8gPSB5MywgeTMgPSBtMiwgbTIgPSBRcyhwLCAxMCksIHAgPSBmLCBmID0gTDIsIEwyID0gJDIoUXMoRzIoTSwgWTIoNzkgLSBxMiwgeCwgUywgRTIpLCBlW3pSW3EyXSArIHJdLCBGUihxMikpLCBXUltxMl0pLCBCKSwgTSA9IEIsIEIgPSBFMiwgRTIgPSBRcyhTLCAxMCksIFMgPSB4LCB4ID0gTDI7CiAgICAgIH0KICAgICAgTDIgPSBVYSh0aGlzLmhbMV0sIHAsIEUyKSwgdGhpcy5oWzFdID0gVWEodGhpcy5oWzJdLCBtMiwgQiksIHRoaXMuaFsyXSA9IFVhKHRoaXMuaFszXSwgeTMsIE0pLCB0aGlzLmhbM10gPSBVYSh0aGlzLmhbNF0sIG8sIHgpLCB0aGlzLmhbNF0gPSBVYSh0aGlzLmhbMF0sIGYsIFMpLCB0aGlzLmhbMF0gPSBMMjsKICAgIH07CiAgICBoaS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8gT24udG9IZXgzMih0aGlzLmgsICJsaXR0bGUiKSA6IE9uLnNwbGl0MzIodGhpcy5oLCAibGl0dGxlIik7CiAgICB9OwogICAgZnVuY3Rpb24gWTIodCwgZSwgciwgbykgewogICAgICByZXR1cm4gdCA8PSAxNSA/IGUgXiByIF4gbyA6IHQgPD0gMzEgPyBlICYgciB8IH5lICYgbyA6IHQgPD0gNDcgPyAoZSB8IH5yKSBeIG8gOiB0IDw9IDYzID8gZSAmIG8gfCByICYgfm8gOiBlIF4gKHIgfCB+byk7CiAgICB9CiAgICBmdW5jdGlvbiBPUih0KSB7CiAgICAgIHJldHVybiB0IDw9IDE1ID8gMCA6IHQgPD0gMzEgPyAxNTE4NTAwMjQ5IDogdCA8PSA0NyA/IDE4NTk3NzUzOTMgOiB0IDw9IDYzID8gMjQwMDk1OTcwOCA6IDI4NDA4NTM4Mzg7CiAgICB9CiAgICBmdW5jdGlvbiBGUih0KSB7CiAgICAgIHJldHVybiB0IDw9IDE1ID8gMTM1MjgyOTkyNiA6IHQgPD0gMzEgPyAxNTQ4NjAzNjg0IDogdCA8PSA0NyA/IDE4MzYwNzI2OTEgOiB0IDw9IDYzID8gMjA1Mzk5NDIxNyA6IDA7CiAgICB9CiAgICB2YXIgVVIgPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgNywgNCwgMTMsIDEsIDEwLCA2LCAxNSwgMywgMTIsIDAsIDksIDUsIDIsIDE0LCAxMSwgOCwgMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMiwgMSwgOSwgMTEsIDEwLCAwLCA4LCAxMiwgNCwgMTMsIDMsIDcsIDE1LCAxNCwgNSwgNiwgMiwgNCwgMCwgNSwgOSwgNywgMTIsIDIsIDEwLCAxNCwgMSwgMywgOCwgMTEsIDYsIDE1LCAxM10sIHpSID0gWzUsIDE0LCA3LCAwLCA5LCAyLCAxMSwgNCwgMTMsIDYsIDE1LCA4LCAxLCAxMCwgMywgMTIsIDYsIDExLCAzLCA3LCAwLCAxMywgNSwgMTAsIDE0LCAxNSwgOCwgMTIsIDQsIDksIDEsIDIsIDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMsIDgsIDYsIDQsIDEsIDMsIDExLCAxNSwgMCwgNSwgMTIsIDIsIDEzLCA5LCA3LCAxMCwgMTQsIDEyLCAxNSwgMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsIDEzLCAxNCwgMCwgMywgOSwgMTFdLCBIUiA9IFsxMSwgMTQsIDE1LCAxMiwgNSwgOCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDYsIDcsIDksIDgsIDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMiwgMTEsIDEzLCA2LCA3LCAxNCwgOSwgMTMsIDE1LCAxNCwgOCwgMTMsIDYsIDUsIDEyLCA3LCA1LCAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCA5LCA4LCA5LCAxNCwgNSwgNiwgOCwgNiwgNSwgMTIsIDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNl0sIFdSID0gWzgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNiwgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLCA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCwgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXTsKICB9KTsKICB0eSA9IFQyKChPaywgZXkpID0+IHsKICAgIHZhciBLUiA9IENyKCksIGpSID0gYXIoKTsKICAgIGZ1bmN0aW9uIFBmKHQsIGUsIHIpIHsKICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBmKSkKICAgICAgICByZXR1cm4gbmV3IFBmKHQsIGUsIHIpOwogICAgICB0aGlzLkhhc2ggPSB0LCB0aGlzLmJsb2NrU2l6ZSA9IHQuYmxvY2tTaXplIC8gOCwgdGhpcy5vdXRTaXplID0gdC5vdXRTaXplIC8gOCwgdGhpcy5pbm5lciA9IG51bGwsIHRoaXMub3V0ZXIgPSBudWxsLCB0aGlzLl9pbml0KEtSLnRvQXJyYXkoZSwgcikpOwogICAgfQogICAgZXkuZXhwb3J0cyA9IFBmOwogICAgUGYucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oZSkgewogICAgICBlLmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplICYmIChlID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShlKS5kaWdlc3QoKSksIGpSKGUubGVuZ3RoIDw9IHRoaXMuYmxvY2tTaXplKTsKICAgICAgZm9yICh2YXIgciA9IGUubGVuZ3RoO3IgPCB0aGlzLmJsb2NrU2l6ZTsgcisrKQogICAgICAgIGUucHVzaCgwKTsKICAgICAgZm9yIChyID0gMDtyIDwgZS5sZW5ndGg7IHIrKykKICAgICAgICBlW3JdIF49IDU0OwogICAgICBmb3IgKHRoaXMuaW5uZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGUpLCByID0gMDtyIDwgZS5sZW5ndGg7IHIrKykKICAgICAgICBlW3JdIF49IDEwNjsKICAgICAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoZSk7CiAgICB9OwogICAgUGYucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUsIHIpLCB0aGlzOwogICAgfTsKICAgIFBmLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKSwgdGhpcy5vdXRlci5kaWdlc3QoZSk7CiAgICB9OwogIH0pOwogIGUwID0gVDIoKHJ5KSA9PiB7CiAgICB2YXIgS3QgPSByeTsKICAgIEt0LnV0aWxzID0gQ3IoKTsKICAgIEt0LmNvbW1vbiA9IFRmKCk7CiAgICBLdC5zaGEgPSBWMigpOwogICAgS3QucmlwZW1kID0gUTIoKTsKICAgIEt0LmhtYWMgPSB0eSgpOwogICAgS3Quc2hhMSA9IEt0LnNoYS5zaGExOwogICAgS3Quc2hhMjU2ID0gS3Quc2hhLnNoYTI1NjsKICAgIEt0LnNoYTIyNCA9IEt0LnNoYS5zaGEyMjQ7CiAgICBLdC5zaGEzODQgPSBLdC5zaGEuc2hhMzg0OwogICAgS3Quc2hhNTEyID0gS3Quc2hhLnNoYTUxMjsKICAgIEt0LnJpcGVtZDE2MCA9IEt0LnJpcGVtZC5yaXBlbWQxNjA7CiAgfSk7CiAgbnkgPSBUMigoVWssIGl5KSA9PiB7CiAgICBpeS5leHBvcnRzID0geyBkb3VibGVzOiB7IHN0ZXA6IDQsIHBvaW50czogW1siZTYwZmNlOTNiNTllOWVjNTMwMTFhYWJjMjFjMjNlOTdiMmEzMTM2OWI4N2E1YWU5YzQ0ZWU4OWUyYTZkZWMwYSIsICJmN2UzNTA3Mzk5ZTU5NTkyOWRiOTlmMzRmNTc5MzcxMDEyOTY4OTFlNDRkMjNmMGJlMWYzMmNjZTY5NjE2ODIxIl0sIFsiODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCIsICIxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmIl0sIFsiMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOSIsICJkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1Il0sIFsiMzYzZDkwZDQ0N2IwMGM5Yzk5Y2VhYzA1YjYyNjJlZTA1MzQ0MWM3ZTU1NTUyZmZlNTI2YmFkOGY4M2ZmNDY0MCIsICI0ZTI3M2FkZmM3MzIyMjE5NTNiNDQ1Mzk3ZjMzNjMxNDViOWE4OTAwODE5OWVjYjYyMDAzYzdmM2JlZTlkZTkiXSwgWyI4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjIiwgIjRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYiXSwgWyI3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhIiwgIjk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYiXSwgWyJlZWJmYTRkNDkzYmViZjk4YmE1ZmVlYzgxMmMyZDNiNTA5NDc5NjEyMzdhOTE5ODM5YTUzM2VjYTBlN2RkN2ZhIiwgIjVkOWE4Y2EzOTcwZWYwZjI2OWVlN2VkYWYxNzgwODlkOWFlNGNkYzNhNzExZjcxMmRkZmQ0ZmRhZTFkZTg5OTkiXSwgWyIxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwIiwgImNkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDkiXSwgWyJlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkIiwgIjlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQiXSwgWyJmZWVhNmNhZTQ2ZDU1YjUzMGFjMjgzOWYxNDNiZDdlYzVjZjhiMjY2YTQxZDZhZjUyZDVlNjg4ZDkwOTQ2OTZkIiwgImU1N2M2YjZjOTdkY2UxYmFiMDZlNGUxMmJmM2VjZDVjOTgxYzg5NTdjYzQxNDQyZDMxNTVkZWJmMTgwOTAwODgiXSwgWyJkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxIiwgIjliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQiXSwgWyI1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwIiwgIjViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgiXSwgWyI4ZTdiY2QwYmQzNTk4M2E3NzE5Y2NhNzc2NGNhOTA2Nzc5YjUzYTA0M2E5YjhiY2FlZmY5NTlmNDNhZDg2MDQ3IiwgIjEwYjc3NzBiMmEzZGE0YjM5NDAzMTA0MjBjYTk1MTQ1NzllODhlMmU0N2ZkNjhiM2VhMTAwNDdlODQ2MDM3MmEiXSwgWyIzODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyIiwgIjI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMiXSwgWyI2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTciLCAiN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCJdLCBbIjMzMjJkNDAxMjQzYzRlMjU4MmEyMTQ3YzEwNGQ2ZWNiZjc3NGQxNjNkYjBmNWU1MzEzYjdlMGU3NDJkMGU2YmQiLCAiNTZlNzA3OTdlOTY2NGVmNWJmYjAxOWJjNGRkYWY5YjcyODA1ZjYzZWEyODczYWY2MjRmM2EyZTk2YzI4YjJhMCJdLCBbIjg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMiLCAiN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNiJdLCBbIjk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYSIsICI1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5Il0sIFsiNjI2MGNlN2Y0NjE4MDFjMzRmMDY3Y2UwZjAyODczYThmMWIwZTQ0ZGZjNjk3NTJhY2NlY2Q4MTlmMzhmZDhlOCIsICJiYzJkYTgyYjZmYTViNTcxYTdmMDkwNDk3NzZhMWVmN2VjZDI5MjIzODA1MWMxOThjMWE4NGU5NWIyYjRhZTE3Il0sIFsiZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCIsICI0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhIl0sIFsiZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNSIsICI3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkIl0sIFsiMjEzYzdhNzE1Y2Q1ZDQ1MzU4ZDBiYmY5ZGMwY2UwMjIwNGIxMGJkZGUyYTNmNTg1NDBhZDY5MDhkMDU1OTc1NCIsICI0YjZkYWQwYjVhZTQ2MjUwNzAxM2FkMDYyNDViYTE5MGJiNDg1MGY1ZjM2YTdlZWRkZmYyYzI3NTM0YjQ1OGYyIl0sIFsiNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYyIsICIxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2Il0sIFsiZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNiIsICI2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmIl0sIFsiNzZlNjQxMTNmNjc3Y2YwZTEwYTI1NzBkNTk5OTY4ZDMxNTQ0ZTE3OWI3NjA0MzI5NTJjMDJhNDQxN2JkZGUzOSIsICJjOTBkZGY4ZGVlNGU5NWNmNTc3MDY2ZDcwNjgxZjBkMzVlMmEzM2QyYjU2ZDIwMzJiNGIxNzUyZDE5MDFhYzAxIl0sIFsiYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MSIsICI4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzIl0sIFsiZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YiIsICJmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmIl0sIFsiYjhkYTk0MDMyYTk1NzUxOGViMGY2NDMzNTcxZTg3NjFjZWZmYzczNjkzZTg0ZWRkNDkxNTBhNTY0ZjY3NmUwMyIsICIyODA0ZGZhNDQ4MDVhMWU0ZDdjOTljYzk3NjI4MDhiMDkyY2M1ODRkOTVmZjNiNTExNDg4ZTRlNzRlZmRmNmU3Il0sIFsiZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCIsICJlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4Il0sIFsiYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCIsICI3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExIl0sIFsiOTBhZDg1YjM4OWQ2YjkzNjQ2M2Y5ZDA1MTI2NzhkZTIwOGNjMzMwYjExMzA3ZmZmYWI3YWM2M2UzZmIwNGVkNCIsICJlNTA3YTM2MjBhMzgyNjFhZmZkY2JkOTQyNzIyMmI4MzlhZWZhYmUxNTgyODk0ZDk5MWQ0ZDQ4Y2I2ZWYxNTAiXSwgWyI4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhIiwgIjY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODIiXSwgWyJlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExIiwgIjFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMiXSwgWyI4YzAwZmE5YjE4ZWJmMzMxZWI5NjE1MzdhNDVhNDI2NmM3MDM0ZjJmMGQ0ZTFkMDcxNmZiNmVhZTIwZWFlMjllIiwgImVmYTQ3MjY3ZmVhNTIxYTFhOWRjMzQzYTM3MzZjOTc0YzJmYWRhZmE4MWUzNmM1NGU3ZDJhNGM2NjcwMjQxNGIiXSwgWyJlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxIiwgIjJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEiXSwgWyJiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmIiwgIjY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NSJdLCBbImQ2OGE4MGM4MjgwYmI4NDA3OTMyMzRhYTExOGYwNjIzMWQ2ZjFmYzY3ZTczYzVhNWRlZGEwZjViNDk2OTQzZTgiLCAiZGI4YmE5ZmZmNGI1ODZkMDBjNGIxZjkxNzdiMGUyOGI1YjBlN2I4Zjc4NDUyOTVhMjk0Yzg0MjY2YjEzMzEyMCJdLCBbIjMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQiLCAiNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCJdLCBbIjRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYiLCAiMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQiXSwgWyI5YzM5MTlhODRhNDc0ODcwZmFlZDhhOWMxY2M2NjAyMTUyMzQ4OTA1NGQ3ZjAzMDhjYmZjOTljOGFjMWY5OGNkIiwgImRkYjg0ZjBmNGE0ZGRkNTc1ODRmMDQ0YmYyNjBlNjQxOTA1MzI2Zjc2YzY0YzhlNmJlN2U1ZTAzZDRmYzU5OWQiXSwgWyI2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1IiwgIjlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgiXSwgWyJhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2IiwgIjQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgiXSwgWyI3Nzc4YTc4YzI4ZGVjM2UzMGEwNWZlOTYyOWRlOGMzOGJiMzBkMWY1Y2Y5YTNhMjA4Zjc2Mzg4OWJlNThhZDcxIiwgIjM0NjI2ZDlhYjVhNWIyMmZmNzA5OGUxMmYyZmY1ODAwODdiMzg0MTFmZjI0YWM1NjNiNTEzZmMxZmQ5ZjQzYWMiXSwgWyI5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMiLCAiYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZiJdLCBbIjg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEiLCAiMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MiJdLCBbImZmMmIwZGNlOTdlZWNlOTdjMWM5YjYwNDE3OThiODVkZmRmYjZkODg4MmRhMjAzMDhmNTQwNDgyNDUyNjA4N2UiLCAiNDkzZDEzZmVmNTI0YmExODhhZjRjNGRjNTRkMDc5MzZjN2I3ZWQ2ZmI5MGUyY2ViMmM5NTFlMDFmMGMyOTkwNyJdLCBbIjgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEiLCAiYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYyJdLCBbImVhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMiLCAiYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCJdLCBbImU0YTQyZDQzYzVjZjE2OWQ5MzkxZGY2ZGVjZjQyZWU1NDFiNmQ4ZjBjOWExMzc0MDFlMjM2MzJkZGEzNGQyNGYiLCAiNGQ5ZjkyZTcxNmQxYzczNTI2ZmM5OWNjZmI4YWQzNGNlODg2ZWVkZmE4ZDhlNGYxM2E3ZjcxMzFkZWJhOTQxNCJdLCBbIjFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTkiLCAiYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCJdLCBbIjE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUiLCAiYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCJdLCBbImZhNTBjMGY2MWQyMmU1ZjA3ZTNhY2ViYjFhYTA3YjEyOGQwMDEyMjA5YTI4Yjk3NzZkNzZhODc5MzE4MGVlZjkiLCAiNmI4NGM2OTIyMzk3ZWJhOWI3MmNkMjg3MjI4MWE2OGE1ZTY4MzI5M2E1N2EyMTNiMzhjZDhkN2QzZjRmMjgxMSJdLCBbImRhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzIiLCAiODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSJdLCBbImE4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMiLCAiN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYyJdLCBbIjE3NGE1M2I5YzlhMjg1ODcyZDM5ZTU2ZTY5MTNjYWIxNWQ1OWIxZmE1MTI1MDhjMDIyZjM4MmRlODMxOTQ5N2MiLCAiY2NjOWRjMzdhYmZjOWMxNjU3YjQxNTVmMmM0N2Y5ZTY2NDZiM2ExZDhjYjk4NTQzODNkYTEzYWMwNzlhZmE3MyJdLCBbIjk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEiLCAiMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCJdLCBbImQyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEiLCAiZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNSJdLCBbIjY0NTg3ZTIzMzU0NzFlYjg5MGVlNzg5NmQ3Y2ZkYzg2NmJhY2JkYmQzODM5MzE3YjM0MzZmOWI0NTYxN2UwNzMiLCAiZDk5ZmNkZDViZjY5MDJlMmFlOTZkZDY0NDdjMjk5YTE4NWI5MGEzOTEzM2FlYWIzNTgyOTllNWU5ZmFmNjU4OSJdLCBbIjg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgiLCAiMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSJdLCBbIjEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmIiLCAiNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNyJdLCBbImJjNGE5ZGY1YjcxM2ZlMmU5YWVmNDMwYmNjMWRjOTdhMGNkOWNjZWRlMmYyODU4OGNhZGEzYTBkMmQ4M2YzNjYiLCAiZDNhODFjYTZlNzg1YzA2MzgzOTM3YWRmNGI3OThjYWE2ZThhOWZiZmE1NDdiMTZkNzU4ZDY2NjU4MWYzM2MxIl0sIFsiOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYSIsICI0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyIl0sIFsiOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwIiwgIjYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUiXSwgWyJkZDM2MjVmYWVmNWJhMDYwNzQ2Njk3MTZiYmQzNzg4ZDg5YmRkZTgxNTk1OTk2ODA5MmY3NmNjNGViOWE5Nzg3IiwgIjdhMTg4ZmEzNTIwZTMwZDQ2MWRhMjUwMTA0NTczMWNhOTQxNDYxOTgyODgzMzk1OTM3ZjY4ZDAwYzY0NGE1NzMiXSwgWyJmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlIiwgImVhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODIiXV0gfSwgbmFmOiB7IHduZDogNywgcG9pbnRzOiBbWyJmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5IiwgIjM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzIiXSwgWyIyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0IiwgImQ4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYiXSwgWyI1Y2JkZjA2NDZlNWRiNGVhYTM5OGYzNjVmMmVhN2EwZTNkNDE5YjdlMDMzMGUzOWNlOTJiZGRlZGNhYzRmOWJjIiwgIjZhZWJjYTQwYmEyNTU5NjBhMzE3OGQ2ZDg2MWE1NGRiYTgxM2QwYjgxM2ZkZTdiNWE1MDgyNjI4MDg3MjY0ZGEiXSwgWyJhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlIiwgImNjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzciXSwgWyI3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiIiwgImQ5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWIiXSwgWyJmMjg3NzNjMmQ5NzUyODhiYzdkMWQyMDVjMzc0ODY1MWIwNzVmYmM2NjEwZTU4Y2RkZWVkZGY4ZjE5NDA1YWE4IiwgImFiMDkwMmU4ZDg4MGE4OTc1ODIxMmViNjVjZGFmNDczYTFhMDZkYTUyMWZhOTFmMjliNWNiNTJkYjAzZWQ4MSJdLCBbImQ3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUiLCAiNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCJdLCBbImRlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQiLCAiNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NyJdLCBbIjJiNGVhMGE3OTdhNDQzZDI5M2VmNWNmZjQ0NGY0OTc5ZjA2YWNmZWJkN2U4NmQyNzc0NzU2NTYxMzgzODViNmMiLCAiODVlODliYzAzNzk0NWQ5M2IzNDMwODNiNWExYzg2MTMxYTAxZjYwYzUwMjY5NzYzYjU3MGM4NTRlNWMwOWI3YSJdLCBbIjM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUiLCAiMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YyJdLCBbIjJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YiLCAiMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3Il0sIFsiOTI0ODI3OWIwOWI0ZDY4ZGFiMjFhOWIwNjZlZGRhODMyNjNjM2Q4NGUwOTU3MmUyNjljYTBjZDdmNTQ1MzcxNCIsICI3MzAxNmY3YmYyMzRhYWRlNWQxYWE3MWJkZWEyYjFmZjNmYzBkZTJhODg3OTEyZmZlNTRhMzJjZTk3Y2IzNDAyIl0sIFsiZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOSIsICJhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1Il0sIFsiYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYiIsICIyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyIl0sIFsiNmEyNDViZjZkYzY5ODUwNGM4OWEyMGNmZGVkNjA4NTMxNTJiNjk1MzM2YzI4MDYzYjYxYzY1Y2JkMjY5ZTZiNCIsICJlMDIyY2Y0MmMyYmQ0YTcwOGIzZjUxMjZmMTZhMjRhZDhiMzNiYTQ4ZDA0MjNiNmVmZDVlNjM0ODEwMGQ4YTgyIl0sIFsiMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNSIsICJiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2Il0sIFsiNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OSIsICIyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDkiXSwgWyI2MmQxNGRhYjQxNTBiZjQ5NzQwMmZkYzQ1YTIxNWUxMGRjYjAxYzM1NDk1OWIxMGNmZTMxYzdlOWQ4N2ZmMzNkIiwgIjgwZmMwNmJkOGNjNWIwMTA5ODA4OGExOTUwZWVkMGRiMDFhYTEzMjk2N2FiNDcyMjM1ZjU2NDI0ODNiMjVlYWYiXSwgWyI4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmIiwgIjFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EiXSwgWyI3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiIiwgImQwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNyJdLCBbImQ1MjhlY2Q5YjY5NmI1NGM5MDdhOWVkMDQ1NDQ3YTc5YmI0MDhlYzM5YjY4ZGY1MDRiYjUxZjQ1OWJjM2ZmYzkiLCAiZWVjZjQxMjUzMTM2ZTVmOTk5NjZmMjE4ODFmZDY1NmViYzQzNDU0MDVjNTIwZGJjMDYzNDY1YjUyMTQwOTkzMyJdLCBbIjQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MyIsICI3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhIl0sIFsiNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCIsICI5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2Il0sIFsiZjJkYWM5OTFjYzRjZTRiOWVhNDQ4ODdlNWM3YzBiY2U1OGM4MDA3NGFiOWQ0ZGJhZWIyODUzMWI3NzM5ZjUzMCIsICJlMGRlZGM5YjNiMmY4ZGFkNGRhMWYzMmRlYzI1MzFkZjllYjVmYmViMDU5OGU0ZmQxYTExN2RiYTcwM2EzYzM3Il0sIFsiNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YiIsICI1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlIl0sIFsiZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NyIsICJjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2Il0sIFsiY2FmNzU0MjcyZGM4NDU2M2IwMzUyYjdhMTQzMTFhZjU1ZDI0NTMxNWFjZTI3YzY1MzY5ZTE1ZjcxNTFkNDFkMSIsICJjYjQ3NDY2MGVmMzVmNWYyYTQxYjY0M2ZhNWU0NjA1NzVmNGZhOWI3OTYyMjMyYTVjMzJmOTA4MzE4YTA0NDc2Il0sIFsiMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCIsICI0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwIl0sIFsiNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNSIsICI5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEiXSwgWyI3NTRlMzIzOWYzMjU1NzBjZGJiZjRhODdkZWVlOGE2NmI3ZjJiMzM0NzlkNDY4ZmJjMWE1MDc0M2JmNTZjYzE4IiwgIjY3M2ZiODZlNWJkYTMwZmIzY2QwZWQzMDRlYTQ5YTAyM2VlMzNkMDE5N2E2OTVkMGM1ZDk4MDkzYzUzNjY4MyJdLCBbImUzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgiLCAiNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNSJdLCBbIjE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWIiLCAiM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YiJdLCBbImRmOWQ3MGE2Yjk4NzZjZTU0NGM5ODU2MWY0YmU0ZjcyNTQ0MmU2ZDJiNzM3ZDljOTFhODMyMTcyNGNlMDk2M2YiLCAiNTVlYjJkYWZkODRkNmNjZDVmODYyYjc4NWRjMzlkNGFiMTU3MjIyNzIwZWY5ZGEyMTdiOGM0NWNmMmJhMjQxNyJdLCBbIjVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMiLCAiZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCJdLCBbIjI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEiLCAiZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YSJdLCBbImFmM2M0MjNhOTVkOWY1YjMwNTQ3NTRlZmExNTBhYzM5Y2QyOTU1MmZlMzYwMjU3MzYyZGZkZWNlZjQwNTNiNDUiLCAiZjk4YTNmZDgzMWViMmI3NDlhOTNiMGU2ZjM1Y2ZiNDBjOGNkNWFhNjY3YTE1NTgxYmMyZmVkZWQ0OThmZDljNiJdLCBbIjc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEiLCAiNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NiJdLCBbIjU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UiLCAiYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZSJdLCBbImYxM2FkYTk1MTAzYzQ1MzczMDVlNjkxZTc0ZTlhNGE4ZGQ2NDdlNzExYTk1ZTczY2I2MmRjNjAxOGNmZDg3YjgiLCAiZTEzODE3YjQ0ZWUxNGRlNjYzYmY0YmM4MDgzNDFmMzI2OTQ5ZTIxYTZhNzVjMjU3MDc3ODQxOWJkYWY1NzMzZCJdLCBbIjc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMiLCAiMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMiJdLCBbIjk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTkiLCAiZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZSJdLCBbIjc5NjI0MTQ0NTBjNzZjMTY4OWM3YjQ4ZjgyMDJlYzM3ZmIyMjRjZjVhYzBiZmExNTcwMzI4YThhM2Q3Yzc3YWIiLCAiMTAwYjYxMGVjNGZmYjQ3NjBkNWMxZmMxMzNlZjZmNmIxMjUwN2EwNTFmMDRhYzU3NjBhZmE1YjI5ZGI4MzQzNyJdLCBbIjM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EiLCAiZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMSJdLCBbImQzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYiLCAiOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCJdLCBbIjE2MjRkODQ3ODA3MzI4NjBjZTFjNzhmY2JmZWZlMDhiMmIyOTgyM2RiOTEzZjY0OTM5NzViYTBmZjQ4NDc2MTAiLCAiNjg2NTFjZjliNmRhOTAzZTA5MTQ0NDhjNmNkOWQ0Y2E4OTY4NzhmNTI4MmJlNGM4Y2MwNmUyYTQwNDA3ODU3NSJdLCBbIjczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQiLCAiZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCJdLCBbIjE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMiLCAiZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCJdLCBbImExZDBmY2YyZWM5ZGU2NzViNjEyMTM2ZTVjZTcwZDI3MWMyMTQxN2M5ZDJiOGFhYWFjMTM4NTk5ZDA3MTc5NDAiLCAiZWRkNzdmNTBiY2I1YTNjYWIyZTkwNzM3MzA5NjY3ZjI2NDE0NjJhNTQwNzBmM2Q1MTkyMTJkMzljMTk3YTYyOSJdLCBbImUyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAiLCAiYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2Il0sIFsiMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMyIsICI2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0Il0sIFsiMzRjMWZkMDRkMzAxYmU4OWIzMWMwNDQyZDNlNmFjMjQ4ODM5MjhiNDVhOTM0MDc4MTg2N2Q0MjMyZWMyZGJkZiIsICI5NDE0Njg1ZTk3YjFiNTk1NGJkNDZmNzMwMTc0MTM2ZDU3ZjFjZWViNDg3NDQzZGM1MzIxODU3YmE3M2FiZWUiXSwgWyJmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzIiwgIjRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEiXSwgWyJkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4IiwgImZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2IiXSwgWyIzMmQzMWMyMjJmOGY2ZjBlZjg2ZjdjOThkM2EzMzM1ZWFkNWJjZDMyYWJkZDk0Mjg5ZmU0ZDMwOTFhYTgyNGJmIiwgIjVmMzAzMmY1ODkyMTU2ZTM5Y2NkM2Q3OTE1YjllMWRhMmU2ZGFjOWU2ZjI2ZTk2MTExOGQxNGI4NDYyZTE2NjEiXSwgWyI3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1IiwgIjhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYiXSwgWyJlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2IiwgIjhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUiXSwgWyIxNmVjOTNlNDQ3ZWM4M2YwNDY3YjE4MzAyZWU2MjBmN2U2NWRlMzMxODc0YzlkYzcyYmZkODYxNmJhOWRhNmI1IiwgIjVlNDYzMTE1MGU2MmZiNDBkMGU4YzJhN2NhNTgwNGEzOWQ1ODE4NmE1MGU0OTcxMzk2MjY3NzhlMjViMDY3NGQiXSwgWyJlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5IiwgImY2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMiXSwgWyI3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEiLCAiZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCJdLCBbIjQ5NGY0YmUyMTlhMWE3NzAxNmRjZDgzODQzMWFlYTAwMDFjZGM4YWU3YTZmYzY4ODcyNjU3OGQ5NzAyODU3YTUiLCAiNDIyNDJhOTY5MjgzYTVmMzM5YmE3ZjA3NWUzNmJhMmFmOTI1Y2UzMGQ3NjdlZDZlNTVmNGIwMzE4ODBkNTYyYyJdLCBbImE1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUiLCAiMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YiJdLCBbImM0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTciLCAiNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzIl0sIFsiODQxZDYwNjNhNTg2ZmE0NzVhNzI0NjA0ZGEwM2JjNWI5MmEyZTBkMmUwYTM2YWNmZTRjNzNhNTUxNDc0Mjg4MSIsICI3Mzg2N2Y1OWMwNjU5ZTgxOTA0ZjlhMWM3NTQzNjk4ZTYyNTYyZDY3NDRjMTY5Y2U3YTM2ZGUwMWE4ZDYxNTQiXSwgWyI1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1IiwgIjM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUiXSwgWyIzNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2IiwgImQyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMiXSwgWyIzMzY1ODFlYTdiZmJiYjI5MGMxOTFhMmY1MDdhNDFjZjU2NDM4NDIxNzBlOTE0ZmFlYWIyN2MyYzU3OWY3MjYiLCAiZWFkMTIxNjg1OTVmZTFiZTk5MjUyMTI5YjZlNTZiMzM5MWY3YWIxNDEwY2QxZTBlZjNkY2RjYWJkMmZkYTIyNCJdLCBbIjhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUiLCAiNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZSJdLCBbIjFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQiLCAiNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2Il0sIFsiODViN2MxZGNiM2NlYzFiN2VlN2YzMGRlZDc5ZGQyMGEwZWQxZjRjYzE4Y2JjZmNmYTQxMDM2MWZkOGYwOGYzMSIsICIzZDk4YTljZGQwMjZkZDQzZjM5MDQ4ZjI1YTg4NDdmNGZjYWZhZDE4OTVkN2E2MzNjNmZlZDNjMzVlOTk5NTExIl0sIFsiMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MSIsICJiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGIiXSwgWyJhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyIiwgImFlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjIiXSwgWyI0ZThjZWFmYjliM2U5YTEzNmRjN2ZmNjdlODQwMjk1YjQ5OWRmYjNiMjEzM2U0YmExMTNmMmU0YzBlMTIxZTUiLCAiY2YyMTc0MTE4YzhiNmQ3YTRiNDhmNmQ1MzRjZTVjNzk0MjJjMDg2YTYzNDYwNTAyYjgyN2NlNjJhMzI2NjgzYyJdLCBbImQyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2IiLCAiNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMyJdLCBbImVhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQiLCAiMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCJdLCBbImFmOGFkZGJmMmI2NjFjOGE2YzYzMjg2NTVlYjk2NjUxMjUyMDA3ZDhjNWVhMzFiZTRhZDE5NmRlOGNlMjEzMWYiLCAiNjc0OWU2N2MwMjliODVmNTJhMDM0ZWFmZDA5NjgzNmIyNTIwODE4NjgwZTI2YWM4ZjNkZmJjZGI3MTc0OTcwMCJdLCBbImUzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5IiwgIjJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQiXSwgWyI1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2IiwgImIwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYiXSwgWyIxMTM5NmQ1NWZkYTU0YzQ5ZjE5YWE5NzMxOGQ4ZGE2MWZhODU4NGU0N2IwODQ5NDUwNzdjZjAzMjU1YjUyOTg0IiwgIjk5OGM3NGE4Y2Q0NWFjMDEyODlkNTgzM2E3YmViNDc0NGZmNTM2YjAxYjI1N2JlNGM1NzY3YmVhOTNlYTU3YTQiXSwgWyIzYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhIiwgImIyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTciXSwgWyJjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwIiwgImJkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMiXSwgWyJjNTMzZTRmN2VhODU1NWFhY2Q5Nzc3YWM1Y2FkMjliOTdkZDRkZWZjY2M1M2VlN2VhMjA0MTE5YjI4ODliMTk3IiwgIjZmMGEyNTZiYzVlZmRmNDI5YTJmYjYyNDJmMWE0M2EyZDliOTI1YmI0YTRiM2EyNmJiOGUwZjQ1ZWI1OTYwOTYiXSwgWyJjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMiLCAiYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCJdLCBbImE2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYiLCAiMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmIl0sIFsiMzQ3ZDZkOWEwMmM0ODkyN2ViZmI4NmMxMzU5YjFjYWYxMzBhM2MwMjY3ZDExY2U2MzQ0YjM5Zjk5ZDQzY2MzOCIsICI2MGVhN2Y2MWEzNTM1MjRkMWM5ODdmNmVjZWM5MmYwODZkNTY1YWI2ODc4NzBjYjEyNjg5ZmYxZTMxYzc0NDQ4Il0sIFsiZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YSIsICI0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhIl0sIFsiYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMSIsICI1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0Il0sIFsiNGU0MmM4ZWM4MmM5OTc5OGNjZjNhNjEwYmU4NzBlNzgzMzhjN2Y3MTMzNDhiZDM0YzgyMDNlZjQwMzdmMzUwMiIsICI3NTcxZDc0ZWU1ZTBmYjkyYTdhOGIzM2EwNzc4MzM0MWE1NDkyMTQ0Y2M1NGJjYzQwYTk0NDczNjkzNjA2NDM3Il0sIFsiMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYSIsICJiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3Il0sIFsiY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNiIsICI4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkIl0sIFsiYjRmOWVhZWEwOWI2OTE3NjE5ZjZlYTZhNGViNTQ2NGVmZGRiNThmZDQ1YjFlYmVmY2RjMWEwMWQwOGI0Nzk4NiIsICIzOWU1Yzk5MjViNWE1NGIwNzQzM2E0ZjE4YzYxNzI2ZjhiYjEzMWMwMTJjYTU0MmViMjRhOGFjMDcyMDA2ODJhIl0sIFsiZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZSIsICI2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0Il0sIFsiNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCIsICIyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3Il0sIFsiZGZlZWVmMTg4MTEwMWYyY2IxMTY0NGYzYTJhZmRmYzIwNDVlMTk5MTkxNTI5MjNmMzY3YTE3NjdjMTFjY2VkYSIsICJlY2ZiNzA1NmNmMWRlMDQyZjk0MjBiYWIzOTY3OTNjMGMzOTBiZGU3NGI0YmJkZmYxNmE4M2FlMDlhOWE3NTE3Il0sIFsiNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OSIsICJjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwIl0sIFsiZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZiIsICJmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1Il0sIFsiZWI5ODY2MGY0YzRkZmFhMDZhMmJlNDUzZDUwMjBiYzk5YTBjMmU2MGFiZTM4ODQ1N2RkNDNmZWZiMWVkNjIwYyIsICI2Y2I5YTg4NzZkOWNiODUyMDYwOWFmM2FkZDI2Y2QyMGEwYTdjZDhhOTQxMTEzMWNlODVmNDQxMDAwOTkyMjNlIl0sIFsiMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MiIsICJmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxIl0sIFsiZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YSIsICIxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyIl0sIFsiYjI2OGY1ZWY5YWQ1MWU0ZDc4ZGUzYTc1MGMyZGM4OWIxZTYyNmQ0MzUwNTg2Nzk5OTkzMmU1ZGIzM2FmM2Q4MCIsICI1ZjMxMGQ0YjNjOTliOWViYjE5Zjc3ZDQxYzFkZWUwMThjZjBkMzRmZDQxOTE2MTQwMDNlOTQ1YTEyMTZlNDIzIl0sIFsiZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCIsICI0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4Il0sIFsiOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMSIsICJjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4Il0sIFsiNTJkYjBiNTM4NGRmYmYwNWJmYTlkNDcyZDdhZTI2ZGZlNGI4NTFjZWNhOTFiMWViYTU0MjYzMTgwZGEzMmI2MyIsICJjM2I5OTdkMDUwZWU1ZDQyM2ViYWY2NmE2ZGI5ZjU3YjMxODBjOTAyODc1Njc5ZGU5MjRiNjlkODRhN2IzNzUiXSwgWyJlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyIiwgIjZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QiXSwgWyI3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzIiwgImNhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMiXSwgWyI1MDk4ZmYxZTFkOWYxNGZiNDZhMjEwZmFkYTZjOTAzZmVmMGZiN2I0YTFkZDFkOWFjNjBhMDM2MTgwMGI3YTAwIiwgIjk3MzExNDFkODFmYzhmODA4NGQzN2M2ZTc1NDIwMDZiM2VlMWI0MGQ2MGRmZTUzNjJhNWIxMzJmZDE3ZGRjMCJdLCBbIjMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgiLCAiZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYyJdLCBbImUyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjciLCAiZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCJdLCBbIjg0Mzg0NDc1NjZkNGQ3YmVkYWRjMjk5NDk2YWIzNTc0MjYwMDlhMzVmMjM1Y2IxNDFiZTBkOTljZDEwYWUzYTgiLCAiYzRlMTAyMDkxNjk4MGE0ZGE1ZDAxYWM1ZTZhZDMzMDczNGVmMGQ3OTA2NjMxYzRmMjM5MDQyNmIyZWRkNzkxZiJdLCBbIjQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UiLCAiNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OSJdLCBbIjNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QiLCAiY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2Il0sIFsiNjc0ZjI2MDBhMzAwN2EwMDU2OGMxYTdjZTA1ZDA4MTZjMWZiODRiZjEzNzA3OThmMWM2OTUzMmZhZWIxYTg2YiIsICIyOTlkMjFmOTQxM2YzM2IzZWRmNDNiMjU3MDA0NTgwYjcwZGI1N2RhMGIxODIyNTllMDllZWNjNjllMGQzOGE1Il0sIFsiZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZiIsICJmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3Il0sIFsiMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNiIsICI0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiIl0sIFsiYmUyMDYyMDAzYzUxY2MzMDA0NjgyOTA0MzMwZTRkZWU3ZjNkY2QxMGIwMWU1ODBiZjE5NzFiMDRkNGNhZDI5NyIsICI2MjE4OGJjNDlkNjFlNTQyODU3M2Q0OGE3NGUxYzY1NWIxYzYxMDkwOTA1NjgyYTBkNTU1OGVkNzJkY2NiOWJjIl0sIFsiOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YSIsICI3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjIl0sIFsiYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYyIsICJhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmIl0sIFsiZDVlOWUxZGE2NDlkOTdkODllNDg2ODExN2E0NjVhM2E0ZjhhMThkZTU3YTE0MGQzNmIzZjJhZjM0MWEyMWI1MiIsICI0Y2IwNDQzN2YzOTFlZDczMTExYTEzY2MxZDRkZDBkYjE2OTM0NjVjMjI0MDQ4MGQ4OTU1ZTg1OTJmMjc0NDdhIl0sIFsiZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYiIsICJiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2Il0sIFsiNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NSIsICJiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmIl0sIFsiNzk4NWZkZmQxMjdjMDU2N2M2ZjUzZWMxYmI2M2VjMzE1OGU1OTdjNDBiZmU3NDdjODNjZGRmYzkxMDY0MTkxNyIsICI2MDNjMTJkYWYzZDk4NjJlZjJiMjVmZTFkZTI4OWFlZDI0ZWQyOTFlMGVjNjcwODcwM2E1YmQ1NjdmMzJlZDAzIl0sIFsiNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOSIsICJjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4Il0sIFsiMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMyIsICI1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4Il0sIFsiOWUyMTU4ZjBkN2MwZDVmMjZjMzc5MWVmZWZhNzk1OTc2NTRlN2EyYjI0NjRmNTJiMWVlNmMxMzQ3NzY5ZWY1NyIsICI3MTJmY2RkMWI5MDUzZjA5MDAzYTM0ODFmYTc3NjJlOWZmZDdjOGVmMzVhMzg1MDllMmZiZjI2MjkwMDgzNzMiXSwgWyIxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2IiwgImVkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMiXSwgWyI3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4IiwgIjk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgiXSwgWyI4MDlhMjBjNjdkNjQ5MDBmZmI2OThjNGM4MjVmNmQ1ZjIzMTBmYjA0NTFjODY5MzQ1YjczMTlmNjQ1NjA1NzIxIiwgIjllOTk0OTgwZDk5MTdlMjJiNzZiMDYxOTI3ZmEwNDE0M2QwOTZjY2M1NDk2M2U2YTVlYmZhNWYzZjhlMjg2YzEiXSwgWyIxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwIiwgIjQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjkiXV0gfSB9OwogIH0pOwogIHQwID0gVDIoKG95KSA9PiB7CiAgICB2YXIgWmwgPSBveSwgUWkgPSBlMCgpLCBqbCA9IFBsKCksIFpSID0gb3IoKSwgZnkgPSBaUi5hc3NlcnQ7CiAgICBmdW5jdGlvbiBheSh0KSB7CiAgICAgIHQudHlwZSA9PT0gInNob3J0IiA/IHRoaXMuY3VydmUgPSBuZXcgamwuc2hvcnQodCkgOiB0LnR5cGUgPT09ICJlZHdhcmRzIiA/IHRoaXMuY3VydmUgPSBuZXcgamwuZWR3YXJkcyh0KSA6IHRoaXMuY3VydmUgPSBuZXcgamwubW9udCh0KSwgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nLCB0aGlzLm4gPSB0aGlzLmN1cnZlLm4sIHRoaXMuaGFzaCA9IHQuaGFzaCwgZnkodGhpcy5nLnZhbGlkYXRlKCksICJJbnZhbGlkIGN1cnZlIiksIGZ5KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICJJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTyIpOwogICAgfQogICAgWmwuUHJlc2V0Q3VydmUgPSBheTsKICAgIGZ1bmN0aW9uIGVuKHQsIGUpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpsLCB0LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgciA9IG5ldyBheShlKTsKICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFpsLCB0LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHIgfSksIHI7CiAgICAgIH0gfSk7CiAgICB9CiAgICBlbigicDE5MiIsIHsgdHlwZTogInNob3J0IiwgcHJpbWU6ICJwMTkyIiwgcDogImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIiwgYTogImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjIiwgYjogIjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxIiwgbjogImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxIiwgaGFzaDogUWkuc2hhMjU2LCBnUmVkOiBmYWxzZSwgZzogWyIxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMiIsICIwNzE5MmI5NSBmZmM4ZGE3OCA2MzEwMTFlZCA2YjI0Y2RkNSA3M2Y5NzdhMSAxZTc5NDgxMSJdIH0pOwogICAgZW4oInAyMjQiLCB7IHR5cGU6ICJzaG9ydCIsIHByaW1lOiAicDIyNCIsIHA6ICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIsIGE6ICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSIsIGI6ICJiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCIsIG46ICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCIsIGhhc2g6IFFpLnNoYTI1NiwgZ1JlZDogZmFsc2UsIGc6IFsiYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjEiLCAiYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQiXSB9KTsKICAgIGVuKCJwMjU2IiwgeyB0eXBlOiAic2hvcnQiLCBwcmltZTogbnVsbCwgcDogImZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIiwgYTogImZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjIiwgYjogIjVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiIiwgbjogImZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxIiwgaGFzaDogUWkuc2hhMjU2LCBnUmVkOiBmYWxzZSwgZzogWyI2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NiIsICI0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNSJdIH0pOwogICAgZW4oInAzODQiLCB7IHR5cGU6ICJzaG9ydCIsIHByaW1lOiBudWxsLCBwOiAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYiLCBhOiAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmMiLCBiOiAiYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYiLCBuOiAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgYzc2MzRkODEgZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMiLCBoYXNoOiBRaS5zaGEzODQsIGdSZWQ6IGZhbHNlLCBnOiBbImFhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4IDU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3IiwgIjM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwIDBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmIl0gfSk7CiAgICBlbigicDUyMSIsIHsgdHlwZTogInNob3J0IiwgcHJpbWU6IG51bGwsIHA6ICIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiIsIGE6ICIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYyIsIGI6ICIwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiA5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMSA1NjE5Mzk1MSBlYzdlOTM3YiAxNjUyYzBiZCAzYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCIsIG46ICIwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCBmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOSIsIGhhc2g6IFFpLnNoYTUxMiwgZ1JlZDogZmFsc2UsIGc6IFsiMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYiLCAiMDAwMDAxMTggMzkyOTZhNzggOWEzYmMwMDQgNWM4YTVmYjQgMmM3ZDFiZDkgOThmNTQ0NDkgNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAiXSB9KTsKICAgIGVuKCJjdXJ2ZTI1NTE5IiwgeyB0eXBlOiAibW9udCIsIHByaW1lOiAicDI1NTE5IiwgcDogIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiLCBhOiAiNzZkMDYiLCBiOiAiMSIsIG46ICIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkIiwgaGFzaDogUWkuc2hhMjU2LCBnUmVkOiBmYWxzZSwgZzogWyI5Il0gfSk7CiAgICBlbigiZWQyNTUxOSIsIHsgdHlwZTogImVkd2FyZHMiLCBwcmltZTogInAyNTUxOSIsIHA6ICI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIiwgYTogIi0xIiwgYzogIjEiLCBkOiAiNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMyIsIG46ICIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkIiwgaGFzaDogUWkuc2hhMjU2LCBnUmVkOiBmYWxzZSwgZzogWyIyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhIiwgIjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NTgiXSB9KTsKICAgIHZhciBWbDsKICAgIHRyeSB7CiAgICAgIFZsID0gbnkoKTsKICAgIH0gY2F0Y2ggewogICAgICBWbCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGVuKCJzZWNwMjU2azEiLCB7IHR5cGU6ICJzaG9ydCIsIHByaW1lOiAiazI1NiIsIHA6ICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIsIGE6ICIwIiwgYjogIjciLCBuOiAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEiLCBoOiAiMSIsIGhhc2g6IFFpLnNoYTI1NiwgYmV0YTogIjdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUiLCBsYW1iZGE6ICI1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyIiwgYmFzaXM6IFt7IGE6ICIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSIsIGI6ICItZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMiIH0sIHsgYTogIjExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCIsIGI6ICIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSIgfV0sIGdSZWQ6IGZhbHNlLCBnOiBbIjc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTgiLCAiNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCIsIFZsXSB9KTsKICB9KTsKICB1eSA9IFQyKChIaywgaHkpID0+IHsKICAgIHZhciBWUiA9IGUwKCksIEZuID0gTmwoKSwgc3kgPSBhcigpOwogICAgZnVuY3Rpb24gdG4odCkgewogICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdG4pKQogICAgICAgIHJldHVybiBuZXcgdG4odCk7CiAgICAgIHRoaXMuaGFzaCA9IHQuaGFzaCwgdGhpcy5wcmVkUmVzaXN0ID0gISF0LnByZWRSZXNpc3QsIHRoaXMub3V0TGVuID0gdGhpcy5oYXNoLm91dFNpemUsIHRoaXMubWluRW50cm9weSA9IHQubWluRW50cm9weSB8fCB0aGlzLmhhc2guaG1hY1N0cmVuZ3RoLCB0aGlzLl9yZXNlZWQgPSBudWxsLCB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbCwgdGhpcy5LID0gbnVsbCwgdGhpcy5WID0gbnVsbDsKICAgICAgdmFyIGUgPSBGbi50b0FycmF5KHQuZW50cm9weSwgdC5lbnRyb3B5RW5jIHx8ICJoZXgiKSwgciA9IEZuLnRvQXJyYXkodC5ub25jZSwgdC5ub25jZUVuYyB8fCAiaGV4IiksIG8gPSBGbi50b0FycmF5KHQucGVycywgdC5wZXJzRW5jIHx8ICJoZXgiKTsKICAgICAgc3koZS5sZW5ndGggPj0gdGhpcy5taW5FbnRyb3B5IC8gOCwgIk5vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogIiArIHRoaXMubWluRW50cm9weSArICIgYml0cyIpLCB0aGlzLl9pbml0KGUsIHIsIG8pOwogICAgfQogICAgaHkuZXhwb3J0cyA9IHRuOwogICAgdG4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICB2YXIgZiA9IGUuY29uY2F0KHIpLmNvbmNhdChvKTsKICAgICAgdGhpcy5LID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCksIHRoaXMuViA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpOwogICAgICBmb3IgKHZhciBwID0gMDtwIDwgdGhpcy5WLmxlbmd0aDsgcCsrKQogICAgICAgIHRoaXMuS1twXSA9IDAsIHRoaXMuVltwXSA9IDE7CiAgICAgIHRoaXMuX3VwZGF0ZShmKSwgdGhpcy5fcmVzZWVkID0gMSwgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IDI4MTQ3NDk3NjcxMDY1NjsKICAgIH07CiAgICB0bi5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG5ldyBWUi5obWFjKHRoaXMuaGFzaCwgdGhpcy5LKTsKICAgIH07CiAgICB0bi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHIgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikudXBkYXRlKFswXSk7CiAgICAgIGUgJiYgKHIgPSByLnVwZGF0ZShlKSksIHRoaXMuSyA9IHIuZGlnZXN0KCksIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSwgZSAmJiAodGhpcy5LID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLnVwZGF0ZShbMV0pLnVwZGF0ZShlKS5kaWdlc3QoKSwgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpKTsKICAgIH07CiAgICB0bi5wcm90b3R5cGUucmVzZWVkID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICB0eXBlb2YgciAhPSAic3RyaW5nIiAmJiAoZiA9IG8sIG8gPSByLCByID0gbnVsbCksIGUgPSBGbi50b0FycmF5KGUsIHIpLCBvID0gRm4udG9BcnJheShvLCBmKSwgc3koZS5sZW5ndGggPj0gdGhpcy5taW5FbnRyb3B5IC8gOCwgIk5vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogIiArIHRoaXMubWluRW50cm9weSArICIgYml0cyIpLCB0aGlzLl91cGRhdGUoZS5jb25jYXQobyB8fCBbXSkpLCB0aGlzLl9yZXNlZWQgPSAxOwogICAgfTsKICAgIHRuLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgaWYgKHRoaXMuX3Jlc2VlZCA+IHRoaXMucmVzZWVkSW50ZXJ2YWwpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZXNlZWQgaXMgcmVxdWlyZWQiKTsKICAgICAgdHlwZW9mIHIgIT0gInN0cmluZyIgJiYgKGYgPSBvLCBvID0gciwgciA9IG51bGwpLCBvICYmIChvID0gRm4udG9BcnJheShvLCBmIHx8ICJoZXgiKSwgdGhpcy5fdXBkYXRlKG8pKTsKICAgICAgZm9yICh2YXIgcCA9IFtdO3AubGVuZ3RoIDwgZTsgKQogICAgICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSwgcCA9IHAuY29uY2F0KHRoaXMuVik7CiAgICAgIHZhciBtMiA9IHAuc2xpY2UoMCwgZSk7CiAgICAgIHJldHVybiB0aGlzLl91cGRhdGUobyksIHRoaXMuX3Jlc2VlZCsrLCBGbi5lbmNvZGUobTIsIHIpOwogICAgfTsKICB9KTsKICBkeSA9IFQyKChXaywgbHkpID0+IHsKICAgIHZhciAkUiA9IHJpKCksIEdSID0gb3IoKSwgJGwgPSBHUi5hc3NlcnQ7CiAgICBmdW5jdGlvbiBHdCh0LCBlKSB7CiAgICAgIHRoaXMuZWMgPSB0LCB0aGlzLnByaXYgPSBudWxsLCB0aGlzLnB1YiA9IG51bGwsIGUucHJpdiAmJiB0aGlzLl9pbXBvcnRQcml2YXRlKGUucHJpdiwgZS5wcml2RW5jKSwgZS5wdWIgJiYgdGhpcy5faW1wb3J0UHVibGljKGUucHViLCBlLnB1YkVuYyk7CiAgICB9CiAgICBseS5leHBvcnRzID0gR3Q7CiAgICBHdC5mcm9tUHVibGljID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gciBpbnN0YW5jZW9mIEd0ID8gciA6IG5ldyBHdChlLCB7IHB1YjogciwgcHViRW5jOiBvIH0pOwogICAgfTsKICAgIEd0LmZyb21Qcml2YXRlID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICByZXR1cm4gciBpbnN0YW5jZW9mIEd0ID8gciA6IG5ldyBHdChlLCB7IHByaXY6IHIsIHByaXZFbmM6IG8gfSk7CiAgICB9OwogICAgR3QucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gdGhpcy5nZXRQdWJsaWMoKTsKICAgICAgcmV0dXJuIGUuaXNJbmZpbml0eSgpID8geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICJJbnZhbGlkIHB1YmxpYyBrZXkiIH0gOiBlLnZhbGlkYXRlKCkgPyBlLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKSA/IHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfSA6IHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAiUHVibGljIGtleSAqIE4gIT0gTyIgfSA6IHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAiUHVibGljIGtleSBpcyBub3QgYSBwb2ludCIgfTsKICAgIH07CiAgICBHdC5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdHlwZW9mIGUgPT0gInN0cmluZyIgJiYgKHIgPSBlLCBlID0gbnVsbCksIHRoaXMucHViIHx8ICh0aGlzLnB1YiA9IHRoaXMuZWMuZy5tdWwodGhpcy5wcml2KSksIHIgPyB0aGlzLnB1Yi5lbmNvZGUociwgZSkgOiB0aGlzLnB1YjsKICAgIH07CiAgICBHdC5wcm90b3R5cGUuZ2V0UHJpdmF0ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgPT09ICJoZXgiID8gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKSA6IHRoaXMucHJpdjsKICAgIH07CiAgICBHdC5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHRoaXMucHJpdiA9IG5ldyAkUihlLCByIHx8IDE2KSwgdGhpcy5wcml2ID0gdGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKTsKICAgIH07CiAgICBHdC5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgaWYgKGUueCB8fCBlLnkpIHsKICAgICAgICB0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICJtb250IiA/ICRsKGUueCwgIk5lZWQgeCBjb29yZGluYXRlIikgOiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAic2hvcnQiIHx8IHRoaXMuZWMuY3VydmUudHlwZSA9PT0gImVkd2FyZHMiKSAmJiAkbChlLnggJiYgZS55LCAiTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZSIpLCB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUucG9pbnQoZS54LCBlLnkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoZSwgcik7CiAgICB9OwogICAgR3QucHJvdG90eXBlLmRlcml2ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUudmFsaWRhdGUoKSB8fCAkbChlLnZhbGlkYXRlKCksICJwdWJsaWMgcG9pbnQgbm90IHZhbGlkYXRlZCIpLCBlLm11bCh0aGlzLnByaXYpLmdldFgoKTsKICAgIH07CiAgICBHdC5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIHRoaXMuZWMuc2lnbihlLCB0aGlzLCByLCBvKTsKICAgIH07CiAgICBHdC5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdGhpcy5lYy52ZXJpZnkoZSwgciwgdGhpcyk7CiAgICB9OwogICAgR3QucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICI8S2V5IHByaXY6ICIgKyAodGhpcy5wcml2ICYmIHRoaXMucHJpdi50b1N0cmluZygxNiwgMikpICsgIiBwdWI6ICIgKyAodGhpcy5wdWIgJiYgdGhpcy5wdWIuaW5zcGVjdCgpKSArICIgPiI7CiAgICB9OwogIH0pOwogIHZ5ID0gVDIoKEtrLCBweSkgPT4gewogICAgdmFyIHIwID0gcmkoKSwgWGwgPSBvcigpLCBZUiA9IFhsLmFzc2VydDsKICAgIGZ1bmN0aW9uIGkwKHQsIGUpIHsKICAgICAgaWYgKHQgaW5zdGFuY2VvZiBpMCkKICAgICAgICByZXR1cm4gdDsKICAgICAgdGhpcy5faW1wb3J0REVSKHQsIGUpIHx8IChZUih0LnIgJiYgdC5zLCAiU2lnbmF0dXJlIHdpdGhvdXQgciBvciBzIiksIHRoaXMuciA9IG5ldyByMCh0LnIsIDE2KSwgdGhpcy5zID0gbmV3IHIwKHQucywgMTYpLCB0LnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZCA/IHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGwgOiB0aGlzLnJlY292ZXJ5UGFyYW0gPSB0LnJlY292ZXJ5UGFyYW0pOwogICAgfQogICAgcHkuZXhwb3J0cyA9IGkwOwogICAgZnVuY3Rpb24gWFIoKSB7CiAgICAgIHRoaXMucGxhY2UgPSAwOwogICAgfQogICAgZnVuY3Rpb24gR2wodCwgZSkgewogICAgICB2YXIgciA9IHRbZS5wbGFjZSsrXTsKICAgICAgaWYgKCEociAmIDEyOCkpCiAgICAgICAgcmV0dXJuIHI7CiAgICAgIHZhciBvID0gciAmIDE1OwogICAgICBpZiAobyA9PT0gMCB8fCBvID4gNCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIGZvciAodmFyIGYgPSAwLCBwID0gMCwgbTIgPSBlLnBsYWNlO3AgPCBvOyBwKyssIG0yKyspCiAgICAgICAgZiA8PD0gOCwgZiB8PSB0W20yXSwgZiA+Pj49IDA7CiAgICAgIHJldHVybiBmIDw9IDEyNyA/IGZhbHNlIDogKGUucGxhY2UgPSBtMiwgZik7CiAgICB9CiAgICBmdW5jdGlvbiBjeSh0KSB7CiAgICAgIGZvciAodmFyIGUgPSAwLCByID0gdC5sZW5ndGggLSAxOyF0W2VdICYmICEodFtlICsgMV0gJiAxMjgpICYmIGUgPCByOyApCiAgICAgICAgZSsrOwogICAgICByZXR1cm4gZSA9PT0gMCA/IHQgOiB0LnNsaWNlKGUpOwogICAgfQogICAgaTAucHJvdG90eXBlLl9pbXBvcnRERVIgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGUgPSBYbC50b0FycmF5KGUsIHIpOwogICAgICB2YXIgbyA9IG5ldyBYUjsKICAgICAgaWYgKGVbby5wbGFjZSsrXSAhPT0gNDgpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgZiA9IEdsKGUsIG8pOwogICAgICBpZiAoZiA9PT0gZmFsc2UgfHwgZiArIG8ucGxhY2UgIT09IGUubGVuZ3RoIHx8IGVbby5wbGFjZSsrXSAhPT0gMikKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHZhciBwID0gR2woZSwgbyk7CiAgICAgIGlmIChwID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHZhciBtMiA9IGUuc2xpY2Uoby5wbGFjZSwgcCArIG8ucGxhY2UpOwogICAgICBpZiAoby5wbGFjZSArPSBwLCBlW28ucGxhY2UrK10gIT09IDIpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgeTMgPSBHbChlLCBvKTsKICAgICAgaWYgKHkzID09PSBmYWxzZSB8fCBlLmxlbmd0aCAhPT0geTMgKyBvLnBsYWNlKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgdmFyIE0gPSBlLnNsaWNlKG8ucGxhY2UsIHkzICsgby5wbGFjZSk7CiAgICAgIGlmIChtMlswXSA9PT0gMCkKICAgICAgICBpZiAobTJbMV0gJiAxMjgpCiAgICAgICAgICBtMiA9IG0yLnNsaWNlKDEpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgaWYgKE1bMF0gPT09IDApCiAgICAgICAgaWYgKE1bMV0gJiAxMjgpCiAgICAgICAgICBNID0gTS5zbGljZSgxKTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0aGlzLnIgPSBuZXcgcjAobTIpLCB0aGlzLnMgPSBuZXcgcjAoTSksIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGwsIHRydWU7CiAgICB9OwogICAgZnVuY3Rpb24gWWwodCwgZSkgewogICAgICBpZiAoZSA8IDEyOCkgewogICAgICAgIHQucHVzaChlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHIgPSAxICsgKE1hdGgubG9nKGUpIC8gTWF0aC5MTjIgPj4+IDMpOwogICAgICBmb3IgKHQucHVzaChyIHwgMTI4KTstLXI7ICkKICAgICAgICB0LnB1c2goZSA+Pj4gKHIgPDwgMykgJiAyNTUpOwogICAgICB0LnB1c2goZSk7CiAgICB9CiAgICBpMC5wcm90b3R5cGUudG9ERVIgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKSwgbyA9IHRoaXMucy50b0FycmF5KCk7CiAgICAgIGZvciAoclswXSAmIDEyOCAmJiAociA9IFswXS5jb25jYXQocikpLCBvWzBdICYgMTI4ICYmIChvID0gWzBdLmNvbmNhdChvKSksIHIgPSBjeShyKSwgbyA9IGN5KG8pOyFvWzBdICYmICEob1sxXSAmIDEyOCk7ICkKICAgICAgICBvID0gby5zbGljZSgxKTsKICAgICAgdmFyIGYgPSBbMl07CiAgICAgIFlsKGYsIHIubGVuZ3RoKSwgZiA9IGYuY29uY2F0KHIpLCBmLnB1c2goMiksIFlsKGYsIG8ubGVuZ3RoKTsKICAgICAgdmFyIHAgPSBmLmNvbmNhdChvKSwgbTIgPSBbNDhdOwogICAgICByZXR1cm4gWWwobTIsIHAubGVuZ3RoKSwgbTIgPSBtMi5jb25jYXQocCksIFhsLmVuY29kZShtMiwgZSk7CiAgICB9OwogIH0pOwogIHl5ID0gVDIoKGprLCBneSkgPT4gewogICAgdmFyIFVuID0gcmkoKSwgYnkgPSB1eSgpLCBKUiA9IG9yKCksIEpsID0gdDAoKSwgUVIgPSBBcygpLCBteSA9IEpSLmFzc2VydCwgUWwgPSBkeSgpLCBuMCA9IHZ5KCk7CiAgICBmdW5jdGlvbiBTcih0KSB7CiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTcikpCiAgICAgICAgcmV0dXJuIG5ldyBTcih0KTsKICAgICAgdHlwZW9mIHQgPT0gInN0cmluZyIgJiYgKG15KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChKbCwgdCksICJVbmtub3duIGN1cnZlICIgKyB0KSwgdCA9IEpsW3RdKSwgdCBpbnN0YW5jZW9mIEpsLlByZXNldEN1cnZlICYmICh0ID0geyBjdXJ2ZTogdCB9KSwgdGhpcy5jdXJ2ZSA9IHQuY3VydmUuY3VydmUsIHRoaXMubiA9IHRoaXMuY3VydmUubiwgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKSwgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nLCB0aGlzLmcgPSB0LmN1cnZlLmcsIHRoaXMuZy5wcmVjb21wdXRlKHQuY3VydmUubi5iaXRMZW5ndGgoKSArIDEpLCB0aGlzLmhhc2ggPSB0Lmhhc2ggfHwgdC5jdXJ2ZS5oYXNoOwogICAgfQogICAgZ3kuZXhwb3J0cyA9IFNyOwogICAgU3IucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBuZXcgUWwodGhpcywgZSk7CiAgICB9OwogICAgU3IucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gUWwuZnJvbVByaXZhdGUodGhpcywgZSwgcik7CiAgICB9OwogICAgU3IucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiBRbC5mcm9tUHVibGljKHRoaXMsIGUsIHIpOwogICAgfTsKICAgIFNyLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24oZSkgewogICAgICBlIHx8IChlID0ge30pOwogICAgICBmb3IgKHZhciByID0gbmV3IGJ5KHsgaGFzaDogdGhpcy5oYXNoLCBwZXJzOiBlLnBlcnMsIHBlcnNFbmM6IGUucGVyc0VuYyB8fCAidXRmOCIsIGVudHJvcHk6IGUuZW50cm9weSB8fCBRUih0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSwgZW50cm9weUVuYzogZS5lbnRyb3B5ICYmIGUuZW50cm9weUVuYyB8fCAidXRmOCIsIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpIH0pLCBvID0gdGhpcy5uLmJ5dGVMZW5ndGgoKSwgZiA9IHRoaXMubi5zdWIobmV3IFVuKDIpKTs7ICkgewogICAgICAgIHZhciBwID0gbmV3IFVuKHIuZ2VuZXJhdGUobykpOwogICAgICAgIGlmICghKHAuY21wKGYpID4gMCkpCiAgICAgICAgICByZXR1cm4gcC5pYWRkbigxKSwgdGhpcy5rZXlGcm9tUHJpdmF0ZShwKTsKICAgICAgfQogICAgfTsKICAgIFNyLnByb3RvdHlwZS5fdHJ1bmNhdGVUb04gPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHZhciBvID0gZS5ieXRlTGVuZ3RoKCkgKiA4IC0gdGhpcy5uLmJpdExlbmd0aCgpOwogICAgICByZXR1cm4gbyA+IDAgJiYgKGUgPSBlLnVzaHJuKG8pKSwgIXIgJiYgZS5jbXAodGhpcy5uKSA+PSAwID8gZS5zdWIodGhpcy5uKSA6IGU7CiAgICB9OwogICAgU3IucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIHR5cGVvZiBvID09ICJvYmplY3QiICYmIChmID0gbywgbyA9IG51bGwpLCBmIHx8IChmID0ge30pLCByID0gdGhpcy5rZXlGcm9tUHJpdmF0ZShyLCBvKSwgZSA9IHRoaXMuX3RydW5jYXRlVG9OKG5ldyBVbihlLCAxNikpOwogICAgICBmb3IgKHZhciBwID0gdGhpcy5uLmJ5dGVMZW5ndGgoKSwgbTIgPSByLmdldFByaXZhdGUoKS50b0FycmF5KCJiZSIsIHApLCB5MyA9IGUudG9BcnJheSgiYmUiLCBwKSwgTSA9IG5ldyBieSh7IGhhc2g6IHRoaXMuaGFzaCwgZW50cm9weTogbTIsIG5vbmNlOiB5MywgcGVyczogZi5wZXJzLCBwZXJzRW5jOiBmLnBlcnNFbmMgfHwgInV0ZjgiIH0pLCB4ID0gdGhpcy5uLnN1YihuZXcgVW4oMSkpLCBTID0gMDs7IFMrKykgewogICAgICAgIHZhciBFMiA9IGYuayA/IGYuayhTKSA6IG5ldyBVbihNLmdlbmVyYXRlKHRoaXMubi5ieXRlTGVuZ3RoKCkpKTsKICAgICAgICBpZiAoRTIgPSB0aGlzLl90cnVuY2F0ZVRvTihFMiwgdHJ1ZSksICEoRTIuY21wbigxKSA8PSAwIHx8IEUyLmNtcCh4KSA+PSAwKSkgewogICAgICAgICAgdmFyIEIgPSB0aGlzLmcubXVsKEUyKTsKICAgICAgICAgIGlmICghQi5pc0luZmluaXR5KCkpIHsKICAgICAgICAgICAgdmFyIHEyID0gQi5nZXRYKCksIEwyID0gcTIudW1vZCh0aGlzLm4pOwogICAgICAgICAgICBpZiAoTDIuY21wbigwKSAhPT0gMCkgewogICAgICAgICAgICAgIHZhciBnZSA9IEUyLmludm0odGhpcy5uKS5tdWwoTDIubXVsKHIuZ2V0UHJpdmF0ZSgpKS5pYWRkKGUpKTsKICAgICAgICAgICAgICBpZiAoZ2UgPSBnZS51bW9kKHRoaXMubiksIGdlLmNtcG4oMCkgIT09IDApIHsKICAgICAgICAgICAgICAgIHZhciBfZSA9IChCLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHwgKHEyLmNtcChMMikgIT09IDAgPyAyIDogMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5jYW5vbmljYWwgJiYgZ2UuY21wKHRoaXMubmgpID4gMCAmJiAoZ2UgPSB0aGlzLm4uc3ViKGdlKSwgX2UgXj0gMSksIG5ldyBuMCh7IHI6IEwyLCBzOiBnZSwgcmVjb3ZlcnlQYXJhbTogX2UgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgU3IucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uKGUsIHIsIG8sIGYpIHsKICAgICAgZSA9IHRoaXMuX3RydW5jYXRlVG9OKG5ldyBVbihlLCAxNikpLCBvID0gdGhpcy5rZXlGcm9tUHVibGljKG8sIGYpLCByID0gbmV3IG4wKHIsICJoZXgiKTsKICAgICAgdmFyIHsgcjogcCwgczogbTIgfSA9IHI7CiAgICAgIGlmIChwLmNtcG4oMSkgPCAwIHx8IHAuY21wKHRoaXMubikgPj0gMCB8fCBtMi5jbXBuKDEpIDwgMCB8fCBtMi5jbXAodGhpcy5uKSA+PSAwKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgdmFyIHkzID0gbTIuaW52bSh0aGlzLm4pLCBNID0geTMubXVsKGUpLnVtb2QodGhpcy5uKSwgeCA9IHkzLm11bChwKS51bW9kKHRoaXMubiksIFM7CiAgICAgIHJldHVybiB0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2sgPyAoUyA9IHRoaXMuZy5qbXVsQWRkKE0sIG8uZ2V0UHVibGljKCksIHgpLCBTLmlzSW5maW5pdHkoKSA/IGZhbHNlIDogUy5lcVhUb1AocCkpIDogKFMgPSB0aGlzLmcubXVsQWRkKE0sIG8uZ2V0UHVibGljKCksIHgpLCBTLmlzSW5maW5pdHkoKSA/IGZhbHNlIDogUy5nZXRYKCkudW1vZCh0aGlzLm4pLmNtcChwKSA9PT0gMCk7CiAgICB9OwogICAgU3IucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbih0LCBlLCByLCBvKSB7CiAgICAgIG15KCgzICYgcikgPT09IHIsICJUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzIiksIGUgPSBuZXcgbjAoZSwgbyk7CiAgICAgIHZhciBmID0gdGhpcy5uLCBwID0gbmV3IFVuKHQpLCBtMiA9IGUuciwgeTMgPSBlLnMsIE0gPSByICYgMSwgeCA9IHIgPj4gMTsKICAgICAgaWYgKG0yLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIHgpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUiKTsKICAgICAgeCA/IG0yID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKG0yLmFkZCh0aGlzLmN1cnZlLm4pLCBNKSA6IG0yID0gdGhpcy5jdXJ2ZS5wb2ludEZyb21YKG0yLCBNKTsKICAgICAgdmFyIFMgPSBlLnIuaW52bShmKSwgRTIgPSBmLnN1YihwKS5tdWwoUykudW1vZChmKSwgQiA9IHkzLm11bChTKS51bW9kKGYpOwogICAgICByZXR1cm4gdGhpcy5nLm11bEFkZChFMiwgbTIsIEIpOwogICAgfTsKICAgIFNyLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24odCwgZSwgciwgbykgewogICAgICBpZiAoZSA9IG5ldyBuMChlLCBvKSwgZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKQogICAgICAgIHJldHVybiBlLnJlY292ZXJ5UGFyYW07CiAgICAgIGZvciAodmFyIGYgPSAwO2YgPCA0OyBmKyspIHsKICAgICAgICB2YXIgcDsKICAgICAgICB0cnkgewogICAgICAgICAgcCA9IHRoaXMucmVjb3ZlclB1YktleSh0LCBlLCBmKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocC5lcShyKSkKICAgICAgICAgIHJldHVybiBmOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGZpbmQgdmFsaWQgcmVjb3ZlcnkgZmFjdG9yIik7CiAgICB9OwogIH0pOwogIHh5ID0gVDIoKFprLCBfeSkgPT4gewogICAgdmFyIHphID0gb3IoKSwgTXkgPSB6YS5hc3NlcnQsIHd5ID0gemEucGFyc2VCeXRlcywgQ2YgPSB6YS5jYWNoZWRQcm9wZXJ0eTsKICAgIGZ1bmN0aW9uIEZ0KHQsIGUpIHsKICAgICAgdGhpcy5lZGRzYSA9IHQsIHRoaXMuX3NlY3JldCA9IHd5KGUuc2VjcmV0KSwgdC5pc1BvaW50KGUucHViKSA/IHRoaXMuX3B1YiA9IGUucHViIDogdGhpcy5fcHViQnl0ZXMgPSB3eShlLnB1Yik7CiAgICB9CiAgICBGdC5mcm9tUHVibGljID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gciBpbnN0YW5jZW9mIEZ0ID8gciA6IG5ldyBGdChlLCB7IHB1YjogciB9KTsKICAgIH07CiAgICBGdC5mcm9tU2VjcmV0ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gciBpbnN0YW5jZW9mIEZ0ID8gciA6IG5ldyBGdChlLCB7IHNlY3JldDogciB9KTsKICAgIH07CiAgICBGdC5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9zZWNyZXQ7CiAgICB9OwogICAgQ2YoRnQsICJwdWJCeXRlcyIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLnB1YigpKTsKICAgIH0pOwogICAgQ2YoRnQsICJwdWIiLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX3B1YkJ5dGVzID8gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcykgOiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTsKICAgIH0pOwogICAgQ2YoRnQsICJwcml2Qnl0ZXMiLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUgPSB0aGlzLmVkZHNhLCByID0gdGhpcy5oYXNoKCksIG8gPSBlLmVuY29kaW5nTGVuZ3RoIC0gMSwgZiA9IHIuc2xpY2UoMCwgZS5lbmNvZGluZ0xlbmd0aCk7CiAgICAgIHJldHVybiBmWzBdICY9IDI0OCwgZltvXSAmPSAxMjcsIGZbb10gfD0gNjQsIGY7CiAgICB9KTsKICAgIENmKEZ0LCAicHJpdiIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSk7CiAgICB9KTsKICAgIENmKEZ0LCAiaGFzaCIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpOwogICAgfSk7CiAgICBDZihGdCwgIm1lc3NhZ2VQcmVmaXgiLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpOwogICAgfSk7CiAgICBGdC5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIE15KHRoaXMuX3NlY3JldCwgIktleVBhaXIgY2FuIG9ubHkgdmVyaWZ5IiksIHRoaXMuZWRkc2Euc2lnbihlLCB0aGlzKTsKICAgIH07CiAgICBGdC5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS52ZXJpZnkoZSwgciwgdGhpcyk7CiAgICB9OwogICAgRnQucHJvdG90eXBlLmdldFNlY3JldCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIE15KHRoaXMuX3NlY3JldCwgIktleVBhaXIgaXMgcHVibGljIG9ubHkiKSwgemEuZW5jb2RlKHRoaXMuc2VjcmV0KCksIGUpOwogICAgfTsKICAgIEZ0LnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB6YS5lbmNvZGUodGhpcy5wdWJCeXRlcygpLCBlKTsKICAgIH07CiAgICBfeS5leHBvcnRzID0gRnQ7CiAgfSk7CiAgRXkgPSBUMigoVmssIFN5KSA9PiB7CiAgICB2YXIgZUIgPSByaSgpLCBmMCA9IG9yKCksIHRCID0gZjAuYXNzZXJ0LCBhMCA9IGYwLmNhY2hlZFByb3BlcnR5LCByQiA9IGYwLnBhcnNlQnl0ZXM7CiAgICBmdW5jdGlvbiB6bih0LCBlKSB7CiAgICAgIHRoaXMuZWRkc2EgPSB0LCB0eXBlb2YgZSAhPSAib2JqZWN0IiAmJiAoZSA9IHJCKGUpKSwgQXJyYXkuaXNBcnJheShlKSAmJiAoZSA9IHsgUjogZS5zbGljZSgwLCB0LmVuY29kaW5nTGVuZ3RoKSwgUzogZS5zbGljZSh0LmVuY29kaW5nTGVuZ3RoKSB9KSwgdEIoZS5SICYmIGUuUywgIlNpZ25hdHVyZSB3aXRob3V0IFIgb3IgUyIpLCB0LmlzUG9pbnQoZS5SKSAmJiAodGhpcy5fUiA9IGUuUiksIGUuUyBpbnN0YW5jZW9mIGVCICYmICh0aGlzLl9TID0gZS5TKSwgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KGUuUikgPyBlLlIgOiBlLlJlbmNvZGVkLCB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoZS5TKSA/IGUuUyA6IGUuU2VuY29kZWQ7CiAgICB9CiAgICBhMCh6biwgIlMiLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMuU2VuY29kZWQoKSk7CiAgICB9KTsKICAgIGEwKHpuLCAiUiIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpOwogICAgfSk7CiAgICBhMCh6biwgIlJlbmNvZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTsKICAgIH0pOwogICAgYTAoem4sICJTZW5jb2RlZCIsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpOwogICAgfSk7CiAgICB6bi5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpOwogICAgfTsKICAgIHpuLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZjAuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAiaGV4IikudG9VcHBlckNhc2UoKTsKICAgIH07CiAgICBTeS5leHBvcnRzID0gem47CiAgfSk7CiAgSXkgPSBUMigoJGssIHF5KSA9PiB7CiAgICB2YXIgaUIgPSBlMCgpLCBuQiA9IHQwKCksIE9mID0gb3IoKSwgZkIgPSBPZi5hc3NlcnQsIFJ5ID0gT2YucGFyc2VCeXRlcywgQnkgPSB4eSgpLCBBeSA9IEV5KCk7CiAgICBmdW5jdGlvbiBucih0KSB7CiAgICAgIGlmIChmQih0ID09PSAiZWQyNTUxOSIsICJvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyIiksICEodGhpcyBpbnN0YW5jZW9mIG5yKSkKICAgICAgICByZXR1cm4gbmV3IG5yKHQpOwogICAgICB0ID0gbkJbdF0uY3VydmUsIHRoaXMuY3VydmUgPSB0LCB0aGlzLmcgPSB0LmcsIHRoaXMuZy5wcmVjb21wdXRlKHQubi5iaXRMZW5ndGgoKSArIDEpLCB0aGlzLnBvaW50Q2xhc3MgPSB0LnBvaW50KCkuY29uc3RydWN0b3IsIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwodC5uLmJpdExlbmd0aCgpIC8gOCksIHRoaXMuaGFzaCA9IGlCLnNoYTUxMjsKICAgIH0KICAgIHF5LmV4cG9ydHMgPSBucjsKICAgIG5yLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24oZSwgcikgewogICAgICBlID0gUnkoZSk7CiAgICAgIHZhciBvID0gdGhpcy5rZXlGcm9tU2VjcmV0KHIpLCBmID0gdGhpcy5oYXNoSW50KG8ubWVzc2FnZVByZWZpeCgpLCBlKSwgcCA9IHRoaXMuZy5tdWwoZiksIG0yID0gdGhpcy5lbmNvZGVQb2ludChwKSwgeTMgPSB0aGlzLmhhc2hJbnQobTIsIG8ucHViQnl0ZXMoKSwgZSkubXVsKG8ucHJpdigpKSwgTSA9IGYuYWRkKHkzKS51bW9kKHRoaXMuY3VydmUubik7CiAgICAgIHJldHVybiB0aGlzLm1ha2VTaWduYXR1cmUoeyBSOiBwLCBTOiBNLCBSZW5jb2RlZDogbTIgfSk7CiAgICB9OwogICAgbnIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgZSA9IFJ5KGUpLCByID0gdGhpcy5tYWtlU2lnbmF0dXJlKHIpOwogICAgICB2YXIgZiA9IHRoaXMua2V5RnJvbVB1YmxpYyhvKSwgcCA9IHRoaXMuaGFzaEludChyLlJlbmNvZGVkKCksIGYucHViQnl0ZXMoKSwgZSksIG0yID0gdGhpcy5nLm11bChyLlMoKSksIHkzID0gci5SKCkuYWRkKGYucHViKCkubXVsKHApKTsKICAgICAgcmV0dXJuIHkzLmVxKG0yKTsKICAgIH07CiAgICBuci5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBlID0gdGhpcy5oYXNoKCksIHIgPSAwO3IgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspCiAgICAgICAgZS51cGRhdGUoYXJndW1lbnRzW3JdKTsKICAgICAgcmV0dXJuIE9mLmludEZyb21MRShlLmRpZ2VzdCgpKS51bW9kKHRoaXMuY3VydmUubik7CiAgICB9OwogICAgbnIucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBCeS5mcm9tUHVibGljKHRoaXMsIGUpOwogICAgfTsKICAgIG5yLnByb3RvdHlwZS5rZXlGcm9tU2VjcmV0ID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gQnkuZnJvbVNlY3JldCh0aGlzLCBlKTsKICAgIH07CiAgICBuci5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBBeSA/IGUgOiBuZXcgQXkodGhpcywgZSk7CiAgICB9OwogICAgbnIucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgciA9IGUuZ2V0WSgpLnRvQXJyYXkoImxlIiwgdGhpcy5lbmNvZGluZ0xlbmd0aCk7CiAgICAgIHJldHVybiByW3RoaXMuZW5jb2RpbmdMZW5ndGggLSAxXSB8PSBlLmdldFgoKS5pc09kZCgpID8gMTI4IDogMCwgcjsKICAgIH07CiAgICBuci5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgIGUgPSBPZi5wYXJzZUJ5dGVzKGUpOwogICAgICB2YXIgciA9IGUubGVuZ3RoIC0gMSwgbyA9IGUuc2xpY2UoMCwgcikuY29uY2F0KGVbcl0gJiAtMTI5KSwgZiA9IChlW3JdICYgMTI4KSAhPT0gMCwgcCA9IE9mLmludEZyb21MRShvKTsKICAgICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWShwLCBmKTsKICAgIH07CiAgICBuci5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZS50b0FycmF5KCJsZSIsIHRoaXMuZW5jb2RpbmdMZW5ndGgpOwogICAgfTsKICAgIG5yLnByb3RvdHlwZS5kZWNvZGVJbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBPZi5pbnRGcm9tTEUoZSk7CiAgICB9OwogICAgbnIucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzOwogICAgfTsKICB9KTsKICBvMCA9IFQyKChUeSkgPT4gewogICAgdmFyIEhuID0gVHk7CiAgICBIbi52ZXJzaW9uID0gczIoKS52ZXJzaW9uOwogICAgSG4udXRpbHMgPSBvcigpOwogICAgSG4ucmFuZCA9IEFzKCk7CiAgICBIbi5jdXJ2ZSA9IFBsKCk7CiAgICBIbi5jdXJ2ZXMgPSB0MCgpOwogICAgSG4uZWMgPSB5eSgpOwogICAgSG4uZWRkc2EgPSBJeSgpOwogIH0pOwogIHRkID0gVDIoKGt5LCBlZCkgPT4gewogICAgKGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgZnVuY3Rpb24gcih2LCBpKSB7CiAgICAgICAgaWYgKCF2KQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkgfHwgIkFzc2VydGlvbiBmYWlsZWQiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvKHYsIGkpIHsKICAgICAgICB2LnN1cGVyXyA9IGk7CiAgICAgICAgdmFyIGEgPSBmdW5jdGlvbigpIHsKICAgICAgICB9OwogICAgICAgIGEucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIHYucHJvdG90eXBlID0gbmV3IGEsIHYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdjsKICAgICAgfQogICAgICBmdW5jdGlvbiBmKHYsIGksIGEpIHsKICAgICAgICBpZiAoZi5pc0JOKHYpKQogICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMud29yZHMgPSBudWxsLCB0aGlzLmxlbmd0aCA9IDAsIHRoaXMucmVkID0gbnVsbCwgdiAhPT0gbnVsbCAmJiAoKGkgPT09ICJsZSIgfHwgaSA9PT0gImJlIikgJiYgKGEgPSBpLCBpID0gMTApLCB0aGlzLl9pbml0KHYgfHwgMCwgaSB8fCAxMCwgYSB8fCAiYmUiKSk7CiAgICAgIH0KICAgICAgdHlwZW9mIHQgPT0gIm9iamVjdCIgPyB0LmV4cG9ydHMgPSBmIDogZS5CTiA9IGYsIGYuQk4gPSBmLCBmLndvcmRTaXplID0gMjY7CiAgICAgIHZhciBwOwogICAgICB0cnkgewogICAgICAgIHR5cGVvZiB3aW5kb3cgPCAidSIgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgPCAidSIgPyBwID0gd2luZG93LkJ1ZmZlciA6IHAgPSBqaSgpLkJ1ZmZlcjsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgICAgZi5pc0JOID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpIGluc3RhbmNlb2YgZiA/IHRydWUgOiBpICE9PSBudWxsICYmIHR5cGVvZiBpID09ICJvYmplY3QiICYmIGkuY29uc3RydWN0b3Iud29yZFNpemUgPT09IGYud29yZFNpemUgJiYgQXJyYXkuaXNBcnJheShpLndvcmRzKTsKICAgICAgfSwgZi5tYXggPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIGkuY21wKGEpID4gMCA/IGkgOiBhOwogICAgICB9LCBmLm1pbiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gaS5jbXAoYSkgPCAwID8gaSA6IGE7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAodHlwZW9mIGkgPT0gIm51bWJlciIpCiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdE51bWJlcihpLCBhLCBoMik7CiAgICAgICAgaWYgKHR5cGVvZiBpID09ICJvYmplY3QiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShpLCBhLCBoMik7CiAgICAgICAgYSA9PT0gImhleCIgJiYgKGEgPSAxNiksIHIoYSA9PT0gKGEgfCAwKSAmJiBhID49IDIgJiYgYSA8PSAzNiksIGkgPSBpLnRvU3RyaW5nKCkucmVwbGFjZSgvXHMrL2csICIiKTsKICAgICAgICB2YXIgcyA9IDA7CiAgICAgICAgaVswXSA9PT0gIi0iICYmIChzKyssIHRoaXMubmVnYXRpdmUgPSAxKSwgcyA8IGkubGVuZ3RoICYmIChhID09PSAxNiA/IHRoaXMuX3BhcnNlSGV4KGksIHMsIGgyKSA6ICh0aGlzLl9wYXJzZUJhc2UoaSwgYSwgcyksIGgyID09PSAibGUiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYSwgaDIpKSk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpIDwgMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDEsIGkgPSAtaSksIGkgPCA2NzEwODg2NCA/ICh0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2M10sIHRoaXMubGVuZ3RoID0gMSkgOiBpIDwgNDUwMzU5OTYyNzM3MDQ5NiA/ICh0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2MywgaSAvIDY3MTA4ODY0ICYgNjcxMDg4NjNdLCB0aGlzLmxlbmd0aCA9IDIpIDogKHIoaSA8IDkwMDcxOTkyNTQ3NDA5OTIpLCB0aGlzLndvcmRzID0gW2kgJiA2NzEwODg2MywgaSAvIDY3MTA4ODY0ICYgNjcxMDg4NjMsIDFdLCB0aGlzLmxlbmd0aCA9IDMpLCBoMiA9PT0gImxlIiAmJiB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGEsIGgyKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIGkubGVuZ3RoID09ICJudW1iZXIiKSwgaS5sZW5ndGggPD0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXM7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoaS5sZW5ndGggLyAzKSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IHRoaXMubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gMDsKICAgICAgICB2YXIgdSwgYywgYjMgPSAwOwogICAgICAgIGlmIChoMiA9PT0gImJlIikKICAgICAgICAgIGZvciAocyA9IGkubGVuZ3RoIC0gMSwgdSA9IDA7cyA+PSAwOyBzIC09IDMpCiAgICAgICAgICAgIGMgPSBpW3NdIHwgaVtzIC0gMV0gPDwgOCB8IGlbcyAtIDJdIDw8IDE2LCB0aGlzLndvcmRzW3VdIHw9IGMgPDwgYjMgJiA2NzEwODg2MywgdGhpcy53b3Jkc1t1ICsgMV0gPSBjID4+PiAyNiAtIGIzICYgNjcxMDg4NjMsIGIzICs9IDI0LCBiMyA+PSAyNiAmJiAoYjMgLT0gMjYsIHUrKyk7CiAgICAgICAgZWxzZSBpZiAoaDIgPT09ICJsZSIpCiAgICAgICAgICBmb3IgKHMgPSAwLCB1ID0gMDtzIDwgaS5sZW5ndGg7IHMgKz0gMykKICAgICAgICAgICAgYyA9IGlbc10gfCBpW3MgKyAxXSA8PCA4IHwgaVtzICsgMl0gPDwgMTYsIHRoaXMud29yZHNbdV0gfD0gYyA8PCBiMyAmIDY3MTA4ODYzLCB0aGlzLndvcmRzW3UgKyAxXSA9IGMgPj4+IDI2IC0gYjMgJiA2NzEwODg2MywgYjMgKz0gMjQsIGIzID49IDI2ICYmIChiMyAtPSAyNiwgdSsrKTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBtMih2LCBpKSB7CiAgICAgICAgdmFyIGEgPSB2LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgcmV0dXJuIGEgPj0gNjUgJiYgYSA8PSA3MCA/IGEgLSA1NSA6IGEgPj0gOTcgJiYgYSA8PSAxMDIgPyBhIC0gODcgOiBhIC0gNDggJiAxNTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5Myh2LCBpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gbTIodiwgYSk7CiAgICAgICAgcmV0dXJuIGEgLSAxID49IGkgJiYgKGgyIHw9IG0yKHYsIGEgLSAxKSA8PCA0KSwgaDI7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuX3BhcnNlSGV4ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgoaS5sZW5ndGggLSBhKSAvIDYpLCB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgdGhpcy5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSAwOwogICAgICAgIHZhciB1ID0gMCwgYyA9IDAsIGIzOwogICAgICAgIGlmIChoMiA9PT0gImJlIikKICAgICAgICAgIGZvciAocyA9IGkubGVuZ3RoIC0gMTtzID49IGE7IHMgLT0gMikKICAgICAgICAgICAgYjMgPSB5MyhpLCBhLCBzKSA8PCB1LCB0aGlzLndvcmRzW2NdIHw9IGIzICYgNjcxMDg4NjMsIHUgPj0gMTggPyAodSAtPSAxOCwgYyArPSAxLCB0aGlzLndvcmRzW2NdIHw9IGIzID4+PiAyNikgOiB1ICs9IDg7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgbCA9IGkubGVuZ3RoIC0gYTsKICAgICAgICAgIGZvciAocyA9IGwgJSAyID09PSAwID8gYSArIDEgOiBhO3MgPCBpLmxlbmd0aDsgcyArPSAyKQogICAgICAgICAgICBiMyA9IHkzKGksIGEsIHMpIDw8IHUsIHRoaXMud29yZHNbY10gfD0gYjMgJiA2NzEwODg2MywgdSA+PSAxOCA/ICh1IC09IDE4LCBjICs9IDEsIHRoaXMud29yZHNbY10gfD0gYjMgPj4+IDI2KSA6IHUgKz0gODsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBNKHYsIGksIGEsIGgyKSB7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSBNYXRoLm1pbih2Lmxlbmd0aCwgYSksIGMgPSBpO2MgPCB1OyBjKyspIHsKICAgICAgICAgIHZhciBiMyA9IHYuY2hhckNvZGVBdChjKSAtIDQ4OwogICAgICAgICAgcyAqPSBoMiwgYjMgPj0gNDkgPyBzICs9IGIzIC0gNDkgKyAxMCA6IGIzID49IDE3ID8gcyArPSBiMyAtIDE3ICsgMTAgOiBzICs9IGIzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB0aGlzLndvcmRzID0gWzBdLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAxO3UgPD0gNjcxMDg4NjM7IHUgKj0gYSkKICAgICAgICAgIHMrKzsKICAgICAgICBzLS0sIHUgPSB1IC8gYSB8IDA7CiAgICAgICAgZm9yICh2YXIgYyA9IGkubGVuZ3RoIC0gaDIsIGIzID0gYyAlIHMsIGwgPSBNYXRoLm1pbihjLCBjIC0gYjMpICsgaDIsIG4gPSAwLCBkID0gaDI7ZCA8IGw7IGQgKz0gcykKICAgICAgICAgIG4gPSBNKGksIGQsIGQgKyBzLCBhKSwgdGhpcy5pbXVsbih1KSwgdGhpcy53b3Jkc1swXSArIG4gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbiA6IHRoaXMuX2lhZGRuKG4pOwogICAgICAgIGlmIChiMyAhPT0gMCkgewogICAgICAgICAgdmFyIHcgPSAxOwogICAgICAgICAgZm9yIChuID0gTShpLCBkLCBpLmxlbmd0aCwgYSksIGQgPSAwO2QgPCBiMzsgZCsrKQogICAgICAgICAgICB3ICo9IGE7CiAgICAgICAgICB0aGlzLmltdWxuKHcpLCB0aGlzLndvcmRzWzBdICsgbiA8IDY3MTA4ODY0ID8gdGhpcy53b3Jkc1swXSArPSBuIDogdGhpcy5faWFkZG4obik7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGg7IGErKykKICAgICAgICAgIGkud29yZHNbYV0gPSB0aGlzLndvcmRzW2FdOwogICAgICAgIGkubGVuZ3RoID0gdGhpcy5sZW5ndGgsIGkubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlLCBpLnJlZCA9IHRoaXMucmVkOwogICAgICB9LCBmLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIHRoaXMuY29weShpKSwgaTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA8IGk7ICkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDA7ICkKICAgICAgICAgIHRoaXMubGVuZ3RoLS07CiAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwICYmICh0aGlzLm5lZ2F0aXZlID0gMCksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMucmVkID8gIjxCTi1SOiAiIDogIjxCTjogIikgKyB0aGlzLnRvU3RyaW5nKDE2KSArICI+IjsKICAgICAgfTsKICAgICAgdmFyIHggPSBbIiIsICIwIiwgIjAwIiwgIjAwMCIsICIwMDAwIiwgIjAwMDAwIiwgIjAwMDAwMCIsICIwMDAwMDAwIiwgIjAwMDAwMDAwIiwgIjAwMDAwMDAwMCIsICIwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sIFMgPSBbMCwgMCwgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LCA4LCA3LCA3LCA3LCA3LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1XSwgRTIgPSBbMCwgMCwgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsIDQzMDQ2NzIxLCAxZTcsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LCAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LCAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3Nl07CiAgICAgIGYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGkgPSBpIHx8IDEwLCBhID0gYSB8IDAgfHwgMTsKICAgICAgICB2YXIgaDI7CiAgICAgICAgaWYgKGkgPT09IDE2IHx8IGkgPT09ICJoZXgiKSB7CiAgICAgICAgICBoMiA9ICIiOwogICAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAwLCBjID0gMDtjIDwgdGhpcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgICB2YXIgYjMgPSB0aGlzLndvcmRzW2NdLCBsID0gKChiMyA8PCBzIHwgdSkgJiAxNjc3NzIxNSkudG9TdHJpbmcoMTYpOwogICAgICAgICAgICB1ID0gYjMgPj4+IDI0IC0gcyAmIDE2Nzc3MjE1LCB1ICE9PSAwIHx8IGMgIT09IHRoaXMubGVuZ3RoIC0gMSA/IGgyID0geFs2IC0gbC5sZW5ndGhdICsgbCArIGgyIDogaDIgPSBsICsgaDIsIHMgKz0gMiwgcyA+PSAyNiAmJiAocyAtPSAyNiwgYy0tKTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodSAhPT0gMCAmJiAoaDIgPSB1LnRvU3RyaW5nKDE2KSArIGgyKTtoMi5sZW5ndGggJSBhICE9PSAwOyApCiAgICAgICAgICAgIGgyID0gIjAiICsgaDI7CiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAoaDIgPSAiLSIgKyBoMiksIGgyOwogICAgICAgIH0KICAgICAgICBpZiAoaSA9PT0gKGkgfCAwKSAmJiBpID49IDIgJiYgaSA8PSAzNikgewogICAgICAgICAgdmFyIG4gPSBTW2ldLCBkID0gRTJbaV07CiAgICAgICAgICBoMiA9ICIiOwogICAgICAgICAgdmFyIHcgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgICBmb3IgKHcubmVnYXRpdmUgPSAwOyF3LmlzWmVybygpOyApIHsKICAgICAgICAgICAgdmFyIGcgPSB3Lm1vZG4oZCkudG9TdHJpbmcoaSk7CiAgICAgICAgICAgIHcgPSB3LmlkaXZuKGQpLCB3LmlzWmVybygpID8gaDIgPSBnICsgaDIgOiBoMiA9IHhbbiAtIGcubGVuZ3RoXSArIGcgKyBoMjsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAodGhpcy5pc1plcm8oKSAmJiAoaDIgPSAiMCIgKyBoMik7aDIubGVuZ3RoICUgYSAhPT0gMDsgKQogICAgICAgICAgICBoMiA9ICIwIiArIGgyOwogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKGgyID0gIi0iICsgaDIpLCBoMjsKICAgICAgICB9CiAgICAgICAgcihmYWxzZSwgIkJhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYiKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IHRoaXMud29yZHNbMF07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAyID8gaSArPSB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAxID8gaSArPSA0NTAzNTk5NjI3MzcwNDk2ICsgdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPiAyICYmIHIoZmFsc2UsICJOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMiKSwgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1pIDogaTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gcih0eXBlb2YgcCA8ICJ1IiksIHRoaXMudG9BcnJheUxpa2UocCwgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSB0aGlzLmJ5dGVMZW5ndGgoKSwgdSA9IGgyIHx8IE1hdGgubWF4KDEsIHMpOwogICAgICAgIHIocyA8PSB1LCAiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCIpLCByKHUgPiAwLCAiUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwIiksIHRoaXMuc3RyaXAoKTsKICAgICAgICB2YXIgYyA9IGEgPT09ICJsZSIsIGIzID0gbmV3IGkodSksIGwsIG4sIGQgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgaWYgKGMpIHsKICAgICAgICAgIGZvciAobiA9IDA7IWQuaXNaZXJvKCk7IG4rKykKICAgICAgICAgICAgbCA9IGQuYW5kbG4oMjU1KSwgZC5pdXNocm4oOCksIGIzW25dID0gbDsKICAgICAgICAgIGZvciAoO24gPCB1OyBuKyspCiAgICAgICAgICAgIGIzW25dID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yIChuID0gMDtuIDwgdSAtIHM7IG4rKykKICAgICAgICAgICAgYjNbbl0gPSAwOwogICAgICAgICAgZm9yIChuID0gMDshZC5pc1plcm8oKTsgbisrKQogICAgICAgICAgICBsID0gZC5hbmRsbigyNTUpLCBkLml1c2hybig4KSwgYjNbdSAtIG4gLSAxXSA9IGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiMzsKICAgICAgfSwgTWF0aC5jbHozMiA/IGYucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMihpKTsKICAgICAgfSA6IGYucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLCBoMiA9IDA7CiAgICAgICAgcmV0dXJuIGEgPj0gNDA5NiAmJiAoaDIgKz0gMTMsIGEgPj4+PSAxMyksIGEgPj0gNjQgJiYgKGgyICs9IDcsIGEgPj4+PSA3KSwgYSA+PSA4ICYmIChoMiArPSA0LCBhID4+Pj0gNCksIGEgPj0gMiAmJiAoaDIgKz0gMiwgYSA+Pj49IDIpLCBoMiArIGE7CiAgICAgIH0sIGYucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaSA9PT0gMCkKICAgICAgICAgIHJldHVybiAyNjsKICAgICAgICB2YXIgYSA9IGksIGgyID0gMDsKICAgICAgICByZXR1cm4gKGEgJiA4MTkxKSA9PT0gMCAmJiAoaDIgKz0gMTMsIGEgPj4+PSAxMyksIChhICYgMTI3KSA9PT0gMCAmJiAoaDIgKz0gNywgYSA+Pj49IDcpLCAoYSAmIDE1KSA9PT0gMCAmJiAoaDIgKz0gNCwgYSA+Pj49IDQpLCAoYSAmIDMpID09PSAwICYmIChoMiArPSAyLCBhID4+Pj0gMiksIChhICYgMSkgPT09IDAgJiYgaDIrKywgaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdLCBhID0gdGhpcy5fY291bnRCaXRzKGkpOwogICAgICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgYTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gQih2KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IG5ldyBBcnJheSh2LmJpdExlbmd0aCgpKSwgYSA9IDA7YSA8IGkubGVuZ3RoOyBhKyspIHsKICAgICAgICAgIHZhciBoMiA9IGEgLyAyNiB8IDAsIHMgPSBhICUgMjY7CiAgICAgICAgICBpW2FdID0gKHYud29yZHNbaDJdICYgMSA8PCBzKSA+Pj4gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gMDthIDwgdGhpcy5sZW5ndGg7IGErKykgewogICAgICAgICAgdmFyIGgyID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1thXSk7CiAgICAgICAgICBpZiAoaSArPSBoMiwgaDIgIT09IDI2KQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5hYnMoKS5pbm90bihpKS5pYWRkbigxKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudGVzdG4oaSAtIDEpID8gdGhpcy5ub3RuKGkpLmlhZGRuKDEpLmluZWcoKSA6IHRoaXMuY2xvbmUoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc1plcm8oKSB8fCAodGhpcy5uZWdhdGl2ZSBePSAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA8IGkubGVuZ3RoOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgIHRoaXMud29yZHNbYV0gPSB0aGlzLndvcmRzW2FdIHwgaS53b3Jkc1thXTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXVvcihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaW9yKGkpIDogaS5jbG9uZSgpLmlvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1b3IoaSkgOiBpLmNsb25lKCkuaXVvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IGEgPSBpIDogYSA9IHRoaXM7CiAgICAgICAgZm9yICh2YXIgaDIgPSAwO2gyIDwgYS5sZW5ndGg7IGgyKyspCiAgICAgICAgICB0aGlzLndvcmRzW2gyXSA9IHRoaXMud29yZHNbaDJdICYgaS53b3Jkc1toMl07CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gYS5sZW5ndGgsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdWFuZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhbmQoaSkgOiBpLmNsb25lKCkuaWFuZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdWFuZChpKSA6IGkuY2xvbmUoKS5pdWFuZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEsIGgyOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyAoYSA9IHRoaXMsIGgyID0gaSkgOiAoYSA9IGksIGgyID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGgyLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IGEud29yZHNbc10gXiBoMi53b3Jkc1tzXTsKICAgICAgICBpZiAodGhpcyAhPT0gYSkKICAgICAgICAgIGZvciAoO3MgPCBhLmxlbmd0aDsgcysrKQogICAgICAgICAgICB0aGlzLndvcmRzW3NdID0gYS53b3Jkc1tzXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBhLmxlbmd0aCwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1eG9yKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXhvcihpKSA6IGkuY2xvbmUoKS5peG9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1eG9yKGkpIDogaS5jbG9uZSgpLml1eG9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBNYXRoLmNlaWwoaSAvIDI2KSB8IDAsIGgyID0gaSAlIDI2OwogICAgICAgIHRoaXMuX2V4cGFuZChhKSwgaDIgPiAwICYmIGEtLTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgYTsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IH50aGlzLndvcmRzW3NdICYgNjcxMDg4NjM7CiAgICAgICAgcmV0dXJuIGgyID4gMCAmJiAodGhpcy53b3Jkc1tzXSA9IH50aGlzLndvcmRzW3NdICYgNjcxMDg4NjMgPj4gMjYgLSBoMiksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgaDIgPSBpIC8gMjYgfCAwLCBzID0gaSAlIDI2OwogICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoaDIgKyAxKSwgYSA/IHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gfCAxIDw8IHMgOiB0aGlzLndvcmRzW2gyXSA9IHRoaXMud29yZHNbaDJdICYgfigxIDw8IHMpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuaXN1YihpKSwgdGhpcy5uZWdhdGl2ZSBePSAxLCB0aGlzLl9ub3JtU2lnbigpOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLmlzdWIoaSksIGkubmVnYXRpdmUgPSAxLCBhLl9ub3JtU2lnbigpOwogICAgICAgIHZhciBoMiwgczsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gKGgyID0gdGhpcywgcyA9IGkpIDogKGgyID0gaSwgcyA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIHUgPSAwLCBjID0gMDtjIDwgcy5sZW5ndGg7IGMrKykKICAgICAgICAgIGEgPSAoaDIud29yZHNbY10gfCAwKSArIChzLndvcmRzW2NdIHwgMCkgKyB1LCB0aGlzLndvcmRzW2NdID0gYSAmIDY3MTA4ODYzLCB1ID0gYSA+Pj4gMjY7CiAgICAgICAgZm9yICg7dSAhPT0gMCAmJiBjIDwgaDIubGVuZ3RoOyBjKyspCiAgICAgICAgICBhID0gKGgyLndvcmRzW2NdIHwgMCkgKyB1LCB0aGlzLndvcmRzW2NdID0gYSAmIDY3MTA4ODYzLCB1ID0gYSA+Pj4gMjY7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID0gaDIubGVuZ3RoLCB1ICE9PSAwKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSB1LCB0aGlzLmxlbmd0aCsrOwogICAgICAgIGVsc2UgaWYgKGgyICE9PSB0aGlzKQogICAgICAgICAgZm9yICg7YyA8IGgyLmxlbmd0aDsgYysrKQogICAgICAgICAgICB0aGlzLndvcmRzW2NdID0gaDIud29yZHNbY107CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwID8gKGkubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5zdWIoaSksIGkubmVnYXRpdmUgXj0gMSwgYSkgOiBpLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDAgPyAodGhpcy5uZWdhdGl2ZSA9IDAsIGEgPSBpLnN1Yih0aGlzKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIGEpIDogdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pYWRkKGkpIDogaS5jbG9uZSgpLmlhZGQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkubmVnYXRpdmUgIT09IDApIHsKICAgICAgICAgIGkubmVnYXRpdmUgPSAwOwogICAgICAgICAgdmFyIGEgPSB0aGlzLmlhZGQoaSk7CiAgICAgICAgICByZXR1cm4gaS5uZWdhdGl2ZSA9IDEsIGEuX25vcm1TaWduKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGQoaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLl9ub3JtU2lnbigpOwogICAgICAgIHZhciBoMiA9IHRoaXMuY21wKGkpOwogICAgICAgIGlmIChoMiA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5sZW5ndGggPSAxLCB0aGlzLndvcmRzWzBdID0gMCwgdGhpczsKICAgICAgICB2YXIgcywgdTsKICAgICAgICBoMiA+IDAgPyAocyA9IHRoaXMsIHUgPSBpKSA6IChzID0gaSwgdSA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIGMgPSAwLCBiMyA9IDA7YjMgPCB1Lmxlbmd0aDsgYjMrKykKICAgICAgICAgIGEgPSAocy53b3Jkc1tiM10gfCAwKSAtICh1LndvcmRzW2IzXSB8IDApICsgYywgYyA9IGEgPj4gMjYsIHRoaXMud29yZHNbYjNdID0gYSAmIDY3MTA4ODYzOwogICAgICAgIGZvciAoO2MgIT09IDAgJiYgYjMgPCBzLmxlbmd0aDsgYjMrKykKICAgICAgICAgIGEgPSAocy53b3Jkc1tiM10gfCAwKSArIGMsIGMgPSBhID4+IDI2LCB0aGlzLndvcmRzW2IzXSA9IGEgJiA2NzEwODg2MzsKICAgICAgICBpZiAoYyA9PT0gMCAmJiBiMyA8IHMubGVuZ3RoICYmIHMgIT09IHRoaXMpCiAgICAgICAgICBmb3IgKDtiMyA8IHMubGVuZ3RoOyBiMysrKQogICAgICAgICAgICB0aGlzLndvcmRzW2IzXSA9IHMud29yZHNbYjNdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBiMyksIHMgIT09IHRoaXMgJiYgKHRoaXMubmVnYXRpdmUgPSAxKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKGkpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBxMih2LCBpLCBhKSB7CiAgICAgICAgYS5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiB2Lm5lZ2F0aXZlOwogICAgICAgIHZhciBoMiA9IHYubGVuZ3RoICsgaS5sZW5ndGggfCAwOwogICAgICAgIGEubGVuZ3RoID0gaDIsIGgyID0gaDIgLSAxIHwgMDsKICAgICAgICB2YXIgcyA9IHYud29yZHNbMF0gfCAwLCB1ID0gaS53b3Jkc1swXSB8IDAsIGMgPSBzICogdSwgYjMgPSBjICYgNjcxMDg4NjMsIGwgPSBjIC8gNjcxMDg4NjQgfCAwOwogICAgICAgIGEud29yZHNbMF0gPSBiMzsKICAgICAgICBmb3IgKHZhciBuID0gMTtuIDwgaDI7IG4rKykgewogICAgICAgICAgZm9yICh2YXIgZCA9IGwgPj4+IDI2LCB3ID0gbCAmIDY3MTA4ODYzLCBnID0gTWF0aC5taW4obiwgaS5sZW5ndGggLSAxKSwgXzMgPSBNYXRoLm1heCgwLCBuIC0gdi5sZW5ndGggKyAxKTtfMyA8PSBnOyBfMysrKSB7CiAgICAgICAgICAgIHZhciBBMiA9IG4gLSBfMyB8IDA7CiAgICAgICAgICAgIHMgPSB2LndvcmRzW0EyXSB8IDAsIHUgPSBpLndvcmRzW18zXSB8IDAsIGMgPSBzICogdSArIHcsIGQgKz0gYyAvIDY3MTA4ODY0IHwgMCwgdyA9IGMgJiA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIGEud29yZHNbbl0gPSB3IHwgMCwgbCA9IGQgfCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbCAhPT0gMCA/IGEud29yZHNbbl0gPSBsIHwgMCA6IGEubGVuZ3RoLS0sIGEuc3RyaXAoKTsKICAgICAgfQogICAgICB2YXIgTDIgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gaS53b3JkcywgdSA9IGEud29yZHMsIGMgPSBoMi53b3JkcywgYjMgPSAwLCBsLCBuLCBkLCB3ID0gc1swXSB8IDAsIGcgPSB3ICYgODE5MSwgXzMgPSB3ID4+PiAxMywgQTIgPSBzWzFdIHwgMCwgUjIgPSBBMiAmIDgxOTEsIEkgPSBBMiA+Pj4gMTMsIE1lID0gc1syXSB8IDAsIGsgPSBNZSAmIDgxOTEsIEQyID0gTWUgPj4+IDEzLCBudCA9IHNbM10gfCAwLCBDMiA9IG50ICYgODE5MSwgTyA9IG50ID4+PiAxMywgdnQgPSBzWzRdIHwgMCwgRiA9IHZ0ICYgODE5MSwgVSA9IHZ0ID4+PiAxMywgYnQgPSBzWzVdIHwgMCwgejIgPSBidCAmIDgxOTEsIEggPSBidCA+Pj4gMTMsIG10ID0gc1s2XSB8IDAsIFcgPSBtdCAmIDgxOTEsIEsgPSBtdCA+Pj4gMTMsIGd0ID0gc1s3XSB8IDAsIGogPSBndCAmIDgxOTEsIFogPSBndCA+Pj4gMTMsIHl0ID0gc1s4XSB8IDAsIFYgPSB5dCAmIDgxOTEsICQgPSB5dCA+Pj4gMTMsIHd0ID0gc1s5XSB8IDAsIEcgPSB3dCAmIDgxOTEsIFkgPSB3dCA+Pj4gMTMsIE10ID0gdVswXSB8IDAsIFggPSBNdCAmIDgxOTEsIEogPSBNdCA+Pj4gMTMsIF90ID0gdVsxXSB8IDAsIFEgPSBfdCAmIDgxOTEsIGVlID0gX3QgPj4+IDEzLCB4dCA9IHVbMl0gfCAwLCB0ZSA9IHh0ICYgODE5MSwgcmUgPSB4dCA+Pj4gMTMsIFN0ID0gdVszXSB8IDAsIGllID0gU3QgJiA4MTkxLCBuZSA9IFN0ID4+PiAxMywgRXQgPSB1WzRdIHwgMCwgZmUgPSBFdCAmIDgxOTEsIGFlID0gRXQgPj4+IDEzLCBBdCA9IHVbNV0gfCAwLCBvZSA9IEF0ICYgODE5MSwgc2UgPSBBdCA+Pj4gMTMsIFJ0ID0gdVs2XSB8IDAsIGhlID0gUnQgJiA4MTkxLCB1ZSA9IFJ0ID4+PiAxMywgQnQgPSB1WzddIHwgMCwgbGUgPSBCdCAmIDgxOTEsIGRlID0gQnQgPj4+IDEzLCBxdCA9IHVbOF0gfCAwLCBjZSA9IHF0ICYgODE5MSwgcGUgPSBxdCA+Pj4gMTMsIEl0ID0gdVs5XSB8IDAsIHZlID0gSXQgJiA4MTkxLCBiZSA9IEl0ID4+PiAxMzsKICAgICAgICBoMi5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiBhLm5lZ2F0aXZlLCBoMi5sZW5ndGggPSAxOSwgbCA9IE1hdGguaW11bChnLCBYKSwgbiA9IE1hdGguaW11bChnLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIFgpIHwgMCwgZCA9IE1hdGguaW11bChfMywgSik7CiAgICAgICAgdmFyIGZ0ID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGZ0ID4+PiAyNikgfCAwLCBmdCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChSMiwgWCksIG4gPSBNYXRoLmltdWwoUjIsIEopLCBuID0gbiArIE1hdGguaW11bChJLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKGcsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzMsIGVlKSB8IDA7CiAgICAgICAgdmFyIEJlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEJlID4+PiAyNikgfCAwLCBCZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChrLCBYKSwgbiA9IE1hdGguaW11bChrLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIFgpIHwgMCwgZCA9IE1hdGguaW11bChEMiwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF8zLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfMywgcmUpIHwgMDsKICAgICAgICB2YXIgcWUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAocWUgPj4+IDI2KSB8IDAsIHFlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEMyLCBYKSwgbiA9IE1hdGguaW11bChDMiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKE8sIFgpIHwgMCwgZCA9IE1hdGguaW11bChPLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoaywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfMywgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzMsIG5lKSB8IDA7CiAgICAgICAgdmFyIHplID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHplID4+PiAyNikgfCAwLCB6ZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChGLCBYKSwgbiA9IE1hdGguaW11bChGLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoVSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFUsIEopLCBsID0gbCArIE1hdGguaW11bChDMiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCBhZSkgfCAwOwogICAgICAgIHZhciBIZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChIZSA+Pj4gMjYpIHwgMCwgSGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoejIsIFgpLCBuID0gTWF0aC5pbXVsKHoyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSCwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEgsIEopLCBsID0gbCArIE1hdGguaW11bChGLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCBzZSkgfCAwOwogICAgICAgIHZhciBXZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChXZSA+Pj4gMjYpIHwgMCwgV2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoVywgWCksIG4gPSBNYXRoLmltdWwoVywgSiksIG4gPSBuICsgTWF0aC5pbXVsKEssIFgpIHwgMCwgZCA9IE1hdGguaW11bChLLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoejIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCB1ZSkgfCAwOwogICAgICAgIHZhciBLZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChLZSA+Pj4gMjYpIHwgMCwgS2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoaiwgWCksIG4gPSBNYXRoLmltdWwoaiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKFosIFgpIHwgMCwgZCA9IE1hdGguaW11bChaLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoVywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCBkZSkgfCAwOwogICAgICAgIHZhciBqZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChqZSA+Pj4gMjYpIHwgMCwgamUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoViwgWCksIG4gPSBNYXRoLmltdWwoViwgSiksIG4gPSBuICsgTWF0aC5pbXVsKCQsIFgpIHwgMCwgZCA9IE1hdGguaW11bCgkLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoaiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCBwZSkgfCAwOwogICAgICAgIHZhciBaZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChaZSA+Pj4gMjYpIHwgMCwgWmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgWCksIG4gPSBNYXRoLmltdWwoRywgSiksIG4gPSBuICsgTWF0aC5pbXVsKFksIFgpIHwgMCwgZCA9IE1hdGguaW11bChZLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzMsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF8zLCBiZSkgfCAwOwogICAgICAgIHZhciBWZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChWZSA+Pj4gMjYpIHwgMCwgVmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgUSksIG4gPSBNYXRoLmltdWwoRywgZWUpLCBuID0gbiArIE1hdGguaW11bChZLCBRKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgZWUpLCBsID0gbCArIE1hdGguaW11bChWLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6Miwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGJlKSB8IDA7CiAgICAgICAgdmFyICRlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKCRlID4+PiAyNikgfCAwLCAkZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCB0ZSksIG4gPSBNYXRoLmltdWwoRywgcmUpLCBuID0gbiArIE1hdGguaW11bChZLCB0ZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHJlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgYmUpIHwgMDsKICAgICAgICB2YXIgR2UgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoR2UgPj4+IDI2KSB8IDAsIEdlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGllKSwgbiA9IE1hdGguaW11bChHLCBuZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGllKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgbmUpLCBsID0gbCArIE1hdGguaW11bChWLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgYmUpIHwgMDsKICAgICAgICB2YXIgWWUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWWUgPj4+IDI2KSB8IDAsIFllICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGZlKSwgbiA9IE1hdGguaW11bChHLCBhZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGZlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgYWUpLCBsID0gbCArIE1hdGguaW11bChWLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGJlKSB8IDA7CiAgICAgICAgdmFyIFhlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFhlID4+PiAyNikgfCAwLCBYZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBvZSksIG4gPSBNYXRoLmltdWwoRywgc2UpLCBuID0gbiArIE1hdGguaW11bChZLCBvZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHNlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBiZSkgfCAwOwogICAgICAgIHZhciBKZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChKZSA+Pj4gMjYpIHwgMCwgSmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgaGUpLCBuID0gTWF0aC5pbXVsKEcsIHVlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgaGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCB1ZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGJlKSB8IDA7CiAgICAgICAgdmFyIFFlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFFlID4+PiAyNikgfCAwLCBRZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBsZSksIG4gPSBNYXRoLmltdWwoRywgZGUpLCBuID0gbiArIE1hdGguaW11bChZLCBsZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGRlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgYmUpIHwgMDsKICAgICAgICB2YXIgZXQgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoZXQgPj4+IDI2KSB8IDAsIGV0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGNlKSwgbiA9IE1hdGguaW11bChHLCBwZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGNlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgcGUpLCBsID0gbCArIE1hdGguaW11bChWLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBiZSkgfCAwOwogICAgICAgIHZhciB0dCA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArICh0dCA+Pj4gMjYpIHwgMCwgdHQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgdmUpLCBuID0gTWF0aC5pbXVsKEcsIGJlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgdmUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBiZSk7CiAgICAgICAgdmFyIHJ0ID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICByZXR1cm4gYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChydCA+Pj4gMjYpIHwgMCwgcnQgJj0gNjcxMDg4NjMsIGNbMF0gPSBmdCwgY1sxXSA9IEJlLCBjWzJdID0gcWUsIGNbM10gPSB6ZSwgY1s0XSA9IEhlLCBjWzVdID0gV2UsIGNbNl0gPSBLZSwgY1s3XSA9IGplLCBjWzhdID0gWmUsIGNbOV0gPSBWZSwgY1sxMF0gPSAkZSwgY1sxMV0gPSBHZSwgY1sxMl0gPSBZZSwgY1sxM10gPSBYZSwgY1sxNF0gPSBKZSwgY1sxNV0gPSBRZSwgY1sxNl0gPSBldCwgY1sxN10gPSB0dCwgY1sxOF0gPSBydCwgYjMgIT09IDAgJiYgKGNbMTldID0gYjMsIGgyLmxlbmd0aCsrKSwgaDI7CiAgICAgIH07CiAgICAgIE1hdGguaW11bCB8fCAoTDIgPSBxMik7CiAgICAgIGZ1bmN0aW9uIGdlKHYsIGksIGEpIHsKICAgICAgICBhLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIHYubmVnYXRpdmUsIGEubGVuZ3RoID0gdi5sZW5ndGggKyBpLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBoMiA9IDAsIHMgPSAwLCB1ID0gMDt1IDwgYS5sZW5ndGggLSAxOyB1KyspIHsKICAgICAgICAgIHZhciBjID0gczsKICAgICAgICAgIHMgPSAwOwogICAgICAgICAgZm9yICh2YXIgYjMgPSBoMiAmIDY3MTA4ODYzLCBsID0gTWF0aC5taW4odSwgaS5sZW5ndGggLSAxKSwgbiA9IE1hdGgubWF4KDAsIHUgLSB2Lmxlbmd0aCArIDEpO24gPD0gbDsgbisrKSB7CiAgICAgICAgICAgIHZhciBkID0gdSAtIG4sIHcgPSB2LndvcmRzW2RdIHwgMCwgZyA9IGkud29yZHNbbl0gfCAwLCBfMyA9IHcgKiBnLCBBMiA9IF8zICYgNjcxMDg4NjM7CiAgICAgICAgICAgIGMgPSBjICsgKF8zIC8gNjcxMDg4NjQgfCAwKSB8IDAsIEEyID0gQTIgKyBiMyB8IDAsIGIzID0gQTIgJiA2NzEwODg2MywgYyA9IGMgKyAoQTIgPj4+IDI2KSB8IDAsIHMgKz0gYyA+Pj4gMjYsIGMgJj0gNjcxMDg4NjM7CiAgICAgICAgICB9CiAgICAgICAgICBhLndvcmRzW3VdID0gYjMsIGgyID0gYywgYyA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoMiAhPT0gMCA/IGEud29yZHNbdV0gPSBoMiA6IGEubGVuZ3RoLS0sIGEuc3RyaXAoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBfZSh2LCBpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gbmV3IE47CiAgICAgICAgcmV0dXJuIGgyLm11bHAodiwgaSwgYSk7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyLCBzID0gdGhpcy5sZW5ndGggKyBpLmxlbmd0aDsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEwICYmIGkubGVuZ3RoID09PSAxMCA/IGgyID0gTDIodGhpcywgaSwgYSkgOiBzIDwgNjMgPyBoMiA9IHEyKHRoaXMsIGksIGEpIDogcyA8IDEwMjQgPyBoMiA9IGdlKHRoaXMsIGksIGEpIDogaDIgPSBfZSh0aGlzLCBpLCBhKSwgaDI7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIE4odiwgaSkgewogICAgICAgIHRoaXMueCA9IHYsIHRoaXMueSA9IGk7CiAgICAgIH0KICAgICAgTi5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gbmV3IEFycmF5KGkpLCBoMiA9IGYucHJvdG90eXBlLl9jb3VudEJpdHMoaSkgLSAxLCBzID0gMDtzIDwgaTsgcysrKQogICAgICAgICAgYVtzXSA9IHRoaXMucmV2QmluKHMsIGgyLCBpKTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgTi5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSBoMiAtIDEpCiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDA7dSA8IGE7IHUrKykKICAgICAgICAgIHMgfD0gKGkgJiAxKSA8PCBhIC0gdSAtIDEsIGkgPj49IDE7CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0sIE4ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbihpLCBhLCBoMiwgcywgdSwgYykgewogICAgICAgIGZvciAodmFyIGIzID0gMDtiMyA8IGM7IGIzKyspCiAgICAgICAgICBzW2IzXSA9IGFbaVtiM11dLCB1W2IzXSA9IGgyW2lbYjNdXTsKICAgICAgfSwgTi5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oaSwgYSwgaDIsIHMsIHUsIGMpIHsKICAgICAgICB0aGlzLnBlcm11dGUoYywgaSwgYSwgaDIsIHMsIHUpOwogICAgICAgIGZvciAodmFyIGIzID0gMTtiMyA8IHU7IGIzIDw8PSAxKQogICAgICAgICAgZm9yICh2YXIgbCA9IGIzIDw8IDEsIG4gPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpLCBkID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKSwgdyA9IDA7dyA8IHU7IHcgKz0gbCkKICAgICAgICAgICAgZm9yICh2YXIgZyA9IG4sIF8zID0gZCwgQTIgPSAwO0EyIDwgYjM7IEEyKyspIHsKICAgICAgICAgICAgICB2YXIgUjIgPSBoMlt3ICsgQTJdLCBJID0gc1t3ICsgQTJdLCBNZSA9IGgyW3cgKyBBMiArIGIzXSwgayA9IHNbdyArIEEyICsgYjNdLCBEMiA9IGcgKiBNZSAtIF8zICogazsKICAgICAgICAgICAgICBrID0gZyAqIGsgKyBfMyAqIE1lLCBNZSA9IEQyLCBoMlt3ICsgQTJdID0gUjIgKyBNZSwgc1t3ICsgQTJdID0gSSArIGssIGgyW3cgKyBBMiArIGIzXSA9IFIyIC0gTWUsIHNbdyArIEEyICsgYjNdID0gSSAtIGssIEEyICE9PSBsICYmIChEMiA9IG4gKiBnIC0gZCAqIF8zLCBfMyA9IG4gKiBfMyArIGQgKiBnLCBnID0gRDIpOwogICAgICAgICAgICB9CiAgICAgIH0sIE4ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMiA9IE1hdGgubWF4KGEsIGkpIHwgMSwgcyA9IGgyICYgMSwgdSA9IDA7CiAgICAgICAgZm9yIChoMiA9IGgyIC8gMiB8IDA7aDI7IGgyID0gaDIgPj4+IDEpCiAgICAgICAgICB1Kys7CiAgICAgICAgcmV0dXJuIDEgPDwgdSArIDEgKyBzOwogICAgICB9LCBOLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmICghKGgyIDw9IDEpKQogICAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGgyIC8gMjsgcysrKSB7CiAgICAgICAgICAgIHZhciB1ID0gaVtzXTsKICAgICAgICAgICAgaVtzXSA9IGlbaDIgLSBzIC0gMV0sIGlbaDIgLSBzIC0gMV0gPSB1LCB1ID0gYVtzXSwgYVtzXSA9IC1hW2gyIC0gcyAtIDFdLCBhW2gyIC0gcyAtIDFdID0gLXU7CiAgICAgICAgICB9CiAgICAgIH0sIE4ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBmb3IgKHZhciBoMiA9IDAsIHMgPSAwO3MgPCBhIC8gMjsgcysrKSB7CiAgICAgICAgICB2YXIgdSA9IE1hdGgucm91bmQoaVsyICogcyArIDFdIC8gYSkgKiA4MTkyICsgTWF0aC5yb3VuZChpWzIgKiBzXSAvIGEpICsgaDI7CiAgICAgICAgICBpW3NdID0gdSAmIDY3MTA4ODYzLCB1IDwgNjcxMDg4NjQgPyBoMiA9IDAgOiBoMiA9IHUgLyA2NzEwODg2NCB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9LCBOLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24oaSwgYSwgaDIsIHMpIHsKICAgICAgICBmb3IgKHZhciB1ID0gMCwgYyA9IDA7YyA8IGE7IGMrKykKICAgICAgICAgIHUgPSB1ICsgKGlbY10gfCAwKSwgaDJbMiAqIGNdID0gdSAmIDgxOTEsIHUgPSB1ID4+PiAxMywgaDJbMiAqIGMgKyAxXSA9IHUgJiA4MTkxLCB1ID0gdSA+Pj4gMTM7CiAgICAgICAgZm9yIChjID0gMiAqIGE7YyA8IHM7ICsrYykKICAgICAgICAgIGgyW2NdID0gMDsKICAgICAgICByKHUgPT09IDApLCByKCh1ICYgLTgxOTIpID09PSAwKTsKICAgICAgfSwgTi5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gbmV3IEFycmF5KGkpLCBoMiA9IDA7aDIgPCBpOyBoMisrKQogICAgICAgICAgYVtoMl0gPSAwOwogICAgICAgIHJldHVybiBhOwogICAgICB9LCBOLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKGkubGVuZ3RoLCBhLmxlbmd0aCksIHUgPSB0aGlzLm1ha2VSQlQocyksIGMgPSB0aGlzLnN0dWIocyksIGIzID0gbmV3IEFycmF5KHMpLCBsID0gbmV3IEFycmF5KHMpLCBuID0gbmV3IEFycmF5KHMpLCBkID0gbmV3IEFycmF5KHMpLCB3ID0gbmV3IEFycmF5KHMpLCBnID0gbmV3IEFycmF5KHMpLCBfMyA9IGgyLndvcmRzOwogICAgICAgIF8zLmxlbmd0aCA9IHMsIHRoaXMuY29udmVydDEzYihpLndvcmRzLCBpLmxlbmd0aCwgYjMsIHMpLCB0aGlzLmNvbnZlcnQxM2IoYS53b3JkcywgYS5sZW5ndGgsIGQsIHMpLCB0aGlzLnRyYW5zZm9ybShiMywgYywgbCwgbiwgcywgdSksIHRoaXMudHJhbnNmb3JtKGQsIGMsIHcsIGcsIHMsIHUpOwogICAgICAgIGZvciAodmFyIEEyID0gMDtBMiA8IHM7IEEyKyspIHsKICAgICAgICAgIHZhciBSMiA9IGxbQTJdICogd1tBMl0gLSBuW0EyXSAqIGdbQTJdOwogICAgICAgICAgbltBMl0gPSBsW0EyXSAqIGdbQTJdICsgbltBMl0gKiB3W0EyXSwgbFtBMl0gPSBSMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuY29uanVnYXRlKGwsIG4sIHMpLCB0aGlzLnRyYW5zZm9ybShsLCBuLCBfMywgYywgcywgdSksIHRoaXMuY29uanVnYXRlKF8zLCBjLCBzKSwgdGhpcy5ub3JtYWxpemUxM2IoXzMsIHMpLCBoMi5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiBhLm5lZ2F0aXZlLCBoMi5sZW5ndGggPSBpLmxlbmd0aCArIGEubGVuZ3RoLCBoMi5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gYS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIGkubGVuZ3RoKSwgdGhpcy5tdWxUbyhpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBhLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgaS5sZW5ndGgpLCBfZSh0aGlzLCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKGksIHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IDA7aDIgPCB0aGlzLmxlbmd0aDsgaDIrKykgewogICAgICAgICAgdmFyIHMgPSAodGhpcy53b3Jkc1toMl0gfCAwKSAqIGksIHUgPSAocyAmIDY3MTA4ODYzKSArIChhICYgNjcxMDg4NjMpOwogICAgICAgICAgYSA+Pj0gMjYsIGEgKz0gcyAvIDY3MTA4ODY0IHwgMCwgYSArPSB1ID4+PiAyNiwgdGhpcy53b3Jkc1toMl0gPSB1ICYgNjcxMDg4NjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhICE9PSAwICYmICh0aGlzLndvcmRzW2gyXSA9IGEsIHRoaXMubGVuZ3RoKyspLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gQihpKTsKICAgICAgICBpZiAoYS5sZW5ndGggPT09IDApCiAgICAgICAgICByZXR1cm4gbmV3IGYoMSk7CiAgICAgICAgZm9yICh2YXIgaDIgPSB0aGlzLCBzID0gMDtzIDwgYS5sZW5ndGggJiYgYVtzXSA9PT0gMDsgcysrLCBoMiA9IGgyLnNxcigpKQogICAgICAgICAgOwogICAgICAgIGlmICgrK3MgPCBhLmxlbmd0aCkKICAgICAgICAgIGZvciAodmFyIHUgPSBoMi5zcXIoKTtzIDwgYS5sZW5ndGg7IHMrKywgdSA9IHUuc3FyKCkpCiAgICAgICAgICAgIGFbc10gIT09IDAgJiYgKGgyID0gaDIubXVsKHUpKTsKICAgICAgICByZXR1cm4gaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2LCBzID0gNjcxMDg4NjMgPj4+IDI2IC0gYSA8PCAyNiAtIGEsIHU7CiAgICAgICAgaWYgKGEgIT09IDApIHsKICAgICAgICAgIHZhciBjID0gMDsKICAgICAgICAgIGZvciAodSA9IDA7dSA8IHRoaXMubGVuZ3RoOyB1KyspIHsKICAgICAgICAgICAgdmFyIGIzID0gdGhpcy53b3Jkc1t1XSAmIHMsIGwgPSAodGhpcy53b3Jkc1t1XSB8IDApIC0gYjMgPDwgYTsKICAgICAgICAgICAgdGhpcy53b3Jkc1t1XSA9IGwgfCBjLCBjID0gYjMgPj4+IDI2IC0gYTsKICAgICAgICAgIH0KICAgICAgICAgIGMgJiYgKHRoaXMud29yZHNbdV0gPSBjLCB0aGlzLmxlbmd0aCsrKTsKICAgICAgICB9CiAgICAgICAgaWYgKGgyICE9PSAwKSB7CiAgICAgICAgICBmb3IgKHUgPSB0aGlzLmxlbmd0aCAtIDE7dSA+PSAwOyB1LS0pCiAgICAgICAgICAgIHRoaXMud29yZHNbdSArIGgyXSA9IHRoaXMud29yZHNbdV07CiAgICAgICAgICBmb3IgKHUgPSAwO3UgPCBoMjsgdSsrKQogICAgICAgICAgICB0aGlzLndvcmRzW3VdID0gMDsKICAgICAgICAgIHRoaXMubGVuZ3RoICs9IGgyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBzOwogICAgICAgIGEgPyBzID0gKGEgLSBhICUgMjYpIC8gMjYgOiBzID0gMDsKICAgICAgICB2YXIgdSA9IGkgJSAyNiwgYyA9IE1hdGgubWluKChpIC0gdSkgLyAyNiwgdGhpcy5sZW5ndGgpLCBiMyA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IHUgPDwgdSwgbCA9IGgyOwogICAgICAgIGlmIChzIC09IGMsIHMgPSBNYXRoLm1heCgwLCBzKSwgbCkgewogICAgICAgICAgZm9yICh2YXIgbiA9IDA7biA8IGM7IG4rKykKICAgICAgICAgICAgbC53b3Jkc1tuXSA9IHRoaXMud29yZHNbbl07CiAgICAgICAgICBsLmxlbmd0aCA9IGM7CiAgICAgICAgfQogICAgICAgIGlmIChjICE9PSAwKQogICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gYykKICAgICAgICAgICAgZm9yICh0aGlzLmxlbmd0aCAtPSBjLCBuID0gMDtuIDwgdGhpcy5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICB0aGlzLndvcmRzW25dID0gdGhpcy53b3Jkc1tuICsgY107CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAwLCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgICAgdmFyIGQgPSAwOwogICAgICAgIGZvciAobiA9IHRoaXMubGVuZ3RoIC0gMTtuID49IDAgJiYgKGQgIT09IDAgfHwgbiA+PSBzKTsgbi0tKSB7CiAgICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbbl0gfCAwOwogICAgICAgICAgdGhpcy53b3Jkc1tuXSA9IGQgPDwgMjYgLSB1IHwgdyA+Pj4gdSwgZCA9IHcgJiBiMzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGwgJiYgZCAhPT0gMCAmJiAobC53b3Jkc1tsLmxlbmd0aCsrXSA9IGQpLCB0aGlzLmxlbmd0aCA9PT0gMCAmJiAodGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMSksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHJldHVybiByKHRoaXMubmVnYXRpdmUgPT09IDApLCB0aGlzLml1c2hybihpLCBhLCBoMik7CiAgICAgIH0sIGYucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjYsIHMgPSAxIDw8IGE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDw9IGgyKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciB1ID0gdGhpcy53b3Jkc1toMl07CiAgICAgICAgcmV0dXJuICEhKHUgJiBzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjY7CiAgICAgICAgaWYgKHIodGhpcy5uZWdhdGl2ZSA9PT0gMCwgImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycyIpLCB0aGlzLmxlbmd0aCA8PSBoMikKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIGlmIChhICE9PSAwICYmIGgyKyssIHRoaXMubGVuZ3RoID0gTWF0aC5taW4oaDIsIHRoaXMubGVuZ3RoKSwgYSAhPT0gMCkgewogICAgICAgICAgdmFyIHMgPSA2NzEwODg2MyBeIDY3MTA4ODYzID4+PiBhIDw8IGE7CiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpLCBpIDwgMCA/IHRoaXMuaXN1Ym4oLWkpIDogdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBpID8gKHRoaXMud29yZHNbMF0gPSBpIC0gKHRoaXMud29yZHNbMF0gfCAwKSwgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMpIDogKHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlzdWJuKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcykgOiB0aGlzLl9pYWRkbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHRoaXMud29yZHNbMF0gKz0gaTsKICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1thXSA+PSA2NzEwODg2NDsgYSsrKQogICAgICAgICAgdGhpcy53b3Jkc1thXSAtPSA2NzEwODg2NCwgYSA9PT0gdGhpcy5sZW5ndGggLSAxID8gdGhpcy53b3Jkc1thICsgMV0gPSAxIDogdGhpcy53b3Jkc1thICsgMV0rKzsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgYSArIDEpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAocih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KSwgaSA8IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5pYWRkbigtaSk7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaWFkZG4oaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzOwogICAgICAgIGlmICh0aGlzLndvcmRzWzBdIC09IGksIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKQogICAgICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdLCB0aGlzLm5lZ2F0aXZlID0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICBmb3IgKHZhciBhID0gMDthIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1thXSA8IDA7IGErKykKICAgICAgICAgICAgdGhpcy53b3Jkc1thXSArPSA2NzEwODg2NCwgdGhpcy53b3Jkc1thICsgMV0gLT0gMTsKICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSBpLmxlbmd0aCArIGgyLCB1OwogICAgICAgIHRoaXMuX2V4cGFuZChzKTsKICAgICAgICB2YXIgYywgYjMgPSAwOwogICAgICAgIGZvciAodSA9IDA7dSA8IGkubGVuZ3RoOyB1KyspIHsKICAgICAgICAgIGMgPSAodGhpcy53b3Jkc1t1ICsgaDJdIHwgMCkgKyBiMzsKICAgICAgICAgIHZhciBsID0gKGkud29yZHNbdV0gfCAwKSAqIGE7CiAgICAgICAgICBjIC09IGwgJiA2NzEwODg2MywgYjMgPSAoYyA+PiAyNikgLSAobCAvIDY3MTA4ODY0IHwgMCksIHRoaXMud29yZHNbdSArIGgyXSA9IGMgJiA2NzEwODg2MzsKICAgICAgICB9CiAgICAgICAgZm9yICg7dSA8IHRoaXMubGVuZ3RoIC0gaDI7IHUrKykKICAgICAgICAgIGMgPSAodGhpcy53b3Jkc1t1ICsgaDJdIHwgMCkgKyBiMywgYjMgPSBjID4+IDI2LCB0aGlzLndvcmRzW3UgKyBoMl0gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgaWYgKGIzID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgICBmb3IgKHIoYjMgPT09IC0xKSwgYjMgPSAwLCB1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykKICAgICAgICAgIGMgPSAtKHRoaXMud29yZHNbdV0gfCAwKSArIGIzLCBiMyA9IGMgPj4gMjYsIHRoaXMud29yZHNbdV0gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMiA9IHRoaXMubGVuZ3RoIC0gaS5sZW5ndGgsIHMgPSB0aGlzLmNsb25lKCksIHUgPSBpLCBjID0gdS53b3Jkc1t1Lmxlbmd0aCAtIDFdIHwgMCwgYjMgPSB0aGlzLl9jb3VudEJpdHMoYyk7CiAgICAgICAgaDIgPSAyNiAtIGIzLCBoMiAhPT0gMCAmJiAodSA9IHUudXNobG4oaDIpLCBzLml1c2hsbihoMiksIGMgPSB1LndvcmRzW3UubGVuZ3RoIC0gMV0gfCAwKTsKICAgICAgICB2YXIgbCA9IHMubGVuZ3RoIC0gdS5sZW5ndGgsIG47CiAgICAgICAgaWYgKGEgIT09ICJtb2QiKSB7CiAgICAgICAgICBuID0gbmV3IGYobnVsbCksIG4ubGVuZ3RoID0gbCArIDEsIG4ud29yZHMgPSBuZXcgQXJyYXkobi5sZW5ndGgpOwogICAgICAgICAgZm9yICh2YXIgZCA9IDA7ZCA8IG4ubGVuZ3RoOyBkKyspCiAgICAgICAgICAgIG4ud29yZHNbZF0gPSAwOwogICAgICAgIH0KICAgICAgICB2YXIgdyA9IHMuY2xvbmUoKS5faXNobG5zdWJtdWwodSwgMSwgbCk7CiAgICAgICAgdy5uZWdhdGl2ZSA9PT0gMCAmJiAocyA9IHcsIG4gJiYgKG4ud29yZHNbbF0gPSAxKSk7CiAgICAgICAgZm9yICh2YXIgZyA9IGwgLSAxO2cgPj0gMDsgZy0tKSB7CiAgICAgICAgICB2YXIgXzMgPSAocy53b3Jkc1t1Lmxlbmd0aCArIGddIHwgMCkgKiA2NzEwODg2NCArIChzLndvcmRzW3UubGVuZ3RoICsgZyAtIDFdIHwgMCk7CiAgICAgICAgICBmb3IgKF8zID0gTWF0aC5taW4oXzMgLyBjIHwgMCwgNjcxMDg4NjMpLCBzLl9pc2hsbnN1Ym11bCh1LCBfMywgZyk7cy5uZWdhdGl2ZSAhPT0gMDsgKQogICAgICAgICAgICBfMy0tLCBzLm5lZ2F0aXZlID0gMCwgcy5faXNobG5zdWJtdWwodSwgMSwgZyksIHMuaXNaZXJvKCkgfHwgKHMubmVnYXRpdmUgXj0gMSk7CiAgICAgICAgICBuICYmIChuLndvcmRzW2ddID0gXzMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiAmJiBuLnN0cmlwKCksIHMuc3RyaXAoKSwgYSAhPT0gImRpdiIgJiYgaDIgIT09IDAgJiYgcy5pdXNocm4oaDIpLCB7IGRpdjogbiB8fCBudWxsLCBtb2Q6IHMgfTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAocighaS5pc1plcm8oKSksIHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4geyBkaXY6IG5ldyBmKDApLCBtb2Q6IG5ldyBmKDApIH07CiAgICAgICAgdmFyIHMsIHUsIGM7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCA/IChjID0gdGhpcy5uZWcoKS5kaXZtb2QoaSwgYSksIGEgIT09ICJtb2QiICYmIChzID0gYy5kaXYubmVnKCkpLCBhICE9PSAiZGl2IiAmJiAodSA9IGMubW9kLm5lZygpLCBoMiAmJiB1Lm5lZ2F0aXZlICE9PSAwICYmIHUuaWFkZChpKSksIHsgZGl2OiBzLCBtb2Q6IHUgfSkgOiB0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDAgPyAoYyA9IHRoaXMuZGl2bW9kKGkubmVnKCksIGEpLCBhICE9PSAibW9kIiAmJiAocyA9IGMuZGl2Lm5lZygpKSwgeyBkaXY6IHMsIG1vZDogYy5tb2QgfSkgOiAodGhpcy5uZWdhdGl2ZSAmIGkubmVnYXRpdmUpICE9PSAwID8gKGMgPSB0aGlzLm5lZygpLmRpdm1vZChpLm5lZygpLCBhKSwgYSAhPT0gImRpdiIgJiYgKHUgPSBjLm1vZC5uZWcoKSwgaDIgJiYgdS5uZWdhdGl2ZSAhPT0gMCAmJiB1LmlzdWIoaSkpLCB7IGRpdjogYy5kaXYsIG1vZDogdSB9KSA6IGkubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAoaSkgPCAwID8geyBkaXY6IG5ldyBmKDApLCBtb2Q6IHRoaXMgfSA6IGkubGVuZ3RoID09PSAxID8gYSA9PT0gImRpdiIgPyB7IGRpdjogdGhpcy5kaXZuKGkud29yZHNbMF0pLCBtb2Q6IG51bGwgfSA6IGEgPT09ICJtb2QiID8geyBkaXY6IG51bGwsIG1vZDogbmV3IGYodGhpcy5tb2RuKGkud29yZHNbMF0pKSB9IDogeyBkaXY6IHRoaXMuZGl2bihpLndvcmRzWzBdKSwgbW9kOiBuZXcgZih0aGlzLm1vZG4oaS53b3Jkc1swXSkpIH0gOiB0aGlzLl93b3JkRGl2KGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJkaXYiLCBmYWxzZSkuZGl2OwogICAgICB9LCBmLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJtb2QiLCBmYWxzZSkubW9kOwogICAgICB9LCBmLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAibW9kIiwgdHJ1ZSkubW9kOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuZGl2bW9kKGkpOwogICAgICAgIGlmIChhLm1vZC5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBhLmRpdjsKICAgICAgICB2YXIgaDIgPSBhLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGEubW9kLmlzdWIoaSkgOiBhLm1vZCwgcyA9IGkudXNocm4oMSksIHUgPSBpLmFuZGxuKDEpLCBjID0gaDIuY21wKHMpOwogICAgICAgIHJldHVybiBjIDwgMCB8fCB1ID09PSAxICYmIGMgPT09IDAgPyBhLmRpdiA6IGEuZGl2Lm5lZ2F0aXZlICE9PSAwID8gYS5kaXYuaXN1Ym4oMSkgOiBhLmRpdi5pYWRkbigxKTsKICAgICAgfSwgZi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkgPD0gNjcxMDg4NjMpOwogICAgICAgIGZvciAodmFyIGEgPSAoMSA8PCAyNikgJSBpLCBoMiA9IDAsIHMgPSB0aGlzLmxlbmd0aCAtIDE7cyA+PSAwOyBzLS0pCiAgICAgICAgICBoMiA9IChhICogaDIgKyAodGhpcy53b3Jkc1tzXSB8IDApKSAlIGk7CiAgICAgICAgcmV0dXJuIGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkgPD0gNjcxMDg4NjMpOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IHRoaXMubGVuZ3RoIC0gMTtoMiA+PSAwOyBoMi0tKSB7CiAgICAgICAgICB2YXIgcyA9ICh0aGlzLndvcmRzW2gyXSB8IDApICsgYSAqIDY3MTA4ODY0OwogICAgICAgICAgdGhpcy53b3Jkc1toMl0gPSBzIC8gaSB8IDAsIGEgPSBzICUgaTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCksIHIoIWkuaXNaZXJvKCkpOwogICAgICAgIHZhciBhID0gdGhpcywgaDIgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSAhPT0gMCA/IGEgPSBhLnVtb2QoaSkgOiBhID0gYS5jbG9uZSgpOwogICAgICAgIGZvciAodmFyIHMgPSBuZXcgZigxKSwgdSA9IG5ldyBmKDApLCBjID0gbmV3IGYoMCksIGIzID0gbmV3IGYoMSksIGwgPSAwO2EuaXNFdmVuKCkgJiYgaDIuaXNFdmVuKCk7ICkKICAgICAgICAgIGEuaXVzaHJuKDEpLCBoMi5pdXNocm4oMSksICsrbDsKICAgICAgICBmb3IgKHZhciBuID0gaDIuY2xvbmUoKSwgZCA9IGEuY2xvbmUoKTshYS5pc1plcm8oKTsgKSB7CiAgICAgICAgICBmb3IgKHZhciB3ID0gMCwgZyA9IDE7KGEud29yZHNbMF0gJiBnKSA9PT0gMCAmJiB3IDwgMjY7ICsrdywgZyA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKHcgPiAwKQogICAgICAgICAgICBmb3IgKGEuaXVzaHJuKHcpO3ctLSA+IDA7ICkKICAgICAgICAgICAgICAocy5pc09kZCgpIHx8IHUuaXNPZGQoKSkgJiYgKHMuaWFkZChuKSwgdS5pc3ViKGQpKSwgcy5pdXNocm4oMSksIHUuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICh2YXIgXzMgPSAwLCBBMiA9IDE7KGgyLndvcmRzWzBdICYgQTIpID09PSAwICYmIF8zIDwgMjY7ICsrXzMsIEEyIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAoXzMgPiAwKQogICAgICAgICAgICBmb3IgKGgyLml1c2hybihfMyk7XzMtLSA+IDA7ICkKICAgICAgICAgICAgICAoYy5pc09kZCgpIHx8IGIzLmlzT2RkKCkpICYmIChjLmlhZGQobiksIGIzLmlzdWIoZCkpLCBjLml1c2hybigxKSwgYjMuaXVzaHJuKDEpOwogICAgICAgICAgYS5jbXAoaDIpID49IDAgPyAoYS5pc3ViKGgyKSwgcy5pc3ViKGMpLCB1LmlzdWIoYjMpKSA6IChoMi5pc3ViKGEpLCBjLmlzdWIocyksIGIzLmlzdWIodSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBhOiBjLCBiOiBiMywgZ2NkOiBoMi5pdXNobG4obCkgfTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCksIHIoIWkuaXNaZXJvKCkpOwogICAgICAgIHZhciBhID0gdGhpcywgaDIgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSAhPT0gMCA/IGEgPSBhLnVtb2QoaSkgOiBhID0gYS5jbG9uZSgpOwogICAgICAgIGZvciAodmFyIHMgPSBuZXcgZigxKSwgdSA9IG5ldyBmKDApLCBjID0gaDIuY2xvbmUoKTthLmNtcG4oMSkgPiAwICYmIGgyLmNtcG4oMSkgPiAwOyApIHsKICAgICAgICAgIGZvciAodmFyIGIzID0gMCwgbCA9IDE7KGEud29yZHNbMF0gJiBsKSA9PT0gMCAmJiBiMyA8IDI2OyArK2IzLCBsIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAoYjMgPiAwKQogICAgICAgICAgICBmb3IgKGEuaXVzaHJuKGIzKTtiMy0tID4gMDsgKQogICAgICAgICAgICAgIHMuaXNPZGQoKSAmJiBzLmlhZGQoYyksIHMuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICh2YXIgbiA9IDAsIGQgPSAxOyhoMi53b3Jkc1swXSAmIGQpID09PSAwICYmIG4gPCAyNjsgKytuLCBkIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAobiA+IDApCiAgICAgICAgICAgIGZvciAoaDIuaXVzaHJuKG4pO24tLSA+IDA7ICkKICAgICAgICAgICAgICB1LmlzT2RkKCkgJiYgdS5pYWRkKGMpLCB1Lml1c2hybigxKTsKICAgICAgICAgIGEuY21wKGgyKSA+PSAwID8gKGEuaXN1YihoMiksIHMuaXN1Yih1KSkgOiAoaDIuaXN1YihhKSwgdS5pc3ViKHMpKTsKICAgICAgICB9CiAgICAgICAgdmFyIHc7CiAgICAgICAgcmV0dXJuIGEuY21wbigxKSA9PT0gMCA/IHcgPSBzIDogdyA9IHUsIHcuY21wbigwKSA8IDAgJiYgdy5pYWRkKGkpLCB3OwogICAgICB9LCBmLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS5hYnMoKTsKICAgICAgICBpZiAoaS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiB0aGlzLmFicygpOwogICAgICAgIHZhciBhID0gdGhpcy5jbG9uZSgpLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlID0gMCwgaDIubmVnYXRpdmUgPSAwOwogICAgICAgIGZvciAodmFyIHMgPSAwO2EuaXNFdmVuKCkgJiYgaDIuaXNFdmVuKCk7IHMrKykKICAgICAgICAgIGEuaXVzaHJuKDEpLCBoMi5pdXNocm4oMSk7CiAgICAgICAgZG8gewogICAgICAgICAgZm9yICg7YS5pc0V2ZW4oKTsgKQogICAgICAgICAgICBhLml1c2hybigxKTsKICAgICAgICAgIGZvciAoO2gyLmlzRXZlbigpOyApCiAgICAgICAgICAgIGgyLml1c2hybigxKTsKICAgICAgICAgIHZhciB1ID0gYS5jbXAoaDIpOwogICAgICAgICAgaWYgKHUgPCAwKSB7CiAgICAgICAgICAgIHZhciBjID0gYTsKICAgICAgICAgICAgYSA9IGgyLCBoMiA9IGM7CiAgICAgICAgICB9IGVsc2UgaWYgKHUgPT09IDAgfHwgaDIuY21wbigxKSA9PT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBhLmlzdWIoaDIpOwogICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgIHJldHVybiBoMi5pdXNobG4ocyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWdjZChpKS5hLnVtb2QoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIpOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNiwgcyA9IDEgPDwgYTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gaDIpCiAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKGgyICsgMSksIHRoaXMud29yZHNbaDJdIHw9IHMsIHRoaXM7CiAgICAgICAgZm9yICh2YXIgdSA9IHMsIGMgPSBoMjt1ICE9PSAwICYmIGMgPCB0aGlzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICB2YXIgYjMgPSB0aGlzLndvcmRzW2NdIHwgMDsKICAgICAgICAgIGIzICs9IHUsIHUgPSBiMyA+Pj4gMjYsIGIzICY9IDY3MTA4ODYzLCB0aGlzLndvcmRzW2NdID0gYjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1ICE9PSAwICYmICh0aGlzLndvcmRzW2NdID0gdSwgdGhpcy5sZW5ndGgrKyksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSA8IDA7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIWEpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgYSkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgICB2YXIgaDI7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMSkKICAgICAgICAgIGgyID0gMTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGEgJiYgKGkgPSAtaSksIHIoaSA8PSA2NzEwODg2MywgIk51bWJlciBpcyB0b28gYmlnIik7CiAgICAgICAgICB2YXIgcyA9IHRoaXMud29yZHNbMF0gfCAwOwogICAgICAgICAgaDIgPSBzID09PSBpID8gMCA6IHMgPCBpID8gLTEgOiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1oMiB8IDAgOiBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDApCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIHZhciBhID0gdGhpcy51Y21wKGkpOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWEgfCAwIDogYTsKICAgICAgfSwgZi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBpLmxlbmd0aCkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IGkubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IHRoaXMubGVuZ3RoIC0gMTtoMiA+PSAwOyBoMi0tKSB7CiAgICAgICAgICB2YXIgcyA9IHRoaXMud29yZHNbaDJdIHwgMCwgdSA9IGkud29yZHNbaDJdIHwgMDsKICAgICAgICAgIGlmIChzICE9PSB1KSB7CiAgICAgICAgICAgIHMgPCB1ID8gYSA9IC0xIDogcyA+IHUgJiYgKGEgPSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9LCBmLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPj0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA+PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gLTE7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA8PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpIDw9IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IDA7CiAgICAgIH0sIGYucmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBuZXcgUChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoIXRoaXMucmVkLCAiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCByKHRoaXMubmVnYXRpdmUgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCBpLmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWQgPSBpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsICJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHRoaXMuX2ZvcmNlUmVkKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmFkZCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmlhZGQodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuc3ViKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuaXN1Yih0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5zaGwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgaSksIHRoaXMucmVkLm11bCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgaSksIHRoaXMucmVkLmltdWwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FyKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuaXNxcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnNxcnQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pbnZtKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLm5lZyh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkICYmICFpLnJlZCwgInJlZFBvdyhub3JtYWxOdW0pIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5wb3codGhpcywgaSk7CiAgICAgIH07CiAgICAgIHZhciB3ZSA9IHsgazI1NjogbnVsbCwgcDIyNDogbnVsbCwgcDE5MjogbnVsbCwgcDI1NTE5OiBudWxsIH07CiAgICAgIGZ1bmN0aW9uIHllKHYsIGkpIHsKICAgICAgICB0aGlzLm5hbWUgPSB2LCB0aGlzLnAgPSBuZXcgZihpLCAxNiksIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKSwgdGhpcy5rID0gbmV3IGYoMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApLCB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpOwogICAgICB9CiAgICAgIHllLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gaS53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKSwgaTsKICAgICAgfSwgeWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLCBoMjsKICAgICAgICBkbwogICAgICAgICAgdGhpcy5zcGxpdChhLCB0aGlzLnRtcCksIGEgPSB0aGlzLmltdWxLKGEpLCBhID0gYS5pYWRkKHRoaXMudG1wKSwgaDIgPSBhLmJpdExlbmd0aCgpOwogICAgICAgIHdoaWxlIChoMiA+IHRoaXMubik7CiAgICAgICAgdmFyIHMgPSBoMiA8IHRoaXMubiA/IC0xIDogYS51Y21wKHRoaXMucCk7CiAgICAgICAgcmV0dXJuIHMgPT09IDAgPyAoYS53b3Jkc1swXSA9IDAsIGEubGVuZ3RoID0gMSkgOiBzID4gMCA/IGEuaXN1Yih0aGlzLnApIDogYS5zdHJpcCAhPT0gdW5kZWZpbmVkID8gYS5zdHJpcCgpIDogYS5fc3RyaXAoKSwgYTsKICAgICAgfSwgeWUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGkuaXVzaHJuKHRoaXMubiwgMCwgYSk7CiAgICAgIH0sIHllLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaS5pbXVsKHRoaXMuayk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHhlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgImsyNTYiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYiKTsKICAgICAgfQogICAgICBvKHhlLCB5ZSksIHhlLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBmb3IgKHZhciBoMiA9IDQxOTQzMDMsIHMgPSBNYXRoLm1pbihpLmxlbmd0aCwgOSksIHUgPSAwO3UgPCBzOyB1KyspCiAgICAgICAgICBhLndvcmRzW3VdID0gaS53b3Jkc1t1XTsKICAgICAgICBpZiAoYS5sZW5ndGggPSBzLCBpLmxlbmd0aCA8PSA5KSB7CiAgICAgICAgICBpLndvcmRzWzBdID0gMCwgaS5sZW5ndGggPSAxOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgYyA9IGkud29yZHNbOV07CiAgICAgICAgZm9yIChhLndvcmRzW2EubGVuZ3RoKytdID0gYyAmIGgyLCB1ID0gMTA7dSA8IGkubGVuZ3RoOyB1KyspIHsKICAgICAgICAgIHZhciBiMyA9IGkud29yZHNbdV0gfCAwOwogICAgICAgICAgaS53b3Jkc1t1IC0gMTBdID0gKGIzICYgaDIpIDw8IDQgfCBjID4+PiAyMiwgYyA9IGIzOwogICAgICAgIH0KICAgICAgICBjID4+Pj0gMjIsIGkud29yZHNbdSAtIDEwXSA9IGMsIGMgPT09IDAgJiYgaS5sZW5ndGggPiAxMCA/IGkubGVuZ3RoIC09IDEwIDogaS5sZW5ndGggLT0gOTsKICAgICAgfSwgeGUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIGkud29yZHNbaS5sZW5ndGhdID0gMCwgaS53b3Jkc1tpLmxlbmd0aCArIDFdID0gMCwgaS5sZW5ndGggKz0gMjsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSAwO2gyIDwgaS5sZW5ndGg7IGgyKyspIHsKICAgICAgICAgIHZhciBzID0gaS53b3Jkc1toMl0gfCAwOwogICAgICAgICAgYSArPSBzICogOTc3LCBpLndvcmRzW2gyXSA9IGEgJiA2NzEwODg2MywgYSA9IHMgKiA2NCArIChhIC8gNjcxMDg4NjQgfCAwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGkud29yZHNbaS5sZW5ndGggLSAxXSA9PT0gMCAmJiAoaS5sZW5ndGgtLSwgaS53b3Jkc1tpLmxlbmd0aCAtIDFdID09PSAwICYmIGkubGVuZ3RoLS0pLCBpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBSZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJwMjI0IiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIik7CiAgICAgIH0KICAgICAgbyhSZSwgeWUpOwogICAgICBmdW5jdGlvbiBFZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJwMTkyIiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIik7CiAgICAgIH0KICAgICAgbyhFZSwgeWUpOwogICAgICBmdW5jdGlvbiBBZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICIyNTUxOSIsICI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIik7CiAgICAgIH0KICAgICAgbyhBZSwgeWUpLCBBZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gMDtoMiA8IGkubGVuZ3RoOyBoMisrKSB7CiAgICAgICAgICB2YXIgcyA9IChpLndvcmRzW2gyXSB8IDApICogMTkgKyBhLCB1ID0gcyAmIDY3MTA4ODYzOwogICAgICAgICAgcyA+Pj49IDI2LCBpLndvcmRzW2gyXSA9IHUsIGEgPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYSAhPT0gMCAmJiAoaS53b3Jkc1tpLmxlbmd0aCsrXSA9IGEpLCBpOwogICAgICB9LCBmLl9wcmltZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAod2VbaV0pCiAgICAgICAgICByZXR1cm4gd2VbaV07CiAgICAgICAgdmFyIGE7CiAgICAgICAgaWYgKGkgPT09ICJrMjU2IikKICAgICAgICAgIGEgPSBuZXcgeGU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAyMjQiKQogICAgICAgICAgYSA9IG5ldyBSZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDE5MiIpCiAgICAgICAgICBhID0gbmV3IEVlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMjU1MTkiKQogICAgICAgICAgYSA9IG5ldyBBZTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcHJpbWUgIiArIGkpOwogICAgICAgIHJldHVybiB3ZVtpXSA9IGEsIGE7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFAodikgewogICAgICAgIGlmICh0eXBlb2YgdiA9PSAic3RyaW5nIikgewogICAgICAgICAgdmFyIGkgPSBmLl9wcmltZSh2KTsKICAgICAgICAgIHRoaXMubSA9IGkucCwgdGhpcy5wcmltZSA9IGk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICByKHYuZ3RuKDEpLCAibW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIiksIHRoaXMubSA9IHYsIHRoaXMucHJpbWUgPSBudWxsOwogICAgICB9CiAgICAgIFAucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaS5uZWdhdGl2ZSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIHIoaS5yZWQsICJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIik7CiAgICAgIH0sIFAucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHIoKGkubmVnYXRpdmUgfCBhLm5lZ2F0aXZlKSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIHIoaS5yZWQgJiYgaS5yZWQgPT09IGEucmVkLCAicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpOwogICAgICB9LCBQLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnByaW1lID8gdGhpcy5wcmltZS5pcmVkdWNlKGkpLl9mb3JjZVJlZCh0aGlzKSA6IGkudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpLmlzWmVybygpID8gaS5jbG9uZSgpIDogdGhpcy5tLnN1YihpKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuYWRkKGEpOwogICAgICAgIHJldHVybiBoMi5jbXAodGhpcy5tKSA+PSAwICYmIGgyLmlzdWIodGhpcy5tKSwgaDIuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5pYWRkKGEpOwogICAgICAgIHJldHVybiBoMi5jbXAodGhpcy5tKSA+PSAwICYmIGgyLmlzdWIodGhpcy5tKSwgaDI7CiAgICAgIH0sIFAucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuc3ViKGEpOwogICAgICAgIHJldHVybiBoMi5jbXBuKDApIDwgMCAmJiBoMi5pYWRkKHRoaXMubSksIGgyLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuaXN1YihhKTsKICAgICAgICByZXR1cm4gaDIuY21wbigwKSA8IDAgJiYgaDIuaWFkZCh0aGlzLm0pLCBoMjsKICAgICAgfSwgUC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkxKGkpLCB0aGlzLmltb2QoaS51c2hsbihhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoaSwgYSksIHRoaXMuaW1vZChpLmltdWwoYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoaSwgYSksIHRoaXMuaW1vZChpLm11bChhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW11bChpLCBpLmNsb25lKCkpOwogICAgICB9LCBQLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsKGksIGkpOwogICAgICB9LCBQLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkuY2xvbmUoKTsKICAgICAgICB2YXIgYSA9IHRoaXMubS5hbmRsbigzKTsKICAgICAgICBpZiAocihhICUgMiA9PT0gMSksIGEgPT09IDMpIHsKICAgICAgICAgIHZhciBoMiA9IHRoaXMubS5hZGQobmV3IGYoMSkpLml1c2hybigyKTsKICAgICAgICAgIHJldHVybiB0aGlzLnBvdyhpLCBoMik7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHMgPSB0aGlzLm0uc3VibigxKSwgdSA9IDA7IXMuaXNaZXJvKCkgJiYgcy5hbmRsbigxKSA9PT0gMDsgKQogICAgICAgICAgdSsrLCBzLml1c2hybigxKTsKICAgICAgICByKCFzLmlzWmVybygpKTsKICAgICAgICB2YXIgYyA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBiMyA9IGMucmVkTmVnKCksIGwgPSB0aGlzLm0uc3VibigxKS5pdXNocm4oMSksIG4gPSB0aGlzLm0uYml0TGVuZ3RoKCk7CiAgICAgICAgZm9yIChuID0gbmV3IGYoMiAqIG4gKiBuKS50b1JlZCh0aGlzKTt0aGlzLnBvdyhuLCBsKS5jbXAoYjMpICE9PSAwOyApCiAgICAgICAgICBuLnJlZElBZGQoYjMpOwogICAgICAgIGZvciAodmFyIGQgPSB0aGlzLnBvdyhuLCBzKSwgdyA9IHRoaXMucG93KGksIHMuYWRkbigxKS5pdXNocm4oMSkpLCBnID0gdGhpcy5wb3coaSwgcyksIF8zID0gdTtnLmNtcChjKSAhPT0gMDsgKSB7CiAgICAgICAgICBmb3IgKHZhciBBMiA9IGcsIFIyID0gMDtBMi5jbXAoYykgIT09IDA7IFIyKyspCiAgICAgICAgICAgIEEyID0gQTIucmVkU3FyKCk7CiAgICAgICAgICByKFIyIDwgXzMpOwogICAgICAgICAgdmFyIEkgPSB0aGlzLnBvdyhkLCBuZXcgZigxKS5pdXNobG4oXzMgLSBSMiAtIDEpKTsKICAgICAgICAgIHcgPSB3LnJlZE11bChJKSwgZCA9IEkucmVkU3FyKCksIGcgPSBnLnJlZE11bChkKSwgXzMgPSBSMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHc7CiAgICAgIH0sIFAucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLl9pbnZtcCh0aGlzLm0pOwogICAgICAgIHJldHVybiBhLm5lZ2F0aXZlICE9PSAwID8gKGEubmVnYXRpdmUgPSAwLCB0aGlzLmltb2QoYSkucmVkTmVnKCkpIDogdGhpcy5pbW9kKGEpOwogICAgICB9LCBQLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gbmV3IGYoMSkudG9SZWQodGhpcyk7CiAgICAgICAgaWYgKGEuY21wbigxKSA9PT0gMCkKICAgICAgICAgIHJldHVybiBpLmNsb25lKCk7CiAgICAgICAgdmFyIGgyID0gNCwgcyA9IG5ldyBBcnJheSgxIDw8IGgyKTsKICAgICAgICBzWzBdID0gbmV3IGYoMSkudG9SZWQodGhpcyksIHNbMV0gPSBpOwogICAgICAgIGZvciAodmFyIHUgPSAyO3UgPCBzLmxlbmd0aDsgdSsrKQogICAgICAgICAgc1t1XSA9IHRoaXMubXVsKHNbdSAtIDFdLCBpKTsKICAgICAgICB2YXIgYyA9IHNbMF0sIGIzID0gMCwgbCA9IDAsIG4gPSBhLmJpdExlbmd0aCgpICUgMjY7CiAgICAgICAgZm9yIChuID09PSAwICYmIChuID0gMjYpLCB1ID0gYS5sZW5ndGggLSAxO3UgPj0gMDsgdS0tKSB7CiAgICAgICAgICBmb3IgKHZhciBkID0gYS53b3Jkc1t1XSwgdyA9IG4gLSAxO3cgPj0gMDsgdy0tKSB7CiAgICAgICAgICAgIHZhciBnID0gZCA+PiB3ICYgMTsKICAgICAgICAgICAgaWYgKGMgIT09IHNbMF0gJiYgKGMgPSB0aGlzLnNxcihjKSksIGcgPT09IDAgJiYgYjMgPT09IDApIHsKICAgICAgICAgICAgICBsID0gMDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiMyA8PD0gMSwgYjMgfD0gZywgbCsrLCAhKGwgIT09IGgyICYmICh1ICE9PSAwIHx8IHcgIT09IDApKSAmJiAoYyA9IHRoaXMubXVsKGMsIHNbYjNdKSwgbCA9IDAsIGIzID0gMCk7CiAgICAgICAgICB9CiAgICAgICAgICBuID0gMjY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjOwogICAgICB9LCBQLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLnVtb2QodGhpcy5tKTsKICAgICAgICByZXR1cm4gYSA9PT0gaSA/IGEuY2xvbmUoKSA6IGE7CiAgICAgIH0sIFAucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS5jbG9uZSgpOwogICAgICAgIHJldHVybiBhLnJlZCA9IG51bGwsIGE7CiAgICAgIH0sIGYubW9udCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gbmV3IFNlKGkpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBTZSh2KSB7CiAgICAgICAgUC5jYWxsKHRoaXMsIHYpLCB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpLCB0aGlzLnNoaWZ0ICUgMjYgIT09IDAgJiYgKHRoaXMuc2hpZnQgKz0gMjYgLSB0aGlzLnNoaWZ0ICUgMjYpLCB0aGlzLnIgPSBuZXcgZigxKS5pdXNobG4odGhpcy5zaGlmdCksIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKSwgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMuciksIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTsKICAgICAgfQogICAgICBvKFNlLCBQKSwgU2UucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbW9kKGkudXNobG4odGhpcy5zaGlmdCkpOwogICAgICB9LCBTZS5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmltb2QoaS5tdWwodGhpcy5yaW52KSk7CiAgICAgICAgcmV0dXJuIGEucmVkID0gbnVsbCwgYTsKICAgICAgfSwgU2UucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkgfHwgYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLndvcmRzWzBdID0gMCwgaS5sZW5ndGggPSAxLCBpOwogICAgICAgIHZhciBoMiA9IGkuaW11bChhKSwgcyA9IGgyLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSwgdSA9IGgyLmlzdWIocykuaXVzaHJuKHRoaXMuc2hpZnQpLCBjID0gdTsKICAgICAgICByZXR1cm4gdS5jbXAodGhpcy5tKSA+PSAwID8gYyA9IHUuaXN1Yih0aGlzLm0pIDogdS5jbXBuKDApIDwgMCAmJiAoYyA9IHUuaWFkZCh0aGlzLm0pKSwgYy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkgfHwgYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBuZXcgZigwKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgICAgdmFyIGgyID0gaS5tdWwoYSksIHMgPSBoMi5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIHUgPSBoMi5pc3ViKHMpLml1c2hybih0aGlzLnNoaWZ0KSwgYyA9IHU7CiAgICAgICAgcmV0dXJuIHUuY21wKHRoaXMubSkgPj0gMCA/IGMgPSB1LmlzdWIodGhpcy5tKSA6IHUuY21wbigwKSA8IDAgJiYgKGMgPSB1LmlhZGQodGhpcy5tKSksIGMuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBTZS5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuaW1vZChpLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7CiAgICAgICAgcmV0dXJuIGEuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9OwogICAgfSkodHlwZW9mIGVkID4gInUiIHx8IGVkLCBreSk7CiAgfSk7CiAgaDAgPSBUMigoWWssIEx5KSA9PiB7CiAgICB2YXIgczAgPSBVdCgpLCBGZiA9IHMwLkJ1ZmZlciwgRXIgPSB7fSwgQXI7CiAgICBmb3IgKEFyIGluIHMwKQogICAgICAhczAuaGFzT3duUHJvcGVydHkoQXIpIHx8IEFyID09PSAiU2xvd0J1ZmZlciIgfHwgQXIgPT09ICJCdWZmZXIiIHx8IChFcltBcl0gPSBzMFtBcl0pOwogICAgdmFyIFVmID0gRXIuQnVmZmVyID0ge307CiAgICBmb3IgKEFyIGluIEZmKQogICAgICAhRmYuaGFzT3duUHJvcGVydHkoQXIpIHx8IEFyID09PSAiYWxsb2NVbnNhZmUiIHx8IEFyID09PSAiYWxsb2NVbnNhZmVTbG93IiB8fCAoVWZbQXJdID0gRmZbQXJdKTsKICAgIEVyLkJ1ZmZlci5wcm90b3R5cGUgPSBGZi5wcm90b3R5cGU7CiAgICAoIVVmLmZyb20gfHwgVWYuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSAmJiAoVWYuZnJvbSA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgaWYgKHR5cGVvZiB0ID09ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdCk7CiAgICAgIGlmICh0ICYmIHR5cGVvZiB0Lmxlbmd0aCA+ICJ1IikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAiICsgdHlwZW9mIHQpOwogICAgICByZXR1cm4gRmYodCwgZSwgcik7CiAgICB9KTsKICAgIFVmLmFsbG9jIHx8IChVZi5hbGxvYyA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHQpOwogICAgICBpZiAodCA8IDAgfHwgdCA+PSAyICogKDEgPDwgMzApKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicgKyB0ICsgJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICJzaXplIicpOwogICAgICB2YXIgbyA9IEZmKHQpOwogICAgICByZXR1cm4gIWUgfHwgZS5sZW5ndGggPT09IDAgPyBvLmZpbGwoMCkgOiB0eXBlb2YgciA9PSAic3RyaW5nIiA/IG8uZmlsbChlLCByKSA6IG8uZmlsbChlKSwgbzsKICAgIH0pOwogICAgaWYgKCFFci5rU3RyaW5nTWF4TGVuZ3RoKQogICAgICB0cnkgewogICAgICAgIEVyLmtTdHJpbmdNYXhMZW5ndGggPSBwcm9jZXNzLmJpbmRpbmcoImJ1ZmZlciIpLmtTdHJpbmdNYXhMZW5ndGg7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICBFci5jb25zdGFudHMgfHwgKEVyLmNvbnN0YW50cyA9IHsgTUFYX0xFTkdUSDogRXIua01heExlbmd0aCB9LCBFci5rU3RyaW5nTWF4TGVuZ3RoICYmIChFci5jb25zdGFudHMuTUFYX1NUUklOR19MRU5HVEggPSBFci5rU3RyaW5nTWF4TGVuZ3RoKSk7CiAgICBMeS5leHBvcnRzID0gRXI7CiAgfSk7CiAgdTAgPSBUMigoTnkpID0+IHsKICAgIHZhciBhQiA9IEllKCk7CiAgICBmdW5jdGlvbiBScih0KSB7CiAgICAgIHRoaXMuX3JlcG9ydGVyU3RhdGUgPSB7IG9iajogbnVsbCwgcGF0aDogW10sIG9wdGlvbnM6IHQgfHwge30sIGVycm9yczogW10gfTsKICAgIH0KICAgIE55LlJlcG9ydGVyID0gUnI7CiAgICBSci5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiB6ZjsKICAgIH07CiAgICBSci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7CiAgICAgIHJldHVybiB7IG9iajogZS5vYmosIHBhdGhMZW46IGUucGF0aC5sZW5ndGggfTsKICAgIH07CiAgICBSci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9yZXBvcnRlclN0YXRlOwogICAgICByLm9iaiA9IGUub2JqLCByLnBhdGggPSByLnBhdGguc2xpY2UoMCwgZS5wYXRoTGVuKTsKICAgIH07CiAgICBSci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGgucHVzaChlKTsKICAgIH07CiAgICBSci5wcm90b3R5cGUuZXhpdEtleSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9yZXBvcnRlclN0YXRlOwogICAgICByLnBhdGggPSByLnBhdGguc2xpY2UoMCwgZSAtIDEpOwogICAgfTsKICAgIFJyLnByb3RvdHlwZS5sZWF2ZUtleSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgbGV0IGYgPSB0aGlzLl9yZXBvcnRlclN0YXRlOwogICAgICB0aGlzLmV4aXRLZXkoZSksIGYub2JqICE9PSBudWxsICYmIChmLm9ialtyXSA9IG8pOwogICAgfTsKICAgIFJyLnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbigiLyIpOwogICAgfTsKICAgIFJyLnByb3RvdHlwZS5lbnRlck9iamVjdCA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGUsIHIgPSBlLm9iajsKICAgICAgcmV0dXJuIGUub2JqID0ge30sIHI7CiAgICB9OwogICAgUnIucHJvdG90eXBlLmxlYXZlT2JqZWN0ID0gZnVuY3Rpb24oZSkgewogICAgICBsZXQgciA9IHRoaXMuX3JlcG9ydGVyU3RhdGUsIG8gPSByLm9iajsKICAgICAgcmV0dXJuIHIub2JqID0gZSwgbzsKICAgIH07CiAgICBSci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgIGxldCByLCBvID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZSwgZiA9IGUgaW5zdGFuY2VvZiB6ZjsKICAgICAgaWYgKGYgPyByID0gZSA6IHIgPSBuZXcgemYoby5wYXRoLm1hcChmdW5jdGlvbihwKSB7CiAgICAgICAgcmV0dXJuICJbIiArIEpTT04uc3RyaW5naWZ5KHApICsgIl0iOwogICAgICB9KS5qb2luKCIiKSwgZS5tZXNzYWdlIHx8IGUsIGUuc3RhY2spLCAhby5vcHRpb25zLnBhcnRpYWwpCiAgICAgICAgdGhyb3cgcjsKICAgICAgcmV0dXJuIGYgfHwgby5lcnJvcnMucHVzaChyKSwgcjsKICAgIH07CiAgICBSci5wcm90b3R5cGUud3JhcFJlc3VsdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9yZXBvcnRlclN0YXRlOwogICAgICByZXR1cm4gci5vcHRpb25zLnBhcnRpYWwgPyB7IHJlc3VsdDogdGhpcy5pc0Vycm9yKGUpID8gbnVsbCA6IGUsIGVycm9yczogci5lcnJvcnMgfSA6IGU7CiAgICB9OwogICAgZnVuY3Rpb24gemYodCwgZSkgewogICAgICB0aGlzLnBhdGggPSB0LCB0aGlzLnJldGhyb3coZSk7CiAgICB9CiAgICBhQih6ZiwgRXJyb3IpOwogICAgemYucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbihlKSB7CiAgICAgIGlmICh0aGlzLm1lc3NhZ2UgPSBlICsgIiBhdDogIiArICh0aGlzLnBhdGggfHwgIihzaGFsbG93KSIpLCBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAmJiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB6ZiksICF0aGlzLnN0YWNrKQogICAgICAgIHRyeSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKTsKICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICB0aGlzLnN0YWNrID0gci5zdGFjazsKICAgICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICB9KTsKICBLZiA9IFQyKChyZCkgPT4gewogICAgdmFyIG9CID0gSWUoKSwgbDAgPSB1MCgpLlJlcG9ydGVyLCBIZiA9IGgwKCkuQnVmZmVyOwogICAgZnVuY3Rpb24gQnIodCwgZSkgewogICAgICBpZiAobDAuY2FsbCh0aGlzLCBlKSwgIUhmLmlzQnVmZmVyKHQpKSB7CiAgICAgICAgdGhpcy5lcnJvcigiSW5wdXQgbm90IEJ1ZmZlciIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmJhc2UgPSB0LCB0aGlzLm9mZnNldCA9IDAsIHRoaXMubGVuZ3RoID0gdC5sZW5ndGg7CiAgICB9CiAgICBvQihCciwgbDApOwogICAgcmQuRGVjb2RlckJ1ZmZlciA9IEJyOwogICAgQnIuaXNEZWNvZGVyQnVmZmVyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEJyID8gdHJ1ZSA6IHR5cGVvZiBlID09ICJvYmplY3QiICYmIEhmLmlzQnVmZmVyKGUuYmFzZSkgJiYgZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAiRGVjb2RlckJ1ZmZlciIgJiYgdHlwZW9mIGUub2Zmc2V0ID09ICJudW1iZXIiICYmIHR5cGVvZiBlLmxlbmd0aCA9PSAibnVtYmVyIiAmJiB0eXBlb2YgZS5zYXZlID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGUucmVzdG9yZSA9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBlLmlzRW1wdHkgPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZS5yZWFkVUludDggPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgZS5za2lwID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGUucmF3ID09ICJmdW5jdGlvbiI7CiAgICB9OwogICAgQnIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsgb2Zmc2V0OiB0aGlzLm9mZnNldCwgcmVwb3J0ZXI6IGwwLnByb3RvdHlwZS5zYXZlLmNhbGwodGhpcykgfTsKICAgIH07CiAgICBCci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSBuZXcgQnIodGhpcy5iYXNlKTsKICAgICAgcmV0dXJuIHIub2Zmc2V0ID0gZS5vZmZzZXQsIHIubGVuZ3RoID0gdGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ID0gZS5vZmZzZXQsIGwwLnByb3RvdHlwZS5yZXN0b3JlLmNhbGwodGhpcywgZS5yZXBvcnRlciksIHI7CiAgICB9OwogICAgQnIucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDsKICAgIH07CiAgICBCci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKyAxIDw9IHRoaXMubGVuZ3RoID8gdGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCB0cnVlKSA6IHRoaXMuZXJyb3IoZSB8fCAiRGVjb2RlckJ1ZmZlciBvdmVycnVuIik7CiAgICB9OwogICAgQnIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmICghKHRoaXMub2Zmc2V0ICsgZSA8PSB0aGlzLmxlbmd0aCkpCiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IociB8fCAiRGVjb2RlckJ1ZmZlciBvdmVycnVuIik7CiAgICAgIGxldCBvID0gbmV3IEJyKHRoaXMuYmFzZSk7CiAgICAgIHJldHVybiBvLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZSwgby5vZmZzZXQgPSB0aGlzLm9mZnNldCwgby5sZW5ndGggPSB0aGlzLm9mZnNldCArIGUsIHRoaXMub2Zmc2V0ICs9IGUsIG87CiAgICB9OwogICAgQnIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuYmFzZS5zbGljZShlID8gZS5vZmZzZXQgOiB0aGlzLm9mZnNldCwgdGhpcy5sZW5ndGgpOwogICAgfTsKICAgIGZ1bmN0aW9uIFdmKHQsIGUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpCiAgICAgICAgdGhpcy5sZW5ndGggPSAwLCB0aGlzLnZhbHVlID0gdC5tYXAoZnVuY3Rpb24ocikgewogICAgICAgICAgcmV0dXJuIFdmLmlzRW5jb2RlckJ1ZmZlcihyKSB8fCAociA9IG5ldyBXZihyLCBlKSksIHRoaXMubGVuZ3RoICs9IHIubGVuZ3RoLCByOwogICAgICAgIH0sIHRoaXMpOwogICAgICBlbHNlIGlmICh0eXBlb2YgdCA9PSAibnVtYmVyIikgewogICAgICAgIGlmICghKDAgPD0gdCAmJiB0IDw9IDI1NSkpCiAgICAgICAgICByZXR1cm4gZS5lcnJvcigibm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZSIpOwogICAgICAgIHRoaXMudmFsdWUgPSB0LCB0aGlzLmxlbmd0aCA9IDE7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHQgPT0gInN0cmluZyIpCiAgICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMubGVuZ3RoID0gSGYuYnl0ZUxlbmd0aCh0KTsKICAgICAgZWxzZSBpZiAoSGYuaXNCdWZmZXIodCkpCiAgICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMubGVuZ3RoID0gdC5sZW5ndGg7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZS5lcnJvcigiVW5zdXBwb3J0ZWQgdHlwZTogIiArIHR5cGVvZiB0KTsKICAgIH0KICAgIHJkLkVuY29kZXJCdWZmZXIgPSBXZjsKICAgIFdmLmlzRW5jb2RlckJ1ZmZlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBXZiA/IHRydWUgOiB0eXBlb2YgZSA9PSAib2JqZWN0IiAmJiBlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICJFbmNvZGVyQnVmZmVyIiAmJiB0eXBlb2YgZS5sZW5ndGggPT0gIm51bWJlciIgJiYgdHlwZW9mIGUuam9pbiA9PSAiZnVuY3Rpb24iOwogICAgfTsKICAgIFdmLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gZSB8fCAoZSA9IEhmLmFsbG9jKHRoaXMubGVuZ3RoKSksIHIgfHwgKHIgPSAwKSwgdGhpcy5sZW5ndGggPT09IDAgfHwgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlLmZvckVhY2goZnVuY3Rpb24obykgewogICAgICAgIG8uam9pbihlLCByKSwgciArPSBvLmxlbmd0aDsKICAgICAgfSkgOiAodHlwZW9mIHRoaXMudmFsdWUgPT0gIm51bWJlciIgPyBlW3JdID0gdGhpcy52YWx1ZSA6IHR5cGVvZiB0aGlzLnZhbHVlID09ICJzdHJpbmciID8gZS53cml0ZSh0aGlzLnZhbHVlLCByKSA6IEhmLmlzQnVmZmVyKHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUuY29weShlLCByKSwgciArPSB0aGlzLmxlbmd0aCkpLCBlOwogICAgfTsKICB9KTsKICBkMCA9IFQyKChRaywgUHkpID0+IHsKICAgIHZhciBzQiA9IHUwKCkuUmVwb3J0ZXIsIGhCID0gS2YoKS5FbmNvZGVyQnVmZmVyLCB1QiA9IEtmKCkuRGVjb2RlckJ1ZmZlciwgUXQgPSBhcigpLCBEeSA9IFsic2VxIiwgInNlcW9mIiwgInNldCIsICJzZXRvZiIsICJvYmppZCIsICJib29sIiwgImdlbnRpbWUiLCAidXRjdGltZSIsICJudWxsXyIsICJlbnVtIiwgImludCIsICJvYmpEZXNjIiwgImJpdHN0ciIsICJibXBzdHIiLCAiY2hhcnN0ciIsICJnZW5zdHIiLCAiZ3JhcGhzdHIiLCAiaWE1c3RyIiwgImlzbzY0NnN0ciIsICJudW1zdHIiLCAib2N0c3RyIiwgInByaW50c3RyIiwgInQ2MXN0ciIsICJ1bmlzdHIiLCAidXRmOHN0ciIsICJ2aWRlb3N0ciJdLCBsQiA9IFsia2V5IiwgIm9iaiIsICJ1c2UiLCAib3B0aW9uYWwiLCAiZXhwbGljaXQiLCAiaW1wbGljaXQiLCAiZGVmIiwgImNob2ljZSIsICJhbnkiLCAiY29udGFpbnMiXS5jb25jYXQoRHkpLCBkQiA9IFsiX3BlZWtUYWciLCAiX2RlY29kZVRhZyIsICJfdXNlIiwgIl9kZWNvZGVTdHIiLCAiX2RlY29kZU9iamlkIiwgIl9kZWNvZGVUaW1lIiwgIl9kZWNvZGVOdWxsIiwgIl9kZWNvZGVJbnQiLCAiX2RlY29kZUJvb2wiLCAiX2RlY29kZUxpc3QiLCAiX2VuY29kZUNvbXBvc2l0ZSIsICJfZW5jb2RlU3RyIiwgIl9lbmNvZGVPYmppZCIsICJfZW5jb2RlVGltZSIsICJfZW5jb2RlTnVsbCIsICJfZW5jb2RlSW50IiwgIl9lbmNvZGVCb29sIl07CiAgICBmdW5jdGlvbiBVZSh0LCBlLCByKSB7CiAgICAgIGxldCBvID0ge307CiAgICAgIHRoaXMuX2Jhc2VTdGF0ZSA9IG8sIG8ubmFtZSA9IHIsIG8uZW5jID0gdCwgby5wYXJlbnQgPSBlIHx8IG51bGwsIG8uY2hpbGRyZW4gPSBudWxsLCBvLnRhZyA9IG51bGwsIG8uYXJncyA9IG51bGwsIG8ucmV2ZXJzZUFyZ3MgPSBudWxsLCBvLmNob2ljZSA9IG51bGwsIG8ub3B0aW9uYWwgPSBmYWxzZSwgby5hbnkgPSBmYWxzZSwgby5vYmogPSBmYWxzZSwgby51c2UgPSBudWxsLCBvLnVzZURlY29kZXIgPSBudWxsLCBvLmtleSA9IG51bGwsIG8uZGVmYXVsdCA9IG51bGwsIG8uZXhwbGljaXQgPSBudWxsLCBvLmltcGxpY2l0ID0gbnVsbCwgby5jb250YWlucyA9IG51bGwsIG8ucGFyZW50IHx8IChvLmNoaWxkcmVuID0gW10sIHRoaXMuX3dyYXAoKSk7CiAgICB9CiAgICBQeS5leHBvcnRzID0gVWU7CiAgICB2YXIgY0IgPSBbImVuYyIsICJwYXJlbnQiLCAiY2hpbGRyZW4iLCAidGFnIiwgImFyZ3MiLCAicmV2ZXJzZUFyZ3MiLCAiY2hvaWNlIiwgIm9wdGlvbmFsIiwgImFueSIsICJvYmoiLCAidXNlIiwgImFsdGVyZWRVc2UiLCAia2V5IiwgImRlZmF1bHQiLCAiZXhwbGljaXQiLCAiaW1wbGljaXQiLCAiY29udGFpbnMiXTsKICAgIFVlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMuX2Jhc2VTdGF0ZSwgciA9IHt9OwogICAgICBjQi5mb3JFYWNoKGZ1bmN0aW9uKGYpIHsKICAgICAgICByW2ZdID0gZVtmXTsKICAgICAgfSk7CiAgICAgIGxldCBvID0gbmV3IHRoaXMuY29uc3RydWN0b3Ioci5wYXJlbnQpOwogICAgICByZXR1cm4gby5fYmFzZVN0YXRlID0gciwgbzsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGV0IGUgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIGxCLmZvckVhY2goZnVuY3Rpb24ocikgewogICAgICAgIHRoaXNbcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGxldCBmID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7CiAgICAgICAgICByZXR1cm4gZS5jaGlsZHJlbi5wdXNoKGYpLCBmW3JdLmFwcGx5KGYsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgfSwgdGhpcyk7CiAgICB9OwogICAgVWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oZSkgewogICAgICBsZXQgciA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgUXQoci5wYXJlbnQgPT09IG51bGwpLCBlLmNhbGwodGhpcyksIHIuY2hpbGRyZW4gPSByLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihvKSB7CiAgICAgICAgcmV0dXJuIG8uX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IHRoaXM7CiAgICAgIH0sIHRoaXMpLCBRdC5lcXVhbChyLmNoaWxkcmVuLmxlbmd0aCwgMSwgIlJvb3Qgbm9kZSBjYW4gaGF2ZSBvbmx5IG9uZSBjaGlsZCIpOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fdXNlQXJncyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGUsIG8gPSBlLmZpbHRlcihmdW5jdGlvbihmKSB7CiAgICAgICAgcmV0dXJuIGYgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yOwogICAgICB9LCB0aGlzKTsKICAgICAgZSA9IGUuZmlsdGVyKGZ1bmN0aW9uKGYpIHsKICAgICAgICByZXR1cm4gIShmIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgICAgIH0sIHRoaXMpLCBvLmxlbmd0aCAhPT0gMCAmJiAoUXQoci5jaGlsZHJlbiA9PT0gbnVsbCksIHIuY2hpbGRyZW4gPSBvLCBvLmZvckVhY2goZnVuY3Rpb24oZikgewogICAgICAgIGYuX2Jhc2VTdGF0ZS5wYXJlbnQgPSB0aGlzOwogICAgICB9LCB0aGlzKSksIGUubGVuZ3RoICE9PSAwICYmIChRdChyLmFyZ3MgPT09IG51bGwpLCByLmFyZ3MgPSBlLCByLnJldmVyc2VBcmdzID0gZS5tYXAoZnVuY3Rpb24oZikgewogICAgICAgIGlmICh0eXBlb2YgZiAhPSAib2JqZWN0IiB8fCBmLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpCiAgICAgICAgICByZXR1cm4gZjsKICAgICAgICBsZXQgcCA9IHt9OwogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKG0yKSB7CiAgICAgICAgICBtMiA9PSAobTIgfCAwKSAmJiAobTIgfD0gMCk7CiAgICAgICAgICBsZXQgeTMgPSBmW20yXTsKICAgICAgICAgIHBbeTNdID0gbTI7CiAgICAgICAgfSksIHA7CiAgICAgIH0pKTsKICAgIH07CiAgICBkQi5mb3JFYWNoKGZ1bmN0aW9uKHQpIHsKICAgICAgVWUucHJvdG90eXBlW3RdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQgKyAiIG5vdCBpbXBsZW1lbnRlZCBmb3IgZW5jb2Rpbmc6ICIgKyByLmVuYyk7CiAgICAgIH07CiAgICB9KTsKICAgIER5LmZvckVhY2goZnVuY3Rpb24odCkgewogICAgICBVZS5wcm90b3R5cGVbdF0gPSBmdW5jdGlvbigpIHsKICAgICAgICBsZXQgciA9IHRoaXMuX2Jhc2VTdGF0ZSwgbyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIFF0KHIudGFnID09PSBudWxsKSwgci50YWcgPSB0LCB0aGlzLl91c2VBcmdzKG8pLCB0aGlzOwogICAgICB9OwogICAgfSk7CiAgICBVZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24oZSkgewogICAgICBRdChlKTsKICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBRdChyLnVzZSA9PT0gbnVsbCksIHIudXNlID0gZSwgdGhpczsKICAgIH07CiAgICBVZS5wcm90b3R5cGUub3B0aW9uYWwgPSBmdW5jdGlvbigpIHsKICAgICAgbGV0IGUgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBlLm9wdGlvbmFsID0gdHJ1ZSwgdGhpczsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuZGVmID0gZnVuY3Rpb24oZSkgewogICAgICBsZXQgciA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgcmV0dXJuIFF0KHIuZGVmYXVsdCA9PT0gbnVsbCksIHIuZGVmYXVsdCA9IGUsIHIub3B0aW9uYWwgPSB0cnVlLCB0aGlzOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5leHBsaWNpdCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBRdChyLmV4cGxpY2l0ID09PSBudWxsICYmIHIuaW1wbGljaXQgPT09IG51bGwpLCByLmV4cGxpY2l0ID0gZSwgdGhpczsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuaW1wbGljaXQgPSBmdW5jdGlvbihlKSB7CiAgICAgIGxldCByID0gdGhpcy5fYmFzZVN0YXRlOwogICAgICByZXR1cm4gUXQoci5leHBsaWNpdCA9PT0gbnVsbCAmJiByLmltcGxpY2l0ID09PSBudWxsKSwgci5pbXBsaWNpdCA9IGUsIHRoaXM7CiAgICB9OwogICAgVWUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZSA9IHRoaXMuX2Jhc2VTdGF0ZSwgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiBlLm9iaiA9IHRydWUsIHIubGVuZ3RoICE9PSAwICYmIHRoaXMuX3VzZUFyZ3MociksIHRoaXM7CiAgICB9OwogICAgVWUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBRdChyLmtleSA9PT0gbnVsbCksIHIua2V5ID0gZSwgdGhpczsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCBlID0gdGhpcy5fYmFzZVN0YXRlOwogICAgICByZXR1cm4gZS5hbnkgPSB0cnVlLCB0aGlzOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5jaG9pY2UgPSBmdW5jdGlvbihlKSB7CiAgICAgIGxldCByID0gdGhpcy5fYmFzZVN0YXRlOwogICAgICByZXR1cm4gUXQoci5jaG9pY2UgPT09IG51bGwpLCByLmNob2ljZSA9IGUsIHRoaXMuX3VzZUFyZ3MoT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKG8pIHsKICAgICAgICByZXR1cm4gZVtvXTsKICAgICAgfSkpLCB0aGlzOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBRdChyLnVzZSA9PT0gbnVsbCksIHIuY29udGFpbnMgPSBlLCB0aGlzOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgaWYgKG8ucGFyZW50ID09PSBudWxsKQogICAgICAgIHJldHVybiBlLndyYXBSZXN1bHQoby5jaGlsZHJlblswXS5fZGVjb2RlKGUsIHIpKTsKICAgICAgbGV0IGYgPSBvLmRlZmF1bHQsIHAgPSB0cnVlLCBtMiA9IG51bGw7CiAgICAgIGlmIChvLmtleSAhPT0gbnVsbCAmJiAobTIgPSBlLmVudGVyS2V5KG8ua2V5KSksIG8ub3B0aW9uYWwpIHsKICAgICAgICBsZXQgTSA9IG51bGw7CiAgICAgICAgaWYgKG8uZXhwbGljaXQgIT09IG51bGwgPyBNID0gby5leHBsaWNpdCA6IG8uaW1wbGljaXQgIT09IG51bGwgPyBNID0gby5pbXBsaWNpdCA6IG8udGFnICE9PSBudWxsICYmIChNID0gby50YWcpLCBNID09PSBudWxsICYmICFvLmFueSkgewogICAgICAgICAgbGV0IHggPSBlLnNhdmUoKTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG8uY2hvaWNlID09PSBudWxsID8gdGhpcy5fZGVjb2RlR2VuZXJpYyhvLnRhZywgZSwgcikgOiB0aGlzLl9kZWNvZGVDaG9pY2UoZSwgciksIHAgPSB0cnVlOwogICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHAgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGUucmVzdG9yZSh4KTsKICAgICAgICB9IGVsc2UgaWYgKHAgPSB0aGlzLl9wZWVrVGFnKGUsIE0sIG8uYW55KSwgZS5pc0Vycm9yKHApKQogICAgICAgICAgcmV0dXJuIHA7CiAgICAgIH0KICAgICAgbGV0IHkzOwogICAgICBpZiAoby5vYmogJiYgcCAmJiAoeTMgPSBlLmVudGVyT2JqZWN0KCkpLCBwKSB7CiAgICAgICAgaWYgKG8uZXhwbGljaXQgIT09IG51bGwpIHsKICAgICAgICAgIGxldCB4ID0gdGhpcy5fZGVjb2RlVGFnKGUsIG8uZXhwbGljaXQpOwogICAgICAgICAgaWYgKGUuaXNFcnJvcih4KSkKICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgICBlID0geDsKICAgICAgICB9CiAgICAgICAgbGV0IE0gPSBlLm9mZnNldDsKICAgICAgICBpZiAoby51c2UgPT09IG51bGwgJiYgby5jaG9pY2UgPT09IG51bGwpIHsKICAgICAgICAgIGxldCB4OwogICAgICAgICAgby5hbnkgJiYgKHggPSBlLnNhdmUoKSk7CiAgICAgICAgICBsZXQgUyA9IHRoaXMuX2RlY29kZVRhZyhlLCBvLmltcGxpY2l0ICE9PSBudWxsID8gby5pbXBsaWNpdCA6IG8udGFnLCBvLmFueSk7CiAgICAgICAgICBpZiAoZS5pc0Vycm9yKFMpKQogICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICAgIG8uYW55ID8gZiA9IGUucmF3KHgpIDogZSA9IFM7CiAgICAgICAgfQogICAgICAgIGlmIChyICYmIHIudHJhY2sgJiYgby50YWcgIT09IG51bGwgJiYgci50cmFjayhlLnBhdGgoKSwgTSwgZS5sZW5ndGgsICJ0YWdnZWQiKSwgciAmJiByLnRyYWNrICYmIG8udGFnICE9PSBudWxsICYmIHIudHJhY2soZS5wYXRoKCksIGUub2Zmc2V0LCBlLmxlbmd0aCwgImNvbnRlbnQiKSwgby5hbnkgfHwgKG8uY2hvaWNlID09PSBudWxsID8gZiA9IHRoaXMuX2RlY29kZUdlbmVyaWMoby50YWcsIGUsIHIpIDogZiA9IHRoaXMuX2RlY29kZUNob2ljZShlLCByKSksIGUuaXNFcnJvcihmKSkKICAgICAgICAgIHJldHVybiBmOwogICAgICAgIGlmICghby5hbnkgJiYgby5jaG9pY2UgPT09IG51bGwgJiYgby5jaGlsZHJlbiAhPT0gbnVsbCAmJiBvLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oUykgewogICAgICAgICAgUy5fZGVjb2RlKGUsIHIpOwogICAgICAgIH0pLCBvLmNvbnRhaW5zICYmIChvLnRhZyA9PT0gIm9jdHN0ciIgfHwgby50YWcgPT09ICJiaXRzdHIiKSkgewogICAgICAgICAgbGV0IHggPSBuZXcgdUIoZik7CiAgICAgICAgICBmID0gdGhpcy5fZ2V0VXNlKG8uY29udGFpbnMsIGUuX3JlcG9ydGVyU3RhdGUub2JqKS5fZGVjb2RlKHgsIHIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gby5vYmogJiYgcCAmJiAoZiA9IGUubGVhdmVPYmplY3QoeTMpKSwgby5rZXkgIT09IG51bGwgJiYgKGYgIT09IG51bGwgfHwgcCA9PT0gdHJ1ZSkgPyBlLmxlYXZlS2V5KG0yLCBvLmtleSwgZikgOiBtMiAhPT0gbnVsbCAmJiBlLmV4aXRLZXkobTIpLCBmOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYyA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgbGV0IGYgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIHJldHVybiBlID09PSAic2VxIiB8fCBlID09PSAic2V0IiA/IG51bGwgOiBlID09PSAic2Vxb2YiIHx8IGUgPT09ICJzZXRvZiIgPyB0aGlzLl9kZWNvZGVMaXN0KHIsIGUsIGYuYXJnc1swXSwgbykgOiAvc3RyJC8udGVzdChlKSA/IHRoaXMuX2RlY29kZVN0cihyLCBlLCBvKSA6IGUgPT09ICJvYmppZCIgJiYgZi5hcmdzID8gdGhpcy5fZGVjb2RlT2JqaWQociwgZi5hcmdzWzBdLCBmLmFyZ3NbMV0sIG8pIDogZSA9PT0gIm9iamlkIiA/IHRoaXMuX2RlY29kZU9iamlkKHIsIG51bGwsIG51bGwsIG8pIDogZSA9PT0gImdlbnRpbWUiIHx8IGUgPT09ICJ1dGN0aW1lIiA/IHRoaXMuX2RlY29kZVRpbWUociwgZSwgbykgOiBlID09PSAibnVsbF8iID8gdGhpcy5fZGVjb2RlTnVsbChyLCBvKSA6IGUgPT09ICJib29sIiA/IHRoaXMuX2RlY29kZUJvb2wociwgbykgOiBlID09PSAib2JqRGVzYyIgPyB0aGlzLl9kZWNvZGVTdHIociwgZSwgbykgOiBlID09PSAiaW50IiB8fCBlID09PSAiZW51bSIgPyB0aGlzLl9kZWNvZGVJbnQociwgZi5hcmdzICYmIGYuYXJnc1swXSwgbykgOiBmLnVzZSAhPT0gbnVsbCA/IHRoaXMuX2dldFVzZShmLnVzZSwgci5fcmVwb3J0ZXJTdGF0ZS5vYmopLl9kZWNvZGUociwgbykgOiByLmVycm9yKCJ1bmtub3duIHRhZzogIiArIGUpOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZ2V0VXNlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgcmV0dXJuIG8udXNlRGVjb2RlciA9IHRoaXMuX3VzZShlLCByKSwgUXQoby51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKSwgby51c2VEZWNvZGVyID0gby51c2VEZWNvZGVyLl9iYXNlU3RhdGUuY2hpbGRyZW5bMF0sIG8uaW1wbGljaXQgIT09IG8udXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ICYmIChvLnVzZURlY29kZXIgPSBvLnVzZURlY29kZXIuY2xvbmUoKSwgby51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBvLmltcGxpY2l0KSwgby51c2VEZWNvZGVyOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX2Jhc2VTdGF0ZSwgZiA9IG51bGwsIHAgPSBmYWxzZTsKICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG8uY2hvaWNlKS5zb21lKGZ1bmN0aW9uKG0yKSB7CiAgICAgICAgbGV0IHkzID0gZS5zYXZlKCksIE0gPSBvLmNob2ljZVttMl07CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxldCB4ID0gTS5fZGVjb2RlKGUsIHIpOwogICAgICAgICAgaWYgKGUuaXNFcnJvcih4KSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgZiA9IHsgdHlwZTogbTIsIHZhbHVlOiB4IH0sIHAgPSB0cnVlOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgcmV0dXJuIGUucmVzdG9yZSh5MyksIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwgdGhpcyksIHAgPyBmIDogZS5lcnJvcigiQ2hvaWNlIG5vdCBtYXRjaGVkIik7CiAgICB9OwogICAgVWUucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gbmV3IGhCKGUsIHRoaXMucmVwb3J0ZXIpOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBsZXQgZiA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgaWYgKGYuZGVmYXVsdCAhPT0gbnVsbCAmJiBmLmRlZmF1bHQgPT09IGUpCiAgICAgICAgcmV0dXJuOwogICAgICBsZXQgcCA9IHRoaXMuX2VuY29kZVZhbHVlKGUsIHIsIG8pOwogICAgICBpZiAocCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLl9za2lwRGVmYXVsdChwLCByLCBvKSkKICAgICAgICByZXR1cm4gcDsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuX2VuY29kZVZhbHVlID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBsZXQgZiA9IHRoaXMuX2Jhc2VTdGF0ZTsKICAgICAgaWYgKGYucGFyZW50ID09PSBudWxsKQogICAgICAgIHJldHVybiBmLmNoaWxkcmVuWzBdLl9lbmNvZGUoZSwgciB8fCBuZXcgc0IpOwogICAgICBsZXQgcCA9IG51bGw7CiAgICAgIGlmICh0aGlzLnJlcG9ydGVyID0gciwgZi5vcHRpb25hbCAmJiBlID09PSB1bmRlZmluZWQpCiAgICAgICAgaWYgKGYuZGVmYXVsdCAhPT0gbnVsbCkKICAgICAgICAgIGUgPSBmLmRlZmF1bHQ7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuOwogICAgICBsZXQgbTIgPSBudWxsLCB5MyA9IGZhbHNlOwogICAgICBpZiAoZi5hbnkpCiAgICAgICAgcCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZSk7CiAgICAgIGVsc2UgaWYgKGYuY2hvaWNlKQogICAgICAgIHAgPSB0aGlzLl9lbmNvZGVDaG9pY2UoZSwgcik7CiAgICAgIGVsc2UgaWYgKGYuY29udGFpbnMpCiAgICAgICAgbTIgPSB0aGlzLl9nZXRVc2UoZi5jb250YWlucywgbykuX2VuY29kZShlLCByKSwgeTMgPSB0cnVlOwogICAgICBlbHNlIGlmIChmLmNoaWxkcmVuKQogICAgICAgIG0yID0gZi5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oTSkgewogICAgICAgICAgaWYgKE0uX2Jhc2VTdGF0ZS50YWcgPT09ICJudWxsXyIpCiAgICAgICAgICAgIHJldHVybiBNLl9lbmNvZGUobnVsbCwgciwgZSk7CiAgICAgICAgICBpZiAoTS5fYmFzZVN0YXRlLmtleSA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIHIuZXJyb3IoIkNoaWxkIHNob3VsZCBoYXZlIGEga2V5Iik7CiAgICAgICAgICBsZXQgeCA9IHIuZW50ZXJLZXkoTS5fYmFzZVN0YXRlLmtleSk7CiAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gIm9iamVjdCIpCiAgICAgICAgICAgIHJldHVybiByLmVycm9yKCJDaGlsZCBleHBlY3RlZCwgYnV0IGlucHV0IGlzIG5vdCBvYmplY3QiKTsKICAgICAgICAgIGxldCBTID0gTS5fZW5jb2RlKGVbTS5fYmFzZVN0YXRlLmtleV0sIHIsIGUpOwogICAgICAgICAgcmV0dXJuIHIubGVhdmVLZXkoeCksIFM7CiAgICAgICAgfSwgdGhpcykuZmlsdGVyKGZ1bmN0aW9uKE0pIHsKICAgICAgICAgIHJldHVybiBNOwogICAgICAgIH0pLCBtMiA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIobTIpOwogICAgICBlbHNlIGlmIChmLnRhZyA9PT0gInNlcW9mIiB8fCBmLnRhZyA9PT0gInNldG9mIikgewogICAgICAgIGlmICghKGYuYXJncyAmJiBmLmFyZ3MubGVuZ3RoID09PSAxKSkKICAgICAgICAgIHJldHVybiByLmVycm9yKCJUb28gbWFueSBhcmdzIGZvciA6ICIgKyBmLnRhZyk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgcmV0dXJuIHIuZXJyb3IoInNlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXkiKTsKICAgICAgICBsZXQgTSA9IHRoaXMuY2xvbmUoKTsKICAgICAgICBNLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsLCBtMiA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZS5tYXAoZnVuY3Rpb24oeCkgewogICAgICAgICAgbGV0IFMgPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKFMuYXJnc1swXSwgZSkuX2VuY29kZSh4LCByKTsKICAgICAgICB9LCBNKSk7CiAgICAgIH0gZWxzZQogICAgICAgIGYudXNlICE9PSBudWxsID8gcCA9IHRoaXMuX2dldFVzZShmLnVzZSwgbykuX2VuY29kZShlLCByKSA6IChtMiA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShmLnRhZywgZSksIHkzID0gdHJ1ZSk7CiAgICAgIGlmICghZi5hbnkgJiYgZi5jaG9pY2UgPT09IG51bGwpIHsKICAgICAgICBsZXQgTSA9IGYuaW1wbGljaXQgIT09IG51bGwgPyBmLmltcGxpY2l0IDogZi50YWcsIHggPSBmLmltcGxpY2l0ID09PSBudWxsID8gInVuaXZlcnNhbCIgOiAiY29udGV4dCI7CiAgICAgICAgTSA9PT0gbnVsbCA/IGYudXNlID09PSBudWxsICYmIHIuZXJyb3IoIlRhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKSIpIDogZi51c2UgPT09IG51bGwgJiYgKHAgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUoTSwgeTMsIHgsIG0yKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGYuZXhwbGljaXQgIT09IG51bGwgJiYgKHAgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUoZi5leHBsaWNpdCwgZmFsc2UsICJjb250ZXh0IiwgcCkpLCBwOwogICAgfTsKICAgIFVlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24oZSwgcikgewogICAgICBsZXQgbyA9IHRoaXMuX2Jhc2VTdGF0ZSwgZiA9IG8uY2hvaWNlW2UudHlwZV07CiAgICAgIHJldHVybiBmIHx8IFF0KGZhbHNlLCBlLnR5cGUgKyAiIG5vdCBmb3VuZCBpbiAiICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoby5jaG9pY2UpKSksIGYuX2VuY29kZShlLnZhbHVlLCByKTsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuX2VuY29kZVByaW1pdGl2ZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgbGV0IG8gPSB0aGlzLl9iYXNlU3RhdGU7CiAgICAgIGlmICgvc3RyJC8udGVzdChlKSkKICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKHIsIGUpOwogICAgICBpZiAoZSA9PT0gIm9iamlkIiAmJiBvLmFyZ3MpCiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKHIsIG8ucmV2ZXJzZUFyZ3NbMF0sIG8uYXJnc1sxXSk7CiAgICAgIGlmIChlID09PSAib2JqaWQiKQogICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChyLCBudWxsLCBudWxsKTsKICAgICAgaWYgKGUgPT09ICJnZW50aW1lIiB8fCBlID09PSAidXRjdGltZSIpCiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUociwgZSk7CiAgICAgIGlmIChlID09PSAibnVsbF8iKQogICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7CiAgICAgIGlmIChlID09PSAiaW50IiB8fCBlID09PSAiZW51bSIpCiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChyLCBvLmFyZ3MgJiYgby5yZXZlcnNlQXJnc1swXSk7CiAgICAgIGlmIChlID09PSAiYm9vbCIpCiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2wocik7CiAgICAgIGlmIChlID09PSAib2JqRGVzYyIpCiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihyLCBlKTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCB0YWc6ICIgKyBlKTsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuX2lzTnVtc3RyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gL15bMC05IF0qJC8udGVzdChlKTsKICAgIH07CiAgICBVZS5wcm90b3R5cGUuX2lzUHJpbnRzdHIgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiAvXltBLVphLXowLTkgJygpKywtLi86PT9dKiQvLnRlc3QoZSk7CiAgICB9OwogIH0pOwogIGMwID0gVDIoKFduKSA9PiB7CiAgICBmdW5jdGlvbiBDeSh0KSB7CiAgICAgIGxldCBlID0ge307CiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgICAociB8IDApID09IHIgJiYgKHIgPSByIHwgMCk7CiAgICAgICAgbGV0IG8gPSB0W3JdOwogICAgICAgIGVbb10gPSByOwogICAgICB9KSwgZTsKICAgIH0KICAgIFduLnRhZ0NsYXNzID0geyAwOiAidW5pdmVyc2FsIiwgMTogImFwcGxpY2F0aW9uIiwgMjogImNvbnRleHQiLCAzOiAicHJpdmF0ZSIgfTsKICAgIFduLnRhZ0NsYXNzQnlOYW1lID0gQ3koV24udGFnQ2xhc3MpOwogICAgV24udGFnID0geyAwOiAiZW5kIiwgMTogImJvb2wiLCAyOiAiaW50IiwgMzogImJpdHN0ciIsIDQ6ICJvY3RzdHIiLCA1OiAibnVsbF8iLCA2OiAib2JqaWQiLCA3OiAib2JqRGVzYyIsIDg6ICJleHRlcm5hbCIsIDk6ICJyZWFsIiwgMTA6ICJlbnVtIiwgMTE6ICJlbWJlZCIsIDEyOiAidXRmOHN0ciIsIDEzOiAicmVsYXRpdmVPaWQiLCAxNjogInNlcSIsIDE3OiAic2V0IiwgMTg6ICJudW1zdHIiLCAxOTogInByaW50c3RyIiwgMjA6ICJ0NjFzdHIiLCAyMTogInZpZGVvc3RyIiwgMjI6ICJpYTVzdHIiLCAyMzogInV0Y3RpbWUiLCAyNDogImdlbnRpbWUiLCAyNTogImdyYXBoc3RyIiwgMjY6ICJpc282NDZzdHIiLCAyNzogImdlbnN0ciIsIDI4OiAidW5pc3RyIiwgMjk6ICJjaGFyc3RyIiwgMzA6ICJibXBzdHIiIH07CiAgICBXbi50YWdCeU5hbWUgPSBDeShXbi50YWcpOwogIH0pOwogIG5kID0gVDIoKHRMLCBVeSkgPT4gewogICAgdmFyIHBCID0gSWUoKSwgSWkgPSBoMCgpLkJ1ZmZlciwgT3kgPSBkMCgpLCBpZCA9IGMwKCk7CiAgICBmdW5jdGlvbiBGeSh0KSB7CiAgICAgIHRoaXMuZW5jID0gImRlciIsIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5lbnRpdHkgPSB0LCB0aGlzLnRyZWUgPSBuZXcgVXIsIHRoaXMudHJlZS5faW5pdCh0LmJvZHkpOwogICAgfQogICAgVXkuZXhwb3J0cyA9IEZ5OwogICAgRnkucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIHRoaXMudHJlZS5fZW5jb2RlKGUsIHIpLmpvaW4oKTsKICAgIH07CiAgICBmdW5jdGlvbiBVcih0KSB7CiAgICAgIE95LmNhbGwodGhpcywgImRlciIsIHQpOwogICAgfQogICAgcEIoVXIsIE95KTsKICAgIFVyLnByb3RvdHlwZS5fZW5jb2RlQ29tcG9zaXRlID0gZnVuY3Rpb24oZSwgciwgbywgZikgewogICAgICBsZXQgcCA9IHZCKGUsIHIsIG8sIHRoaXMucmVwb3J0ZXIpOwogICAgICBpZiAoZi5sZW5ndGggPCAxMjgpIHsKICAgICAgICBsZXQgTSA9IElpLmFsbG9jKDIpOwogICAgICAgIHJldHVybiBNWzBdID0gcCwgTVsxXSA9IGYubGVuZ3RoLCB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFtNLCBmXSk7CiAgICAgIH0KICAgICAgbGV0IG0yID0gMTsKICAgICAgZm9yIChsZXQgTSA9IGYubGVuZ3RoO00gPj0gMjU2OyBNID4+PSA4KQogICAgICAgIG0yKys7CiAgICAgIGxldCB5MyA9IElpLmFsbG9jKDEgKyAxICsgbTIpOwogICAgICB5M1swXSA9IHAsIHkzWzFdID0gMTI4IHwgbTI7CiAgICAgIGZvciAobGV0IE0gPSAxICsgbTIsIHggPSBmLmxlbmd0aDt4ID4gMDsgTS0tLCB4ID4+PSA4KQogICAgICAgIHkzW01dID0geCAmIDI1NTsKICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW3kzLCBmXSk7CiAgICB9OwogICAgVXIucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmIChyID09PSAiYml0c3RyIikKICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbZS51bnVzZWQgfCAwLCBlLmRhdGFdKTsKICAgICAgaWYgKHIgPT09ICJibXBzdHIiKSB7CiAgICAgICAgbGV0IG8gPSBJaS5hbGxvYyhlLmxlbmd0aCAqIDIpOwogICAgICAgIGZvciAobGV0IGYgPSAwO2YgPCBlLmxlbmd0aDsgZisrKQogICAgICAgICAgby53cml0ZVVJbnQxNkJFKGUuY2hhckNvZGVBdChmKSwgZiAqIDIpOwogICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG8pOwogICAgICB9IGVsc2UKICAgICAgICByZXR1cm4gciA9PT0gIm51bXN0ciIgPyB0aGlzLl9pc051bXN0cihlKSA/IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZSkgOiB0aGlzLnJlcG9ydGVyLmVycm9yKCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHN1cHBvcnRzIG9ubHkgZGlnaXRzIGFuZCBzcGFjZSIpIDogciA9PT0gInByaW50c3RyIiA/IHRoaXMuX2lzUHJpbnRzdHIoZSkgPyB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGUpIDogdGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzIG9ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggcGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sIHF1ZXN0aW9uIG1hcmsiKSA6IC9zdHIkLy50ZXN0KHIpID8gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihlKSA6IHIgPT09ICJvYmpEZXNjIiA/IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZSkgOiB0aGlzLnJlcG9ydGVyLmVycm9yKCJFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogIiArIHIgKyAiIHVuc3VwcG9ydGVkIik7CiAgICB9OwogICAgVXIucHJvdG90eXBlLl9lbmNvZGVPYmppZCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgaWYgKHR5cGVvZiBlID09ICJzdHJpbmciKSB7CiAgICAgICAgaWYgKCFyKQogICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoInN0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQiKTsKICAgICAgICBpZiAoIXIuaGFzT3duUHJvcGVydHkoZSkpCiAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcigib2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAiKTsKICAgICAgICBlID0gcltlXS5zcGxpdCgvW1xzLl0rL2cpOwogICAgICAgIGZvciAobGV0IHkzID0gMDt5MyA8IGUubGVuZ3RoOyB5MysrKQogICAgICAgICAgZVt5M10gfD0gMDsKICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgZSA9IGUuc2xpY2UoKTsKICAgICAgICBmb3IgKGxldCB5MyA9IDA7eTMgPCBlLmxlbmd0aDsgeTMrKykKICAgICAgICAgIGVbeTNdIHw9IDA7CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKQogICAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCBnb3Q6ICIgKyBKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgIGlmICghbykgewogICAgICAgIGlmIChlWzFdID49IDQwKQogICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIlNlY29uZCBvYmppZCBpZGVudGlmaWVyIE9PQiIpOwogICAgICAgIGUuc3BsaWNlKDAsIDIsIGVbMF0gKiA0MCArIGVbMV0pOwogICAgICB9CiAgICAgIGxldCBmID0gMDsKICAgICAgZm9yIChsZXQgeTMgPSAwO3kzIDwgZS5sZW5ndGg7IHkzKyspIHsKICAgICAgICBsZXQgTSA9IGVbeTNdOwogICAgICAgIGZvciAoZisrO00gPj0gMTI4OyBNID4+PSA3KQogICAgICAgICAgZisrOwogICAgICB9CiAgICAgIGxldCBwID0gSWkuYWxsb2MoZiksIG0yID0gcC5sZW5ndGggLSAxOwogICAgICBmb3IgKGxldCB5MyA9IGUubGVuZ3RoIC0gMTt5MyA+PSAwOyB5My0tKSB7CiAgICAgICAgbGV0IE0gPSBlW3kzXTsKICAgICAgICBmb3IgKHBbbTItLV0gPSBNICYgMTI3OyhNID4+PSA3KSA+IDA7ICkKICAgICAgICAgIHBbbTItLV0gPSAxMjggfCBNICYgMTI3OwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHApOwogICAgfTsKICAgIGZ1bmN0aW9uIHFyKHQpIHsKICAgICAgcmV0dXJuIHQgPCAxMCA/ICIwIiArIHQgOiB0OwogICAgfQogICAgVXIucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24oZSwgcikgewogICAgICBsZXQgbywgZiA9IG5ldyBEYXRlKGUpOwogICAgICByZXR1cm4gciA9PT0gImdlbnRpbWUiID8gbyA9IFtxcihmLmdldFVUQ0Z1bGxZZWFyKCkpLCBxcihmLmdldFVUQ01vbnRoKCkgKyAxKSwgcXIoZi5nZXRVVENEYXRlKCkpLCBxcihmLmdldFVUQ0hvdXJzKCkpLCBxcihmLmdldFVUQ01pbnV0ZXMoKSksIHFyKGYuZ2V0VVRDU2Vjb25kcygpKSwgIloiXS5qb2luKCIiKSA6IHIgPT09ICJ1dGN0aW1lIiA/IG8gPSBbcXIoZi5nZXRVVENGdWxsWWVhcigpICUgMTAwKSwgcXIoZi5nZXRVVENNb250aCgpICsgMSksIHFyKGYuZ2V0VVRDRGF0ZSgpKSwgcXIoZi5nZXRVVENIb3VycygpKSwgcXIoZi5nZXRVVENNaW51dGVzKCkpLCBxcihmLmdldFVUQ1NlY29uZHMoKSksICJaIl0uam9pbigiIikgOiB0aGlzLnJlcG9ydGVyLmVycm9yKCJFbmNvZGluZyAiICsgciArICIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpLCB0aGlzLl9lbmNvZGVTdHIobywgIm9jdHN0ciIpOwogICAgfTsKICAgIFVyLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcigiIik7CiAgICB9OwogICAgVXIucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIikgewogICAgICAgIGlmICghcikKICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCJTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIik7CiAgICAgICAgaWYgKCFyLmhhc093blByb3BlcnR5KGUpKQogICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIlZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluOiAiICsgSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgIGUgPSByW2VdOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZSAhPSAibnVtYmVyIiAmJiAhSWkuaXNCdWZmZXIoZSkpIHsKICAgICAgICBsZXQgcCA9IGUudG9BcnJheSgpOwogICAgICAgICFlLnNpZ24gJiYgcFswXSAmIDEyOCAmJiBwLnVuc2hpZnQoMCksIGUgPSBJaS5mcm9tKHApOwogICAgICB9CiAgICAgIGlmIChJaS5pc0J1ZmZlcihlKSkgewogICAgICAgIGxldCBwID0gZS5sZW5ndGg7CiAgICAgICAgZS5sZW5ndGggPT09IDAgJiYgcCsrOwogICAgICAgIGxldCBtMiA9IElpLmFsbG9jKHApOwogICAgICAgIHJldHVybiBlLmNvcHkobTIpLCBlLmxlbmd0aCA9PT0gMCAmJiAobTJbMF0gPSAwKSwgdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihtMik7CiAgICAgIH0KICAgICAgaWYgKGUgPCAxMjgpCiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZSk7CiAgICAgIGlmIChlIDwgMjU2KQogICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBlXSk7CiAgICAgIGxldCBvID0gMTsKICAgICAgZm9yIChsZXQgcCA9IGU7cCA+PSAyNTY7IHAgPj49IDgpCiAgICAgICAgbysrOwogICAgICBsZXQgZiA9IG5ldyBBcnJheShvKTsKICAgICAgZm9yIChsZXQgcCA9IGYubGVuZ3RoIC0gMTtwID49IDA7IHAtLSkKICAgICAgICBmW3BdID0gZSAmIDI1NSwgZSA+Pj0gODsKICAgICAgcmV0dXJuIGZbMF0gJiAxMjggJiYgZi51bnNoaWZ0KDApLCB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKElpLmZyb20oZikpOwogICAgfTsKICAgIFVyLnByb3RvdHlwZS5fZW5jb2RlQm9vbCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZSA/IDI1NSA6IDApOwogICAgfTsKICAgIFVyLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdHlwZW9mIGUgPT0gImZ1bmN0aW9uIiAmJiAoZSA9IGUocikpLCBlLl9nZXRFbmNvZGVyKCJkZXIiKS50cmVlOwogICAgfTsKICAgIFVyLnByb3RvdHlwZS5fc2tpcERlZmF1bHQgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIGxldCBmID0gdGhpcy5fYmFzZVN0YXRlLCBwOwogICAgICBpZiAoZi5kZWZhdWx0ID09PSBudWxsKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgbGV0IG0yID0gZS5qb2luKCk7CiAgICAgIGlmIChmLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZCAmJiAoZi5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoZi5kZWZhdWx0LCByLCBvKS5qb2luKCkpLCBtMi5sZW5ndGggIT09IGYuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKHAgPSAwO3AgPCBtMi5sZW5ndGg7IHArKykKICAgICAgICBpZiAobTJbcF0gIT09IGYuZGVmYXVsdEJ1ZmZlcltwXSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogICAgZnVuY3Rpb24gdkIodCwgZSwgciwgbykgewogICAgICBsZXQgZjsKICAgICAgaWYgKHQgPT09ICJzZXFvZiIgPyB0ID0gInNlcSIgOiB0ID09PSAic2V0b2YiICYmICh0ID0gInNldCIpLCBpZC50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodCkpCiAgICAgICAgZiA9IGlkLnRhZ0J5TmFtZVt0XTsKICAgICAgZWxzZSBpZiAodHlwZW9mIHQgPT0gIm51bWJlciIgJiYgKHQgfCAwKSA9PT0gdCkKICAgICAgICBmID0gdDsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBvLmVycm9yKCJVbmtub3duIHRhZzogIiArIHQpOwogICAgICByZXR1cm4gZiA+PSAzMSA/IG8uZXJyb3IoIk11bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCIpIDogKGUgfHwgKGYgfD0gMzIpLCBmIHw9IGlkLnRhZ0NsYXNzQnlOYW1lW3IgfHwgInVuaXZlcnNhbCJdIDw8IDYsIGYpOwogICAgfQogIH0pOwogIEh5ID0gVDIoKHJMLCB6eSkgPT4gewogICAgdmFyIGJCID0gSWUoKSwgZmQgPSBuZCgpOwogICAgZnVuY3Rpb24gYWQodCkgewogICAgICBmZC5jYWxsKHRoaXMsIHQpLCB0aGlzLmVuYyA9ICJwZW0iOwogICAgfQogICAgYkIoYWQsIGZkKTsKICAgIHp5LmV4cG9ydHMgPSBhZDsKICAgIGFkLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGxldCBmID0gZmQucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGUpLnRvU3RyaW5nKCJiYXNlNjQiKSwgcCA9IFsiLS0tLS1CRUdJTiAiICsgci5sYWJlbCArICItLS0tLSJdOwogICAgICBmb3IgKGxldCBtMiA9IDA7bTIgPCBmLmxlbmd0aDsgbTIgKz0gNjQpCiAgICAgICAgcC5wdXNoKGYuc2xpY2UobTIsIG0yICsgNjQpKTsKICAgICAgcmV0dXJuIHAucHVzaCgiLS0tLS1FTkQgIiArIHIubGFiZWwgKyAiLS0tLS0iKSwgcC5qb2luKGAKYCk7CiAgICB9OwogIH0pOwogIG9kID0gVDIoKEt5KSA9PiB7CiAgICB2YXIgV3kgPSBLeTsKICAgIFd5LmRlciA9IG5kKCk7CiAgICBXeS5wZW0gPSBIeSgpOwogIH0pOwogIGhkID0gVDIoKG5MLCBZeSkgPT4gewogICAgdmFyIG1CID0gSWUoKSwgZ0IgPSB0ZCgpLCBqeSA9IEtmKCkuRGVjb2RlckJ1ZmZlciwgVnkgPSBkMCgpLCBaeSA9IGMwKCk7CiAgICBmdW5jdGlvbiAkeSh0KSB7CiAgICAgIHRoaXMuZW5jID0gImRlciIsIHRoaXMubmFtZSA9IHQubmFtZSwgdGhpcy5lbnRpdHkgPSB0LCB0aGlzLnRyZWUgPSBuZXcgc3IsIHRoaXMudHJlZS5faW5pdCh0LmJvZHkpOwogICAgfQogICAgWXkuZXhwb3J0cyA9ICR5OwogICAgJHkucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIGp5LmlzRGVjb2RlckJ1ZmZlcihlKSB8fCAoZSA9IG5ldyBqeShlLCByKSksIHRoaXMudHJlZS5fZGVjb2RlKGUsIHIpOwogICAgfTsKICAgIGZ1bmN0aW9uIHNyKHQpIHsKICAgICAgVnkuY2FsbCh0aGlzLCAiZGVyIiwgdCk7CiAgICB9CiAgICBtQihzciwgVnkpOwogICAgc3IucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICBpZiAoZS5pc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBsZXQgZiA9IGUuc2F2ZSgpLCBwID0gc2QoZSwgJ0ZhaWxlZCB0byBwZWVrIHRhZzogIicgKyByICsgJyInKTsKICAgICAgcmV0dXJuIGUuaXNFcnJvcihwKSA/IHAgOiAoZS5yZXN0b3JlKGYpLCBwLnRhZyA9PT0gciB8fCBwLnRhZ1N0ciA9PT0gciB8fCBwLnRhZ1N0ciArICJvZiIgPT09IHIgfHwgbyk7CiAgICB9OwogICAgc3IucHJvdG90eXBlLl9kZWNvZGVUYWcgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIGxldCBmID0gc2QoZSwgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mICInICsgciArICciJyk7CiAgICAgIGlmIChlLmlzRXJyb3IoZikpCiAgICAgICAgcmV0dXJuIGY7CiAgICAgIGxldCBwID0gR3koZSwgZi5wcmltaXRpdmUsICdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiAiJyArIHIgKyAnIicpOwogICAgICBpZiAoZS5pc0Vycm9yKHApKQogICAgICAgIHJldHVybiBwOwogICAgICBpZiAoIW8gJiYgZi50YWcgIT09IHIgJiYgZi50YWdTdHIgIT09IHIgJiYgZi50YWdTdHIgKyAib2YiICE9PSByKQogICAgICAgIHJldHVybiBlLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiAiJyArIHIgKyAnIicpOwogICAgICBpZiAoZi5wcmltaXRpdmUgfHwgcCAhPT0gbnVsbCkKICAgICAgICByZXR1cm4gZS5za2lwKHAsICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogIicgKyByICsgJyInKTsKICAgICAgbGV0IG0yID0gZS5zYXZlKCksIHkzID0gdGhpcy5fc2tpcFVudGlsRW5kKGUsICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiAiJyArIHRoaXMudGFnICsgJyInKTsKICAgICAgcmV0dXJuIGUuaXNFcnJvcih5MykgPyB5MyA6IChwID0gZS5vZmZzZXQgLSBtMi5vZmZzZXQsIGUucmVzdG9yZShtMiksIGUuc2tpcChwLCAnRmFpbGVkIHRvIG1hdGNoIGJvZHkgb2Y6ICInICsgciArICciJykpOwogICAgfTsKICAgIHNyLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kID0gZnVuY3Rpb24oZSwgcikgewogICAgICBmb3IgKDs7ICkgewogICAgICAgIGxldCBvID0gc2QoZSwgcik7CiAgICAgICAgaWYgKGUuaXNFcnJvcihvKSkKICAgICAgICAgIHJldHVybiBvOwogICAgICAgIGxldCBmID0gR3koZSwgby5wcmltaXRpdmUsIHIpOwogICAgICAgIGlmIChlLmlzRXJyb3IoZikpCiAgICAgICAgICByZXR1cm4gZjsKICAgICAgICBsZXQgcDsKICAgICAgICBpZiAoby5wcmltaXRpdmUgfHwgZiAhPT0gbnVsbCA/IHAgPSBlLnNraXAoZikgOiBwID0gdGhpcy5fc2tpcFVudGlsRW5kKGUsIHIpLCBlLmlzRXJyb3IocCkpCiAgICAgICAgICByZXR1cm4gcDsKICAgICAgICBpZiAoby50YWdTdHIgPT09ICJlbmQiKQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH07CiAgICBzci5wcm90b3R5cGUuX2RlY29kZUxpc3QgPSBmdW5jdGlvbihlLCByLCBvLCBmKSB7CiAgICAgIGxldCBwID0gW107CiAgICAgIGZvciAoOyFlLmlzRW1wdHkoKTsgKSB7CiAgICAgICAgbGV0IG0yID0gdGhpcy5fcGVla1RhZyhlLCAiZW5kIik7CiAgICAgICAgaWYgKGUuaXNFcnJvcihtMikpCiAgICAgICAgICByZXR1cm4gbTI7CiAgICAgICAgbGV0IHkzID0gby5kZWNvZGUoZSwgImRlciIsIGYpOwogICAgICAgIGlmIChlLmlzRXJyb3IoeTMpICYmIG0yKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgcC5wdXNoKHkzKTsKICAgICAgfQogICAgICByZXR1cm4gcDsKICAgIH07CiAgICBzci5wcm90b3R5cGUuX2RlY29kZVN0ciA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgaWYgKHIgPT09ICJiaXRzdHIiKSB7CiAgICAgICAgbGV0IG8gPSBlLnJlYWRVSW50OCgpOwogICAgICAgIHJldHVybiBlLmlzRXJyb3IobykgPyBvIDogeyB1bnVzZWQ6IG8sIGRhdGE6IGUucmF3KCkgfTsKICAgICAgfSBlbHNlIGlmIChyID09PSAiYm1wc3RyIikgewogICAgICAgIGxldCBvID0gZS5yYXcoKTsKICAgICAgICBpZiAoby5sZW5ndGggJSAyID09PSAxKQogICAgICAgICAgcmV0dXJuIGUuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoIik7CiAgICAgICAgbGV0IGYgPSAiIjsKICAgICAgICBmb3IgKGxldCBwID0gMDtwIDwgby5sZW5ndGggLyAyOyBwKyspCiAgICAgICAgICBmICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoby5yZWFkVUludDE2QkUocCAqIDIpKTsKICAgICAgICByZXR1cm4gZjsKICAgICAgfSBlbHNlIGlmIChyID09PSAibnVtc3RyIikgewogICAgICAgIGxldCBvID0gZS5yYXcoKS50b1N0cmluZygiYXNjaWkiKTsKICAgICAgICByZXR1cm4gdGhpcy5faXNOdW1zdHIobykgPyBvIDogZS5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHIgPT09ICJvY3RzdHIiKQogICAgICAgICAgcmV0dXJuIGUucmF3KCk7CiAgICAgICAgaWYgKHIgPT09ICJvYmpEZXNjIikKICAgICAgICAgIHJldHVybiBlLnJhdygpOwogICAgICAgIGlmIChyID09PSAicHJpbnRzdHIiKSB7CiAgICAgICAgICBsZXQgbyA9IGUucmF3KCkudG9TdHJpbmcoImFzY2lpIik7CiAgICAgICAgICByZXR1cm4gdGhpcy5faXNQcmludHN0cihvKSA/IG8gOiBlLmVycm9yKCJEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyIpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgcmV0dXJuIC9zdHIkLy50ZXN0KHIpID8gZS5yYXcoKS50b1N0cmluZygpIDogZS5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICIgKyByICsgIiB1bnN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9OwogICAgc3IucHJvdG90eXBlLl9kZWNvZGVPYmppZCA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgbGV0IGYsIHAgPSBbXSwgbTIgPSAwLCB5MyA9IDA7CiAgICAgIGZvciAoOyFlLmlzRW1wdHkoKTsgKQogICAgICAgIHkzID0gZS5yZWFkVUludDgoKSwgbTIgPDw9IDcsIG0yIHw9IHkzICYgMTI3LCAoeTMgJiAxMjgpID09PSAwICYmIChwLnB1c2gobTIpLCBtMiA9IDApOwogICAgICB5MyAmIDEyOCAmJiBwLnB1c2gobTIpOwogICAgICBsZXQgTSA9IHBbMF0gLyA0MCB8IDAsIHggPSBwWzBdICUgNDA7CiAgICAgIGlmIChvID8gZiA9IHAgOiBmID0gW00sIHhdLmNvbmNhdChwLnNsaWNlKDEpKSwgcikgewogICAgICAgIGxldCBTID0gcltmLmpvaW4oIiAiKV07CiAgICAgICAgUyA9PT0gdW5kZWZpbmVkICYmIChTID0gcltmLmpvaW4oIi4iKV0pLCBTICE9PSB1bmRlZmluZWQgJiYgKGYgPSBTKTsKICAgICAgfQogICAgICByZXR1cm4gZjsKICAgIH07CiAgICBzci5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGxldCBvID0gZS5yYXcoKS50b1N0cmluZygpLCBmLCBwLCBtMiwgeTMsIE0sIHg7CiAgICAgIGlmIChyID09PSAiZ2VudGltZSIpCiAgICAgICAgZiA9IG8uc2xpY2UoMCwgNCkgfCAwLCBwID0gby5zbGljZSg0LCA2KSB8IDAsIG0yID0gby5zbGljZSg2LCA4KSB8IDAsIHkzID0gby5zbGljZSg4LCAxMCkgfCAwLCBNID0gby5zbGljZSgxMCwgMTIpIHwgMCwgeCA9IG8uc2xpY2UoMTIsIDE0KSB8IDA7CiAgICAgIGVsc2UgaWYgKHIgPT09ICJ1dGN0aW1lIikKICAgICAgICBmID0gby5zbGljZSgwLCAyKSB8IDAsIHAgPSBvLnNsaWNlKDIsIDQpIHwgMCwgbTIgPSBvLnNsaWNlKDQsIDYpIHwgMCwgeTMgPSBvLnNsaWNlKDYsIDgpIHwgMCwgTSA9IG8uc2xpY2UoOCwgMTApIHwgMCwgeCA9IG8uc2xpY2UoMTAsIDEyKSB8IDAsIGYgPCA3MCA/IGYgPSAyMDAwICsgZiA6IGYgPSAxOTAwICsgZjsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBlLmVycm9yKCJEZWNvZGluZyAiICsgciArICIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpOwogICAgICByZXR1cm4gRGF0ZS5VVEMoZiwgcCAtIDEsIG0yLCB5MywgTSwgeCwgMCk7CiAgICB9OwogICAgc3IucHJvdG90eXBlLl9kZWNvZGVOdWxsID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfTsKICAgIHNyLnByb3RvdHlwZS5fZGVjb2RlQm9vbCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHIgPSBlLnJlYWRVSW50OCgpOwogICAgICByZXR1cm4gZS5pc0Vycm9yKHIpID8gciA6IHIgIT09IDA7CiAgICB9OwogICAgc3IucHJvdG90eXBlLl9kZWNvZGVJbnQgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGxldCBvID0gZS5yYXcoKSwgZiA9IG5ldyBnQihvKTsKICAgICAgcmV0dXJuIHIgJiYgKGYgPSByW2YudG9TdHJpbmcoMTApXSB8fCBmKSwgZjsKICAgIH07CiAgICBzci5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBlID09ICJmdW5jdGlvbiIgJiYgKGUgPSBlKHIpKSwgZS5fZ2V0RGVjb2RlcigiZGVyIikudHJlZTsKICAgIH07CiAgICBmdW5jdGlvbiBzZCh0LCBlKSB7CiAgICAgIGxldCByID0gdC5yZWFkVUludDgoZSk7CiAgICAgIGlmICh0LmlzRXJyb3IocikpCiAgICAgICAgcmV0dXJuIHI7CiAgICAgIGxldCBvID0gWnkudGFnQ2xhc3NbciA+PiA2XSwgZiA9IChyICYgMzIpID09PSAwOwogICAgICBpZiAoKHIgJiAzMSkgPT09IDMxKSB7CiAgICAgICAgbGV0IG0yID0gcjsKICAgICAgICBmb3IgKHIgPSAwOyhtMiAmIDEyOCkgPT09IDEyODsgKSB7CiAgICAgICAgICBpZiAobTIgPSB0LnJlYWRVSW50OChlKSwgdC5pc0Vycm9yKG0yKSkKICAgICAgICAgICAgcmV0dXJuIG0yOwogICAgICAgICAgciA8PD0gNywgciB8PSBtMiAmIDEyNzsKICAgICAgICB9CiAgICAgIH0gZWxzZQogICAgICAgIHIgJj0gMzE7CiAgICAgIGxldCBwID0gWnkudGFnW3JdOwogICAgICByZXR1cm4geyBjbHM6IG8sIHByaW1pdGl2ZTogZiwgdGFnOiByLCB0YWdTdHI6IHAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIEd5KHQsIGUsIHIpIHsKICAgICAgbGV0IG8gPSB0LnJlYWRVSW50OChyKTsKICAgICAgaWYgKHQuaXNFcnJvcihvKSkKICAgICAgICByZXR1cm4gbzsKICAgICAgaWYgKCFlICYmIG8gPT09IDEyOCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgaWYgKChvICYgMTI4KSA9PT0gMCkKICAgICAgICByZXR1cm4gbzsKICAgICAgbGV0IGYgPSBvICYgMTI3OwogICAgICBpZiAoZiA+IDQpCiAgICAgICAgcmV0dXJuIHQuZXJyb3IoImxlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmciKTsKICAgICAgbyA9IDA7CiAgICAgIGZvciAobGV0IHAgPSAwO3AgPCBmOyBwKyspIHsKICAgICAgICBvIDw8PSA4OwogICAgICAgIGxldCBtMiA9IHQucmVhZFVJbnQ4KHIpOwogICAgICAgIGlmICh0LmlzRXJyb3IobTIpKQogICAgICAgICAgcmV0dXJuIG0yOwogICAgICAgIG8gfD0gbTI7CiAgICAgIH0KICAgICAgcmV0dXJuIG87CiAgICB9CiAgfSk7CiAgSnkgPSBUMigoZkwsIFh5KSA9PiB7CiAgICB2YXIgeUIgPSBJZSgpLCB3QiA9IGgwKCkuQnVmZmVyLCB1ZCA9IGhkKCk7CiAgICBmdW5jdGlvbiBsZCh0KSB7CiAgICAgIHVkLmNhbGwodGhpcywgdCksIHRoaXMuZW5jID0gInBlbSI7CiAgICB9CiAgICB5QihsZCwgdWQpOwogICAgWHkuZXhwb3J0cyA9IGxkOwogICAgbGQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgbGV0IG8gPSBlLnRvU3RyaW5nKCkuc3BsaXQoL1tcclxuXSsvZyksIGYgPSByLmxhYmVsLnRvVXBwZXJDYXNlKCksIHAgPSAvXi0tLS0tKEJFR0lOfEVORCkgKFteLV0rKS0tLS0tJC8sIG0yID0gLTEsIHkzID0gLTE7CiAgICAgIGZvciAobGV0IFMgPSAwO1MgPCBvLmxlbmd0aDsgUysrKSB7CiAgICAgICAgbGV0IEUyID0gb1tTXS5tYXRjaChwKTsKICAgICAgICBpZiAoRTIgIT09IG51bGwgJiYgRTJbMl0gPT09IGYpCiAgICAgICAgICBpZiAobTIgPT09IC0xKSB7CiAgICAgICAgICAgIGlmIChFMlsxXSAhPT0gIkJFR0lOIikKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgbTIgPSBTOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKEUyWzFdICE9PSAiRU5EIikKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgeTMgPSBTOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgfQogICAgICBpZiAobTIgPT09IC0xIHx8IHkzID09PSAtMSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6ICIgKyBmKTsKICAgICAgbGV0IE0gPSBvLnNsaWNlKG0yICsgMSwgeTMpLmpvaW4oIiIpOwogICAgICBNLnJlcGxhY2UoL1teYS16MC05Ky89XSsvZ2ksICIiKTsKICAgICAgbGV0IHggPSB3Qi5mcm9tKE0sICJiYXNlNjQiKTsKICAgICAgcmV0dXJuIHVkLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCB4LCByKTsKICAgIH07CiAgfSk7CiAgZGQgPSBUMigoZTMpID0+IHsKICAgIHZhciBReSA9IGUzOwogICAgUXkuZGVyID0gaGQoKTsKICAgIFF5LnBlbSA9IEp5KCk7CiAgfSk7CiAgcjMgPSBUMigodDMpID0+IHsKICAgIHZhciBNQiA9IG9kKCksIF9CID0gZGQoKSwgeEIgPSBJZSgpLCBTQiA9IHQzOwogICAgU0IuZGVmaW5lID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gbmV3IGpmKGUsIHIpOwogICAgfTsKICAgIGZ1bmN0aW9uIGpmKHQsIGUpIHsKICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy5ib2R5ID0gZSwgdGhpcy5kZWNvZGVycyA9IHt9LCB0aGlzLmVuY29kZXJzID0ge307CiAgICB9CiAgICBqZi5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkID0gZnVuY3Rpb24oZSkgewogICAgICBsZXQgciA9IHRoaXMubmFtZTsKICAgICAgZnVuY3Rpb24gbyhmKSB7CiAgICAgICAgdGhpcy5faW5pdE5hbWVkKGYsIHIpOwogICAgICB9CiAgICAgIHJldHVybiB4QihvLCBlKSwgby5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uKHAsIG0yKSB7CiAgICAgICAgZS5jYWxsKHRoaXMsIHAsIG0yKTsKICAgICAgfSwgbmV3IG8odGhpcyk7CiAgICB9OwogICAgamYucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24oZSkgewogICAgICByZXR1cm4gZSA9IGUgfHwgImRlciIsIHRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZSkgfHwgKHRoaXMuZGVjb2RlcnNbZV0gPSB0aGlzLl9jcmVhdGVOYW1lZChfQltlXSkpLCB0aGlzLmRlY29kZXJzW2VdOwogICAgfTsKICAgIGpmLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbihlLCByLCBvKSB7CiAgICAgIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKHIpLmRlY29kZShlLCBvKTsKICAgIH07CiAgICBqZi5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBlID0gZSB8fCAiZGVyIiwgdGhpcy5lbmNvZGVycy5oYXNPd25Qcm9wZXJ0eShlKSB8fCAodGhpcy5lbmNvZGVyc1tlXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKE1CW2VdKSksIHRoaXMuZW5jb2RlcnNbZV07CiAgICB9OwogICAgamYucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIocikuZW5jb2RlKGUsIG8pOwogICAgfTsKICB9KTsKICBuMyA9IFQyKChpMykgPT4gewogICAgdmFyIHAwID0gaTM7CiAgICBwMC5SZXBvcnRlciA9IHUwKCkuUmVwb3J0ZXI7CiAgICBwMC5EZWNvZGVyQnVmZmVyID0gS2YoKS5EZWNvZGVyQnVmZmVyOwogICAgcDAuRW5jb2RlckJ1ZmZlciA9IEtmKCkuRW5jb2RlckJ1ZmZlcjsKICAgIHAwLk5vZGUgPSBkMCgpOwogIH0pOwogIG8zID0gVDIoKGEzKSA9PiB7CiAgICB2YXIgZjMgPSBhMzsKICAgIGYzLl9yZXZlcnNlID0gZnVuY3Rpb24oZSkgewogICAgICBsZXQgciA9IHt9OwogICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihvKSB7CiAgICAgICAgKG8gfCAwKSA9PSBvICYmIChvID0gbyB8IDApOwogICAgICAgIGxldCBmID0gZVtvXTsKICAgICAgICByW2ZdID0gbzsKICAgICAgfSksIHI7CiAgICB9OwogICAgZjMuZGVyID0gYzAoKTsKICB9KTsKICBjZCA9IFQyKChzMykgPT4gewogICAgdmFyIFpmID0gczM7CiAgICBaZi5iaWdudW0gPSB0ZCgpOwogICAgWmYuZGVmaW5lID0gcjMoKS5kZWZpbmU7CiAgICBaZi5iYXNlID0gbjMoKTsKICAgIFpmLmNvbnN0YW50cyA9IG8zKCk7CiAgICBaZi5kZWNvZGVycyA9IGRkKCk7CiAgICBaZi5lbmNvZGVycyA9IG9kKCk7CiAgfSk7CiAgZDMgPSBUMigobEwsIGwzKSA9PiB7CiAgICB2YXIgenIgPSBjZCgpLCBoMyA9IHpyLmRlZmluZSgiVGltZSIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmNob2ljZSh7IHV0Y1RpbWU6IHRoaXMudXRjdGltZSgpLCBnZW5lcmFsVGltZTogdGhpcy5nZW50aW1lKCkgfSk7CiAgICB9KSwgRUIgPSB6ci5kZWZpbmUoIkF0dHJpYnV0ZVR5cGVWYWx1ZSIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidHlwZSIpLm9iamlkKCksIHRoaXMua2V5KCJ2YWx1ZSIpLmFueSgpKTsKICAgIH0pLCBwZCA9IHpyLmRlZmluZSgiQWxnb3JpdGhtSWRlbnRpZmllciIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikub2JqaWQoKSwgdGhpcy5rZXkoInBhcmFtZXRlcnMiKS5vcHRpb25hbCgpLCB0aGlzLmtleSgiY3VydmUiKS5vYmppZCgpLm9wdGlvbmFsKCkpOwogICAgfSksIEFCID0genIuZGVmaW5lKCJTdWJqZWN0UHVibGljS2V5SW5mbyIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikudXNlKHBkKSwgdGhpcy5rZXkoInN1YmplY3RQdWJsaWNLZXkiKS5iaXRzdHIoKSk7CiAgICB9KSwgUkIgPSB6ci5kZWZpbmUoIlJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUiLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXRvZihFQik7CiAgICB9KSwgQkIgPSB6ci5kZWZpbmUoIlJETlNlcXVlbmNlIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc2Vxb2YoUkIpOwogICAgfSksIHUzID0genIuZGVmaW5lKCJOYW1lIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuY2hvaWNlKHsgcmRuU2VxdWVuY2U6IHRoaXMudXNlKEJCKSB9KTsKICAgIH0pLCBxQiA9IHpyLmRlZmluZSgiVmFsaWRpdHkiLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoIm5vdEJlZm9yZSIpLnVzZShoMyksIHRoaXMua2V5KCJub3RBZnRlciIpLnVzZShoMykpOwogICAgfSksIElCID0genIuZGVmaW5lKCJFeHRlbnNpb24iLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImV4dG5JRCIpLm9iamlkKCksIHRoaXMua2V5KCJjcml0aWNhbCIpLmJvb2woKS5kZWYoZmFsc2UpLCB0aGlzLmtleSgiZXh0blZhbHVlIikub2N0c3RyKCkpOwogICAgfSksIFRCID0genIuZGVmaW5lKCJUQlNDZXJ0aWZpY2F0ZSIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidmVyc2lvbiIpLmV4cGxpY2l0KDApLmludCgpLm9wdGlvbmFsKCksIHRoaXMua2V5KCJzZXJpYWxOdW1iZXIiKS5pbnQoKSwgdGhpcy5rZXkoInNpZ25hdHVyZSIpLnVzZShwZCksIHRoaXMua2V5KCJpc3N1ZXIiKS51c2UodTMpLCB0aGlzLmtleSgidmFsaWRpdHkiKS51c2UocUIpLCB0aGlzLmtleSgic3ViamVjdCIpLnVzZSh1MyksIHRoaXMua2V5KCJzdWJqZWN0UHVibGljS2V5SW5mbyIpLnVzZShBQiksIHRoaXMua2V5KCJpc3N1ZXJVbmlxdWVJRCIpLmltcGxpY2l0KDEpLmJpdHN0cigpLm9wdGlvbmFsKCksIHRoaXMua2V5KCJzdWJqZWN0VW5pcXVlSUQiKS5pbXBsaWNpdCgyKS5iaXRzdHIoKS5vcHRpb25hbCgpLCB0aGlzLmtleSgiZXh0ZW5zaW9ucyIpLmV4cGxpY2l0KDMpLnNlcW9mKElCKS5vcHRpb25hbCgpKTsKICAgIH0pLCBrQiA9IHpyLmRlZmluZSgiWDUwOUNlcnRpZmljYXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ0YnNDZXJ0aWZpY2F0ZSIpLnVzZShUQiksIHRoaXMua2V5KCJzaWduYXR1cmVBbGdvcml0aG0iKS51c2UocGQpLCB0aGlzLmtleSgic2lnbmF0dXJlVmFsdWUiKS5iaXRzdHIoKSk7CiAgICB9KTsKICAgIGwzLmV4cG9ydHMgPSBrQjsKICB9KTsKICBwMyA9IFQyKChXcikgPT4gewogICAgdmFyIEhyID0gY2QoKTsKICAgIFdyLmNlcnRpZmljYXRlID0gZDMoKTsKICAgIHZhciBMQiA9IEhyLmRlZmluZSgiUlNBUHJpdmF0ZUtleSIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidmVyc2lvbiIpLmludCgpLCB0aGlzLmtleSgibW9kdWx1cyIpLmludCgpLCB0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSwgdGhpcy5rZXkoInByaXZhdGVFeHBvbmVudCIpLmludCgpLCB0aGlzLmtleSgicHJpbWUxIikuaW50KCksIHRoaXMua2V5KCJwcmltZTIiKS5pbnQoKSwgdGhpcy5rZXkoImV4cG9uZW50MSIpLmludCgpLCB0aGlzLmtleSgiZXhwb25lbnQyIikuaW50KCksIHRoaXMua2V5KCJjb2VmZmljaWVudCIpLmludCgpKTsKICAgIH0pOwogICAgV3IuUlNBUHJpdmF0ZUtleSA9IExCOwogICAgdmFyIE5CID0gSHIuZGVmaW5lKCJSU0FQdWJsaWNLZXkiLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSwgdGhpcy5rZXkoInB1YmxpY0V4cG9uZW50IikuaW50KCkpOwogICAgfSk7CiAgICBXci5SU0FQdWJsaWNLZXkgPSBOQjsKICAgIHZhciBEQiA9IEhyLmRlZmluZSgiU3ViamVjdFB1YmxpY0tleUluZm8iLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImFsZ29yaXRobSIpLnVzZShjMyksIHRoaXMua2V5KCJzdWJqZWN0UHVibGljS2V5IikuYml0c3RyKCkpOwogICAgfSk7CiAgICBXci5QdWJsaWNLZXkgPSBEQjsKICAgIHZhciBjMyA9IEhyLmRlZmluZSgiQWxnb3JpdGhtSWRlbnRpZmllciIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikub2JqaWQoKSwgdGhpcy5rZXkoIm5vbmUiKS5udWxsXygpLm9wdGlvbmFsKCksIHRoaXMua2V5KCJjdXJ2ZSIpLm9iamlkKCkub3B0aW9uYWwoKSwgdGhpcy5rZXkoInBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgicCIpLmludCgpLCB0aGlzLmtleSgicSIpLmludCgpLCB0aGlzLmtleSgiZyIpLmludCgpKS5vcHRpb25hbCgpKTsKICAgIH0pLCBQQiA9IEhyLmRlZmluZSgiUHJpdmF0ZUtleUluZm8iLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5pbnQoKSwgdGhpcy5rZXkoImFsZ29yaXRobSIpLnVzZShjMyksIHRoaXMua2V5KCJzdWJqZWN0UHJpdmF0ZUtleSIpLm9jdHN0cigpKTsKICAgIH0pOwogICAgV3IuUHJpdmF0ZUtleSA9IFBCOwogICAgdmFyIENCID0gSHIuZGVmaW5lKCJFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyIsIGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikuc2VxKCkub2JqKHRoaXMua2V5KCJpZCIpLm9iamlkKCksIHRoaXMua2V5KCJkZWNyeXB0Iikuc2VxKCkub2JqKHRoaXMua2V5KCJrZGUiKS5zZXEoKS5vYmoodGhpcy5rZXkoImlkIikub2JqaWQoKSwgdGhpcy5rZXkoImtkZXBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgic2FsdCIpLm9jdHN0cigpLCB0aGlzLmtleSgiaXRlcnMiKS5pbnQoKSkpLCB0aGlzLmtleSgiY2lwaGVyIikuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvIikub2JqaWQoKSwgdGhpcy5rZXkoIml2Iikub2N0c3RyKCkpKSksIHRoaXMua2V5KCJzdWJqZWN0UHJpdmF0ZUtleSIpLm9jdHN0cigpKTsKICAgIH0pOwogICAgV3IuRW5jcnlwdGVkUHJpdmF0ZUtleSA9IENCOwogICAgdmFyIE9CID0gSHIuZGVmaW5lKCJEU0FQcml2YXRlS2V5IiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksIHRoaXMua2V5KCJwIikuaW50KCksIHRoaXMua2V5KCJxIikuaW50KCksIHRoaXMua2V5KCJnIikuaW50KCksIHRoaXMua2V5KCJwdWJfa2V5IikuaW50KCksIHRoaXMua2V5KCJwcml2X2tleSIpLmludCgpKTsKICAgIH0pOwogICAgV3IuRFNBUHJpdmF0ZUtleSA9IE9COwogICAgV3IuRFNBcGFyYW0gPSBIci5kZWZpbmUoIkRTQXBhcmFtIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW50KCk7CiAgICB9KTsKICAgIHZhciBGQiA9IEhyLmRlZmluZSgiRUNQcml2YXRlS2V5IiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksIHRoaXMua2V5KCJwcml2YXRlS2V5Iikub2N0c3RyKCksIHRoaXMua2V5KCJwYXJhbWV0ZXJzIikub3B0aW9uYWwoKS5leHBsaWNpdCgwKS51c2UoVUIpLCB0aGlzLmtleSgicHVibGljS2V5Iikub3B0aW9uYWwoKS5leHBsaWNpdCgxKS5iaXRzdHIoKSk7CiAgICB9KTsKICAgIFdyLkVDUHJpdmF0ZUtleSA9IEZCOwogICAgdmFyIFVCID0gSHIuZGVmaW5lKCJFQ1BhcmFtZXRlcnMiLCBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5jaG9pY2UoeyBuYW1lZEN1cnZlOiB0aGlzLm9iamlkKCkgfSk7CiAgICB9KTsKICAgIFdyLnNpZ25hdHVyZSA9IEhyLmRlZmluZSgic2lnbmF0dXJlIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJyIikuaW50KCksIHRoaXMua2V5KCJzIikuaW50KCkpOwogICAgfSk7CiAgfSk7CiAgdjMgPSBUMigoY0wsIHpCKSA9PiB7CiAgICB6Qi5leHBvcnRzID0geyAiMi4xNi44NDAuMS4xMDEuMy40LjEuMSI6ICJhZXMtMTI4LWVjYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yIjogImFlcy0xMjgtY2JjIiwgIjIuMTYuODQwLjEuMTAxLjMuNC4xLjMiOiAiYWVzLTEyOC1vZmIiLCAiMi4xNi44NDAuMS4xMDEuMy40LjEuNCI6ICJhZXMtMTI4LWNmYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSI6ICJhZXMtMTkyLWVjYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMiI6ICJhZXMtMTkyLWNiYyIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMyI6ICJhZXMtMTkyLW9mYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCI6ICJhZXMtMTkyLWNmYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MSI6ICJhZXMtMjU2LWVjYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MiI6ICJhZXMtMjU2LWNiYyIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MyI6ICJhZXMtMjU2LW9mYiIsICIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40NCI6ICJhZXMtMjU2LWNmYiIgfTsKICB9KTsKICBtMyA9IFQyKChwTCwgYjMpID0+IHsKICAgIHZhciBIQiA9IC9Qcm9jLVR5cGU6IDQsRU5DUllQVEVEW1xuXHJdK0RFSy1JbmZvOiBBRVMtKCg/OjEyOCl8KD86MTkyKXwoPzoyNTYpKS1DQkMsKFswLTlBLUhdKylbXG5ccl0rKFswLTlBLXpcblxyKy89XSspW1xuXHJdKy9tLCBXQiA9IC9eLS0tLS1CRUdJTiAoKD86Lio/IEtFWSl8Q0VSVElGSUNBVEUpLS0tLS0vbSwgS0IgPSAvXi0tLS0tQkVHSU4gKCg/Oi4qPyBLRVkpfENFUlRJRklDQVRFKS0tLS0tKFswLTlBLXpcblxyKy89XSspLS0tLS1FTkQgXDEtLS0tLSQvbSwgakIgPSBCYSgpLCBaQiA9IEVzKCksIHYwID0gVGUoKS5CdWZmZXI7CiAgICBiMy5leHBvcnRzID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IHQudG9TdHJpbmcoKSwgbyA9IHIubWF0Y2goSEIpLCBmOwogICAgICBpZiAobykgewogICAgICAgIHZhciBtMiA9ICJhZXMiICsgb1sxXSwgeTMgPSB2MC5mcm9tKG9bMl0sICJoZXgiKSwgTSA9IHYwLmZyb20ob1szXS5yZXBsYWNlKC9bXHJcbl0vZywgIiIpLCAiYmFzZTY0IiksIHggPSBqQihlLCB5My5zbGljZSgwLCA4KSwgcGFyc2VJbnQob1sxXSwgMTApKS5rZXksIFMgPSBbXSwgRTIgPSBaQi5jcmVhdGVEZWNpcGhlcml2KG0yLCB4LCB5Myk7CiAgICAgICAgUy5wdXNoKEUyLnVwZGF0ZShNKSksIFMucHVzaChFMi5maW5hbCgpKSwgZiA9IHYwLmNvbmNhdChTKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcCA9IHIubWF0Y2goS0IpOwogICAgICAgIGYgPSB2MC5mcm9tKHBbMl0ucmVwbGFjZSgvW1xyXG5dL2csICIiKSwgImJhc2U2NCIpOwogICAgICB9CiAgICAgIHZhciBCID0gci5tYXRjaChXQilbMV07CiAgICAgIHJldHVybiB7IHRhZzogQiwgZGF0YTogZiB9OwogICAgfTsKICB9KTsKICBIYSA9IFQyKCh2TCwgeTMpID0+IHsKICAgIHZhciBmciA9IHAzKCksIFZCID0gdjMoKSwgJEIgPSBtMygpLCBHQiA9IEVzKCksIFlCID0gSXUoKSwgdmQgPSBUZSgpLkJ1ZmZlcjsKICAgIHkzLmV4cG9ydHMgPSBnMzsKICAgIGZ1bmN0aW9uIGczKHQpIHsKICAgICAgdmFyIGU7CiAgICAgIHR5cGVvZiB0ID09ICJvYmplY3QiICYmICF2ZC5pc0J1ZmZlcih0KSAmJiAoZSA9IHQucGFzc3BocmFzZSwgdCA9IHQua2V5KSwgdHlwZW9mIHQgPT0gInN0cmluZyIgJiYgKHQgPSB2ZC5mcm9tKHQpKTsKICAgICAgdmFyIHIgPSAkQih0LCBlKSwgbyA9IHIudGFnLCBmID0gci5kYXRhLCBwLCBtMjsKICAgICAgc3dpdGNoIChvKSB7CiAgICAgICAgY2FzZSAiQ0VSVElGSUNBVEUiOgogICAgICAgICAgbTIgPSBmci5jZXJ0aWZpY2F0ZS5kZWNvZGUoZiwgImRlciIpLnRic0NlcnRpZmljYXRlLnN1YmplY3RQdWJsaWNLZXlJbmZvOwogICAgICAgIGNhc2UgIlBVQkxJQyBLRVkiOgogICAgICAgICAgc3dpdGNoIChtMiB8fCAobTIgPSBmci5QdWJsaWNLZXkuZGVjb2RlKGYsICJkZXIiKSksIHAgPSBtMi5hbGdvcml0aG0uYWxnb3JpdGhtLmpvaW4oIi4iKSwgcCkgewogICAgICAgICAgICBjYXNlICIxLjIuODQwLjExMzU0OS4xLjEuMSI6CiAgICAgICAgICAgICAgcmV0dXJuIGZyLlJTQVB1YmxpY0tleS5kZWNvZGUobTIuc3ViamVjdFB1YmxpY0tleS5kYXRhLCAiZGVyIik7CiAgICAgICAgICAgIGNhc2UgIjEuMi44NDAuMTAwNDUuMi4xIjoKICAgICAgICAgICAgICByZXR1cm4gbTIuc3ViamVjdFByaXZhdGVLZXkgPSBtMi5zdWJqZWN0UHVibGljS2V5LCB7IHR5cGU6ICJlYyIsIGRhdGE6IG0yIH07CiAgICAgICAgICAgIGNhc2UgIjEuMi44NDAuMTAwNDAuNC4xIjoKICAgICAgICAgICAgICByZXR1cm4gbTIuYWxnb3JpdGhtLnBhcmFtcy5wdWJfa2V5ID0gZnIuRFNBcGFyYW0uZGVjb2RlKG0yLnN1YmplY3RQdWJsaWNLZXkuZGF0YSwgImRlciIpLCB7IHR5cGU6ICJkc2EiLCBkYXRhOiBtMi5hbGdvcml0aG0ucGFyYW1zIH07CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSBpZCAiICsgcCk7CiAgICAgICAgICB9CiAgICAgICAgY2FzZSAiRU5DUllQVEVEIFBSSVZBVEUgS0VZIjoKICAgICAgICAgIGYgPSBmci5FbmNyeXB0ZWRQcml2YXRlS2V5LmRlY29kZShmLCAiZGVyIiksIGYgPSBYQihmLCBlKTsKICAgICAgICBjYXNlICJQUklWQVRFIEtFWSI6CiAgICAgICAgICBzd2l0Y2ggKG0yID0gZnIuUHJpdmF0ZUtleS5kZWNvZGUoZiwgImRlciIpLCBwID0gbTIuYWxnb3JpdGhtLmFsZ29yaXRobS5qb2luKCIuIiksIHApIHsKICAgICAgICAgICAgY2FzZSAiMS4yLjg0MC4xMTM1NDkuMS4xLjEiOgogICAgICAgICAgICAgIHJldHVybiBmci5SU0FQcml2YXRlS2V5LmRlY29kZShtMi5zdWJqZWN0UHJpdmF0ZUtleSwgImRlciIpOwogICAgICAgICAgICBjYXNlICIxLjIuODQwLjEwMDQ1LjIuMSI6CiAgICAgICAgICAgICAgcmV0dXJuIHsgY3VydmU6IG0yLmFsZ29yaXRobS5jdXJ2ZSwgcHJpdmF0ZUtleTogZnIuRUNQcml2YXRlS2V5LmRlY29kZShtMi5zdWJqZWN0UHJpdmF0ZUtleSwgImRlciIpLnByaXZhdGVLZXkgfTsKICAgICAgICAgICAgY2FzZSAiMS4yLjg0MC4xMDA0MC40LjEiOgogICAgICAgICAgICAgIHJldHVybiBtMi5hbGdvcml0aG0ucGFyYW1zLnByaXZfa2V5ID0gZnIuRFNBcGFyYW0uZGVjb2RlKG0yLnN1YmplY3RQcml2YXRlS2V5LCAiZGVyIiksIHsgdHlwZTogImRzYSIsIHBhcmFtczogbTIuYWxnb3JpdGhtLnBhcmFtcyB9OwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgaWQgIiArIHApOwogICAgICAgICAgfQogICAgICAgIGNhc2UgIlJTQSBQVUJMSUMgS0VZIjoKICAgICAgICAgIHJldHVybiBmci5SU0FQdWJsaWNLZXkuZGVjb2RlKGYsICJkZXIiKTsKICAgICAgICBjYXNlICJSU0EgUFJJVkFURSBLRVkiOgogICAgICAgICAgcmV0dXJuIGZyLlJTQVByaXZhdGVLZXkuZGVjb2RlKGYsICJkZXIiKTsKICAgICAgICBjYXNlICJEU0EgUFJJVkFURSBLRVkiOgogICAgICAgICAgcmV0dXJuIHsgdHlwZTogImRzYSIsIHBhcmFtczogZnIuRFNBUHJpdmF0ZUtleS5kZWNvZGUoZiwgImRlciIpIH07CiAgICAgICAgY2FzZSAiRUMgUFJJVkFURSBLRVkiOgogICAgICAgICAgcmV0dXJuIGYgPSBmci5FQ1ByaXZhdGVLZXkuZGVjb2RlKGYsICJkZXIiKSwgeyBjdXJ2ZTogZi5wYXJhbWV0ZXJzLnZhbHVlLCBwcml2YXRlS2V5OiBmLnByaXZhdGVLZXkgfTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSB0eXBlICIgKyBvKTsKICAgICAgfQogICAgfQogICAgZzMuc2lnbmF0dXJlID0gZnIuc2lnbmF0dXJlOwogICAgZnVuY3Rpb24gWEIodCwgZSkgewogICAgICB2YXIgciA9IHQuYWxnb3JpdGhtLmRlY3J5cHQua2RlLmtkZXBhcmFtcy5zYWx0LCBvID0gcGFyc2VJbnQodC5hbGdvcml0aG0uZGVjcnlwdC5rZGUua2RlcGFyYW1zLml0ZXJzLnRvU3RyaW5nKCksIDEwKSwgZiA9IFZCW3QuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLmFsZ28uam9pbigiLiIpXSwgcCA9IHQuYWxnb3JpdGhtLmRlY3J5cHQuY2lwaGVyLml2LCBtMiA9IHQuc3ViamVjdFByaXZhdGVLZXksIHk0ID0gcGFyc2VJbnQoZi5zcGxpdCgiLSIpWzFdLCAxMCkgLyA4LCBNID0gWUIucGJrZGYyU3luYyhlLCByLCBvLCB5NCwgInNoYTEiKSwgeCA9IEdCLmNyZWF0ZURlY2lwaGVyaXYoZiwgTSwgcCksIFMgPSBbXTsKICAgICAgcmV0dXJuIFMucHVzaCh4LnVwZGF0ZShtMikpLCBTLnB1c2goeC5maW5hbCgpKSwgdmQuY29uY2F0KFMpOwogICAgfQogIH0pOwogIGJkID0gVDIoKGJMLCBKQikgPT4gewogICAgSkIuZXhwb3J0cyA9IHsgIjEuMy4xMzIuMC4xMCI6ICJzZWNwMjU2azEiLCAiMS4zLjEzMi4wLjMzIjogInAyMjQiLCAiMS4yLjg0MC4xMDA0NS4zLjEuMSI6ICJwMTkyIiwgIjEuMi44NDAuMTAwNDUuMy4xLjciOiAicDI1NiIsICIxLjMuMTMyLjAuMzQiOiAicDM4NCIsICIxLjMuMTMyLjAuMzUiOiAicDUyMSIgfTsKICB9KTsKICBfMyA9IFQyKChtTCwgbTApID0+IHsKICAgIHZhciBZdCA9IFRlKCkuQnVmZmVyLCBLbiA9IHd1KCksIFFCID0gS3MoKSwgZXEgPSBvMCgpLmVjLCBiMCA9IFdzKCksIHRxID0gSGEoKSwgcnEgPSBiZCgpOwogICAgZnVuY3Rpb24gaXEodCwgZSwgciwgbywgZikgewogICAgICB2YXIgcCA9IHRxKGUpOwogICAgICBpZiAocC5jdXJ2ZSkgewogICAgICAgIGlmIChvICE9PSAiZWNkc2EiICYmIG8gIT09ICJlY2RzYS9yc2EiKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7CiAgICAgICAgcmV0dXJuIG5xKHQsIHApOwogICAgICB9IGVsc2UgaWYgKHAudHlwZSA9PT0gImRzYSIpIHsKICAgICAgICBpZiAobyAhPT0gImRzYSIpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIndyb25nIHByaXZhdGUga2V5IHR5cGUiKTsKICAgICAgICByZXR1cm4gZnEodCwgcCwgcik7CiAgICAgIH0gZWxzZSBpZiAobyAhPT0gInJzYSIgJiYgbyAhPT0gImVjZHNhL3JzYSIpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7CiAgICAgIHQgPSBZdC5jb25jYXQoW2YsIHRdKTsKICAgICAgZm9yICh2YXIgbTIgPSBwLm1vZHVsdXMuYnl0ZUxlbmd0aCgpLCB5MyA9IFswLCAxXTt0Lmxlbmd0aCArIHkzLmxlbmd0aCArIDEgPCBtMjsgKQogICAgICAgIHkzLnB1c2goMjU1KTsKICAgICAgeTMucHVzaCgwKTsKICAgICAgZm9yICh2YXIgTSA9IC0xOysrTSA8IHQubGVuZ3RoOyApCiAgICAgICAgeTMucHVzaCh0W01dKTsKICAgICAgdmFyIHggPSBRQih5MywgcCk7CiAgICAgIHJldHVybiB4OwogICAgfQogICAgZnVuY3Rpb24gbnEodCwgZSkgewogICAgICB2YXIgciA9IHJxW2UuY3VydmUuam9pbigiLiIpXTsKICAgICAgaWYgKCFyKQogICAgICAgIHRocm93IG5ldyBFcnJvcigidW5rbm93biBjdXJ2ZSAiICsgZS5jdXJ2ZS5qb2luKCIuIikpOwogICAgICB2YXIgbyA9IG5ldyBlcShyKSwgZiA9IG8ua2V5RnJvbVByaXZhdGUoZS5wcml2YXRlS2V5KSwgcCA9IGYuc2lnbih0KTsKICAgICAgcmV0dXJuIFl0LmZyb20ocC50b0RFUigpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZxKHQsIGUsIHIpIHsKICAgICAgZm9yICh2YXIgbyA9IGUucGFyYW1zLnByaXZfa2V5LCBmID0gZS5wYXJhbXMucCwgcCA9IGUucGFyYW1zLnEsIG0yID0gZS5wYXJhbXMuZywgeTMgPSBuZXcgYjAoMCksIE0sIHggPSBtZCh0LCBwKS5tb2QocCksIFMgPSBmYWxzZSwgRTIgPSB3MyhvLCBwLCB0LCByKTtTID09PSBmYWxzZTsgKQogICAgICAgIE0gPSBNMyhwLCBFMiwgciksIHkzID0gc3EobTIsIE0sIGYsIHApLCBTID0gTS5pbnZtKHApLmltdWwoeC5hZGQoby5tdWwoeTMpKSkubW9kKHApLCBTLmNtcG4oMCkgPT09IDAgJiYgKFMgPSBmYWxzZSwgeTMgPSBuZXcgYjAoMCkpOwogICAgICByZXR1cm4gYXEoeTMsIFMpOwogICAgfQogICAgZnVuY3Rpb24gYXEodCwgZSkgewogICAgICB0ID0gdC50b0FycmF5KCksIGUgPSBlLnRvQXJyYXkoKSwgdFswXSAmIDEyOCAmJiAodCA9IFswXS5jb25jYXQodCkpLCBlWzBdICYgMTI4ICYmIChlID0gWzBdLmNvbmNhdChlKSk7CiAgICAgIHZhciByID0gdC5sZW5ndGggKyBlLmxlbmd0aCArIDQsIG8gPSBbNDgsIHIsIDIsIHQubGVuZ3RoXTsKICAgICAgcmV0dXJuIG8gPSBvLmNvbmNhdCh0LCBbMiwgZS5sZW5ndGhdLCBlKSwgWXQuZnJvbShvKTsKICAgIH0KICAgIGZ1bmN0aW9uIHczKHQsIGUsIHIsIG8pIHsKICAgICAgaWYgKHQgPSBZdC5mcm9tKHQudG9BcnJheSgpKSwgdC5sZW5ndGggPCBlLmJ5dGVMZW5ndGgoKSkgewogICAgICAgIHZhciBmID0gWXQuYWxsb2MoZS5ieXRlTGVuZ3RoKCkgLSB0Lmxlbmd0aCk7CiAgICAgICAgdCA9IFl0LmNvbmNhdChbZiwgdF0pOwogICAgICB9CiAgICAgIHZhciBwID0gci5sZW5ndGgsIG0yID0gb3EociwgZSksIHkzID0gWXQuYWxsb2MocCk7CiAgICAgIHkzLmZpbGwoMSk7CiAgICAgIHZhciBNID0gWXQuYWxsb2MocCk7CiAgICAgIHJldHVybiBNID0gS24obywgTSkudXBkYXRlKHkzKS51cGRhdGUoWXQuZnJvbShbMF0pKS51cGRhdGUodCkudXBkYXRlKG0yKS5kaWdlc3QoKSwgeTMgPSBLbihvLCBNKS51cGRhdGUoeTMpLmRpZ2VzdCgpLCBNID0gS24obywgTSkudXBkYXRlKHkzKS51cGRhdGUoWXQuZnJvbShbMV0pKS51cGRhdGUodCkudXBkYXRlKG0yKS5kaWdlc3QoKSwgeTMgPSBLbihvLCBNKS51cGRhdGUoeTMpLmRpZ2VzdCgpLCB7IGs6IE0sIHY6IHkzIH07CiAgICB9CiAgICBmdW5jdGlvbiBtZCh0LCBlKSB7CiAgICAgIHZhciByID0gbmV3IGIwKHQpLCBvID0gKHQubGVuZ3RoIDw8IDMpIC0gZS5iaXRMZW5ndGgoKTsKICAgICAgcmV0dXJuIG8gPiAwICYmIHIuaXNocm4obyksIHI7CiAgICB9CiAgICBmdW5jdGlvbiBvcSh0LCBlKSB7CiAgICAgIHQgPSBtZCh0LCBlKSwgdCA9IHQubW9kKGUpOwogICAgICB2YXIgciA9IFl0LmZyb20odC50b0FycmF5KCkpOwogICAgICBpZiAoci5sZW5ndGggPCBlLmJ5dGVMZW5ndGgoKSkgewogICAgICAgIHZhciBvID0gWXQuYWxsb2MoZS5ieXRlTGVuZ3RoKCkgLSByLmxlbmd0aCk7CiAgICAgICAgciA9IFl0LmNvbmNhdChbbywgcl0pOwogICAgICB9CiAgICAgIHJldHVybiByOwogICAgfQogICAgZnVuY3Rpb24gTTModCwgZSwgcikgewogICAgICB2YXIgbywgZjsKICAgICAgZG8gewogICAgICAgIGZvciAobyA9IFl0LmFsbG9jKDApO28ubGVuZ3RoICogOCA8IHQuYml0TGVuZ3RoKCk7ICkKICAgICAgICAgIGUudiA9IEtuKHIsIGUuaykudXBkYXRlKGUudikuZGlnZXN0KCksIG8gPSBZdC5jb25jYXQoW28sIGUudl0pOwogICAgICAgIGYgPSBtZChvLCB0KSwgZS5rID0gS24ociwgZS5rKS51cGRhdGUoZS52KS51cGRhdGUoWXQuZnJvbShbMF0pKS5kaWdlc3QoKSwgZS52ID0gS24ociwgZS5rKS51cGRhdGUoZS52KS5kaWdlc3QoKTsKICAgICAgfSB3aGlsZSAoZi5jbXAodCkgIT09IC0xKTsKICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICBmdW5jdGlvbiBzcSh0LCBlLCByLCBvKSB7CiAgICAgIHJldHVybiB0LnRvUmVkKGIwLm1vbnQocikpLnJlZFBvdyhlKS5mcm9tUmVkKCkubW9kKG8pOwogICAgfQogICAgbTAuZXhwb3J0cyA9IGlxOwogICAgbTAuZXhwb3J0cy5nZXRLZXkgPSB3MzsKICAgIG0wLmV4cG9ydHMubWFrZUtleSA9IE0zOwogIH0pOwogIEEzID0gVDIoKGdMLCBFMykgPT4gewogICAgdmFyIGdkID0gVGUoKS5CdWZmZXIsIFdhID0gV3MoKSwgaHEgPSBvMCgpLmVjLCBTMyA9IEhhKCksIHVxID0gYmQoKTsKICAgIGZ1bmN0aW9uIGxxKHQsIGUsIHIsIG8sIGYpIHsKICAgICAgdmFyIHAgPSBTMyhyKTsKICAgICAgaWYgKHAudHlwZSA9PT0gImVjIikgewogICAgICAgIGlmIChvICE9PSAiZWNkc2EiICYmIG8gIT09ICJlY2RzYS9yc2EiKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwdWJsaWMga2V5IHR5cGUiKTsKICAgICAgICByZXR1cm4gZHEodCwgZSwgcCk7CiAgICAgIH0gZWxzZSBpZiAocC50eXBlID09PSAiZHNhIikgewogICAgICAgIGlmIChvICE9PSAiZHNhIikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7CiAgICAgICAgcmV0dXJuIGNxKHQsIGUsIHApOwogICAgICB9IGVsc2UgaWYgKG8gIT09ICJyc2EiICYmIG8gIT09ICJlY2RzYS9yc2EiKQogICAgICAgIHRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7CiAgICAgIGUgPSBnZC5jb25jYXQoW2YsIGVdKTsKICAgICAgZm9yICh2YXIgbTIgPSBwLm1vZHVsdXMuYnl0ZUxlbmd0aCgpLCB5MyA9IFsxXSwgTSA9IDA7ZS5sZW5ndGggKyB5My5sZW5ndGggKyAyIDwgbTI7ICkKICAgICAgICB5My5wdXNoKDI1NSksIE0rKzsKICAgICAgeTMucHVzaCgwKTsKICAgICAgZm9yICh2YXIgeCA9IC0xOysreCA8IGUubGVuZ3RoOyApCiAgICAgICAgeTMucHVzaChlW3hdKTsKICAgICAgeTMgPSBnZC5mcm9tKHkzKTsKICAgICAgdmFyIFMgPSBXYS5tb250KHAubW9kdWx1cyk7CiAgICAgIHQgPSBuZXcgV2EodCkudG9SZWQoUyksIHQgPSB0LnJlZFBvdyhuZXcgV2EocC5wdWJsaWNFeHBvbmVudCkpLCB0ID0gZ2QuZnJvbSh0LmZyb21SZWQoKS50b0FycmF5KCkpOwogICAgICB2YXIgRTIgPSBNIDwgOCA/IDEgOiAwOwogICAgICBmb3IgKG0yID0gTWF0aC5taW4odC5sZW5ndGgsIHkzLmxlbmd0aCksIHQubGVuZ3RoICE9PSB5My5sZW5ndGggJiYgKEUyID0gMSksIHggPSAtMTsrK3ggPCBtMjsgKQogICAgICAgIEUyIHw9IHRbeF0gXiB5M1t4XTsKICAgICAgcmV0dXJuIEUyID09PSAwOwogICAgfQogICAgZnVuY3Rpb24gZHEodCwgZSwgcikgewogICAgICB2YXIgbyA9IHVxW3IuZGF0YS5hbGdvcml0aG0uY3VydmUuam9pbigiLiIpXTsKICAgICAgaWYgKCFvKQogICAgICAgIHRocm93IG5ldyBFcnJvcigidW5rbm93biBjdXJ2ZSAiICsgci5kYXRhLmFsZ29yaXRobS5jdXJ2ZS5qb2luKCIuIikpOwogICAgICB2YXIgZiA9IG5ldyBocShvKSwgcCA9IHIuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleS5kYXRhOwogICAgICByZXR1cm4gZi52ZXJpZnkoZSwgdCwgcCk7CiAgICB9CiAgICBmdW5jdGlvbiBjcSh0LCBlLCByKSB7CiAgICAgIHZhciBvID0gci5kYXRhLnAsIGYgPSByLmRhdGEucSwgcCA9IHIuZGF0YS5nLCBtMiA9IHIuZGF0YS5wdWJfa2V5LCB5MyA9IFMzLnNpZ25hdHVyZS5kZWNvZGUodCwgImRlciIpLCBNID0geTMucywgeCA9IHkzLnI7CiAgICAgIHgzKE0sIGYpLCB4Myh4LCBmKTsKICAgICAgdmFyIFMgPSBXYS5tb250KG8pLCBFMiA9IE0uaW52bShmKSwgQiA9IHAudG9SZWQoUykucmVkUG93KG5ldyBXYShlKS5tdWwoRTIpLm1vZChmKSkuZnJvbVJlZCgpLm11bChtMi50b1JlZChTKS5yZWRQb3coeC5tdWwoRTIpLm1vZChmKSkuZnJvbVJlZCgpKS5tb2QobykubW9kKGYpOwogICAgICByZXR1cm4gQi5jbXAoeCkgPT09IDA7CiAgICB9CiAgICBmdW5jdGlvbiB4Myh0LCBlKSB7CiAgICAgIGlmICh0LmNtcG4oMCkgPD0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2lnIik7CiAgICAgIGlmICh0LmNtcChlKSA+PSBlKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaWciKTsKICAgIH0KICAgIEUzLmV4cG9ydHMgPSBscTsKICB9KTsKICBrMyA9IFQyKCh5TCwgVDMpID0+IHsKICAgIHZhciBnMCA9IFRlKCkuQnVmZmVyLCBxMyA9IGJmKCksIHkwID0gaTIoKSwgSTMgPSBJZSgpLCBwcSA9IF8zKCksIHZxID0gQTMoKSwgam4gPSBNdSgpOwogICAgT2JqZWN0LmtleXMoam4pLmZvckVhY2goZnVuY3Rpb24odCkgewogICAgICBqblt0XS5pZCA9IGcwLmZyb20oam5bdF0uaWQsICJoZXgiKSwgam5bdC50b0xvd2VyQ2FzZSgpXSA9IGpuW3RdOwogICAgfSk7CiAgICBmdW5jdGlvbiBLYSh0KSB7CiAgICAgIHkwLldyaXRhYmxlLmNhbGwodGhpcyk7CiAgICAgIHZhciBlID0gam5bdF07CiAgICAgIGlmICghZSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbWVzc2FnZSBkaWdlc3QiKTsKICAgICAgdGhpcy5faGFzaFR5cGUgPSBlLmhhc2gsIHRoaXMuX2hhc2ggPSBxMyhlLmhhc2gpLCB0aGlzLl90YWcgPSBlLmlkLCB0aGlzLl9zaWduVHlwZSA9IGUuc2lnbjsKICAgIH0KICAgIEkzKEthLCB5MC5Xcml0YWJsZSk7CiAgICBLYS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICB0aGlzLl9oYXNoLnVwZGF0ZShlKSwgbygpOwogICAgfTsKICAgIEthLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIHJldHVybiB0eXBlb2YgZSA9PSAic3RyaW5nIiAmJiAoZSA9IGcwLmZyb20oZSwgcikpLCB0aGlzLl9oYXNoLnVwZGF0ZShlKSwgdGhpczsKICAgIH07CiAgICBLYS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgdGhpcy5lbmQoKTsKICAgICAgdmFyIG8gPSB0aGlzLl9oYXNoLmRpZ2VzdCgpLCBmID0gcHEobywgZSwgdGhpcy5faGFzaFR5cGUsIHRoaXMuX3NpZ25UeXBlLCB0aGlzLl90YWcpOwogICAgICByZXR1cm4gciA/IGYudG9TdHJpbmcocikgOiBmOwogICAgfTsKICAgIGZ1bmN0aW9uIGphKHQpIHsKICAgICAgeTAuV3JpdGFibGUuY2FsbCh0aGlzKTsKICAgICAgdmFyIGUgPSBqblt0XTsKICAgICAgaWYgKCFlKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIGRpZ2VzdCIpOwogICAgICB0aGlzLl9oYXNoID0gcTMoZS5oYXNoKSwgdGhpcy5fdGFnID0gZS5pZCwgdGhpcy5fc2lnblR5cGUgPSBlLnNpZ247CiAgICB9CiAgICBJMyhqYSwgeTAuV3JpdGFibGUpOwogICAgamEucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdGhpcy5faGFzaC51cGRhdGUoZSksIG8oKTsKICAgIH07CiAgICBqYS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gdHlwZW9mIGUgPT0gInN0cmluZyIgJiYgKGUgPSBnMC5mcm9tKGUsIHIpKSwgdGhpcy5faGFzaC51cGRhdGUoZSksIHRoaXM7CiAgICB9OwogICAgamEucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdHlwZW9mIHIgPT0gInN0cmluZyIgJiYgKHIgPSBnMC5mcm9tKHIsIG8pKSwgdGhpcy5lbmQoKTsKICAgICAgdmFyIGYgPSB0aGlzLl9oYXNoLmRpZ2VzdCgpOwogICAgICByZXR1cm4gdnEociwgZiwgZSwgdGhpcy5fc2lnblR5cGUsIHRoaXMuX3RhZyk7CiAgICB9OwogICAgZnVuY3Rpb24gUjModCkgewogICAgICByZXR1cm4gbmV3IEthKHQpOwogICAgfQogICAgZnVuY3Rpb24gQjModCkgewogICAgICByZXR1cm4gbmV3IGphKHQpOwogICAgfQogICAgVDMuZXhwb3J0cyA9IHsgU2lnbjogUjMsIFZlcmlmeTogQjMsIGNyZWF0ZVNpZ246IFIzLCBjcmVhdGVWZXJpZnk6IEIzIH07CiAgfSk7CiAgTjMgPSBUMigoTDMsIHlkKSA9PiB7CiAgICAoZnVuY3Rpb24odCwgZSkgewogICAgICBmdW5jdGlvbiByKHYsIGkpIHsKICAgICAgICBpZiAoIXYpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaSB8fCAiQXNzZXJ0aW9uIGZhaWxlZCIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG8odiwgaSkgewogICAgICAgIHYuc3VwZXJfID0gaTsKICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uKCkgewogICAgICAgIH07CiAgICAgICAgYS5wcm90b3R5cGUgPSBpLnByb3RvdHlwZSwgdi5wcm90b3R5cGUgPSBuZXcgYSwgdi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSB2OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGYodiwgaSwgYSkgewogICAgICAgIGlmIChmLmlzQk4odikpCiAgICAgICAgICByZXR1cm4gdjsKICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy53b3JkcyA9IG51bGwsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5yZWQgPSBudWxsLCB2ICE9PSBudWxsICYmICgoaSA9PT0gImxlIiB8fCBpID09PSAiYmUiKSAmJiAoYSA9IGksIGkgPSAxMCksIHRoaXMuX2luaXQodiB8fCAwLCBpIHx8IDEwLCBhIHx8ICJiZSIpKTsKICAgICAgfQogICAgICB0eXBlb2YgdCA9PSAib2JqZWN0IiA/IHQuZXhwb3J0cyA9IGYgOiBlLkJOID0gZiwgZi5CTiA9IGYsIGYud29yZFNpemUgPSAyNjsKICAgICAgdmFyIHA7CiAgICAgIHRyeSB7CiAgICAgICAgdHlwZW9mIHdpbmRvdyA8ICJ1IiAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciA8ICJ1IiA/IHAgPSB3aW5kb3cuQnVmZmVyIDogcCA9IGppKCkuQnVmZmVyOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgICBmLmlzQk4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkgaW5zdGFuY2VvZiBmID8gdHJ1ZSA6IGkgIT09IG51bGwgJiYgdHlwZW9mIGkgPT0gIm9iamVjdCIgJiYgaS5jb25zdHJ1Y3Rvci53b3JkU2l6ZSA9PT0gZi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KGkud29yZHMpOwogICAgICB9LCBmLm1heCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gaS5jbXAoYSkgPiAwID8gaSA6IGE7CiAgICAgIH0sIGYubWluID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiBpLmNtcChhKSA8IDAgPyBpIDogYTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmICh0eXBlb2YgaSA9PSAibnVtYmVyIikKICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKGksIGEsIGgyKTsKICAgICAgICBpZiAodHlwZW9mIGkgPT0gIm9iamVjdCIpCiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KGksIGEsIGgyKTsKICAgICAgICBhID09PSAiaGV4IiAmJiAoYSA9IDE2KSwgcihhID09PSAoYSB8IDApICYmIGEgPj0gMiAmJiBhIDw9IDM2KSwgaSA9IGkudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywgIiIpOwogICAgICAgIHZhciBzID0gMDsKICAgICAgICBpWzBdID09PSAiLSIgJiYgKHMrKywgdGhpcy5uZWdhdGl2ZSA9IDEpLCBzIDwgaS5sZW5ndGggJiYgKGEgPT09IDE2ID8gdGhpcy5fcGFyc2VIZXgoaSwgcywgaDIpIDogKHRoaXMuX3BhcnNlQmFzZShpLCBhLCBzKSwgaDIgPT09ICJsZSIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBhLCBoMikpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGkgPCAwICYmICh0aGlzLm5lZ2F0aXZlID0gMSwgaSA9IC1pKSwgaSA8IDY3MTA4ODY0ID8gKHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAxKSA6IGkgPCA0NTAzNTk5NjI3MzcwNDk2ID8gKHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzLCBpIC8gNjcxMDg4NjQgJiA2NzEwODg2M10sIHRoaXMubGVuZ3RoID0gMikgOiAocihpIDwgOTAwNzE5OTI1NDc0MDk5MiksIHRoaXMud29yZHMgPSBbaSAmIDY3MTA4ODYzLCBpIC8gNjcxMDg4NjQgJiA2NzEwODg2MywgMV0sIHRoaXMubGVuZ3RoID0gMyksIGgyID09PSAibGUiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYSwgaDIpOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAocih0eXBlb2YgaS5sZW5ndGggPT0gIm51bWJlciIpLCBpLmxlbmd0aCA8PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMSwgdGhpczsKICAgICAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChpLmxlbmd0aCAvIDMpLCB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgdGhpcy5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSAwOwogICAgICAgIHZhciB1LCBjLCBiMyA9IDA7CiAgICAgICAgaWYgKGgyID09PSAiYmUiKQogICAgICAgICAgZm9yIChzID0gaS5sZW5ndGggLSAxLCB1ID0gMDtzID49IDA7IHMgLT0gMykKICAgICAgICAgICAgYyA9IGlbc10gfCBpW3MgLSAxXSA8PCA4IHwgaVtzIC0gMl0gPDwgMTYsIHRoaXMud29yZHNbdV0gfD0gYyA8PCBiMyAmIDY3MTA4ODYzLCB0aGlzLndvcmRzW3UgKyAxXSA9IGMgPj4+IDI2IC0gYjMgJiA2NzEwODg2MywgYjMgKz0gMjQsIGIzID49IDI2ICYmIChiMyAtPSAyNiwgdSsrKTsKICAgICAgICBlbHNlIGlmIChoMiA9PT0gImxlIikKICAgICAgICAgIGZvciAocyA9IDAsIHUgPSAwO3MgPCBpLmxlbmd0aDsgcyArPSAzKQogICAgICAgICAgICBjID0gaVtzXSB8IGlbcyArIDFdIDw8IDggfCBpW3MgKyAyXSA8PCAxNiwgdGhpcy53b3Jkc1t1XSB8PSBjIDw8IGIzICYgNjcxMDg4NjMsIHRoaXMud29yZHNbdSArIDFdID0gYyA+Pj4gMjYgLSBiMyAmIDY3MTA4ODYzLCBiMyArPSAyNCwgYjMgPj0gMjYgJiYgKGIzIC09IDI2LCB1KyspOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIG0yKHYsIGkpIHsKICAgICAgICB2YXIgYSA9IHYuY2hhckNvZGVBdChpKTsKICAgICAgICByZXR1cm4gYSA+PSA2NSAmJiBhIDw9IDcwID8gYSAtIDU1IDogYSA+PSA5NyAmJiBhIDw9IDEwMiA/IGEgLSA4NyA6IGEgLSA0OCAmIDE1OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHkzKHYsIGksIGEpIHsKICAgICAgICB2YXIgaDIgPSBtMih2LCBhKTsKICAgICAgICByZXR1cm4gYSAtIDEgPj0gaSAmJiAoaDIgfD0gbTIodiwgYSAtIDEpIDw8IDQpLCBoMjsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChpLmxlbmd0aCAtIGEpIC8gNiksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCB0aGlzLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IDA7CiAgICAgICAgdmFyIHUgPSAwLCBjID0gMCwgYjM7CiAgICAgICAgaWYgKGgyID09PSAiYmUiKQogICAgICAgICAgZm9yIChzID0gaS5sZW5ndGggLSAxO3MgPj0gYTsgcyAtPSAyKQogICAgICAgICAgICBiMyA9IHkzKGksIGEsIHMpIDw8IHUsIHRoaXMud29yZHNbY10gfD0gYjMgJiA2NzEwODg2MywgdSA+PSAxOCA/ICh1IC09IDE4LCBjICs9IDEsIHRoaXMud29yZHNbY10gfD0gYjMgPj4+IDI2KSA6IHUgKz0gODsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBsID0gaS5sZW5ndGggLSBhOwogICAgICAgICAgZm9yIChzID0gbCAlIDIgPT09IDAgPyBhICsgMSA6IGE7cyA8IGkubGVuZ3RoOyBzICs9IDIpCiAgICAgICAgICAgIGIzID0geTMoaSwgYSwgcykgPDwgdSwgdGhpcy53b3Jkc1tjXSB8PSBiMyAmIDY3MTA4ODYzLCB1ID49IDE4ID8gKHUgLT0gMTgsIGMgKz0gMSwgdGhpcy53b3Jkc1tjXSB8PSBiMyA+Pj4gMjYpIDogdSArPSA4OwogICAgICAgIH0KICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIE0odiwgaSwgYSwgaDIpIHsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IE1hdGgubWluKHYubGVuZ3RoLCBhKSwgYyA9IGk7YyA8IHU7IGMrKykgewogICAgICAgICAgdmFyIGIzID0gdi5jaGFyQ29kZUF0KGMpIC0gNDg7CiAgICAgICAgICBzICo9IGgyLCBiMyA+PSA0OSA/IHMgKz0gYjMgLSA0OSArIDEwIDogYjMgPj0gMTcgPyBzICs9IGIzIC0gMTcgKyAxMCA6IHMgKz0gYjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMTsKICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDE7dSA8PSA2NzEwODg2MzsgdSAqPSBhKQogICAgICAgICAgcysrOwogICAgICAgIHMtLSwgdSA9IHUgLyBhIHwgMDsKICAgICAgICBmb3IgKHZhciBjID0gaS5sZW5ndGggLSBoMiwgYjMgPSBjICUgcywgbCA9IE1hdGgubWluKGMsIGMgLSBiMykgKyBoMiwgbiA9IDAsIGQgPSBoMjtkIDwgbDsgZCArPSBzKQogICAgICAgICAgbiA9IE0oaSwgZCwgZCArIHMsIGEpLCB0aGlzLmltdWxuKHUpLCB0aGlzLndvcmRzWzBdICsgbiA8IDY3MTA4ODY0ID8gdGhpcy53b3Jkc1swXSArPSBuIDogdGhpcy5faWFkZG4obik7CiAgICAgICAgaWYgKGIzICE9PSAwKSB7CiAgICAgICAgICB2YXIgdyA9IDE7CiAgICAgICAgICBmb3IgKG4gPSBNKGksIGQsIGkubGVuZ3RoLCBhKSwgZCA9IDA7ZCA8IGIzOyBkKyspCiAgICAgICAgICAgIHcgKj0gYTsKICAgICAgICAgIHRoaXMuaW11bG4odyksIHRoaXMud29yZHNbMF0gKyBuIDwgNjcxMDg4NjQgPyB0aGlzLndvcmRzWzBdICs9IG4gOiB0aGlzLl9pYWRkbihuKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oaSkgewogICAgICAgIGkud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aDsgYSsrKQogICAgICAgICAgaS53b3Jkc1thXSA9IHRoaXMud29yZHNbYV07CiAgICAgICAgaS5sZW5ndGggPSB0aGlzLmxlbmd0aCwgaS5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmUsIGkucmVkID0gdGhpcy5yZWQ7CiAgICAgIH0sIGYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gdGhpcy5jb3B5KGkpLCBpOwogICAgICB9LCBmLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoIDwgaTsgKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMDsgKQogICAgICAgICAgdGhpcy5sZW5ndGgtLTsKICAgICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDAgJiYgKHRoaXMubmVnYXRpdmUgPSAwKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAodGhpcy5yZWQgPyAiPEJOLVI6ICIgOiAiPEJOOiAiKSArIHRoaXMudG9TdHJpbmcoMTYpICsgIj4iOwogICAgICB9OwogICAgICB2YXIgeCA9IFsiIiwgIjAiLCAiMDAiLCAiMDAwIiwgIjAwMDAiLCAiMDAwMDAiLCAiMDAwMDAwIiwgIjAwMDAwMDAiLCAiMDAwMDAwMDAiLCAiMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiXSwgUyA9IFswLCAwLCAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsIDgsIDcsIDcsIDcsIDcsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDVdLCBFMiA9IFswLCAwLCAzMzU1NDQzMiwgNDMwNDY3MjEsIDE2Nzc3MjE2LCA0ODgyODEyNSwgNjA0NjYxNzYsIDQwMzUzNjA3LCAxNjc3NzIxNiwgNDMwNDY3MjEsIDFlNywgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsIDE2Nzc3MjE2LCAyNDEzNzU2OSwgMzQwMTIyMjQsIDQ3MDQ1ODgxLCA2NDAwMDAwMCwgNDA4NDEwMSwgNTE1MzYzMiwgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XTsKICAgICAgZi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaSA9IGkgfHwgMTAsIGEgPSBhIHwgMCB8fCAxOwogICAgICAgIHZhciBoMjsKICAgICAgICBpZiAoaSA9PT0gMTYgfHwgaSA9PT0gImhleCIpIHsKICAgICAgICAgIGgyID0gIiI7CiAgICAgICAgICBmb3IgKHZhciBzID0gMCwgdSA9IDAsIGMgPSAwO2MgPCB0aGlzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICAgIHZhciBiMyA9IHRoaXMud29yZHNbY10sIGwgPSAoKGIzIDw8IHMgfCB1KSAmIDE2Nzc3MjE1KS50b1N0cmluZygxNik7CiAgICAgICAgICAgIHUgPSBiMyA+Pj4gMjQgLSBzICYgMTY3NzcyMTUsIHUgIT09IDAgfHwgYyAhPT0gdGhpcy5sZW5ndGggLSAxID8gaDIgPSB4WzYgLSBsLmxlbmd0aF0gKyBsICsgaDIgOiBoMiA9IGwgKyBoMiwgcyArPSAyLCBzID49IDI2ICYmIChzIC09IDI2LCBjLS0pOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh1ICE9PSAwICYmIChoMiA9IHUudG9TdHJpbmcoMTYpICsgaDIpO2gyLmxlbmd0aCAlIGEgIT09IDA7ICkKICAgICAgICAgICAgaDIgPSAiMCIgKyBoMjsKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIChoMiA9ICItIiArIGgyKSwgaDI7CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSAoaSB8IDApICYmIGkgPj0gMiAmJiBpIDw9IDM2KSB7CiAgICAgICAgICB2YXIgbiA9IFNbaV0sIGQgPSBFMltpXTsKICAgICAgICAgIGgyID0gIiI7CiAgICAgICAgICB2YXIgdyA9IHRoaXMuY2xvbmUoKTsKICAgICAgICAgIGZvciAody5uZWdhdGl2ZSA9IDA7IXcuaXNaZXJvKCk7ICkgewogICAgICAgICAgICB2YXIgZyA9IHcubW9kbihkKS50b1N0cmluZyhpKTsKICAgICAgICAgICAgdyA9IHcuaWRpdm4oZCksIHcuaXNaZXJvKCkgPyBoMiA9IGcgKyBoMiA6IGgyID0geFtuIC0gZy5sZW5ndGhdICsgZyArIGgyOwogICAgICAgICAgfQogICAgICAgICAgZm9yICh0aGlzLmlzWmVybygpICYmIChoMiA9ICIwIiArIGgyKTtoMi5sZW5ndGggJSBhICE9PSAwOyApCiAgICAgICAgICAgIGgyID0gIjAiICsgaDI7CiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAoaDIgPSAiLSIgKyBoMiksIGgyOwogICAgICAgIH0KICAgICAgICByKGZhbHNlLCAiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpOwogICAgICB9LCBmLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gdGhpcy53b3Jkc1swXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDIgPyBpICs9IHRoaXMud29yZHNbMV0gKiA2NzEwODg2NCA6IHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDEgPyBpICs9IDQ1MDM1OTk2MjczNzA0OTYgKyB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA+IDIgJiYgcihmYWxzZSwgIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLCB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWkgOiBpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiByKHR5cGVvZiBwIDwgInUiKSwgdGhpcy50b0FycmF5TGlrZShwLCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IHRoaXMuYnl0ZUxlbmd0aCgpLCB1ID0gaDIgfHwgTWF0aC5tYXgoMSwgcyk7CiAgICAgICAgcihzIDw9IHUsICJieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoIiksIHIodSA+IDAsICJSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAiKSwgdGhpcy5zdHJpcCgpOwogICAgICAgIHZhciBjID0gYSA9PT0gImxlIiwgYjMgPSBuZXcgaSh1KSwgbCwgbiwgZCA9IHRoaXMuY2xvbmUoKTsKICAgICAgICBpZiAoYykgewogICAgICAgICAgZm9yIChuID0gMDshZC5pc1plcm8oKTsgbisrKQogICAgICAgICAgICBsID0gZC5hbmRsbigyNTUpLCBkLml1c2hybig4KSwgYjNbbl0gPSBsOwogICAgICAgICAgZm9yICg7biA8IHU7IG4rKykKICAgICAgICAgICAgYjNbbl0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKG4gPSAwO24gPCB1IC0gczsgbisrKQogICAgICAgICAgICBiM1tuXSA9IDA7CiAgICAgICAgICBmb3IgKG4gPSAwOyFkLmlzWmVybygpOyBuKyspCiAgICAgICAgICAgIGwgPSBkLmFuZGxuKDI1NSksIGQuaXVzaHJuKDgpLCBiM1t1IC0gbiAtIDFdID0gbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGIzOwogICAgICB9LCBNYXRoLmNsejMyID8gZi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKGkpOwogICAgICB9IDogZi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGksIGgyID0gMDsKICAgICAgICByZXR1cm4gYSA+PSA0MDk2ICYmIChoMiArPSAxMywgYSA+Pj49IDEzKSwgYSA+PSA2NCAmJiAoaDIgKz0gNywgYSA+Pj49IDcpLCBhID49IDggJiYgKGgyICs9IDQsIGEgPj4+PSA0KSwgYSA+PSAyICYmIChoMiArPSAyLCBhID4+Pj0gMiksIGgyICsgYTsKICAgICAgfSwgZi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpID09PSAwKQogICAgICAgICAgcmV0dXJuIDI2OwogICAgICAgIHZhciBhID0gaSwgaDIgPSAwOwogICAgICAgIHJldHVybiAoYSAmIDgxOTEpID09PSAwICYmIChoMiArPSAxMywgYSA+Pj49IDEzKSwgKGEgJiAxMjcpID09PSAwICYmIChoMiArPSA3LCBhID4+Pj0gNyksIChhICYgMTUpID09PSAwICYmIChoMiArPSA0LCBhID4+Pj0gNCksIChhICYgMykgPT09IDAgJiYgKGgyICs9IDIsIGEgPj4+PSAyKSwgKGEgJiAxKSA9PT0gMCAmJiBoMisrLCBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0sIGEgPSB0aGlzLl9jb3VudEJpdHMoaSk7CiAgICAgICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBhOwogICAgICB9OwogICAgICBmdW5jdGlvbiBCKHYpIHsKICAgICAgICBmb3IgKHZhciBpID0gbmV3IEFycmF5KHYuYml0TGVuZ3RoKCkpLCBhID0gMDthIDwgaS5sZW5ndGg7IGErKykgewogICAgICAgICAgdmFyIGgyID0gYSAvIDI2IHwgMCwgcyA9IGEgJSAyNjsKICAgICAgICAgIGlbYV0gPSAodi53b3Jkc1toMl0gJiAxIDw8IHMpID4+PiBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGEgPSAwO2EgPCB0aGlzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICB2YXIgaDIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2FdKTsKICAgICAgICAgIGlmIChpICs9IGgyLCBoMiAhPT0gMjYpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfSwgZi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpOwogICAgICB9LCBmLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyB0aGlzLmFicygpLmlub3RuKGkpLmlhZGRuKDEpIDogdGhpcy5jbG9uZSgpOwogICAgICB9LCBmLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy50ZXN0bihpIC0gMSkgPyB0aGlzLm5vdG4oaSkuaWFkZG4oMSkuaW5lZygpIDogdGhpcy5jbG9uZSgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmlzWmVybygpIHx8ICh0aGlzLm5lZ2F0aXZlIF49IDEpLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAoO3RoaXMubGVuZ3RoIDwgaS5sZW5ndGg7ICkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCBpLmxlbmd0aDsgYSsrKQogICAgICAgICAgdGhpcy53b3Jkc1thXSA9IHRoaXMud29yZHNbYV0gfCBpLndvcmRzW2FdOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdW9yKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pb3IoaSkgOiBpLmNsb25lKCkuaW9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVvcihpKSA6IGkuY2xvbmUoKS5pdW9yKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gYSA9IGkgOiBhID0gdGhpczsKICAgICAgICBmb3IgKHZhciBoMiA9IDA7aDIgPCBhLmxlbmd0aDsgaDIrKykKICAgICAgICAgIHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gJiBpLndvcmRzW2gyXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBhLmxlbmd0aCwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1YW5kKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFuZChpKSA6IGkuY2xvbmUoKS5pYW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml1YW5kKGkpIDogaS5jbG9uZSgpLml1YW5kKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSwgaDI7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IChhID0gdGhpcywgaDIgPSBpKSA6IChhID0gaSwgaDIgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgaDIubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gYS53b3Jkc1tzXSBeIGgyLndvcmRzW3NdOwogICAgICAgIGlmICh0aGlzICE9PSBhKQogICAgICAgICAgZm9yICg7cyA8IGEubGVuZ3RoOyBzKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbc10gPSBhLndvcmRzW3NdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXV4b3IoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5peG9yKGkpIDogaS5jbG9uZSgpLml4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXV4b3IoaSkgOiBpLmNsb25lKCkuaXV4b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IE1hdGguY2VpbChpIC8gMjYpIHwgMCwgaDIgPSBpICUgMjY7CiAgICAgICAgdGhpcy5fZXhwYW5kKGEpLCBoMiA+IDAgJiYgYS0tOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBhOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gfnRoaXMud29yZHNbc10gJiA2NzEwODg2MzsKICAgICAgICByZXR1cm4gaDIgPiAwICYmICh0aGlzLndvcmRzW3NdID0gfnRoaXMud29yZHNbc10gJiA2NzEwODg2MyA+PiAyNiAtIGgyKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBoMiA9IGkgLyAyNiB8IDAsIHMgPSBpICUgMjY7CiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZChoMiArIDEpLCBhID8gdGhpcy53b3Jkc1toMl0gPSB0aGlzLndvcmRzW2gyXSB8IDEgPDwgcyA6IHRoaXMud29yZHNbaDJdID0gdGhpcy53b3Jkc1toMl0gJiB+KDEgPDwgcyksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5pc3ViKGkpLCB0aGlzLm5lZ2F0aXZlIF49IDEsIHRoaXMuX25vcm1TaWduKCk7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiBpLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuaXN1YihpKSwgaS5uZWdhdGl2ZSA9IDEsIGEuX25vcm1TaWduKCk7CiAgICAgICAgdmFyIGgyLCBzOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyAoaDIgPSB0aGlzLCBzID0gaSkgOiAoaDIgPSBpLCBzID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBzLmxlbmd0aDsgYysrKQogICAgICAgICAgYSA9IChoMi53b3Jkc1tjXSB8IDApICsgKHMud29yZHNbY10gfCAwKSArIHUsIHRoaXMud29yZHNbY10gPSBhICYgNjcxMDg4NjMsIHUgPSBhID4+PiAyNjsKICAgICAgICBmb3IgKDt1ICE9PSAwICYmIGMgPCBoMi5sZW5ndGg7IGMrKykKICAgICAgICAgIGEgPSAoaDIud29yZHNbY10gfCAwKSArIHUsIHRoaXMud29yZHNbY10gPSBhICYgNjcxMDg4NjMsIHUgPSBhID4+PiAyNjsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPSBoMi5sZW5ndGgsIHUgIT09IDApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IHUsIHRoaXMubGVuZ3RoKys7CiAgICAgICAgZWxzZSBpZiAoaDIgIT09IHRoaXMpCiAgICAgICAgICBmb3IgKDtjIDwgaDIubGVuZ3RoOyBjKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbY10gPSBoMi53b3Jkc1tjXTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIHJldHVybiBpLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDAgPyAoaS5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLnN1YihpKSwgaS5uZWdhdGl2ZSBePSAxLCBhKSA6IGkubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/ICh0aGlzLm5lZ2F0aXZlID0gMCwgYSA9IGkuc3ViKHRoaXMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgYSkgOiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhZGQoaSkgOiBpLmNsb25lKCkuaWFkZCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaS5uZWdhdGl2ZSAhPT0gMCkgewogICAgICAgICAgaS5uZWdhdGl2ZSA9IDA7CiAgICAgICAgICB2YXIgYSA9IHRoaXMuaWFkZChpKTsKICAgICAgICAgIHJldHVybiBpLm5lZ2F0aXZlID0gMSwgYS5fbm9ybVNpZ24oKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaWFkZChpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMuX25vcm1TaWduKCk7CiAgICAgICAgdmFyIGgyID0gdGhpcy5jbXAoaSk7CiAgICAgICAgaWYgKGgyID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmxlbmd0aCA9IDEsIHRoaXMud29yZHNbMF0gPSAwLCB0aGlzOwogICAgICAgIHZhciBzLCB1OwogICAgICAgIGgyID4gMCA/IChzID0gdGhpcywgdSA9IGkpIDogKHMgPSBpLCB1ID0gdGhpcyk7CiAgICAgICAgZm9yICh2YXIgYyA9IDAsIGIzID0gMDtiMyA8IHUubGVuZ3RoOyBiMysrKQogICAgICAgICAgYSA9IChzLndvcmRzW2IzXSB8IDApIC0gKHUud29yZHNbYjNdIHwgMCkgKyBjLCBjID0gYSA+PiAyNiwgdGhpcy53b3Jkc1tiM10gPSBhICYgNjcxMDg4NjM7CiAgICAgICAgZm9yICg7YyAhPT0gMCAmJiBiMyA8IHMubGVuZ3RoOyBiMysrKQogICAgICAgICAgYSA9IChzLndvcmRzW2IzXSB8IDApICsgYywgYyA9IGEgPj4gMjYsIHRoaXMud29yZHNbYjNdID0gYSAmIDY3MTA4ODYzOwogICAgICAgIGlmIChjID09PSAwICYmIGIzIDwgcy5sZW5ndGggJiYgcyAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO2IzIDwgcy5sZW5ndGg7IGIzKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbYjNdID0gcy53b3Jkc1tiM107CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGIzKSwgcyAhPT0gdGhpcyAmJiAodGhpcy5uZWdhdGl2ZSA9IDEpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIoaSk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIHEyKHYsIGksIGEpIHsKICAgICAgICBhLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIHYubmVnYXRpdmU7CiAgICAgICAgdmFyIGgyID0gdi5sZW5ndGggKyBpLmxlbmd0aCB8IDA7CiAgICAgICAgYS5sZW5ndGggPSBoMiwgaDIgPSBoMiAtIDEgfCAwOwogICAgICAgIHZhciBzID0gdi53b3Jkc1swXSB8IDAsIHUgPSBpLndvcmRzWzBdIHwgMCwgYyA9IHMgKiB1LCBiMyA9IGMgJiA2NzEwODg2MywgbCA9IGMgLyA2NzEwODg2NCB8IDA7CiAgICAgICAgYS53b3Jkc1swXSA9IGIzOwogICAgICAgIGZvciAodmFyIG4gPSAxO24gPCBoMjsgbisrKSB7CiAgICAgICAgICBmb3IgKHZhciBkID0gbCA+Pj4gMjYsIHcgPSBsICYgNjcxMDg4NjMsIGcgPSBNYXRoLm1pbihuLCBpLmxlbmd0aCAtIDEpLCBfNCA9IE1hdGgubWF4KDAsIG4gLSB2Lmxlbmd0aCArIDEpO180IDw9IGc7IF80KyspIHsKICAgICAgICAgICAgdmFyIEEyID0gbiAtIF80IHwgMDsKICAgICAgICAgICAgcyA9IHYud29yZHNbQTJdIHwgMCwgdSA9IGkud29yZHNbXzRdIHwgMCwgYyA9IHMgKiB1ICsgdywgZCArPSBjIC8gNjcxMDg4NjQgfCAwLCB3ID0gYyAmIDY3MTA4ODYzOwogICAgICAgICAgfQogICAgICAgICAgYS53b3Jkc1tuXSA9IHcgfCAwLCBsID0gZCB8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsICE9PSAwID8gYS53b3Jkc1tuXSA9IGwgfCAwIDogYS5sZW5ndGgtLSwgYS5zdHJpcCgpOwogICAgICB9CiAgICAgIHZhciBMMiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSBpLndvcmRzLCB1ID0gYS53b3JkcywgYyA9IGgyLndvcmRzLCBiMyA9IDAsIGwsIG4sIGQsIHcgPSBzWzBdIHwgMCwgZyA9IHcgJiA4MTkxLCBfNCA9IHcgPj4+IDEzLCBBMiA9IHNbMV0gfCAwLCBSMiA9IEEyICYgODE5MSwgSSA9IEEyID4+PiAxMywgTWUgPSBzWzJdIHwgMCwgayA9IE1lICYgODE5MSwgRDIgPSBNZSA+Pj4gMTMsIG50ID0gc1szXSB8IDAsIEMyID0gbnQgJiA4MTkxLCBPID0gbnQgPj4+IDEzLCB2dCA9IHNbNF0gfCAwLCBGID0gdnQgJiA4MTkxLCBVID0gdnQgPj4+IDEzLCBidCA9IHNbNV0gfCAwLCB6MiA9IGJ0ICYgODE5MSwgSCA9IGJ0ID4+PiAxMywgbXQgPSBzWzZdIHwgMCwgVyA9IG10ICYgODE5MSwgSyA9IG10ID4+PiAxMywgZ3QgPSBzWzddIHwgMCwgaiA9IGd0ICYgODE5MSwgWiA9IGd0ID4+PiAxMywgeXQgPSBzWzhdIHwgMCwgViA9IHl0ICYgODE5MSwgJCA9IHl0ID4+PiAxMywgd3QgPSBzWzldIHwgMCwgRyA9IHd0ICYgODE5MSwgWSA9IHd0ID4+PiAxMywgTXQgPSB1WzBdIHwgMCwgWCA9IE10ICYgODE5MSwgSiA9IE10ID4+PiAxMywgX3QgPSB1WzFdIHwgMCwgUSA9IF90ICYgODE5MSwgZWUgPSBfdCA+Pj4gMTMsIHh0ID0gdVsyXSB8IDAsIHRlID0geHQgJiA4MTkxLCByZSA9IHh0ID4+PiAxMywgU3QgPSB1WzNdIHwgMCwgaWUgPSBTdCAmIDgxOTEsIG5lID0gU3QgPj4+IDEzLCBFdCA9IHVbNF0gfCAwLCBmZSA9IEV0ICYgODE5MSwgYWUgPSBFdCA+Pj4gMTMsIEF0ID0gdVs1XSB8IDAsIG9lID0gQXQgJiA4MTkxLCBzZSA9IEF0ID4+PiAxMywgUnQgPSB1WzZdIHwgMCwgaGUgPSBSdCAmIDgxOTEsIHVlID0gUnQgPj4+IDEzLCBCdCA9IHVbN10gfCAwLCBsZSA9IEJ0ICYgODE5MSwgZGUgPSBCdCA+Pj4gMTMsIHF0ID0gdVs4XSB8IDAsIGNlID0gcXQgJiA4MTkxLCBwZSA9IHF0ID4+PiAxMywgSXQgPSB1WzldIHwgMCwgdmUgPSBJdCAmIDgxOTEsIGJlID0gSXQgPj4+IDEzOwogICAgICAgIGgyLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIGEubmVnYXRpdmUsIGgyLmxlbmd0aCA9IDE5LCBsID0gTWF0aC5pbXVsKGcsIFgpLCBuID0gTWF0aC5pbXVsKGcsIEopLCBuID0gbiArIE1hdGguaW11bChfNCwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKF80LCBKKTsKICAgICAgICB2YXIgZnQgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoZnQgPj4+IDI2KSB8IDAsIGZ0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFIyLCBYKSwgbiA9IE1hdGguaW11bChSMiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKEksIFgpIHwgMCwgZCA9IE1hdGguaW11bChJLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoZywgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgZWUpIHwgMDsKICAgICAgICB2YXIgQmUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoQmUgPj4+IDI2KSB8IDAsIEJlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKGssIFgpLCBuID0gTWF0aC5pbXVsKGssIEopLCBuID0gbiArIE1hdGguaW11bChEMiwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEQyLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzQsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF80LCByZSkgfCAwOwogICAgICAgIHZhciBxZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChxZSA+Pj4gMjYpIHwgMCwgcWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoQzIsIFgpLCBuID0gTWF0aC5pbXVsKEMyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoTywgWCkgfCAwLCBkID0gTWF0aC5pbXVsKE8sIEopLCBsID0gbCArIE1hdGguaW11bChrLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgbmUpIHwgMDsKICAgICAgICB2YXIgemUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoemUgPj4+IDI2KSB8IDAsIHplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEYsIFgpLCBuID0gTWF0aC5pbXVsKEYsIEopLCBuID0gbiArIE1hdGguaW11bChVLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoVSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIGFlKSB8IDA7CiAgICAgICAgdmFyIEhlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEhlID4+PiAyNikgfCAwLCBIZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bCh6MiwgWCksIG4gPSBNYXRoLmltdWwoejIsIEopLCBuID0gbiArIE1hdGguaW11bChILCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSCwgSiksIGwgPSBsICsgTWF0aC5pbXVsKEYsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIHNlKSB8IDA7CiAgICAgICAgdmFyIFdlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFdlID4+PiAyNikgfCAwLCBXZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChXLCBYKSwgbiA9IE1hdGguaW11bChXLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSywgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEssIEopLCBsID0gbCArIE1hdGguaW11bCh6MiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIHVlKSB8IDA7CiAgICAgICAgdmFyIEtlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEtlID4+PiAyNikgfCAwLCBLZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChqLCBYKSwgbiA9IE1hdGguaW11bChqLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoWiwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFosIEopLCBsID0gbCArIE1hdGguaW11bChXLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIGRlKSB8IDA7CiAgICAgICAgdmFyIGplID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGplID4+PiAyNikgfCAwLCBqZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChWLCBYKSwgbiA9IE1hdGguaW11bChWLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoJCwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKCQsIEopLCBsID0gbCArIE1hdGguaW11bChqLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIHBlKSB8IDA7CiAgICAgICAgdmFyIFplID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFplID4+PiAyNikgfCAwLCBaZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBYKSwgbiA9IE1hdGguaW11bChHLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKFksIEopLCBsID0gbCArIE1hdGguaW11bChWLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIGJlKSB8IDA7CiAgICAgICAgdmFyIFZlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFZlID4+PiAyNikgfCAwLCBWZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBRKSwgbiA9IE1hdGguaW11bChHLCBlZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIFEpIHwgMCwgZCA9IE1hdGguaW11bChZLCBlZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6Miwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgYmUpIHwgMDsKICAgICAgICB2YXIgJGUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoJGUgPj4+IDI2KSB8IDAsICRlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIHRlKSwgbiA9IE1hdGguaW11bChHLCByZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIHRlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgcmUpLCBsID0gbCArIE1hdGguaW11bChWLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBhZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBiZSkgfCAwOwogICAgICAgIHZhciBHZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChHZSA+Pj4gMjYpIHwgMCwgR2UgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgaWUpLCBuID0gTWF0aC5pbXVsKEcsIG5lKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgaWUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBuZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBiZSkgfCAwOwogICAgICAgIHZhciBZZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChZZSA+Pj4gMjYpIHwgMCwgWWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgZmUpLCBuID0gTWF0aC5pbXVsKEcsIGFlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgZmUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBhZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgYmUpIHwgMDsKICAgICAgICB2YXIgWGUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWGUgPj4+IDI2KSB8IDAsIFhlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIG9lKSwgbiA9IE1hdGguaW11bChHLCBzZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIG9lKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgc2UpLCBsID0gbCArIE1hdGguaW11bChWLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGJlKSB8IDA7CiAgICAgICAgdmFyIEplID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEplID4+PiAyNikgfCAwLCBKZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBoZSksIG4gPSBNYXRoLmltdWwoRywgdWUpLCBuID0gbiArIE1hdGguaW11bChZLCBoZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHVlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgcGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgY2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgYmUpIHwgMDsKICAgICAgICB2YXIgUWUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoUWUgPj4+IDI2KSB8IDAsIFFlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGxlKSwgbiA9IE1hdGguaW11bChHLCBkZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGxlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgZGUpLCBsID0gbCArIE1hdGguaW11bChWLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBiZSkgfCAwOwogICAgICAgIHZhciBldCA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChldCA+Pj4gMjYpIHwgMCwgZXQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgY2UpLCBuID0gTWF0aC5pbXVsKEcsIHBlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgY2UpIHwgMCwgZCA9IE1hdGguaW11bChZLCBwZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIGJlKSB8IDA7CiAgICAgICAgdmFyIHR0ID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHR0ID4+PiAyNikgfCAwLCB0dCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCB2ZSksIG4gPSBNYXRoLmltdWwoRywgYmUpLCBuID0gbiArIE1hdGguaW11bChZLCB2ZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGJlKTsKICAgICAgICB2YXIgcnQgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIHJldHVybiBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHJ0ID4+PiAyNikgfCAwLCBydCAmPSA2NzEwODg2MywgY1swXSA9IGZ0LCBjWzFdID0gQmUsIGNbMl0gPSBxZSwgY1szXSA9IHplLCBjWzRdID0gSGUsIGNbNV0gPSBXZSwgY1s2XSA9IEtlLCBjWzddID0gamUsIGNbOF0gPSBaZSwgY1s5XSA9IFZlLCBjWzEwXSA9ICRlLCBjWzExXSA9IEdlLCBjWzEyXSA9IFllLCBjWzEzXSA9IFhlLCBjWzE0XSA9IEplLCBjWzE1XSA9IFFlLCBjWzE2XSA9IGV0LCBjWzE3XSA9IHR0LCBjWzE4XSA9IHJ0LCBiMyAhPT0gMCAmJiAoY1sxOV0gPSBiMywgaDIubGVuZ3RoKyspLCBoMjsKICAgICAgfTsKICAgICAgTWF0aC5pbXVsIHx8IChMMiA9IHEyKTsKICAgICAgZnVuY3Rpb24gZ2UodiwgaSwgYSkgewogICAgICAgIGEubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gdi5uZWdhdGl2ZSwgYS5sZW5ndGggPSB2Lmxlbmd0aCArIGkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGgyID0gMCwgcyA9IDAsIHUgPSAwO3UgPCBhLmxlbmd0aCAtIDE7IHUrKykgewogICAgICAgICAgdmFyIGMgPSBzOwogICAgICAgICAgcyA9IDA7CiAgICAgICAgICBmb3IgKHZhciBiMyA9IGgyICYgNjcxMDg4NjMsIGwgPSBNYXRoLm1pbih1LCBpLmxlbmd0aCAtIDEpLCBuID0gTWF0aC5tYXgoMCwgdSAtIHYubGVuZ3RoICsgMSk7biA8PSBsOyBuKyspIHsKICAgICAgICAgICAgdmFyIGQgPSB1IC0gbiwgdyA9IHYud29yZHNbZF0gfCAwLCBnID0gaS53b3Jkc1tuXSB8IDAsIF80ID0gdyAqIGcsIEEyID0gXzQgJiA2NzEwODg2MzsKICAgICAgICAgICAgYyA9IGMgKyAoXzQgLyA2NzEwODg2NCB8IDApIHwgMCwgQTIgPSBBMiArIGIzIHwgMCwgYjMgPSBBMiAmIDY3MTA4ODYzLCBjID0gYyArIChBMiA+Pj4gMjYpIHwgMCwgcyArPSBjID4+PiAyNiwgYyAmPSA2NzEwODg2MzsKICAgICAgICAgIH0KICAgICAgICAgIGEud29yZHNbdV0gPSBiMywgaDIgPSBjLCBjID0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGgyICE9PSAwID8gYS53b3Jkc1t1XSA9IGgyIDogYS5sZW5ndGgtLSwgYS5zdHJpcCgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIF9lKHYsIGksIGEpIHsKICAgICAgICB2YXIgaDIgPSBuZXcgTjsKICAgICAgICByZXR1cm4gaDIubXVscCh2LCBpLCBhKTsKICAgICAgfQogICAgICBmLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDIsIHMgPSB0aGlzLmxlbmd0aCArIGkubGVuZ3RoOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMTAgJiYgaS5sZW5ndGggPT09IDEwID8gaDIgPSBMMih0aGlzLCBpLCBhKSA6IHMgPCA2MyA/IGgyID0gcTIodGhpcywgaSwgYSkgOiBzIDwgMTAyNCA/IGgyID0gZ2UodGhpcywgaSwgYSkgOiBoMiA9IF9lKHRoaXMsIGksIGEpLCBoMjsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gTih2LCBpKSB7CiAgICAgICAgdGhpcy54ID0gdiwgdGhpcy55ID0gaTsKICAgICAgfQogICAgICBOLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSBuZXcgQXJyYXkoaSksIGgyID0gZi5wcm90b3R5cGUuX2NvdW50Qml0cyhpKSAtIDEsIHMgPSAwO3MgPCBpOyBzKyspCiAgICAgICAgICBhW3NdID0gdGhpcy5yZXZCaW4ocywgaDIsIGkpOwogICAgICAgIHJldHVybiBhOwogICAgICB9LCBOLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IGgyIC0gMSkKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMDt1IDwgYTsgdSsrKQogICAgICAgICAgcyB8PSAoaSAmIDEpIDw8IGEgLSB1IC0gMSwgaSA+Pj0gMTsKICAgICAgICByZXR1cm4gczsKICAgICAgfSwgTi5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uKGksIGEsIGgyLCBzLCB1LCBjKSB7CiAgICAgICAgZm9yICh2YXIgYjMgPSAwO2IzIDwgYzsgYjMrKykKICAgICAgICAgIHNbYjNdID0gYVtpW2IzXV0sIHVbYjNdID0gaDJbaVtiM11dOwogICAgICB9LCBOLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihpLCBhLCBoMiwgcywgdSwgYykgewogICAgICAgIHRoaXMucGVybXV0ZShjLCBpLCBhLCBoMiwgcywgdSk7CiAgICAgICAgZm9yICh2YXIgYjMgPSAxO2IzIDwgdTsgYjMgPDw9IDEpCiAgICAgICAgICBmb3IgKHZhciBsID0gYjMgPDwgMSwgbiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCksIGQgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpLCB3ID0gMDt3IDwgdTsgdyArPSBsKQogICAgICAgICAgICBmb3IgKHZhciBnID0gbiwgXzQgPSBkLCBBMiA9IDA7QTIgPCBiMzsgQTIrKykgewogICAgICAgICAgICAgIHZhciBSMiA9IGgyW3cgKyBBMl0sIEkgPSBzW3cgKyBBMl0sIE1lID0gaDJbdyArIEEyICsgYjNdLCBrID0gc1t3ICsgQTIgKyBiM10sIEQyID0gZyAqIE1lIC0gXzQgKiBrOwogICAgICAgICAgICAgIGsgPSBnICogayArIF80ICogTWUsIE1lID0gRDIsIGgyW3cgKyBBMl0gPSBSMiArIE1lLCBzW3cgKyBBMl0gPSBJICsgaywgaDJbdyArIEEyICsgYjNdID0gUjIgLSBNZSwgc1t3ICsgQTIgKyBiM10gPSBJIC0gaywgQTIgIT09IGwgJiYgKEQyID0gbiAqIGcgLSBkICogXzQsIF80ID0gbiAqIF80ICsgZCAqIGcsIGcgPSBEMik7CiAgICAgICAgICAgIH0KICAgICAgfSwgTi5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gTWF0aC5tYXgoYSwgaSkgfCAxLCBzID0gaDIgJiAxLCB1ID0gMDsKICAgICAgICBmb3IgKGgyID0gaDIgLyAyIHwgMDtoMjsgaDIgPSBoMiA+Pj4gMSkKICAgICAgICAgIHUrKzsKICAgICAgICByZXR1cm4gMSA8PCB1ICsgMSArIHM7CiAgICAgIH0sIE4ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKCEoaDIgPD0gMSkpCiAgICAgICAgICBmb3IgKHZhciBzID0gMDtzIDwgaDIgLyAyOyBzKyspIHsKICAgICAgICAgICAgdmFyIHUgPSBpW3NdOwogICAgICAgICAgICBpW3NdID0gaVtoMiAtIHMgLSAxXSwgaVtoMiAtIHMgLSAxXSA9IHUsIHUgPSBhW3NdLCBhW3NdID0gLWFbaDIgLSBzIC0gMV0sIGFbaDIgLSBzIC0gMV0gPSAtdTsKICAgICAgICAgIH0KICAgICAgfSwgTi5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGZvciAodmFyIGgyID0gMCwgcyA9IDA7cyA8IGEgLyAyOyBzKyspIHsKICAgICAgICAgIHZhciB1ID0gTWF0aC5yb3VuZChpWzIgKiBzICsgMV0gLyBhKSAqIDgxOTIgKyBNYXRoLnJvdW5kKGlbMiAqIHNdIC8gYSkgKyBoMjsKICAgICAgICAgIGlbc10gPSB1ICYgNjcxMDg4NjMsIHUgPCA2NzEwODg2NCA/IGgyID0gMCA6IGgyID0gdSAvIDY3MTA4ODY0IHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0sIE4ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbihpLCBhLCBoMiwgcykgewogICAgICAgIGZvciAodmFyIHUgPSAwLCBjID0gMDtjIDwgYTsgYysrKQogICAgICAgICAgdSA9IHUgKyAoaVtjXSB8IDApLCBoMlsyICogY10gPSB1ICYgODE5MSwgdSA9IHUgPj4+IDEzLCBoMlsyICogYyArIDFdID0gdSAmIDgxOTEsIHUgPSB1ID4+PiAxMzsKICAgICAgICBmb3IgKGMgPSAyICogYTtjIDwgczsgKytjKQogICAgICAgICAgaDJbY10gPSAwOwogICAgICAgIHIodSA9PT0gMCksIHIoKHUgJiAtODE5MikgPT09IDApOwogICAgICB9LCBOLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSBuZXcgQXJyYXkoaSksIGgyID0gMDtoMiA8IGk7IGgyKyspCiAgICAgICAgICBhW2gyXSA9IDA7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIE4ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoaS5sZW5ndGgsIGEubGVuZ3RoKSwgdSA9IHRoaXMubWFrZVJCVChzKSwgYyA9IHRoaXMuc3R1YihzKSwgYjMgPSBuZXcgQXJyYXkocyksIGwgPSBuZXcgQXJyYXkocyksIG4gPSBuZXcgQXJyYXkocyksIGQgPSBuZXcgQXJyYXkocyksIHcgPSBuZXcgQXJyYXkocyksIGcgPSBuZXcgQXJyYXkocyksIF80ID0gaDIud29yZHM7CiAgICAgICAgXzQubGVuZ3RoID0gcywgdGhpcy5jb252ZXJ0MTNiKGkud29yZHMsIGkubGVuZ3RoLCBiMywgcyksIHRoaXMuY29udmVydDEzYihhLndvcmRzLCBhLmxlbmd0aCwgZCwgcyksIHRoaXMudHJhbnNmb3JtKGIzLCBjLCBsLCBuLCBzLCB1KSwgdGhpcy50cmFuc2Zvcm0oZCwgYywgdywgZywgcywgdSk7CiAgICAgICAgZm9yICh2YXIgQTIgPSAwO0EyIDwgczsgQTIrKykgewogICAgICAgICAgdmFyIFIyID0gbFtBMl0gKiB3W0EyXSAtIG5bQTJdICogZ1tBMl07CiAgICAgICAgICBuW0EyXSA9IGxbQTJdICogZ1tBMl0gKyBuW0EyXSAqIHdbQTJdLCBsW0EyXSA9IFIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUobCwgbiwgcyksIHRoaXMudHJhbnNmb3JtKGwsIG4sIF80LCBjLCBzLCB1KSwgdGhpcy5jb25qdWdhdGUoXzQsIGMsIHMpLCB0aGlzLm5vcm1hbGl6ZTEzYihfNCwgcyksIGgyLm5lZ2F0aXZlID0gaS5uZWdhdGl2ZSBeIGEubmVnYXRpdmUsIGgyLmxlbmd0aCA9IGkubGVuZ3RoICsgYS5sZW5ndGgsIGgyLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBhLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgaS5sZW5ndGgpLCB0aGlzLm11bFRvKGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGEud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBpLmxlbmd0aCksIF9lKHRoaXMsIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8oaSwgdGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCk7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gMDtoMiA8IHRoaXMubGVuZ3RoOyBoMisrKSB7CiAgICAgICAgICB2YXIgcyA9ICh0aGlzLndvcmRzW2gyXSB8IDApICogaSwgdSA9IChzICYgNjcxMDg4NjMpICsgKGEgJiA2NzEwODg2Myk7CiAgICAgICAgICBhID4+PSAyNiwgYSArPSBzIC8gNjcxMDg4NjQgfCAwLCBhICs9IHUgPj4+IDI2LCB0aGlzLndvcmRzW2gyXSA9IHUgJiA2NzEwODg2MzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGEgIT09IDAgJiYgKHRoaXMud29yZHNbaDJdID0gYSwgdGhpcy5sZW5ndGgrKyksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpOwogICAgICB9LCBmLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBCKGkpOwogICAgICAgIGlmIChhLmxlbmd0aCA9PT0gMCkKICAgICAgICAgIHJldHVybiBuZXcgZigxKTsKICAgICAgICBmb3IgKHZhciBoMiA9IHRoaXMsIHMgPSAwO3MgPCBhLmxlbmd0aCAmJiBhW3NdID09PSAwOyBzKyssIGgyID0gaDIuc3FyKCkpCiAgICAgICAgICA7CiAgICAgICAgaWYgKCsrcyA8IGEubGVuZ3RoKQogICAgICAgICAgZm9yICh2YXIgdSA9IGgyLnNxcigpO3MgPCBhLmxlbmd0aDsgcysrLCB1ID0gdS5zcXIoKSkKICAgICAgICAgICAgYVtzXSAhPT0gMCAmJiAoaDIgPSBoMi5tdWwodSkpOwogICAgICAgIHJldHVybiBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjYsIHMgPSA2NzEwODg2MyA+Pj4gMjYgLSBhIDw8IDI2IC0gYSwgdTsKICAgICAgICBpZiAoYSAhPT0gMCkgewogICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgZm9yICh1ID0gMDt1IDwgdGhpcy5sZW5ndGg7IHUrKykgewogICAgICAgICAgICB2YXIgYjMgPSB0aGlzLndvcmRzW3VdICYgcywgbCA9ICh0aGlzLndvcmRzW3VdIHwgMCkgLSBiMyA8PCBhOwogICAgICAgICAgICB0aGlzLndvcmRzW3VdID0gbCB8IGMsIGMgPSBiMyA+Pj4gMjYgLSBhOwogICAgICAgICAgfQogICAgICAgICAgYyAmJiAodGhpcy53b3Jkc1t1XSA9IGMsIHRoaXMubGVuZ3RoKyspOwogICAgICAgIH0KICAgICAgICBpZiAoaDIgIT09IDApIHsKICAgICAgICAgIGZvciAodSA9IHRoaXMubGVuZ3RoIC0gMTt1ID49IDA7IHUtLSkKICAgICAgICAgICAgdGhpcy53b3Jkc1t1ICsgaDJdID0gdGhpcy53b3Jkc1t1XTsKICAgICAgICAgIGZvciAodSA9IDA7dSA8IGgyOyB1KyspCiAgICAgICAgICAgIHRoaXMud29yZHNbdV0gPSAwOwogICAgICAgICAgdGhpcy5sZW5ndGggKz0gaDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMubmVnYXRpdmUgPT09IDApLCB0aGlzLml1c2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIHM7CiAgICAgICAgYSA/IHMgPSAoYSAtIGEgJSAyNikgLyAyNiA6IHMgPSAwOwogICAgICAgIHZhciB1ID0gaSAlIDI2LCBjID0gTWF0aC5taW4oKGkgLSB1KSAvIDI2LCB0aGlzLmxlbmd0aCksIGIzID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4gdSA8PCB1LCBsID0gaDI7CiAgICAgICAgaWYgKHMgLT0gYywgcyA9IE1hdGgubWF4KDAsIHMpLCBsKSB7CiAgICAgICAgICBmb3IgKHZhciBuID0gMDtuIDwgYzsgbisrKQogICAgICAgICAgICBsLndvcmRzW25dID0gdGhpcy53b3Jkc1tuXTsKICAgICAgICAgIGwubGVuZ3RoID0gYzsKICAgICAgICB9CiAgICAgICAgaWYgKGMgIT09IDApCiAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBjKQogICAgICAgICAgICBmb3IgKHRoaXMubGVuZ3RoIC09IGMsIG4gPSAwO24gPCB0aGlzLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgIHRoaXMud29yZHNbbl0gPSB0aGlzLndvcmRzW24gKyBjXTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMTsKICAgICAgICB2YXIgZCA9IDA7CiAgICAgICAgZm9yIChuID0gdGhpcy5sZW5ndGggLSAxO24gPj0gMCAmJiAoZCAhPT0gMCB8fCBuID49IHMpOyBuLS0pIHsKICAgICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tuXSB8IDA7CiAgICAgICAgICB0aGlzLndvcmRzW25dID0gZCA8PCAyNiAtIHUgfCB3ID4+PiB1LCBkID0gdyAmIGIzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbCAmJiBkICE9PSAwICYmIChsLndvcmRzW2wubGVuZ3RoKytdID0gZCksIHRoaXMubGVuZ3RoID09PSAwICYmICh0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaHJuKGksIGEsIGgyKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNiwgcyA9IDEgPDwgYTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPD0gaDIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHUgPSB0aGlzLndvcmRzW2gyXTsKICAgICAgICByZXR1cm4gISEodSAmIHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNjsKICAgICAgICBpZiAocih0aGlzLm5lZ2F0aXZlID09PSAwLCAiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksIHRoaXMubGVuZ3RoIDw9IGgyKQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKGEgIT09IDAgJiYgaDIrKywgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihoMiwgdGhpcy5sZW5ndGgpLCBhICE9PSAwKSB7CiAgICAgICAgICB2YXIgcyA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IGEgPDwgYTsKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCksIGkgPCAwID8gdGhpcy5pc3VibigtaSkgOiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IGkgPyAodGhpcy53b3Jkc1swXSA9IGkgLSAodGhpcy53b3Jkc1swXSB8IDApLCB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcykgOiAodGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMuaXN1Ym4oaSksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzKSA6IHRoaXMuX2lhZGRuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdGhpcy53b3Jkc1swXSArPSBpOwogICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2FdID49IDY3MTA4ODY0OyBhKyspCiAgICAgICAgICB0aGlzLndvcmRzW2FdIC09IDY3MTA4ODY0LCBhID09PSB0aGlzLmxlbmd0aCAtIDEgPyB0aGlzLndvcmRzW2EgKyAxXSA9IDEgOiB0aGlzLndvcmRzW2EgKyAxXSsrOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBhICsgMSksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChyKHR5cGVvZiBpID09ICJudW1iZXIiKSwgcihpIDwgNjcxMDg4NjQpLCBpIDwgMCkKICAgICAgICAgIHJldHVybiB0aGlzLmlhZGRuKC1pKTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkbihpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXM7CiAgICAgICAgaWYgKHRoaXMud29yZHNbMF0gLT0gaSwgdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApCiAgICAgICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF0sIHRoaXMubmVnYXRpdmUgPSAxOwogICAgICAgIGVsc2UKICAgICAgICAgIGZvciAodmFyIGEgPSAwO2EgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2FdIDwgMDsgYSsrKQogICAgICAgICAgICB0aGlzLndvcmRzW2FdICs9IDY3MTA4ODY0LCB0aGlzLndvcmRzW2EgKyAxXSAtPSAxOwogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IGkubGVuZ3RoICsgaDIsIHU7CiAgICAgICAgdGhpcy5fZXhwYW5kKHMpOwogICAgICAgIHZhciBjLCBiMyA9IDA7CiAgICAgICAgZm9yICh1ID0gMDt1IDwgaS5sZW5ndGg7IHUrKykgewogICAgICAgICAgYyA9ICh0aGlzLndvcmRzW3UgKyBoMl0gfCAwKSArIGIzOwogICAgICAgICAgdmFyIGwgPSAoaS53b3Jkc1t1XSB8IDApICogYTsKICAgICAgICAgIGMgLT0gbCAmIDY3MTA4ODYzLCBiMyA9IChjID4+IDI2KSAtIChsIC8gNjcxMDg4NjQgfCAwKSwgdGhpcy53b3Jkc1t1ICsgaDJdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIH0KICAgICAgICBmb3IgKDt1IDwgdGhpcy5sZW5ndGggLSBoMjsgdSsrKQogICAgICAgICAgYyA9ICh0aGlzLndvcmRzW3UgKyBoMl0gfCAwKSArIGIzLCBiMyA9IGMgPj4gMjYsIHRoaXMud29yZHNbdSArIGgyXSA9IGMgJiA2NzEwODg2MzsKICAgICAgICBpZiAoYjMgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICAgIGZvciAocihiMyA9PT0gLTEpLCBiMyA9IDAsIHUgPSAwO3UgPCB0aGlzLmxlbmd0aDsgdSsrKQogICAgICAgICAgYyA9IC0odGhpcy53b3Jkc1t1XSB8IDApICsgYjMsIGIzID0gYyA+PiAyNiwgdGhpcy53b3Jkc1t1XSA9IGMgJiA2NzEwODg2MzsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdmFyIGgyID0gdGhpcy5sZW5ndGggLSBpLmxlbmd0aCwgcyA9IHRoaXMuY2xvbmUoKSwgdSA9IGksIGMgPSB1LndvcmRzW3UubGVuZ3RoIC0gMV0gfCAwLCBiMyA9IHRoaXMuX2NvdW50Qml0cyhjKTsKICAgICAgICBoMiA9IDI2IC0gYjMsIGgyICE9PSAwICYmICh1ID0gdS51c2hsbihoMiksIHMuaXVzaGxuKGgyKSwgYyA9IHUud29yZHNbdS5sZW5ndGggLSAxXSB8IDApOwogICAgICAgIHZhciBsID0gcy5sZW5ndGggLSB1Lmxlbmd0aCwgbjsKICAgICAgICBpZiAoYSAhPT0gIm1vZCIpIHsKICAgICAgICAgIG4gPSBuZXcgZihudWxsKSwgbi5sZW5ndGggPSBsICsgMSwgbi53b3JkcyA9IG5ldyBBcnJheShuLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKHZhciBkID0gMDtkIDwgbi5sZW5ndGg7IGQrKykKICAgICAgICAgICAgbi53b3Jkc1tkXSA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciB3ID0gcy5jbG9uZSgpLl9pc2hsbnN1Ym11bCh1LCAxLCBsKTsKICAgICAgICB3Lm5lZ2F0aXZlID09PSAwICYmIChzID0gdywgbiAmJiAobi53b3Jkc1tsXSA9IDEpKTsKICAgICAgICBmb3IgKHZhciBnID0gbCAtIDE7ZyA+PSAwOyBnLS0pIHsKICAgICAgICAgIHZhciBfNCA9IChzLndvcmRzW3UubGVuZ3RoICsgZ10gfCAwKSAqIDY3MTA4ODY0ICsgKHMud29yZHNbdS5sZW5ndGggKyBnIC0gMV0gfCAwKTsKICAgICAgICAgIGZvciAoXzQgPSBNYXRoLm1pbihfNCAvIGMgfCAwLCA2NzEwODg2MyksIHMuX2lzaGxuc3VibXVsKHUsIF80LCBnKTtzLm5lZ2F0aXZlICE9PSAwOyApCiAgICAgICAgICAgIF80LS0sIHMubmVnYXRpdmUgPSAwLCBzLl9pc2hsbnN1Ym11bCh1LCAxLCBnKSwgcy5pc1plcm8oKSB8fCAocy5uZWdhdGl2ZSBePSAxKTsKICAgICAgICAgIG4gJiYgKG4ud29yZHNbZ10gPSBfNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuICYmIG4uc3RyaXAoKSwgcy5zdHJpcCgpLCBhICE9PSAiZGl2IiAmJiBoMiAhPT0gMCAmJiBzLml1c2hybihoMiksIHsgZGl2OiBuIHx8IG51bGwsIG1vZDogcyB9OwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmIChyKCFpLmlzWmVybygpKSwgdGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiB7IGRpdjogbmV3IGYoMCksIG1vZDogbmV3IGYoMCkgfTsKICAgICAgICB2YXIgcywgdSwgYzsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwID8gKGMgPSB0aGlzLm5lZygpLmRpdm1vZChpLCBhKSwgYSAhPT0gIm1vZCIgJiYgKHMgPSBjLmRpdi5uZWcoKSksIGEgIT09ICJkaXYiICYmICh1ID0gYy5tb2QubmVnKCksIGgyICYmIHUubmVnYXRpdmUgIT09IDAgJiYgdS5pYWRkKGkpKSwgeyBkaXY6IHMsIG1vZDogdSB9KSA6IHRoaXMubmVnYXRpdmUgPT09IDAgJiYgaS5uZWdhdGl2ZSAhPT0gMCA/IChjID0gdGhpcy5kaXZtb2QoaS5uZWcoKSwgYSksIGEgIT09ICJtb2QiICYmIChzID0gYy5kaXYubmVnKCkpLCB7IGRpdjogcywgbW9kOiBjLm1vZCB9KSA6ICh0aGlzLm5lZ2F0aXZlICYgaS5uZWdhdGl2ZSkgIT09IDAgPyAoYyA9IHRoaXMubmVnKCkuZGl2bW9kKGkubmVnKCksIGEpLCBhICE9PSAiZGl2IiAmJiAodSA9IGMubW9kLm5lZygpLCBoMiAmJiB1Lm5lZ2F0aXZlICE9PSAwICYmIHUuaXN1YihpKSksIHsgZGl2OiBjLmRpdiwgbW9kOiB1IH0pIDogaS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChpKSA8IDAgPyB7IGRpdjogbmV3IGYoMCksIG1vZDogdGhpcyB9IDogaS5sZW5ndGggPT09IDEgPyBhID09PSAiZGl2IiA/IHsgZGl2OiB0aGlzLmRpdm4oaS53b3Jkc1swXSksIG1vZDogbnVsbCB9IDogYSA9PT0gIm1vZCIgPyB7IGRpdjogbnVsbCwgbW9kOiBuZXcgZih0aGlzLm1vZG4oaS53b3Jkc1swXSkpIH0gOiB7IGRpdjogdGhpcy5kaXZuKGkud29yZHNbMF0pLCBtb2Q6IG5ldyBmKHRoaXMubW9kbihpLndvcmRzWzBdKSkgfSA6IHRoaXMuX3dvcmREaXYoaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgImRpdiIsIGZhbHNlKS5kaXY7CiAgICAgIH0sIGYucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgIm1vZCIsIGZhbHNlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGksICJtb2QiLCB0cnVlKS5tb2Q7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5kaXZtb2QoaSk7CiAgICAgICAgaWYgKGEubW9kLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGEuZGl2OwogICAgICAgIHZhciBoMiA9IGEuZGl2Lm5lZ2F0aXZlICE9PSAwID8gYS5tb2QuaXN1YihpKSA6IGEubW9kLCBzID0gaS51c2hybigxKSwgdSA9IGkuYW5kbG4oMSksIGMgPSBoMi5jbXAocyk7CiAgICAgICAgcmV0dXJuIGMgPCAwIHx8IHUgPT09IDEgJiYgYyA9PT0gMCA/IGEuZGl2IDogYS5kaXYubmVnYXRpdmUgIT09IDAgPyBhLmRpdi5pc3VibigxKSA6IGEuZGl2LmlhZGRuKDEpOwogICAgICB9LCBmLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaSA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYSA9ICgxIDw8IDI2KSAlIGksIGgyID0gMCwgcyA9IHRoaXMubGVuZ3RoIC0gMTtzID49IDA7IHMtLSkKICAgICAgICAgIGgyID0gKGEgKiBoMiArICh0aGlzLndvcmRzW3NdIHwgMCkpICUgaTsKICAgICAgICByZXR1cm4gaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHIoaSA8PSA2NzEwODg2Myk7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gdGhpcy5sZW5ndGggLSAxO2gyID49IDA7IGgyLS0pIHsKICAgICAgICAgIHZhciBzID0gKHRoaXMud29yZHNbaDJdIHwgMCkgKyBhICogNjcxMDg4NjQ7CiAgICAgICAgICB0aGlzLndvcmRzW2gyXSA9IHMgLyBpIHwgMCwgYSA9IHMgJSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwKSwgcighaS5pc1plcm8oKSk7CiAgICAgICAgdmFyIGEgPSB0aGlzLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlICE9PSAwID8gYSA9IGEudW1vZChpKSA6IGEgPSBhLmNsb25lKCk7CiAgICAgICAgZm9yICh2YXIgcyA9IG5ldyBmKDEpLCB1ID0gbmV3IGYoMCksIGMgPSBuZXcgZigwKSwgYjMgPSBuZXcgZigxKSwgbCA9IDA7YS5pc0V2ZW4oKSAmJiBoMi5pc0V2ZW4oKTsgKQogICAgICAgICAgYS5pdXNocm4oMSksIGgyLml1c2hybigxKSwgKytsOwogICAgICAgIGZvciAodmFyIG4gPSBoMi5jbG9uZSgpLCBkID0gYS5jbG9uZSgpOyFhLmlzWmVybygpOyApIHsKICAgICAgICAgIGZvciAodmFyIHcgPSAwLCBnID0gMTsoYS53b3Jkc1swXSAmIGcpID09PSAwICYmIHcgPCAyNjsgKyt3LCBnIDw8PSAxKQogICAgICAgICAgICA7CiAgICAgICAgICBpZiAodyA+IDApCiAgICAgICAgICAgIGZvciAoYS5pdXNocm4odyk7dy0tID4gMDsgKQogICAgICAgICAgICAgIChzLmlzT2RkKCkgfHwgdS5pc09kZCgpKSAmJiAocy5pYWRkKG4pLCB1LmlzdWIoZCkpLCBzLml1c2hybigxKSwgdS5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKHZhciBfNCA9IDAsIEEyID0gMTsoaDIud29yZHNbMF0gJiBBMikgPT09IDAgJiYgXzQgPCAyNjsgKytfNCwgQTIgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChfNCA+IDApCiAgICAgICAgICAgIGZvciAoaDIuaXVzaHJuKF80KTtfNC0tID4gMDsgKQogICAgICAgICAgICAgIChjLmlzT2RkKCkgfHwgYjMuaXNPZGQoKSkgJiYgKGMuaWFkZChuKSwgYjMuaXN1YihkKSksIGMuaXVzaHJuKDEpLCBiMy5pdXNocm4oMSk7CiAgICAgICAgICBhLmNtcChoMikgPj0gMCA/IChhLmlzdWIoaDIpLCBzLmlzdWIoYyksIHUuaXN1YihiMykpIDogKGgyLmlzdWIoYSksIGMuaXN1YihzKSwgYjMuaXN1Yih1KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGE6IGMsIGI6IGIzLCBnY2Q6IGgyLml1c2hsbihsKSB9OwogICAgICB9LCBmLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwKSwgcighaS5pc1plcm8oKSk7CiAgICAgICAgdmFyIGEgPSB0aGlzLCBoMiA9IGkuY2xvbmUoKTsKICAgICAgICBhLm5lZ2F0aXZlICE9PSAwID8gYSA9IGEudW1vZChpKSA6IGEgPSBhLmNsb25lKCk7CiAgICAgICAgZm9yICh2YXIgcyA9IG5ldyBmKDEpLCB1ID0gbmV3IGYoMCksIGMgPSBoMi5jbG9uZSgpO2EuY21wbigxKSA+IDAgJiYgaDIuY21wbigxKSA+IDA7ICkgewogICAgICAgICAgZm9yICh2YXIgYjMgPSAwLCBsID0gMTsoYS53b3Jkc1swXSAmIGwpID09PSAwICYmIGIzIDwgMjY7ICsrYjMsIGwgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChiMyA+IDApCiAgICAgICAgICAgIGZvciAoYS5pdXNocm4oYjMpO2IzLS0gPiAwOyApCiAgICAgICAgICAgICAgcy5pc09kZCgpICYmIHMuaWFkZChjKSwgcy5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKHZhciBuID0gMCwgZCA9IDE7KGgyLndvcmRzWzBdICYgZCkgPT09IDAgJiYgbiA8IDI2OyArK24sIGQgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmIChuID4gMCkKICAgICAgICAgICAgZm9yIChoMi5pdXNocm4obik7bi0tID4gMDsgKQogICAgICAgICAgICAgIHUuaXNPZGQoKSAmJiB1LmlhZGQoYyksIHUuaXVzaHJuKDEpOwogICAgICAgICAgYS5jbXAoaDIpID49IDAgPyAoYS5pc3ViKGgyKSwgcy5pc3ViKHUpKSA6IChoMi5pc3ViKGEpLCB1LmlzdWIocykpOwogICAgICAgIH0KICAgICAgICB2YXIgdzsKICAgICAgICByZXR1cm4gYS5jbXBuKDEpID09PSAwID8gdyA9IHMgOiB3ID0gdSwgdy5jbXBuKDApIDwgMCAmJiB3LmlhZGQoaSksIHc7CiAgICAgIH0sIGYucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLmFicygpOwogICAgICAgIGlmIChpLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHRoaXMuYWJzKCk7CiAgICAgICAgdmFyIGEgPSB0aGlzLmNsb25lKCksIGgyID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgPSAwLCBoMi5uZWdhdGl2ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7YS5pc0V2ZW4oKSAmJiBoMi5pc0V2ZW4oKTsgcysrKQogICAgICAgICAgYS5pdXNocm4oMSksIGgyLml1c2hybigxKTsKICAgICAgICBkbyB7CiAgICAgICAgICBmb3IgKDthLmlzRXZlbigpOyApCiAgICAgICAgICAgIGEuaXVzaHJuKDEpOwogICAgICAgICAgZm9yICg7aDIuaXNFdmVuKCk7ICkKICAgICAgICAgICAgaDIuaXVzaHJuKDEpOwogICAgICAgICAgdmFyIHUgPSBhLmNtcChoMik7CiAgICAgICAgICBpZiAodSA8IDApIHsKICAgICAgICAgICAgdmFyIGMgPSBhOwogICAgICAgICAgICBhID0gaDIsIGgyID0gYzsKICAgICAgICAgIH0gZWxzZSBpZiAodSA9PT0gMCB8fCBoMi5jbXBuKDEpID09PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGEuaXN1YihoMik7CiAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgICAgcmV0dXJuIGgyLml1c2hsbihzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5lZ2NkKGkpLmEudW1vZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgaTsKICAgICAgfSwgZi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIik7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2LCBzID0gMSA8PCBhOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSBoMikKICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQoaDIgKyAxKSwgdGhpcy53b3Jkc1toMl0gfD0gcywgdGhpczsKICAgICAgICBmb3IgKHZhciB1ID0gcywgYyA9IGgyO3UgIT09IDAgJiYgYyA8IHRoaXMubGVuZ3RoOyBjKyspIHsKICAgICAgICAgIHZhciBiMyA9IHRoaXMud29yZHNbY10gfCAwOwogICAgICAgICAgYjMgKz0gdSwgdSA9IGIzID4+PiAyNiwgYjMgJj0gNjcxMDg4NjMsIHRoaXMud29yZHNbY10gPSBiMzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHUgIT09IDAgJiYgKHRoaXMud29yZHNbY10gPSB1LCB0aGlzLmxlbmd0aCsrKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpIDwgMDsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhYSkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBhKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgdGhpcy5zdHJpcCgpOwogICAgICAgIHZhciBoMjsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAxKQogICAgICAgICAgaDIgPSAxOwogICAgICAgIGVsc2UgewogICAgICAgICAgYSAmJiAoaSA9IC1pKSwgcihpIDw9IDY3MTA4ODYzLCAiTnVtYmVyIGlzIHRvbyBiaWciKTsKICAgICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1swXSB8IDA7CiAgICAgICAgICBoMiA9IHMgPT09IGkgPyAwIDogcyA8IGkgPyAtMSA6IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWgyIHwgMCA6IGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgaS5uZWdhdGl2ZSA9PT0gMCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgdmFyIGEgPSB0aGlzLnVjbXAoaSk7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtYSB8IDAgOiBhOwogICAgICB9LCBmLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGkubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgaS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gdGhpcy5sZW5ndGggLSAxO2gyID49IDA7IGgyLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy53b3Jkc1toMl0gfCAwLCB1ID0gaS53b3Jkc1toMl0gfCAwOwogICAgICAgICAgaWYgKHMgIT09IHUpIHsKICAgICAgICAgICAgcyA8IHUgPyBhID0gLTEgOiBzID4gdSAmJiAoYSA9IDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAxOwogICAgICB9LCBmLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA+PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID49IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID09PSAtMTsKICAgICAgfSwgZi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAtMTsKICAgICAgfSwgZi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpIDw9IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPD0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmVxID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gMDsKICAgICAgfSwgZi5yZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsICJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksIGkuY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZCA9IGksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgdGhpcy5fZm9yY2VSZWQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuYWRkKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuaWFkZCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5zdWIodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5pc3ViKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLnNobCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBpKSwgdGhpcy5yZWQubXVsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBpKSwgdGhpcy5yZWQuaW11bCh0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5zcXIodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pc3FyKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FydCh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmludm0odGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQubmVnKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQgJiYgIWkucmVkLCAicmVkUG93KG5vcm1hbE51bSkiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnBvdyh0aGlzLCBpKTsKICAgICAgfTsKICAgICAgdmFyIHdlID0geyBrMjU2OiBudWxsLCBwMjI0OiBudWxsLCBwMTkyOiBudWxsLCBwMjU1MTk6IG51bGwgfTsKICAgICAgZnVuY3Rpb24geWUodiwgaSkgewogICAgICAgIHRoaXMubmFtZSA9IHYsIHRoaXMucCA9IG5ldyBmKGksIDE2KSwgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpLCB0aGlzLmsgPSBuZXcgZigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7CiAgICAgIH0KICAgICAgeWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiBpLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpLCBpOwogICAgICB9LCB5ZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGksIGgyOwogICAgICAgIGRvCiAgICAgICAgICB0aGlzLnNwbGl0KGEsIHRoaXMudG1wKSwgYSA9IHRoaXMuaW11bEsoYSksIGEgPSBhLmlhZGQodGhpcy50bXApLCBoMiA9IGEuYml0TGVuZ3RoKCk7CiAgICAgICAgd2hpbGUgKGgyID4gdGhpcy5uKTsKICAgICAgICB2YXIgcyA9IGgyIDwgdGhpcy5uID8gLTEgOiBhLnVjbXAodGhpcy5wKTsKICAgICAgICByZXR1cm4gcyA9PT0gMCA/IChhLndvcmRzWzBdID0gMCwgYS5sZW5ndGggPSAxKSA6IHMgPiAwID8gYS5pc3ViKHRoaXMucCkgOiBhLnN0cmlwICE9PSB1bmRlZmluZWQgPyBhLnN0cmlwKCkgOiBhLl9zdHJpcCgpLCBhOwogICAgICB9LCB5ZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgaS5pdXNocm4odGhpcy5uLCAwLCBhKTsKICAgICAgfSwgeWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBpLmltdWwodGhpcy5rKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24geGUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAiazI1NiIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpOwogICAgICB9CiAgICAgIG8oeGUsIHllKSwgeGUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGZvciAodmFyIGgyID0gNDE5NDMwMywgcyA9IE1hdGgubWluKGkubGVuZ3RoLCA5KSwgdSA9IDA7dSA8IHM7IHUrKykKICAgICAgICAgIGEud29yZHNbdV0gPSBpLndvcmRzW3VdOwogICAgICAgIGlmIChhLmxlbmd0aCA9IHMsIGkubGVuZ3RoIDw9IDkpIHsKICAgICAgICAgIGkud29yZHNbMF0gPSAwLCBpLmxlbmd0aCA9IDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBjID0gaS53b3Jkc1s5XTsKICAgICAgICBmb3IgKGEud29yZHNbYS5sZW5ndGgrK10gPSBjICYgaDIsIHUgPSAxMDt1IDwgaS5sZW5ndGg7IHUrKykgewogICAgICAgICAgdmFyIGIzID0gaS53b3Jkc1t1XSB8IDA7CiAgICAgICAgICBpLndvcmRzW3UgLSAxMF0gPSAoYjMgJiBoMikgPDwgNCB8IGMgPj4+IDIyLCBjID0gYjM7CiAgICAgICAgfQogICAgICAgIGMgPj4+PSAyMiwgaS53b3Jkc1t1IC0gMTBdID0gYywgYyA9PT0gMCAmJiBpLmxlbmd0aCA+IDEwID8gaS5sZW5ndGggLT0gMTAgOiBpLmxlbmd0aCAtPSA5OwogICAgICB9LCB4ZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaS53b3Jkc1tpLmxlbmd0aF0gPSAwLCBpLndvcmRzW2kubGVuZ3RoICsgMV0gPSAwLCBpLmxlbmd0aCArPSAyOwogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IDA7aDIgPCBpLmxlbmd0aDsgaDIrKykgewogICAgICAgICAgdmFyIHMgPSBpLndvcmRzW2gyXSB8IDA7CiAgICAgICAgICBhICs9IHMgKiA5NzcsIGkud29yZHNbaDJdID0gYSAmIDY3MTA4ODYzLCBhID0gcyAqIDY0ICsgKGEgLyA2NzEwODg2NCB8IDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaS53b3Jkc1tpLmxlbmd0aCAtIDFdID09PSAwICYmIChpLmxlbmd0aC0tLCBpLndvcmRzW2kubGVuZ3RoIC0gMV0gPT09IDAgJiYgaS5sZW5ndGgtLSksIGk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFJlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgInAyMjQiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiKTsKICAgICAgfQogICAgICBvKFJlLCB5ZSk7CiAgICAgIGZ1bmN0aW9uIEVlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgInAxOTIiLCAiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKTsKICAgICAgfQogICAgICBvKEVlLCB5ZSk7CiAgICAgIGZ1bmN0aW9uIEFlKCkgewogICAgICAgIHllLmNhbGwodGhpcywgIjI1NTE5IiwgIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKTsKICAgICAgfQogICAgICBvKEFlLCB5ZSksIEFlLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSAwO2gyIDwgaS5sZW5ndGg7IGgyKyspIHsKICAgICAgICAgIHZhciBzID0gKGkud29yZHNbaDJdIHwgMCkgKiAxOSArIGEsIHUgPSBzICYgNjcxMDg4NjM7CiAgICAgICAgICBzID4+Pj0gMjYsIGkud29yZHNbaDJdID0gdSwgYSA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhICE9PSAwICYmIChpLndvcmRzW2kubGVuZ3RoKytdID0gYSksIGk7CiAgICAgIH0sIGYuX3ByaW1lID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh3ZVtpXSkKICAgICAgICAgIHJldHVybiB3ZVtpXTsKICAgICAgICB2YXIgYTsKICAgICAgICBpZiAoaSA9PT0gImsyNTYiKQogICAgICAgICAgYSA9IG5ldyB4ZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDIyNCIpCiAgICAgICAgICBhID0gbmV3IFJlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMTkyIikKICAgICAgICAgIGEgPSBuZXcgRWU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAyNTUxOSIpCiAgICAgICAgICBhID0gbmV3IEFlOwogICAgICAgIGVsc2UKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiICsgaSk7CiAgICAgICAgcmV0dXJuIHdlW2ldID0gYSwgYTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gUCh2KSB7CiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgaSA9IGYuX3ByaW1lKHYpOwogICAgICAgICAgdGhpcy5tID0gaS5wLCB0aGlzLnByaW1lID0gaTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHIodi5ndG4oMSksICJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSwgdGhpcy5tID0gdiwgdGhpcy5wcmltZSA9IG51bGw7CiAgICAgIH0KICAgICAgUC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpLm5lZ2F0aXZlID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihpLnJlZCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKTsKICAgICAgfSwgUC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcigoaS5uZWdhdGl2ZSB8IGEubmVnYXRpdmUpID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgcihpLnJlZCAmJiBpLnJlZCA9PT0gYS5yZWQsICJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIik7CiAgICAgIH0sIFAucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWUgPyB0aGlzLnByaW1lLmlyZWR1Y2UoaSkuX2ZvcmNlUmVkKHRoaXMpIDogaS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkuaXNaZXJvKCkgPyBpLmNsb25lKCkgOiB0aGlzLm0uc3ViKGkpLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5hZGQoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcCh0aGlzLm0pID49IDAgJiYgaDIuaXN1Yih0aGlzLm0pLCBoMi5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDIgPSBpLmlhZGQoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcCh0aGlzLm0pID49IDAgJiYgaDIuaXN1Yih0aGlzLm0pLCBoMjsKICAgICAgfSwgUC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5zdWIoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcG4oMCkgPCAwICYmIGgyLmlhZGQodGhpcy5tKSwgaDIuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHRoaXMuX3ZlcmlmeTIoaSwgYSk7CiAgICAgICAgdmFyIGgyID0gaS5pc3ViKGEpOwogICAgICAgIHJldHVybiBoMi5jbXBuKDApIDwgMCAmJiBoMi5pYWRkKHRoaXMubSksIGgyOwogICAgICB9LCBQLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTEoaSksIHRoaXMuaW1vZChpLnVzaGxuKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihpLCBhKSwgdGhpcy5pbW9kKGkuaW11bChhKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihpLCBhKSwgdGhpcy5pbW9kKGkubXVsKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbXVsKGksIGkuY2xvbmUoKSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWwoaSwgaSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS5jbG9uZSgpOwogICAgICAgIHZhciBhID0gdGhpcy5tLmFuZGxuKDMpOwogICAgICAgIGlmIChyKGEgJSAyID09PSAxKSwgYSA9PT0gMykgewogICAgICAgICAgdmFyIGgyID0gdGhpcy5tLmFkZChuZXcgZigxKSkuaXVzaHJuKDIpOwogICAgICAgICAgcmV0dXJuIHRoaXMucG93KGksIGgyKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgcyA9IHRoaXMubS5zdWJuKDEpLCB1ID0gMDshcy5pc1plcm8oKSAmJiBzLmFuZGxuKDEpID09PSAwOyApCiAgICAgICAgICB1KyssIHMuaXVzaHJuKDEpOwogICAgICAgIHIoIXMuaXNaZXJvKCkpOwogICAgICAgIHZhciBjID0gbmV3IGYoMSkudG9SZWQodGhpcyksIGIzID0gYy5yZWROZWcoKSwgbCA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKSwgbiA9IHRoaXMubS5iaXRMZW5ndGgoKTsKICAgICAgICBmb3IgKG4gPSBuZXcgZigyICogbiAqIG4pLnRvUmVkKHRoaXMpO3RoaXMucG93KG4sIGwpLmNtcChiMykgIT09IDA7ICkKICAgICAgICAgIG4ucmVkSUFkZChiMyk7CiAgICAgICAgZm9yICh2YXIgZCA9IHRoaXMucG93KG4sIHMpLCB3ID0gdGhpcy5wb3coaSwgcy5hZGRuKDEpLml1c2hybigxKSksIGcgPSB0aGlzLnBvdyhpLCBzKSwgXzQgPSB1O2cuY21wKGMpICE9PSAwOyApIHsKICAgICAgICAgIGZvciAodmFyIEEyID0gZywgUjIgPSAwO0EyLmNtcChjKSAhPT0gMDsgUjIrKykKICAgICAgICAgICAgQTIgPSBBMi5yZWRTcXIoKTsKICAgICAgICAgIHIoUjIgPCBfNCk7CiAgICAgICAgICB2YXIgSSA9IHRoaXMucG93KGQsIG5ldyBmKDEpLml1c2hsbihfNCAtIFIyIC0gMSkpOwogICAgICAgICAgdyA9IHcucmVkTXVsKEkpLCBkID0gSS5yZWRTcXIoKSwgZyA9IGcucmVkTXVsKGQpLCBfNCA9IFIyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdzsKICAgICAgfSwgUC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkuX2ludm1wKHRoaXMubSk7CiAgICAgICAgcmV0dXJuIGEubmVnYXRpdmUgIT09IDAgPyAoYS5uZWdhdGl2ZSA9IDAsIHRoaXMuaW1vZChhKS5yZWROZWcoKSkgOiB0aGlzLmltb2QoYSk7CiAgICAgIH0sIFAucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoYS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBuZXcgZigxKS50b1JlZCh0aGlzKTsKICAgICAgICBpZiAoYS5jbXBuKDEpID09PSAwKQogICAgICAgICAgcmV0dXJuIGkuY2xvbmUoKTsKICAgICAgICB2YXIgaDIgPSA0LCBzID0gbmV3IEFycmF5KDEgPDwgaDIpOwogICAgICAgIHNbMF0gPSBuZXcgZigxKS50b1JlZCh0aGlzKSwgc1sxXSA9IGk7CiAgICAgICAgZm9yICh2YXIgdSA9IDI7dSA8IHMubGVuZ3RoOyB1KyspCiAgICAgICAgICBzW3VdID0gdGhpcy5tdWwoc1t1IC0gMV0sIGkpOwogICAgICAgIHZhciBjID0gc1swXSwgYjMgPSAwLCBsID0gMCwgbiA9IGEuYml0TGVuZ3RoKCkgJSAyNjsKICAgICAgICBmb3IgKG4gPT09IDAgJiYgKG4gPSAyNiksIHUgPSBhLmxlbmd0aCAtIDE7dSA+PSAwOyB1LS0pIHsKICAgICAgICAgIGZvciAodmFyIGQgPSBhLndvcmRzW3VdLCB3ID0gbiAtIDE7dyA+PSAwOyB3LS0pIHsKICAgICAgICAgICAgdmFyIGcgPSBkID4+IHcgJiAxOwogICAgICAgICAgICBpZiAoYyAhPT0gc1swXSAmJiAoYyA9IHRoaXMuc3FyKGMpKSwgZyA9PT0gMCAmJiBiMyA9PT0gMCkgewogICAgICAgICAgICAgIGwgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGIzIDw8PSAxLCBiMyB8PSBnLCBsKyssICEobCAhPT0gaDIgJiYgKHUgIT09IDAgfHwgdyAhPT0gMCkpICYmIChjID0gdGhpcy5tdWwoYywgc1tiM10pLCBsID0gMCwgYjMgPSAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG4gPSAyNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH0sIFAucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkudW1vZCh0aGlzLm0pOwogICAgICAgIHJldHVybiBhID09PSBpID8gYS5jbG9uZSgpIDogYTsKICAgICAgfSwgUC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBpLmNsb25lKCk7CiAgICAgICAgcmV0dXJuIGEucmVkID0gbnVsbCwgYTsKICAgICAgfSwgZi5tb250ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiBuZXcgU2UoaSk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIFNlKHYpIHsKICAgICAgICBQLmNhbGwodGhpcywgdiksIHRoaXMuc2hpZnQgPSB0aGlzLm0uYml0TGVuZ3RoKCksIHRoaXMuc2hpZnQgJSAyNiAhPT0gMCAmJiAodGhpcy5zaGlmdCArPSAyNiAtIHRoaXMuc2hpZnQgJSAyNiksIHRoaXMuciA9IG5ldyBmKDEpLml1c2hsbih0aGlzLnNoaWZ0KSwgdGhpcy5yMiA9IHRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLCB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSksIHRoaXMubWludiA9IHRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSwgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKSwgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpOwogICAgICB9CiAgICAgIG8oU2UsIFApLCBTZS5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmltb2QoaS51c2hsbih0aGlzLnNoaWZ0KSk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IHRoaXMuaW1vZChpLm11bCh0aGlzLnJpbnYpKTsKICAgICAgICByZXR1cm4gYS5yZWQgPSBudWxsLCBhOwogICAgICB9LCBTZS5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSB8fCBhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkud29yZHNbMF0gPSAwLCBpLmxlbmd0aCA9IDEsIGk7CiAgICAgICAgdmFyIGgyID0gaS5pbXVsKGEpLCBzID0gaDIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLCB1ID0gaDIuaXN1YihzKS5pdXNocm4odGhpcy5zaGlmdCksIGMgPSB1OwogICAgICAgIHJldHVybiB1LmNtcCh0aGlzLm0pID49IDAgPyBjID0gdS5pc3ViKHRoaXMubSkgOiB1LmNtcG4oMCkgPCAwICYmIChjID0gdS5pYWRkKHRoaXMubSkpLCBjLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgU2UucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSB8fCBhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDApLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgICB2YXIgaDIgPSBpLm11bChhKSwgcyA9IGgyLm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSwgdSA9IGgyLmlzdWIocykuaXVzaHJuKHRoaXMuc2hpZnQpLCBjID0gdTsKICAgICAgICByZXR1cm4gdS5jbXAodGhpcy5tKSA+PSAwID8gYyA9IHUuaXN1Yih0aGlzLm0pIDogdS5jbXBuKDApIDwgMCAmJiAoYyA9IHUuaWFkZCh0aGlzLm0pKSwgYy5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5pbW9kKGkuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTsKICAgICAgICByZXR1cm4gYS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH07CiAgICB9KSh0eXBlb2YgeWQgPiAidSIgfHwgeWQsIEwzKTsKICB9KTsKICBQMyA9IFQyKCh3TCwgRDMpID0+IHsKICAgIHZhciBicSA9IG8wKCksIG1xID0gTjMoKTsKICAgIEQzLmV4cG9ydHMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHJldHVybiBuZXcgWm4oZSk7CiAgICB9OwogICAgdmFyIGhyID0geyBzZWNwMjU2azE6IHsgbmFtZTogInNlY3AyNTZrMSIsIGJ5dGVMZW5ndGg6IDMyIH0sIHNlY3AyMjRyMTogeyBuYW1lOiAicDIyNCIsIGJ5dGVMZW5ndGg6IDI4IH0sIHByaW1lMjU2djE6IHsgbmFtZTogInAyNTYiLCBieXRlTGVuZ3RoOiAzMiB9LCBwcmltZTE5MnYxOiB7IG5hbWU6ICJwMTkyIiwgYnl0ZUxlbmd0aDogMjQgfSwgZWQyNTUxOTogeyBuYW1lOiAiZWQyNTUxOSIsIGJ5dGVMZW5ndGg6IDMyIH0sIHNlY3AzODRyMTogeyBuYW1lOiAicDM4NCIsIGJ5dGVMZW5ndGg6IDQ4IH0sIHNlY3A1MjFyMTogeyBuYW1lOiAicDUyMSIsIGJ5dGVMZW5ndGg6IDY2IH0gfTsKICAgIGhyLnAyMjQgPSBoci5zZWNwMjI0cjE7CiAgICBoci5wMjU2ID0gaHIuc2VjcDI1NnIxID0gaHIucHJpbWUyNTZ2MTsKICAgIGhyLnAxOTIgPSBoci5zZWNwMTkycjEgPSBoci5wcmltZTE5MnYxOwogICAgaHIucDM4NCA9IGhyLnNlY3AzODRyMTsKICAgIGhyLnA1MjEgPSBoci5zZWNwNTIxcjE7CiAgICBmdW5jdGlvbiBabih0KSB7CiAgICAgIHRoaXMuY3VydmVUeXBlID0gaHJbdF0sIHRoaXMuY3VydmVUeXBlIHx8ICh0aGlzLmN1cnZlVHlwZSA9IHsgbmFtZTogdCB9KSwgdGhpcy5jdXJ2ZSA9IG5ldyBicS5lYyh0aGlzLmN1cnZlVHlwZS5uYW1lKSwgdGhpcy5rZXlzID0gdW5kZWZpbmVkOwogICAgfQogICAgWm4ucHJvdG90eXBlLmdlbmVyYXRlS2V5cyA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIHRoaXMua2V5cyA9IHRoaXMuY3VydmUuZ2VuS2V5UGFpcigpLCB0aGlzLmdldFB1YmxpY0tleSh0LCBlKTsKICAgIH07CiAgICBabi5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uKHQsIGUsIHIpIHsKICAgICAgZSA9IGUgfHwgInV0ZjgiLCBCdWZmZXIuaXNCdWZmZXIodCkgfHwgKHQgPSBuZXcgQnVmZmVyKHQsIGUpKTsKICAgICAgdmFyIG8gPSB0aGlzLmN1cnZlLmtleUZyb21QdWJsaWModCkuZ2V0UHVibGljKCksIGYgPSBvLm11bCh0aGlzLmtleXMuZ2V0UHJpdmF0ZSgpKS5nZXRYKCk7CiAgICAgIHJldHVybiB3ZChmLCByLCB0aGlzLmN1cnZlVHlwZS5ieXRlTGVuZ3RoKTsKICAgIH07CiAgICBabi5wcm90b3R5cGUuZ2V0UHVibGljS2V5ID0gZnVuY3Rpb24odCwgZSkgewogICAgICB2YXIgciA9IHRoaXMua2V5cy5nZXRQdWJsaWMoZSA9PT0gImNvbXByZXNzZWQiLCB0cnVlKTsKICAgICAgcmV0dXJuIGUgPT09ICJoeWJyaWQiICYmIChyW3IubGVuZ3RoIC0gMV0gJSAyID8gclswXSA9IDcgOiByWzBdID0gNiksIHdkKHIsIHQpOwogICAgfTsKICAgIFpuLnByb3RvdHlwZS5nZXRQcml2YXRlS2V5ID0gZnVuY3Rpb24odCkgewogICAgICByZXR1cm4gd2QodGhpcy5rZXlzLmdldFByaXZhdGUoKSwgdCk7CiAgICB9OwogICAgWm4ucHJvdG90eXBlLnNldFB1YmxpY0tleSA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgcmV0dXJuIGUgPSBlIHx8ICJ1dGY4IiwgQnVmZmVyLmlzQnVmZmVyKHQpIHx8ICh0ID0gbmV3IEJ1ZmZlcih0LCBlKSksIHRoaXMua2V5cy5faW1wb3J0UHVibGljKHQpLCB0aGlzOwogICAgfTsKICAgIFpuLnByb3RvdHlwZS5zZXRQcml2YXRlS2V5ID0gZnVuY3Rpb24odCwgZSkgewogICAgICBlID0gZSB8fCAidXRmOCIsIEJ1ZmZlci5pc0J1ZmZlcih0KSB8fCAodCA9IG5ldyBCdWZmZXIodCwgZSkpOwogICAgICB2YXIgciA9IG5ldyBtcSh0KTsKICAgICAgcmV0dXJuIHIgPSByLnRvU3RyaW5nKDE2KSwgdGhpcy5rZXlzID0gdGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCksIHRoaXMua2V5cy5faW1wb3J0UHJpdmF0ZShyKSwgdGhpczsKICAgIH07CiAgICBmdW5jdGlvbiB3ZCh0LCBlLCByKSB7CiAgICAgIEFycmF5LmlzQXJyYXkodCkgfHwgKHQgPSB0LnRvQXJyYXkoKSk7CiAgICAgIHZhciBvID0gbmV3IEJ1ZmZlcih0KTsKICAgICAgaWYgKHIgJiYgby5sZW5ndGggPCByKSB7CiAgICAgICAgdmFyIGYgPSBuZXcgQnVmZmVyKHIgLSBvLmxlbmd0aCk7CiAgICAgICAgZi5maWxsKDApLCBvID0gQnVmZmVyLmNvbmNhdChbZiwgb10pOwogICAgICB9CiAgICAgIHJldHVybiBlID8gby50b1N0cmluZyhlKSA6IG87CiAgICB9CiAgfSk7CiAgX2QgPSBUMigoTUwsIEMzKSA9PiB7CiAgICB2YXIgZ3EgPSBiZigpLCBNZCA9IFRlKCkuQnVmZmVyOwogICAgQzMuZXhwb3J0cyA9IGZ1bmN0aW9uKHQsIGUpIHsKICAgICAgZm9yICh2YXIgciA9IE1kLmFsbG9jKDApLCBvID0gMCwgZjtyLmxlbmd0aCA8IGU7ICkKICAgICAgICBmID0geXEobysrKSwgciA9IE1kLmNvbmNhdChbciwgZ3EoInNoYTEiKS51cGRhdGUodCkudXBkYXRlKGYpLmRpZ2VzdCgpXSk7CiAgICAgIHJldHVybiByLnNsaWNlKDAsIGUpOwogICAgfTsKICAgIGZ1bmN0aW9uIHlxKHQpIHsKICAgICAgdmFyIGUgPSBNZC5hbGxvY1Vuc2FmZSg0KTsKICAgICAgcmV0dXJuIGUud3JpdGVVSW50MzJCRSh0LCAwKSwgZTsKICAgIH0KICB9KTsKICB4ZCA9IFQyKChfTCwgTzMpID0+IHsKICAgIE8zLmV4cG9ydHMgPSBmdW5jdGlvbihlLCByKSB7CiAgICAgIGZvciAodmFyIG8gPSBlLmxlbmd0aCwgZiA9IC0xOysrZiA8IG87ICkKICAgICAgICBlW2ZdIF49IHJbZl07CiAgICAgIHJldHVybiBlOwogICAgfTsKICB9KTsKICB3MCA9IFQyKChGMywgU2QpID0+IHsKICAgIChmdW5jdGlvbih0LCBlKSB7CiAgICAgIGZ1bmN0aW9uIHIodiwgaSkgewogICAgICAgIGlmICghdikKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpIHx8ICJBc3NlcnRpb24gZmFpbGVkIik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbyh2LCBpKSB7CiAgICAgICAgdi5zdXBlcl8gPSBpOwogICAgICAgIHZhciBhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgfTsKICAgICAgICBhLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCB2LnByb3RvdHlwZSA9IG5ldyBhLCB2LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHY7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZih2LCBpLCBhKSB7CiAgICAgICAgaWYgKGYuaXNCTih2KSkKICAgICAgICAgIHJldHVybiB2OwogICAgICAgIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLndvcmRzID0gbnVsbCwgdGhpcy5sZW5ndGggPSAwLCB0aGlzLnJlZCA9IG51bGwsIHYgIT09IG51bGwgJiYgKChpID09PSAibGUiIHx8IGkgPT09ICJiZSIpICYmIChhID0gaSwgaSA9IDEwKSwgdGhpcy5faW5pdCh2IHx8IDAsIGkgfHwgMTAsIGEgfHwgImJlIikpOwogICAgICB9CiAgICAgIHR5cGVvZiB0ID09ICJvYmplY3QiID8gdC5leHBvcnRzID0gZiA6IGUuQk4gPSBmLCBmLkJOID0gZiwgZi53b3JkU2l6ZSA9IDI2OwogICAgICB2YXIgcDsKICAgICAgdHJ5IHsKICAgICAgICB0eXBlb2Ygd2luZG93IDwgInUiICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyIDwgInUiID8gcCA9IHdpbmRvdy5CdWZmZXIgOiBwID0gamkoKS5CdWZmZXI7CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICAgIGYuaXNCTiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaSBpbnN0YW5jZW9mIGYgPyB0cnVlIDogaSAhPT0gbnVsbCAmJiB0eXBlb2YgaSA9PSAib2JqZWN0IiAmJiBpLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBmLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkoaS53b3Jkcyk7CiAgICAgIH0sIGYubWF4ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiBpLmNtcChhKSA+IDAgPyBpIDogYTsKICAgICAgfSwgZi5taW4gPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIGkuY21wKGEpIDwgMCA/IGkgOiBhOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKHR5cGVvZiBpID09ICJudW1iZXIiKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIoaSwgYSwgaDIpOwogICAgICAgIGlmICh0eXBlb2YgaSA9PSAib2JqZWN0IikKICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkoaSwgYSwgaDIpOwogICAgICAgIGEgPT09ICJoZXgiICYmIChhID0gMTYpLCByKGEgPT09IChhIHwgMCkgJiYgYSA+PSAyICYmIGEgPD0gMzYpLCBpID0gaS50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCAiIik7CiAgICAgICAgdmFyIHMgPSAwOwogICAgICAgIGlbMF0gPT09ICItIiAmJiAocysrLCB0aGlzLm5lZ2F0aXZlID0gMSksIHMgPCBpLmxlbmd0aCAmJiAoYSA9PT0gMTYgPyB0aGlzLl9wYXJzZUhleChpLCBzLCBoMikgOiAodGhpcy5fcGFyc2VCYXNlKGksIGEsIHMpLCBoMiA9PT0gImxlIiAmJiB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGEsIGgyKSkpOwogICAgICB9LCBmLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaSA8IDAgJiYgKHRoaXMubmVnYXRpdmUgPSAxLCBpID0gLWkpLCBpIDwgNjcxMDg4NjQgPyAodGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjNdLCB0aGlzLmxlbmd0aCA9IDEpIDogaSA8IDQ1MDM1OTk2MjczNzA0OTYgPyAodGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjMsIGkgLyA2NzEwODg2NCAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAyKSA6IChyKGkgPCA5MDA3MTk5MjU0NzQwOTkyKSwgdGhpcy53b3JkcyA9IFtpICYgNjcxMDg4NjMsIGkgLyA2NzEwODg2NCAmIDY3MTA4ODYzLCAxXSwgdGhpcy5sZW5ndGggPSAzKSwgaDIgPT09ICJsZSIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBhLCBoMik7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIGlmIChyKHR5cGVvZiBpLmxlbmd0aCA9PSAibnVtYmVyIiksIGkubGVuZ3RoIDw9IDApCiAgICAgICAgICByZXR1cm4gdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxLCB0aGlzOwogICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKGkubGVuZ3RoIC8gMyksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCB0aGlzLmxlbmd0aDsgcysrKQogICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IDA7CiAgICAgICAgdmFyIHUsIGMsIGIzID0gMDsKICAgICAgICBpZiAoaDIgPT09ICJiZSIpCiAgICAgICAgICBmb3IgKHMgPSBpLmxlbmd0aCAtIDEsIHUgPSAwO3MgPj0gMDsgcyAtPSAzKQogICAgICAgICAgICBjID0gaVtzXSB8IGlbcyAtIDFdIDw8IDggfCBpW3MgLSAyXSA8PCAxNiwgdGhpcy53b3Jkc1t1XSB8PSBjIDw8IGIzICYgNjcxMDg4NjMsIHRoaXMud29yZHNbdSArIDFdID0gYyA+Pj4gMjYgLSBiMyAmIDY3MTA4ODYzLCBiMyArPSAyNCwgYjMgPj0gMjYgJiYgKGIzIC09IDI2LCB1KyspOwogICAgICAgIGVsc2UgaWYgKGgyID09PSAibGUiKQogICAgICAgICAgZm9yIChzID0gMCwgdSA9IDA7cyA8IGkubGVuZ3RoOyBzICs9IDMpCiAgICAgICAgICAgIGMgPSBpW3NdIHwgaVtzICsgMV0gPDwgOCB8IGlbcyArIDJdIDw8IDE2LCB0aGlzLndvcmRzW3VdIHw9IGMgPDwgYjMgJiA2NzEwODg2MywgdGhpcy53b3Jkc1t1ICsgMV0gPSBjID4+PiAyNiAtIGIzICYgNjcxMDg4NjMsIGIzICs9IDI0LCBiMyA+PSAyNiAmJiAoYjMgLT0gMjYsIHUrKyk7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gbTIodiwgaSkgewogICAgICAgIHZhciBhID0gdi5jaGFyQ29kZUF0KGkpOwogICAgICAgIHJldHVybiBhID49IDY1ICYmIGEgPD0gNzAgPyBhIC0gNTUgOiBhID49IDk3ICYmIGEgPD0gMTAyID8gYSAtIDg3IDogYSAtIDQ4ICYgMTU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geTModiwgaSwgYSkgewogICAgICAgIHZhciBoMiA9IG0yKHYsIGEpOwogICAgICAgIHJldHVybiBhIC0gMSA+PSBpICYmIChoMiB8PSBtMih2LCBhIC0gMSkgPDwgNCksIGgyOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKGkubGVuZ3RoIC0gYSkgLyA2KSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IHRoaXMubGVuZ3RoOyBzKyspCiAgICAgICAgICB0aGlzLndvcmRzW3NdID0gMDsKICAgICAgICB2YXIgdSA9IDAsIGMgPSAwLCBiMzsKICAgICAgICBpZiAoaDIgPT09ICJiZSIpCiAgICAgICAgICBmb3IgKHMgPSBpLmxlbmd0aCAtIDE7cyA+PSBhOyBzIC09IDIpCiAgICAgICAgICAgIGIzID0geTMoaSwgYSwgcykgPDwgdSwgdGhpcy53b3Jkc1tjXSB8PSBiMyAmIDY3MTA4ODYzLCB1ID49IDE4ID8gKHUgLT0gMTgsIGMgKz0gMSwgdGhpcy53b3Jkc1tjXSB8PSBiMyA+Pj4gMjYpIDogdSArPSA4OwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGwgPSBpLmxlbmd0aCAtIGE7CiAgICAgICAgICBmb3IgKHMgPSBsICUgMiA9PT0gMCA/IGEgKyAxIDogYTtzIDwgaS5sZW5ndGg7IHMgKz0gMikKICAgICAgICAgICAgYjMgPSB5MyhpLCBhLCBzKSA8PCB1LCB0aGlzLndvcmRzW2NdIHw9IGIzICYgNjcxMDg4NjMsIHUgPj0gMTggPyAodSAtPSAxOCwgYyArPSAxLCB0aGlzLndvcmRzW2NdIHw9IGIzID4+PiAyNikgOiB1ICs9IDg7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RyaXAoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gTSh2LCBpLCBhLCBoMikgewogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gTWF0aC5taW4odi5sZW5ndGgsIGEpLCBjID0gaTtjIDwgdTsgYysrKSB7CiAgICAgICAgICB2YXIgYjMgPSB2LmNoYXJDb2RlQXQoYykgLSA0ODsKICAgICAgICAgIHMgKj0gaDIsIGIzID49IDQ5ID8gcyArPSBiMyAtIDQ5ICsgMTAgOiBiMyA+PSAxNyA/IHMgKz0gYjMgLSAxNyArIDEwIDogcyArPSBiMzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0KICAgICAgZi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxOwogICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMTt1IDw9IDY3MTA4ODYzOyB1ICo9IGEpCiAgICAgICAgICBzKys7CiAgICAgICAgcy0tLCB1ID0gdSAvIGEgfCAwOwogICAgICAgIGZvciAodmFyIGMgPSBpLmxlbmd0aCAtIGgyLCBiMyA9IGMgJSBzLCBsID0gTWF0aC5taW4oYywgYyAtIGIzKSArIGgyLCBuID0gMCwgZCA9IGgyO2QgPCBsOyBkICs9IHMpCiAgICAgICAgICBuID0gTShpLCBkLCBkICsgcywgYSksIHRoaXMuaW11bG4odSksIHRoaXMud29yZHNbMF0gKyBuIDwgNjcxMDg4NjQgPyB0aGlzLndvcmRzWzBdICs9IG4gOiB0aGlzLl9pYWRkbihuKTsKICAgICAgICBpZiAoYjMgIT09IDApIHsKICAgICAgICAgIHZhciB3ID0gMTsKICAgICAgICAgIGZvciAobiA9IE0oaSwgZCwgaS5sZW5ndGgsIGEpLCBkID0gMDtkIDwgYjM7IGQrKykKICAgICAgICAgICAgdyAqPSBhOwogICAgICAgICAgdGhpcy5pbXVsbih3KSwgdGhpcy53b3Jkc1swXSArIG4gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbiA6IHRoaXMuX2lhZGRuKG4pOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoOyBhKyspCiAgICAgICAgICBpLndvcmRzW2FdID0gdGhpcy53b3Jkc1thXTsKICAgICAgICBpLmxlbmd0aCA9IHRoaXMubGVuZ3RoLCBpLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSwgaS5yZWQgPSB0aGlzLnJlZDsKICAgICAgfSwgZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IG5ldyBmKG51bGwpOwogICAgICAgIHJldHVybiB0aGlzLmNvcHkoaSksIGk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPCBpOyApCiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKDt0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwOyApCiAgICAgICAgICB0aGlzLmxlbmd0aC0tOwogICAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpOwogICAgICB9LCBmLnByb3RvdHlwZS5fbm9ybVNpZ24gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDApLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnJlZCA/ICI8Qk4tUjogIiA6ICI8Qk46ICIpICsgdGhpcy50b1N0cmluZygxNikgKyAiPiI7CiAgICAgIH07CiAgICAgIHZhciB4ID0gWyIiLCAiMCIsICIwMCIsICIwMDAiLCAiMDAwMCIsICIwMDAwMCIsICIwMDAwMDAiLCAiMDAwMDAwMCIsICIwMDAwMDAwMCIsICIwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJdLCBTID0gWzAsIDAsIDI1LCAxNiwgMTIsIDExLCAxMCwgOSwgOCwgOCwgNywgNywgNywgNywgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNV0sIEUyID0gWzAsIDAsIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LCA0MzA0NjcyMSwgMWU3LCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSwgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLCA2NDM2MzQzLCA3OTYyNjI0LCA5NzY1NjI1LCAxMTg4MTM3NiwgMTQzNDg5MDcsIDE3MjEwMzY4LCAyMDUxMTE0OSwgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZdOwogICAgICBmLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpID0gaSB8fCAxMCwgYSA9IGEgfCAwIHx8IDE7CiAgICAgICAgdmFyIGgyOwogICAgICAgIGlmIChpID09PSAxNiB8fCBpID09PSAiaGV4IikgewogICAgICAgICAgaDIgPSAiIjsKICAgICAgICAgIGZvciAodmFyIHMgPSAwLCB1ID0gMCwgYyA9IDA7YyA8IHRoaXMubGVuZ3RoOyBjKyspIHsKICAgICAgICAgICAgdmFyIGIzID0gdGhpcy53b3Jkc1tjXSwgbCA9ICgoYjMgPDwgcyB8IHUpICYgMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgdSA9IGIzID4+PiAyNCAtIHMgJiAxNjc3NzIxNSwgdSAhPT0gMCB8fCBjICE9PSB0aGlzLmxlbmd0aCAtIDEgPyBoMiA9IHhbNiAtIGwubGVuZ3RoXSArIGwgKyBoMiA6IGgyID0gbCArIGgyLCBzICs9IDIsIHMgPj0gMjYgJiYgKHMgLT0gMjYsIGMtLSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHUgIT09IDAgJiYgKGgyID0gdS50b1N0cmluZygxNikgKyBoMik7aDIubGVuZ3RoICUgYSAhPT0gMDsgKQogICAgICAgICAgICBoMiA9ICIwIiArIGgyOwogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKGgyID0gIi0iICsgaDIpLCBoMjsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT09IChpIHwgMCkgJiYgaSA+PSAyICYmIGkgPD0gMzYpIHsKICAgICAgICAgIHZhciBuID0gU1tpXSwgZCA9IEUyW2ldOwogICAgICAgICAgaDIgPSAiIjsKICAgICAgICAgIHZhciB3ID0gdGhpcy5jbG9uZSgpOwogICAgICAgICAgZm9yICh3Lm5lZ2F0aXZlID0gMDshdy5pc1plcm8oKTsgKSB7CiAgICAgICAgICAgIHZhciBnID0gdy5tb2RuKGQpLnRvU3RyaW5nKGkpOwogICAgICAgICAgICB3ID0gdy5pZGl2bihkKSwgdy5pc1plcm8oKSA/IGgyID0gZyArIGgyIDogaDIgPSB4W24gLSBnLmxlbmd0aF0gKyBnICsgaDI7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHRoaXMuaXNaZXJvKCkgJiYgKGgyID0gIjAiICsgaDIpO2gyLmxlbmd0aCAlIGEgIT09IDA7ICkKICAgICAgICAgICAgaDIgPSAiMCIgKyBoMjsKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIChoMiA9ICItIiArIGgyKSwgaDI7CiAgICAgICAgfQogICAgICAgIHIoZmFsc2UsICJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Iik7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLndvcmRzWzBdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMiA/IGkgKz0gdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMSA/IGkgKz0gNDUwMzU5OTYyNzM3MDQ5NiArIHRoaXMud29yZHNbMV0gKiA2NzEwODg2NCA6IHRoaXMubGVuZ3RoID4gMiAmJiByKGZhbHNlLCAiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzIiksIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtaSA6IGk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgcmV0dXJuIHIodHlwZW9mIHAgPCAidSIpLCB0aGlzLnRvQXJyYXlMaWtlKHAsIGksIGEpOwogICAgICB9LCBmLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gdGhpcy5ieXRlTGVuZ3RoKCksIHUgPSBoMiB8fCBNYXRoLm1heCgxLCBzKTsKICAgICAgICByKHMgPD0gdSwgImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgiKSwgcih1ID4gMCwgIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpLCB0aGlzLnN0cmlwKCk7CiAgICAgICAgdmFyIGMgPSBhID09PSAibGUiLCBiMyA9IG5ldyBpKHUpLCBsLCBuLCBkID0gdGhpcy5jbG9uZSgpOwogICAgICAgIGlmIChjKSB7CiAgICAgICAgICBmb3IgKG4gPSAwOyFkLmlzWmVybygpOyBuKyspCiAgICAgICAgICAgIGwgPSBkLmFuZGxuKDI1NSksIGQuaXVzaHJuKDgpLCBiM1tuXSA9IGw7CiAgICAgICAgICBmb3IgKDtuIDwgdTsgbisrKQogICAgICAgICAgICBiM1tuXSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAobiA9IDA7biA8IHUgLSBzOyBuKyspCiAgICAgICAgICAgIGIzW25dID0gMDsKICAgICAgICAgIGZvciAobiA9IDA7IWQuaXNaZXJvKCk7IG4rKykKICAgICAgICAgICAgbCA9IGQuYW5kbG4oMjU1KSwgZC5pdXNocm4oOCksIGIzW3UgLSBuIC0gMV0gPSBsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYjM7CiAgICAgIH0sIE1hdGguY2x6MzIgPyBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIoaSk7CiAgICAgIH0gOiBmLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSwgaDIgPSAwOwogICAgICAgIHJldHVybiBhID49IDQwOTYgJiYgKGgyICs9IDEzLCBhID4+Pj0gMTMpLCBhID49IDY0ICYmIChoMiArPSA3LCBhID4+Pj0gNyksIGEgPj0gOCAmJiAoaDIgKz0gNCwgYSA+Pj49IDQpLCBhID49IDIgJiYgKGgyICs9IDIsIGEgPj4+PSAyKSwgaDIgKyBhOwogICAgICB9LCBmLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKGkgPT09IDApCiAgICAgICAgICByZXR1cm4gMjY7CiAgICAgICAgdmFyIGEgPSBpLCBoMiA9IDA7CiAgICAgICAgcmV0dXJuIChhICYgODE5MSkgPT09IDAgJiYgKGgyICs9IDEzLCBhID4+Pj0gMTMpLCAoYSAmIDEyNykgPT09IDAgJiYgKGgyICs9IDcsIGEgPj4+PSA3KSwgKGEgJiAxNSkgPT09IDAgJiYgKGgyICs9IDQsIGEgPj4+PSA0KSwgKGEgJiAzKSA9PT0gMCAmJiAoaDIgKz0gMiwgYSA+Pj49IDIpLCAoYSAmIDEpID09PSAwICYmIGgyKyssIGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaSA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSwgYSA9IHRoaXMuX2NvdW50Qml0cyhpKTsKICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGE7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIEIodikgewogICAgICAgIGZvciAodmFyIGkgPSBuZXcgQXJyYXkodi5iaXRMZW5ndGgoKSksIGEgPSAwO2EgPCBpLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICB2YXIgaDIgPSBhIC8gMjYgfCAwLCBzID0gYSAlIDI2OwogICAgICAgICAgaVthXSA9ICh2LndvcmRzW2gyXSAmIDEgPDwgcykgPj4+IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBmb3IgKHZhciBpID0gMCwgYSA9IDA7YSA8IHRoaXMubGVuZ3RoOyBhKyspIHsKICAgICAgICAgIHZhciBoMiA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbYV0pOwogICAgICAgICAgaWYgKGkgKz0gaDIsIGgyICE9PSAyNikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9LCBmLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IHRoaXMuYWJzKCkuaW5vdG4oaSkuaWFkZG4oMSkgOiB0aGlzLmNsb25lKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLnRlc3RuKGkgLSAxKSA/IHRoaXMubm90bihpKS5pYWRkbigxKS5pbmVnKCkgOiB0aGlzLmNsb25lKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNaZXJvKCkgfHwgKHRoaXMubmVnYXRpdmUgXj0gMSksIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICg7dGhpcy5sZW5ndGggPCBpLmxlbmd0aDsgKQogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IGkubGVuZ3RoOyBhKyspCiAgICAgICAgICB0aGlzLndvcmRzW2FdID0gdGhpcy53b3Jkc1thXSB8IGkud29yZHNbYV07CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgaS5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1b3IoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlvcihpKSA6IGkuY2xvbmUoKS5pb3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdW9yKGkpIDogaS5jbG9uZSgpLml1b3IodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyBhID0gaSA6IGEgPSB0aGlzOwogICAgICAgIGZvciAodmFyIGgyID0gMDtoMiA8IGEubGVuZ3RoOyBoMisrKQogICAgICAgICAgdGhpcy53b3Jkc1toMl0gPSB0aGlzLndvcmRzW2gyXSAmIGkud29yZHNbaDJdOwogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoKHRoaXMubmVnYXRpdmUgfCBpLm5lZ2F0aXZlKSA9PT0gMCksIHRoaXMuaXVhbmQoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pYW5kKGkpIDogaS5jbG9uZSgpLmlhbmQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVhbmQoaSkgOiBpLmNsb25lKCkuaXVhbmQodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhLCBoMjsKICAgICAgICB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gKGEgPSB0aGlzLCBoMiA9IGkpIDogKGEgPSBpLCBoMiA9IHRoaXMpOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBoMi5sZW5ndGg7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSBhLndvcmRzW3NdIF4gaDIud29yZHNbc107CiAgICAgICAgaWYgKHRoaXMgIT09IGEpCiAgICAgICAgICBmb3IgKDtzIDwgYS5sZW5ndGg7IHMrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tzXSA9IGEud29yZHNbc107CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gYS5sZW5ndGgsIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGkubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdXhvcihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IGkubGVuZ3RoID8gdGhpcy5jbG9uZSgpLml4b3IoaSkgOiBpLmNsb25lKCkuaXhvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IHRoaXMuY2xvbmUoKS5pdXhvcihpKSA6IGkuY2xvbmUoKS5pdXhvcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gTWF0aC5jZWlsKGkgLyAyNikgfCAwLCBoMiA9IGkgJSAyNjsKICAgICAgICB0aGlzLl9leHBhbmQoYSksIGgyID4gMCAmJiBhLS07CiAgICAgICAgZm9yICh2YXIgcyA9IDA7cyA8IGE7IHMrKykKICAgICAgICAgIHRoaXMud29yZHNbc10gPSB+dGhpcy53b3Jkc1tzXSAmIDY3MTA4ODYzOwogICAgICAgIHJldHVybiBoMiA+IDAgJiYgKHRoaXMud29yZHNbc10gPSB+dGhpcy53b3Jkc1tzXSAmIDY3MTA4ODYzID4+IDI2IC0gaDIpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGgyID0gaSAvIDI2IHwgMCwgcyA9IGkgJSAyNjsKICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKGgyICsgMSksIGEgPyB0aGlzLndvcmRzW2gyXSA9IHRoaXMud29yZHNbaDJdIHwgMSA8PCBzIDogdGhpcy53b3Jkc1toMl0gPSB0aGlzLndvcmRzW2gyXSAmIH4oMSA8PCBzKSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIGEgPSB0aGlzLmlzdWIoaSksIHRoaXMubmVnYXRpdmUgXj0gMSwgdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgPSAwLCBhID0gdGhpcy5pc3ViKGkpLCBpLm5lZ2F0aXZlID0gMSwgYS5fbm9ybVNpZ24oKTsKICAgICAgICB2YXIgaDIsIHM7CiAgICAgICAgdGhpcy5sZW5ndGggPiBpLmxlbmd0aCA/IChoMiA9IHRoaXMsIHMgPSBpKSA6IChoMiA9IGksIHMgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciB1ID0gMCwgYyA9IDA7YyA8IHMubGVuZ3RoOyBjKyspCiAgICAgICAgICBhID0gKGgyLndvcmRzW2NdIHwgMCkgKyAocy53b3Jkc1tjXSB8IDApICsgdSwgdGhpcy53b3Jkc1tjXSA9IGEgJiA2NzEwODg2MywgdSA9IGEgPj4+IDI2OwogICAgICAgIGZvciAoO3UgIT09IDAgJiYgYyA8IGgyLmxlbmd0aDsgYysrKQogICAgICAgICAgYSA9IChoMi53b3Jkc1tjXSB8IDApICsgdSwgdGhpcy53b3Jkc1tjXSA9IGEgJiA2NzEwODg2MywgdSA9IGEgPj4+IDI2OwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA9IGgyLmxlbmd0aCwgdSAhPT0gMCkKICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gdSwgdGhpcy5sZW5ndGgrKzsKICAgICAgICBlbHNlIGlmIChoMiAhPT0gdGhpcykKICAgICAgICAgIGZvciAoO2MgPCBoMi5sZW5ndGg7IGMrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tjXSA9IGgyLndvcmRzW2NdOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGE7CiAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCA/IChpLm5lZ2F0aXZlID0gMCwgYSA9IHRoaXMuc3ViKGkpLCBpLm5lZ2F0aXZlIF49IDEsIGEpIDogaS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gKHRoaXMubmVnYXRpdmUgPSAwLCBhID0gaS5zdWIodGhpcyksIHRoaXMubmVnYXRpdmUgPSAxLCBhKSA6IHRoaXMubGVuZ3RoID4gaS5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFkZChpKSA6IGkuY2xvbmUoKS5pYWRkKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpLm5lZ2F0aXZlICE9PSAwKSB7CiAgICAgICAgICBpLm5lZ2F0aXZlID0gMDsKICAgICAgICAgIHZhciBhID0gdGhpcy5pYWRkKGkpOwogICAgICAgICAgcmV0dXJuIGkubmVnYXRpdmUgPSAxLCBhLl9ub3JtU2lnbigpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5fbm9ybVNpZ24oKTsKICAgICAgICB2YXIgaDIgPSB0aGlzLmNtcChpKTsKICAgICAgICBpZiAoaDIgPT09IDApCiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMubGVuZ3RoID0gMSwgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXM7CiAgICAgICAgdmFyIHMsIHU7CiAgICAgICAgaDIgPiAwID8gKHMgPSB0aGlzLCB1ID0gaSkgOiAocyA9IGksIHUgPSB0aGlzKTsKICAgICAgICBmb3IgKHZhciBjID0gMCwgYjMgPSAwO2IzIDwgdS5sZW5ndGg7IGIzKyspCiAgICAgICAgICBhID0gKHMud29yZHNbYjNdIHwgMCkgLSAodS53b3Jkc1tiM10gfCAwKSArIGMsIGMgPSBhID4+IDI2LCB0aGlzLndvcmRzW2IzXSA9IGEgJiA2NzEwODg2MzsKICAgICAgICBmb3IgKDtjICE9PSAwICYmIGIzIDwgcy5sZW5ndGg7IGIzKyspCiAgICAgICAgICBhID0gKHMud29yZHNbYjNdIHwgMCkgKyBjLCBjID0gYSA+PiAyNiwgdGhpcy53b3Jkc1tiM10gPSBhICYgNjcxMDg4NjM7CiAgICAgICAgaWYgKGMgPT09IDAgJiYgYjMgPCBzLmxlbmd0aCAmJiBzICE9PSB0aGlzKQogICAgICAgICAgZm9yICg7YjMgPCBzLmxlbmd0aDsgYjMrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1tiM10gPSBzLndvcmRzW2IzXTsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgYjMpLCBzICE9PSB0aGlzICYmICh0aGlzLm5lZ2F0aXZlID0gMSksIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihpKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gcTIodiwgaSwgYSkgewogICAgICAgIGEubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gdi5uZWdhdGl2ZTsKICAgICAgICB2YXIgaDIgPSB2Lmxlbmd0aCArIGkubGVuZ3RoIHwgMDsKICAgICAgICBhLmxlbmd0aCA9IGgyLCBoMiA9IGgyIC0gMSB8IDA7CiAgICAgICAgdmFyIHMgPSB2LndvcmRzWzBdIHwgMCwgdSA9IGkud29yZHNbMF0gfCAwLCBjID0gcyAqIHUsIGIzID0gYyAmIDY3MTA4ODYzLCBsID0gYyAvIDY3MTA4ODY0IHwgMDsKICAgICAgICBhLndvcmRzWzBdID0gYjM7CiAgICAgICAgZm9yICh2YXIgbiA9IDE7biA8IGgyOyBuKyspIHsKICAgICAgICAgIGZvciAodmFyIGQgPSBsID4+PiAyNiwgdyA9IGwgJiA2NzEwODg2MywgZyA9IE1hdGgubWluKG4sIGkubGVuZ3RoIC0gMSksIF80ID0gTWF0aC5tYXgoMCwgbiAtIHYubGVuZ3RoICsgMSk7XzQgPD0gZzsgXzQrKykgewogICAgICAgICAgICB2YXIgQTIgPSBuIC0gXzQgfCAwOwogICAgICAgICAgICBzID0gdi53b3Jkc1tBMl0gfCAwLCB1ID0gaS53b3Jkc1tfNF0gfCAwLCBjID0gcyAqIHUgKyB3LCBkICs9IGMgLyA2NzEwODg2NCB8IDAsIHcgPSBjICYgNjcxMDg4NjM7CiAgICAgICAgICB9CiAgICAgICAgICBhLndvcmRzW25dID0gdyB8IDAsIGwgPSBkIHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGwgIT09IDAgPyBhLndvcmRzW25dID0gbCB8IDAgOiBhLmxlbmd0aC0tLCBhLnN0cmlwKCk7CiAgICAgIH0KICAgICAgdmFyIEwyID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICB2YXIgcyA9IGkud29yZHMsIHUgPSBhLndvcmRzLCBjID0gaDIud29yZHMsIGIzID0gMCwgbCwgbiwgZCwgdyA9IHNbMF0gfCAwLCBnID0gdyAmIDgxOTEsIF80ID0gdyA+Pj4gMTMsIEEyID0gc1sxXSB8IDAsIFIyID0gQTIgJiA4MTkxLCBJID0gQTIgPj4+IDEzLCBNZSA9IHNbMl0gfCAwLCBrID0gTWUgJiA4MTkxLCBEMiA9IE1lID4+PiAxMywgbnQgPSBzWzNdIHwgMCwgQzIgPSBudCAmIDgxOTEsIE8gPSBudCA+Pj4gMTMsIHZ0ID0gc1s0XSB8IDAsIEYgPSB2dCAmIDgxOTEsIFUgPSB2dCA+Pj4gMTMsIGJ0ID0gc1s1XSB8IDAsIHoyID0gYnQgJiA4MTkxLCBIID0gYnQgPj4+IDEzLCBtdCA9IHNbNl0gfCAwLCBXID0gbXQgJiA4MTkxLCBLID0gbXQgPj4+IDEzLCBndCA9IHNbN10gfCAwLCBqID0gZ3QgJiA4MTkxLCBaID0gZ3QgPj4+IDEzLCB5dCA9IHNbOF0gfCAwLCBWID0geXQgJiA4MTkxLCAkID0geXQgPj4+IDEzLCB3dCA9IHNbOV0gfCAwLCBHID0gd3QgJiA4MTkxLCBZID0gd3QgPj4+IDEzLCBNdCA9IHVbMF0gfCAwLCBYID0gTXQgJiA4MTkxLCBKID0gTXQgPj4+IDEzLCBfdCA9IHVbMV0gfCAwLCBRID0gX3QgJiA4MTkxLCBlZSA9IF90ID4+PiAxMywgeHQgPSB1WzJdIHwgMCwgdGUgPSB4dCAmIDgxOTEsIHJlID0geHQgPj4+IDEzLCBTdCA9IHVbM10gfCAwLCBpZSA9IFN0ICYgODE5MSwgbmUgPSBTdCA+Pj4gMTMsIEV0ID0gdVs0XSB8IDAsIGZlID0gRXQgJiA4MTkxLCBhZSA9IEV0ID4+PiAxMywgQXQgPSB1WzVdIHwgMCwgb2UgPSBBdCAmIDgxOTEsIHNlID0gQXQgPj4+IDEzLCBSdCA9IHVbNl0gfCAwLCBoZSA9IFJ0ICYgODE5MSwgdWUgPSBSdCA+Pj4gMTMsIEJ0ID0gdVs3XSB8IDAsIGxlID0gQnQgJiA4MTkxLCBkZSA9IEJ0ID4+PiAxMywgcXQgPSB1WzhdIHwgMCwgY2UgPSBxdCAmIDgxOTEsIHBlID0gcXQgPj4+IDEzLCBJdCA9IHVbOV0gfCAwLCB2ZSA9IEl0ICYgODE5MSwgYmUgPSBJdCA+Pj4gMTM7CiAgICAgICAgaDIubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gYS5uZWdhdGl2ZSwgaDIubGVuZ3RoID0gMTksIGwgPSBNYXRoLmltdWwoZywgWCksIG4gPSBNYXRoLmltdWwoZywgSiksIG4gPSBuICsgTWF0aC5pbXVsKF80LCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoXzQsIEopOwogICAgICAgIHZhciBmdCA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChmdCA+Pj4gMjYpIHwgMCwgZnQgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoUjIsIFgpLCBuID0gTWF0aC5pbXVsKFIyLCBKKSwgbiA9IG4gKyBNYXRoLmltdWwoSSwgWCkgfCAwLCBkID0gTWF0aC5pbXVsKEksIEopLCBsID0gbCArIE1hdGguaW11bChnLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF80LCBlZSkgfCAwOwogICAgICAgIHZhciBCZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChCZSA+Pj4gMjYpIHwgMCwgQmUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoaywgWCksIG4gPSBNYXRoLmltdWwoaywgSiksIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoRDIsIEopLCBsID0gbCArIE1hdGguaW11bChSMiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChnLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChnLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChfNCwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoXzQsIHJlKSB8IDA7CiAgICAgICAgdmFyIHFlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKHFlID4+PiAyNikgfCAwLCBxZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChDMiwgWCksIG4gPSBNYXRoLmltdWwoQzIsIEopLCBuID0gbiArIE1hdGguaW11bChPLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoTywgSiksIGwgPSBsICsgTWF0aC5pbXVsKGssIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFIyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChSMiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSSwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSSwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoZywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoZywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoXzQsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKF80LCBuZSkgfCAwOwogICAgICAgIHZhciB6ZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArICh6ZSA+Pj4gMjYpIHwgMCwgemUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRiwgWCksIG4gPSBNYXRoLmltdWwoRiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKFUsIFgpIHwgMCwgZCA9IE1hdGguaW11bChVLCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIFEpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgZWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBmZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgYWUpIHwgMDsKICAgICAgICB2YXIgSGUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoSGUgPj4+IDI2KSB8IDAsIEhlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKHoyLCBYKSwgbiA9IE1hdGguaW11bCh6MiwgSiksIG4gPSBuICsgTWF0aC5pbXVsKEgsIFgpIHwgMCwgZCA9IE1hdGguaW11bChILCBKKSwgbCA9IGwgKyBNYXRoLmltdWwoRiwgUSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgc2UpIHwgMDsKICAgICAgICB2YXIgV2UgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoV2UgPj4+IDI2KSB8IDAsIFdlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFcsIFgpLCBuID0gTWF0aC5pbXVsKFcsIEopLCBuID0gbiArIE1hdGguaW11bChLLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoSywgSiksIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBRKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBlZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBRKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIHRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBhZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgdWUpIHwgMDsKICAgICAgICB2YXIgS2UgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoS2UgPj4+IDI2KSB8IDAsIEtlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKGosIFgpLCBuID0gTWF0aC5pbXVsKGosIEopLCBuID0gbiArIE1hdGguaW11bChaLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoWiwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFcsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIHJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIHRlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIHJlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBmZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgZGUpIHwgMDsKICAgICAgICB2YXIgamUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoamUgPj4+IDI2KSB8IDAsIGplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKFYsIFgpLCBuID0gTWF0aC5pbXVsKFYsIEopLCBuID0gbiArIE1hdGguaW11bCgkLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoJCwgSiksIGwgPSBsICsgTWF0aC5pbXVsKGosIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBvZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgcGUpIHwgMDsKICAgICAgICB2YXIgWmUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoWmUgPj4+IDI2KSB8IDAsIFplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIFgpLCBuID0gTWF0aC5pbXVsKEcsIEopLCBuID0gbiArIE1hdGguaW11bChZLCBYKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgSiksIGwgPSBsICsgTWF0aC5pbXVsKFYsIFEpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgZWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgUSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBlZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCB0ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCByZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCB0ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCByZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCBpZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBuZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCBpZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBuZSkgfCAwLCBsID0gbCArIE1hdGguaW11bCh6MiwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoejIsIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEgsIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEgsIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEYsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEYsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFUsIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFUsIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKEMyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChDMiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoTywgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoTywgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRDIsIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEQyLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChSMiwgY2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoUjIsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEksIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEksIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGcsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGcsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKF80LCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChfNCwgYmUpIHwgMDsKICAgICAgICB2YXIgVmUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoVmUgPj4+IDI2KSB8IDAsIFZlICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIFEpLCBuID0gTWF0aC5pbXVsKEcsIGVlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgUSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGVlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgdGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgcmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgdGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgcmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgaWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgbmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgaWUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgbmUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBzZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBvZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBzZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCB1ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBoZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCB1ZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGssIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGssIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEQyLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChEMiwgcGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoUjIsIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFIyLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChJLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChJLCBiZSkgfCAwOwogICAgICAgIHZhciAkZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArICgkZSA+Pj4gMjYpIHwgMCwgJGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgdGUpLCBuID0gTWF0aC5pbXVsKEcsIHJlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgdGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCByZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGllKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIG5lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGllKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIG5lKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGFlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGFlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIG9lKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIG9lKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHNlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCBoZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoRiwgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoRiwgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVSwgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoVSwgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoQzIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEMyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChPLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChPLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChrLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChrLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChEMiwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoRDIsIGJlKSB8IDA7CiAgICAgICAgdmFyIEdlID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKEdlID4+PiAyNikgfCAwLCBHZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBpZSksIG4gPSBNYXRoLmltdWwoRywgbmUpLCBuID0gbiArIE1hdGguaW11bChZLCBpZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIG5lKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgZmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgYWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgZmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgYWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChDMiwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoQzIsIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKE8sIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKE8sIGJlKSB8IDA7CiAgICAgICAgdmFyIFllID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKFllID4+PiAyNikgfCAwLCBZZSAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBmZSksIG4gPSBNYXRoLmltdWwoRywgYWUpLCBuID0gbiArIE1hdGguaW11bChZLCBmZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIGFlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgb2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgc2UpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgb2UpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgc2UpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoaiwgaGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoaiwgdWUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoWiwgaGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoWiwgdWUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoVywgbGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoVywgZGUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSywgbGUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSywgZGUpIHwgMCwgbCA9IGwgKyBNYXRoLmltdWwoejIsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKHoyLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChILCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChILCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChGLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChGLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChVLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChVLCBiZSkgfCAwOwogICAgICAgIHZhciBYZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChYZSA+Pj4gMjYpIHwgMCwgWGUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgb2UpLCBuID0gTWF0aC5pbXVsKEcsIHNlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgb2UpIHwgMCwgZCA9IE1hdGguaW11bChZLCBzZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGhlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHVlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGhlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHVlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIGxlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGRlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIGxlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGRlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKFcsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFcsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKEssIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKEssIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKHoyLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCh6MiwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoSCwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoSCwgYmUpIHwgMDsKICAgICAgICB2YXIgSmUgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAoSmUgPj4+IDI2KSB8IDAsIEplICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIGhlKSwgbiA9IE1hdGguaW11bChHLCB1ZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIGhlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgdWUpLCBsID0gbCArIE1hdGguaW11bChWLCBsZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChWLCBkZSkgfCAwLCBuID0gbiArIE1hdGguaW11bCgkLCBsZSkgfCAwLCBkID0gZCArIE1hdGguaW11bCgkLCBkZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChqLCBjZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChqLCBwZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChaLCBjZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChaLCBwZSkgfCAwLCBsID0gbCArIE1hdGguaW11bChXLCB2ZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChXLCBiZSkgfCAwLCBuID0gbiArIE1hdGguaW11bChLLCB2ZSkgfCAwLCBkID0gZCArIE1hdGguaW11bChLLCBiZSkgfCAwOwogICAgICAgIHZhciBRZSA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgYjMgPSAoZCArIChuID4+PiAxMykgfCAwKSArIChRZSA+Pj4gMjYpIHwgMCwgUWUgJj0gNjcxMDg4NjMsIGwgPSBNYXRoLmltdWwoRywgbGUpLCBuID0gTWF0aC5pbXVsKEcsIGRlKSwgbiA9IG4gKyBNYXRoLmltdWwoWSwgbGUpIHwgMCwgZCA9IE1hdGguaW11bChZLCBkZSksIGwgPSBsICsgTWF0aC5pbXVsKFYsIGNlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFYsIHBlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKCQsIGNlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKCQsIHBlKSB8IDAsIGwgPSBsICsgTWF0aC5pbXVsKGosIHZlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKGosIGJlKSB8IDAsIG4gPSBuICsgTWF0aC5pbXVsKFosIHZlKSB8IDAsIGQgPSBkICsgTWF0aC5pbXVsKFosIGJlKSB8IDA7CiAgICAgICAgdmFyIGV0ID0gKGIzICsgbCB8IDApICsgKChuICYgODE5MSkgPDwgMTMpIHwgMDsKICAgICAgICBiMyA9IChkICsgKG4gPj4+IDEzKSB8IDApICsgKGV0ID4+PiAyNikgfCAwLCBldCAmPSA2NzEwODg2MywgbCA9IE1hdGguaW11bChHLCBjZSksIG4gPSBNYXRoLmltdWwoRywgcGUpLCBuID0gbiArIE1hdGguaW11bChZLCBjZSkgfCAwLCBkID0gTWF0aC5pbXVsKFksIHBlKSwgbCA9IGwgKyBNYXRoLmltdWwoViwgdmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoViwgYmUpIHwgMCwgbiA9IG4gKyBNYXRoLmltdWwoJCwgdmUpIHwgMCwgZCA9IGQgKyBNYXRoLmltdWwoJCwgYmUpIHwgMDsKICAgICAgICB2YXIgdHQgPSAoYjMgKyBsIHwgMCkgKyAoKG4gJiA4MTkxKSA8PCAxMykgfCAwOwogICAgICAgIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAodHQgPj4+IDI2KSB8IDAsIHR0ICY9IDY3MTA4ODYzLCBsID0gTWF0aC5pbXVsKEcsIHZlKSwgbiA9IE1hdGguaW11bChHLCBiZSksIG4gPSBuICsgTWF0aC5pbXVsKFksIHZlKSB8IDAsIGQgPSBNYXRoLmltdWwoWSwgYmUpOwogICAgICAgIHZhciBydCA9IChiMyArIGwgfCAwKSArICgobiAmIDgxOTEpIDw8IDEzKSB8IDA7CiAgICAgICAgcmV0dXJuIGIzID0gKGQgKyAobiA+Pj4gMTMpIHwgMCkgKyAocnQgPj4+IDI2KSB8IDAsIHJ0ICY9IDY3MTA4ODYzLCBjWzBdID0gZnQsIGNbMV0gPSBCZSwgY1syXSA9IHFlLCBjWzNdID0gemUsIGNbNF0gPSBIZSwgY1s1XSA9IFdlLCBjWzZdID0gS2UsIGNbN10gPSBqZSwgY1s4XSA9IFplLCBjWzldID0gVmUsIGNbMTBdID0gJGUsIGNbMTFdID0gR2UsIGNbMTJdID0gWWUsIGNbMTNdID0gWGUsIGNbMTRdID0gSmUsIGNbMTVdID0gUWUsIGNbMTZdID0gZXQsIGNbMTddID0gdHQsIGNbMThdID0gcnQsIGIzICE9PSAwICYmIChjWzE5XSA9IGIzLCBoMi5sZW5ndGgrKyksIGgyOwogICAgICB9OwogICAgICBNYXRoLmltdWwgfHwgKEwyID0gcTIpOwogICAgICBmdW5jdGlvbiBnZSh2LCBpLCBhKSB7CiAgICAgICAgYS5uZWdhdGl2ZSA9IGkubmVnYXRpdmUgXiB2Lm5lZ2F0aXZlLCBhLmxlbmd0aCA9IHYubGVuZ3RoICsgaS5sZW5ndGg7CiAgICAgICAgZm9yICh2YXIgaDIgPSAwLCBzID0gMCwgdSA9IDA7dSA8IGEubGVuZ3RoIC0gMTsgdSsrKSB7CiAgICAgICAgICB2YXIgYyA9IHM7CiAgICAgICAgICBzID0gMDsKICAgICAgICAgIGZvciAodmFyIGIzID0gaDIgJiA2NzEwODg2MywgbCA9IE1hdGgubWluKHUsIGkubGVuZ3RoIC0gMSksIG4gPSBNYXRoLm1heCgwLCB1IC0gdi5sZW5ndGggKyAxKTtuIDw9IGw7IG4rKykgewogICAgICAgICAgICB2YXIgZCA9IHUgLSBuLCB3ID0gdi53b3Jkc1tkXSB8IDAsIGcgPSBpLndvcmRzW25dIHwgMCwgXzQgPSB3ICogZywgQTIgPSBfNCAmIDY3MTA4ODYzOwogICAgICAgICAgICBjID0gYyArIChfNCAvIDY3MTA4ODY0IHwgMCkgfCAwLCBBMiA9IEEyICsgYjMgfCAwLCBiMyA9IEEyICYgNjcxMDg4NjMsIGMgPSBjICsgKEEyID4+PiAyNikgfCAwLCBzICs9IGMgPj4+IDI2LCBjICY9IDY3MTA4ODYzOwogICAgICAgICAgfQogICAgICAgICAgYS53b3Jkc1t1XSA9IGIzLCBoMiA9IGMsIGMgPSBzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaDIgIT09IDAgPyBhLndvcmRzW3VdID0gaDIgOiBhLmxlbmd0aC0tLCBhLnN0cmlwKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2UodiwgaSwgYSkgewogICAgICAgIHZhciBoMiA9IG5ldyBOOwogICAgICAgIHJldHVybiBoMi5tdWxwKHYsIGksIGEpOwogICAgICB9CiAgICAgIGYucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHZhciBoMiwgcyA9IHRoaXMubGVuZ3RoICsgaS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxMCAmJiBpLmxlbmd0aCA9PT0gMTAgPyBoMiA9IEwyKHRoaXMsIGksIGEpIDogcyA8IDYzID8gaDIgPSBxMih0aGlzLCBpLCBhKSA6IHMgPCAxMDI0ID8gaDIgPSBnZSh0aGlzLCBpLCBhKSA6IGgyID0gX2UodGhpcywgaSwgYSksIGgyOwogICAgICB9OwogICAgICBmdW5jdGlvbiBOKHYsIGkpIHsKICAgICAgICB0aGlzLnggPSB2LCB0aGlzLnkgPSBpOwogICAgICB9CiAgICAgIE4ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IG5ldyBBcnJheShpKSwgaDIgPSBmLnByb3RvdHlwZS5fY291bnRCaXRzKGkpIC0gMSwgcyA9IDA7cyA8IGk7IHMrKykKICAgICAgICAgIGFbc10gPSB0aGlzLnJldkJpbihzLCBoMiwgaSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0sIE4ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gaDIgLSAxKQogICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgZm9yICh2YXIgcyA9IDAsIHUgPSAwO3UgPCBhOyB1KyspCiAgICAgICAgICBzIHw9IChpICYgMSkgPDwgYSAtIHUgLSAxLCBpID4+PSAxOwogICAgICAgIHJldHVybiBzOwogICAgICB9LCBOLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24oaSwgYSwgaDIsIHMsIHUsIGMpIHsKICAgICAgICBmb3IgKHZhciBiMyA9IDA7YjMgPCBjOyBiMysrKQogICAgICAgICAgc1tiM10gPSBhW2lbYjNdXSwgdVtiM10gPSBoMltpW2IzXV07CiAgICAgIH0sIE4ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGksIGEsIGgyLCBzLCB1LCBjKSB7CiAgICAgICAgdGhpcy5wZXJtdXRlKGMsIGksIGEsIGgyLCBzLCB1KTsKICAgICAgICBmb3IgKHZhciBiMyA9IDE7YjMgPCB1OyBiMyA8PD0gMSkKICAgICAgICAgIGZvciAodmFyIGwgPSBiMyA8PCAxLCBuID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKSwgZCA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCksIHcgPSAwO3cgPCB1OyB3ICs9IGwpCiAgICAgICAgICAgIGZvciAodmFyIGcgPSBuLCBfNCA9IGQsIEEyID0gMDtBMiA8IGIzOyBBMisrKSB7CiAgICAgICAgICAgICAgdmFyIFIyID0gaDJbdyArIEEyXSwgSSA9IHNbdyArIEEyXSwgTWUgPSBoMlt3ICsgQTIgKyBiM10sIGsgPSBzW3cgKyBBMiArIGIzXSwgRDIgPSBnICogTWUgLSBfNCAqIGs7CiAgICAgICAgICAgICAgayA9IGcgKiBrICsgXzQgKiBNZSwgTWUgPSBEMiwgaDJbdyArIEEyXSA9IFIyICsgTWUsIHNbdyArIEEyXSA9IEkgKyBrLCBoMlt3ICsgQTIgKyBiM10gPSBSMiAtIE1lLCBzW3cgKyBBMiArIGIzXSA9IEkgLSBrLCBBMiAhPT0gbCAmJiAoRDIgPSBuICogZyAtIGQgKiBfNCwgXzQgPSBuICogXzQgKyBkICogZywgZyA9IEQyKTsKICAgICAgICAgICAgfQogICAgICB9LCBOLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDIgPSBNYXRoLm1heChhLCBpKSB8IDEsIHMgPSBoMiAmIDEsIHUgPSAwOwogICAgICAgIGZvciAoaDIgPSBoMiAvIDIgfCAwO2gyOyBoMiA9IGgyID4+PiAxKQogICAgICAgICAgdSsrOwogICAgICAgIHJldHVybiAxIDw8IHUgKyAxICsgczsKICAgICAgfSwgTi5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICBpZiAoIShoMiA8PSAxKSkKICAgICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBoMiAvIDI7IHMrKykgewogICAgICAgICAgICB2YXIgdSA9IGlbc107CiAgICAgICAgICAgIGlbc10gPSBpW2gyIC0gcyAtIDFdLCBpW2gyIC0gcyAtIDFdID0gdSwgdSA9IGFbc10sIGFbc10gPSAtYVtoMiAtIHMgLSAxXSwgYVtoMiAtIHMgLSAxXSA9IC11OwogICAgICAgICAgfQogICAgICB9LCBOLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgZm9yICh2YXIgaDIgPSAwLCBzID0gMDtzIDwgYSAvIDI7IHMrKykgewogICAgICAgICAgdmFyIHUgPSBNYXRoLnJvdW5kKGlbMiAqIHMgKyAxXSAvIGEpICogODE5MiArIE1hdGgucm91bmQoaVsyICogc10gLyBhKSArIGgyOwogICAgICAgICAgaVtzXSA9IHUgJiA2NzEwODg2MywgdSA8IDY3MTA4ODY0ID8gaDIgPSAwIDogaDIgPSB1IC8gNjcxMDg4NjQgfCAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgICAgfSwgTi5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uKGksIGEsIGgyLCBzKSB7CiAgICAgICAgZm9yICh2YXIgdSA9IDAsIGMgPSAwO2MgPCBhOyBjKyspCiAgICAgICAgICB1ID0gdSArIChpW2NdIHwgMCksIGgyWzIgKiBjXSA9IHUgJiA4MTkxLCB1ID0gdSA+Pj4gMTMsIGgyWzIgKiBjICsgMV0gPSB1ICYgODE5MSwgdSA9IHUgPj4+IDEzOwogICAgICAgIGZvciAoYyA9IDIgKiBhO2MgPCBzOyArK2MpCiAgICAgICAgICBoMltjXSA9IDA7CiAgICAgICAgcih1ID09PSAwKSwgcigodSAmIC04MTkyKSA9PT0gMCk7CiAgICAgIH0sIE4ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IG5ldyBBcnJheShpKSwgaDIgPSAwO2gyIDwgaTsgaDIrKykKICAgICAgICAgIGFbaDJdID0gMDsKICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgTi5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgdmFyIHMgPSAyICogdGhpcy5ndWVzc0xlbjEzYihpLmxlbmd0aCwgYS5sZW5ndGgpLCB1ID0gdGhpcy5tYWtlUkJUKHMpLCBjID0gdGhpcy5zdHViKHMpLCBiMyA9IG5ldyBBcnJheShzKSwgbCA9IG5ldyBBcnJheShzKSwgbiA9IG5ldyBBcnJheShzKSwgZCA9IG5ldyBBcnJheShzKSwgdyA9IG5ldyBBcnJheShzKSwgZyA9IG5ldyBBcnJheShzKSwgXzQgPSBoMi53b3JkczsKICAgICAgICBfNC5sZW5ndGggPSBzLCB0aGlzLmNvbnZlcnQxM2IoaS53b3JkcywgaS5sZW5ndGgsIGIzLCBzKSwgdGhpcy5jb252ZXJ0MTNiKGEud29yZHMsIGEubGVuZ3RoLCBkLCBzKSwgdGhpcy50cmFuc2Zvcm0oYjMsIGMsIGwsIG4sIHMsIHUpLCB0aGlzLnRyYW5zZm9ybShkLCBjLCB3LCBnLCBzLCB1KTsKICAgICAgICBmb3IgKHZhciBBMiA9IDA7QTIgPCBzOyBBMisrKSB7CiAgICAgICAgICB2YXIgUjIgPSBsW0EyXSAqIHdbQTJdIC0gbltBMl0gKiBnW0EyXTsKICAgICAgICAgIG5bQTJdID0gbFtBMl0gKiBnW0EyXSArIG5bQTJdICogd1tBMl0sIGxbQTJdID0gUjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmNvbmp1Z2F0ZShsLCBuLCBzKSwgdGhpcy50cmFuc2Zvcm0obCwgbiwgXzQsIGMsIHMsIHUpLCB0aGlzLmNvbmp1Z2F0ZShfNCwgYywgcyksIHRoaXMubm9ybWFsaXplMTNiKF80LCBzKSwgaDIubmVnYXRpdmUgPSBpLm5lZ2F0aXZlIF4gYS5uZWdhdGl2ZSwgaDIubGVuZ3RoID0gaS5sZW5ndGggKyBhLmxlbmd0aCwgaDIuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGEud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBpLmxlbmd0aCksIHRoaXMubXVsVG8oaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSBuZXcgZihudWxsKTsKICAgICAgICByZXR1cm4gYS53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIGkubGVuZ3RoKSwgX2UodGhpcywgaSwgYSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhpLCB0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSAwO2gyIDwgdGhpcy5sZW5ndGg7IGgyKyspIHsKICAgICAgICAgIHZhciBzID0gKHRoaXMud29yZHNbaDJdIHwgMCkgKiBpLCB1ID0gKHMgJiA2NzEwODg2MykgKyAoYSAmIDY3MTA4ODYzKTsKICAgICAgICAgIGEgPj49IDI2LCBhICs9IHMgLyA2NzEwODg2NCB8IDAsIGEgKz0gdSA+Pj4gMjYsIHRoaXMud29yZHNbaDJdID0gdSAmIDY3MTA4ODYzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYSAhPT0gMCAmJiAodGhpcy53b3Jkc1toMl0gPSBhLCB0aGlzLmxlbmd0aCsrKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IEIoaSk7CiAgICAgICAgaWYgKGEubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpOwogICAgICAgIGZvciAodmFyIGgyID0gdGhpcywgcyA9IDA7cyA8IGEubGVuZ3RoICYmIGFbc10gPT09IDA7IHMrKywgaDIgPSBoMi5zcXIoKSkKICAgICAgICAgIDsKICAgICAgICBpZiAoKytzIDwgYS5sZW5ndGgpCiAgICAgICAgICBmb3IgKHZhciB1ID0gaDIuc3FyKCk7cyA8IGEubGVuZ3RoOyBzKyssIHUgPSB1LnNxcigpKQogICAgICAgICAgICBhW3NdICE9PSAwICYmIChoMiA9IGgyLm11bCh1KSk7CiAgICAgICAgcmV0dXJuIGgyOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcih0eXBlb2YgaSA9PSAibnVtYmVyIiAmJiBpID49IDApOwogICAgICAgIHZhciBhID0gaSAlIDI2LCBoMiA9IChpIC0gYSkgLyAyNiwgcyA9IDY3MTA4ODYzID4+PiAyNiAtIGEgPDwgMjYgLSBhLCB1OwogICAgICAgIGlmIChhICE9PSAwKSB7CiAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICBmb3IgKHUgPSAwO3UgPCB0aGlzLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgIHZhciBiMyA9IHRoaXMud29yZHNbdV0gJiBzLCBsID0gKHRoaXMud29yZHNbdV0gfCAwKSAtIGIzIDw8IGE7CiAgICAgICAgICAgIHRoaXMud29yZHNbdV0gPSBsIHwgYywgYyA9IGIzID4+PiAyNiAtIGE7CiAgICAgICAgICB9CiAgICAgICAgICBjICYmICh0aGlzLndvcmRzW3VdID0gYywgdGhpcy5sZW5ndGgrKyk7CiAgICAgICAgfQogICAgICAgIGlmIChoMiAhPT0gMCkgewogICAgICAgICAgZm9yICh1ID0gdGhpcy5sZW5ndGggLSAxO3UgPj0gMDsgdS0tKQogICAgICAgICAgICB0aGlzLndvcmRzW3UgKyBoMl0gPSB0aGlzLndvcmRzW3VdOwogICAgICAgICAgZm9yICh1ID0gMDt1IDwgaDI7IHUrKykKICAgICAgICAgICAgdGhpcy53b3Jkc1t1XSA9IDA7CiAgICAgICAgICB0aGlzLmxlbmd0aCArPSBoMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHIodHlwZW9mIGkgPT0gIm51bWJlciIgJiYgaSA+PSAwKTsKICAgICAgICB2YXIgczsKICAgICAgICBhID8gcyA9IChhIC0gYSAlIDI2KSAvIDI2IDogcyA9IDA7CiAgICAgICAgdmFyIHUgPSBpICUgMjYsIGMgPSBNYXRoLm1pbigoaSAtIHUpIC8gMjYsIHRoaXMubGVuZ3RoKSwgYjMgPSA2NzEwODg2MyBeIDY3MTA4ODYzID4+PiB1IDw8IHUsIGwgPSBoMjsKICAgICAgICBpZiAocyAtPSBjLCBzID0gTWF0aC5tYXgoMCwgcyksIGwpIHsKICAgICAgICAgIGZvciAodmFyIG4gPSAwO24gPCBjOyBuKyspCiAgICAgICAgICAgIGwud29yZHNbbl0gPSB0aGlzLndvcmRzW25dOwogICAgICAgICAgbC5sZW5ndGggPSBjOwogICAgICAgIH0KICAgICAgICBpZiAoYyAhPT0gMCkKICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGMpCiAgICAgICAgICAgIGZvciAodGhpcy5sZW5ndGggLT0gYywgbiA9IDA7biA8IHRoaXMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgdGhpcy53b3Jkc1tuXSA9IHRoaXMud29yZHNbbiArIGNdOwogICAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxOwogICAgICAgIHZhciBkID0gMDsKICAgICAgICBmb3IgKG4gPSB0aGlzLmxlbmd0aCAtIDE7biA+PSAwICYmIChkICE9PSAwIHx8IG4gPj0gcyk7IG4tLSkgewogICAgICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW25dIHwgMDsKICAgICAgICAgIHRoaXMud29yZHNbbl0gPSBkIDw8IDI2IC0gdSB8IHcgPj4+IHUsIGQgPSB3ICYgYjM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsICYmIGQgIT09IDAgJiYgKGwud29yZHNbbC5sZW5ndGgrK10gPSBkKSwgdGhpcy5sZW5ndGggPT09IDAgJiYgKHRoaXMud29yZHNbMF0gPSAwLCB0aGlzLmxlbmd0aCA9IDEpLCB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24oaSwgYSwgaDIpIHsKICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNocm4oaSwgYSwgaDIpOwogICAgICB9LCBmLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2LCBzID0gMSA8PCBhOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSBoMikKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgdSA9IHRoaXMud29yZHNbaDJdOwogICAgICAgIHJldHVybiAhISh1ICYgcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiICYmIGkgPj0gMCk7CiAgICAgICAgdmFyIGEgPSBpICUgMjYsIGgyID0gKGkgLSBhKSAvIDI2OwogICAgICAgIGlmIChyKHRoaXMubmVnYXRpdmUgPT09IDAsICJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMiKSwgdGhpcy5sZW5ndGggPD0gaDIpCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICBpZiAoYSAhPT0gMCAmJiBoMisrLCB0aGlzLmxlbmd0aCA9IE1hdGgubWluKGgyLCB0aGlzLmxlbmd0aCksIGEgIT09IDApIHsKICAgICAgICAgIHZhciBzID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4gYSA8PCBhOwogICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0eXBlb2YgaSA9PSAibnVtYmVyIiksIHIoaSA8IDY3MTA4ODY0KSwgaSA8IDAgPyB0aGlzLmlzdWJuKC1pKSA6IHRoaXMubmVnYXRpdmUgIT09IDAgPyB0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgaSA/ICh0aGlzLndvcmRzWzBdID0gaSAtICh0aGlzLndvcmRzWzBdIHwgMCksIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzKSA6ICh0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pc3VibihpKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXMpIDogdGhpcy5faWFkZG4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB0aGlzLndvcmRzWzBdICs9IGk7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbYV0gPj0gNjcxMDg4NjQ7IGErKykKICAgICAgICAgIHRoaXMud29yZHNbYV0gLT0gNjcxMDg4NjQsIGEgPT09IHRoaXMubGVuZ3RoIC0gMSA/IHRoaXMud29yZHNbYSArIDFdID0gMSA6IHRoaXMud29yZHNbYSArIDFdKys7CiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGEgKyAxKSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHIodHlwZW9mIGkgPT0gIm51bWJlciIpLCByKGkgPCA2NzEwODg2NCksIGkgPCAwKQogICAgICAgICAgcmV0dXJuIHRoaXMuaWFkZG4oLWkpOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGRuKGkpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpczsKICAgICAgICBpZiAodGhpcy53b3Jkc1swXSAtPSBpLCB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkKICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXSwgdGhpcy5uZWdhdGl2ZSA9IDE7CiAgICAgICAgZWxzZQogICAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbYV0gPCAwOyBhKyspCiAgICAgICAgICAgIHRoaXMud29yZHNbYV0gKz0gNjcxMDg4NjQsIHRoaXMud29yZHNbYSArIDFdIC09IDE7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaXAoKTsKICAgICAgfSwgZi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4oaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXM7CiAgICAgIH0sIGYucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpOwogICAgICB9LCBmLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbihpLCBhLCBoMikgewogICAgICAgIHZhciBzID0gaS5sZW5ndGggKyBoMiwgdTsKICAgICAgICB0aGlzLl9leHBhbmQocyk7CiAgICAgICAgdmFyIGMsIGIzID0gMDsKICAgICAgICBmb3IgKHUgPSAwO3UgPCBpLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICBjID0gKHRoaXMud29yZHNbdSArIGgyXSB8IDApICsgYjM7CiAgICAgICAgICB2YXIgbCA9IChpLndvcmRzW3VdIHwgMCkgKiBhOwogICAgICAgICAgYyAtPSBsICYgNjcxMDg4NjMsIGIzID0gKGMgPj4gMjYpIC0gKGwgLyA2NzEwODg2NCB8IDApLCB0aGlzLndvcmRzW3UgKyBoMl0gPSBjICYgNjcxMDg4NjM7CiAgICAgICAgfQogICAgICAgIGZvciAoO3UgPCB0aGlzLmxlbmd0aCAtIGgyOyB1KyspCiAgICAgICAgICBjID0gKHRoaXMud29yZHNbdSArIGgyXSB8IDApICsgYjMsIGIzID0gYyA+PiAyNiwgdGhpcy53b3Jkc1t1ICsgaDJdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIGlmIChiMyA9PT0gMCkKICAgICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgICAgZm9yIChyKGIzID09PSAtMSksIGIzID0gMCwgdSA9IDA7dSA8IHRoaXMubGVuZ3RoOyB1KyspCiAgICAgICAgICBjID0gLSh0aGlzLndvcmRzW3VdIHwgMCkgKyBiMywgYjMgPSBjID4+IDI2LCB0aGlzLndvcmRzW3VdID0gYyAmIDY3MTA4ODYzOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5zdHJpcCgpOwogICAgICB9LCBmLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB2YXIgaDIgPSB0aGlzLmxlbmd0aCAtIGkubGVuZ3RoLCBzID0gdGhpcy5jbG9uZSgpLCB1ID0gaSwgYyA9IHUud29yZHNbdS5sZW5ndGggLSAxXSB8IDAsIGIzID0gdGhpcy5fY291bnRCaXRzKGMpOwogICAgICAgIGgyID0gMjYgLSBiMywgaDIgIT09IDAgJiYgKHUgPSB1LnVzaGxuKGgyKSwgcy5pdXNobG4oaDIpLCBjID0gdS53b3Jkc1t1Lmxlbmd0aCAtIDFdIHwgMCk7CiAgICAgICAgdmFyIGwgPSBzLmxlbmd0aCAtIHUubGVuZ3RoLCBuOwogICAgICAgIGlmIChhICE9PSAibW9kIikgewogICAgICAgICAgbiA9IG5ldyBmKG51bGwpLCBuLmxlbmd0aCA9IGwgKyAxLCBuLndvcmRzID0gbmV3IEFycmF5KG4ubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGQgPSAwO2QgPCBuLmxlbmd0aDsgZCsrKQogICAgICAgICAgICBuLndvcmRzW2RdID0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIHcgPSBzLmNsb25lKCkuX2lzaGxuc3VibXVsKHUsIDEsIGwpOwogICAgICAgIHcubmVnYXRpdmUgPT09IDAgJiYgKHMgPSB3LCBuICYmIChuLndvcmRzW2xdID0gMSkpOwogICAgICAgIGZvciAodmFyIGcgPSBsIC0gMTtnID49IDA7IGctLSkgewogICAgICAgICAgdmFyIF80ID0gKHMud29yZHNbdS5sZW5ndGggKyBnXSB8IDApICogNjcxMDg4NjQgKyAocy53b3Jkc1t1Lmxlbmd0aCArIGcgLSAxXSB8IDApOwogICAgICAgICAgZm9yIChfNCA9IE1hdGgubWluKF80IC8gYyB8IDAsIDY3MTA4ODYzKSwgcy5faXNobG5zdWJtdWwodSwgXzQsIGcpO3MubmVnYXRpdmUgIT09IDA7ICkKICAgICAgICAgICAgXzQtLSwgcy5uZWdhdGl2ZSA9IDAsIHMuX2lzaGxuc3VibXVsKHUsIDEsIGcpLCBzLmlzWmVybygpIHx8IChzLm5lZ2F0aXZlIF49IDEpOwogICAgICAgICAgbiAmJiAobi53b3Jkc1tnXSA9IF80KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4gJiYgbi5zdHJpcCgpLCBzLnN0cmlwKCksIGEgIT09ICJkaXYiICYmIGgyICE9PSAwICYmIHMuaXVzaHJuKGgyKSwgeyBkaXY6IG4gfHwgbnVsbCwgbW9kOiBzIH07CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uKGksIGEsIGgyKSB7CiAgICAgICAgaWYgKHIoIWkuaXNaZXJvKCkpLCB0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIHsgZGl2OiBuZXcgZigwKSwgbW9kOiBuZXcgZigwKSB9OwogICAgICAgIHZhciBzLCB1LCBjOwogICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwICYmIGkubmVnYXRpdmUgPT09IDAgPyAoYyA9IHRoaXMubmVnKCkuZGl2bW9kKGksIGEpLCBhICE9PSAibW9kIiAmJiAocyA9IGMuZGl2Lm5lZygpKSwgYSAhPT0gImRpdiIgJiYgKHUgPSBjLm1vZC5uZWcoKSwgaDIgJiYgdS5uZWdhdGl2ZSAhPT0gMCAmJiB1LmlhZGQoaSkpLCB7IGRpdjogcywgbW9kOiB1IH0pIDogdGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBpLm5lZ2F0aXZlICE9PSAwID8gKGMgPSB0aGlzLmRpdm1vZChpLm5lZygpLCBhKSwgYSAhPT0gIm1vZCIgJiYgKHMgPSBjLmRpdi5uZWcoKSksIHsgZGl2OiBzLCBtb2Q6IGMubW9kIH0pIDogKHRoaXMubmVnYXRpdmUgJiBpLm5lZ2F0aXZlKSAhPT0gMCA/IChjID0gdGhpcy5uZWcoKS5kaXZtb2QoaS5uZWcoKSwgYSksIGEgIT09ICJkaXYiICYmICh1ID0gYy5tb2QubmVnKCksIGgyICYmIHUubmVnYXRpdmUgIT09IDAgJiYgdS5pc3ViKGkpKSwgeyBkaXY6IGMuZGl2LCBtb2Q6IHUgfSkgOiBpLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKGkpIDwgMCA/IHsgZGl2OiBuZXcgZigwKSwgbW9kOiB0aGlzIH0gOiBpLmxlbmd0aCA9PT0gMSA/IGEgPT09ICJkaXYiID8geyBkaXY6IHRoaXMuZGl2bihpLndvcmRzWzBdKSwgbW9kOiBudWxsIH0gOiBhID09PSAibW9kIiA/IHsgZGl2OiBudWxsLCBtb2Q6IG5ldyBmKHRoaXMubW9kbihpLndvcmRzWzBdKSkgfSA6IHsgZGl2OiB0aGlzLmRpdm4oaS53b3Jkc1swXSksIG1vZDogbmV3IGYodGhpcy5tb2RuKGkud29yZHNbMF0pKSB9IDogdGhpcy5fd29yZERpdihpLCBhKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAiZGl2IiwgZmFsc2UpLmRpdjsKICAgICAgfSwgZi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmRpdm1vZChpLCAibW9kIiwgZmFsc2UpLm1vZDsKICAgICAgfSwgZi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoaSwgIm1vZCIsIHRydWUpLm1vZDsKICAgICAgfSwgZi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmRpdm1vZChpKTsKICAgICAgICBpZiAoYS5tb2QuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gYS5kaXY7CiAgICAgICAgdmFyIGgyID0gYS5kaXYubmVnYXRpdmUgIT09IDAgPyBhLm1vZC5pc3ViKGkpIDogYS5tb2QsIHMgPSBpLnVzaHJuKDEpLCB1ID0gaS5hbmRsbigxKSwgYyA9IGgyLmNtcChzKTsKICAgICAgICByZXR1cm4gYyA8IDAgfHwgdSA9PT0gMSAmJiBjID09PSAwID8gYS5kaXYgOiBhLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGEuZGl2LmlzdWJuKDEpIDogYS5kaXYuaWFkZG4oMSk7CiAgICAgIH0sIGYucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpIDw9IDY3MTA4ODYzKTsKICAgICAgICBmb3IgKHZhciBhID0gKDEgPDwgMjYpICUgaSwgaDIgPSAwLCBzID0gdGhpcy5sZW5ndGggLSAxO3MgPj0gMDsgcy0tKQogICAgICAgICAgaDIgPSAoYSAqIGgyICsgKHRoaXMud29yZHNbc10gfCAwKSkgJSBpOwogICAgICAgIHJldHVybiBoMjsKICAgICAgfSwgZi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcihpIDw9IDY3MTA4ODYzKTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSB0aGlzLmxlbmd0aCAtIDE7aDIgPj0gMDsgaDItLSkgewogICAgICAgICAgdmFyIHMgPSAodGhpcy53b3Jkc1toMl0gfCAwKSArIGEgKiA2NzEwODg2NDsKICAgICAgICAgIHRoaXMud29yZHNbaDJdID0gcyAvIGkgfCAwLCBhID0gcyAlIGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0cmlwKCk7CiAgICAgIH0sIGYucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihpKTsKICAgICAgfSwgZi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDApLCByKCFpLmlzWmVybygpKTsKICAgICAgICB2YXIgYSA9IHRoaXMsIGgyID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgIT09IDAgPyBhID0gYS51bW9kKGkpIDogYSA9IGEuY2xvbmUoKTsKICAgICAgICBmb3IgKHZhciBzID0gbmV3IGYoMSksIHUgPSBuZXcgZigwKSwgYyA9IG5ldyBmKDApLCBiMyA9IG5ldyBmKDEpLCBsID0gMDthLmlzRXZlbigpICYmIGgyLmlzRXZlbigpOyApCiAgICAgICAgICBhLml1c2hybigxKSwgaDIuaXVzaHJuKDEpLCArK2w7CiAgICAgICAgZm9yICh2YXIgbiA9IGgyLmNsb25lKCksIGQgPSBhLmNsb25lKCk7IWEuaXNaZXJvKCk7ICkgewogICAgICAgICAgZm9yICh2YXIgdyA9IDAsIGcgPSAxOyhhLndvcmRzWzBdICYgZykgPT09IDAgJiYgdyA8IDI2OyArK3csIGcgPDw9IDEpCiAgICAgICAgICAgIDsKICAgICAgICAgIGlmICh3ID4gMCkKICAgICAgICAgICAgZm9yIChhLml1c2hybih3KTt3LS0gPiAwOyApCiAgICAgICAgICAgICAgKHMuaXNPZGQoKSB8fCB1LmlzT2RkKCkpICYmIChzLmlhZGQobiksIHUuaXN1YihkKSksIHMuaXVzaHJuKDEpLCB1Lml1c2hybigxKTsKICAgICAgICAgIGZvciAodmFyIF80ID0gMCwgQTIgPSAxOyhoMi53b3Jkc1swXSAmIEEyKSA9PT0gMCAmJiBfNCA8IDI2OyArK180LCBBMiA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKF80ID4gMCkKICAgICAgICAgICAgZm9yIChoMi5pdXNocm4oXzQpO180LS0gPiAwOyApCiAgICAgICAgICAgICAgKGMuaXNPZGQoKSB8fCBiMy5pc09kZCgpKSAmJiAoYy5pYWRkKG4pLCBiMy5pc3ViKGQpKSwgYy5pdXNocm4oMSksIGIzLml1c2hybigxKTsKICAgICAgICAgIGEuY21wKGgyKSA+PSAwID8gKGEuaXN1YihoMiksIHMuaXN1YihjKSwgdS5pc3ViKGIzKSkgOiAoaDIuaXN1YihhKSwgYy5pc3ViKHMpLCBiMy5pc3ViKHUpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgYTogYywgYjogYjMsIGdjZDogaDIuaXVzaGxuKGwpIH07CiAgICAgIH0sIGYucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDApLCByKCFpLmlzWmVybygpKTsKICAgICAgICB2YXIgYSA9IHRoaXMsIGgyID0gaS5jbG9uZSgpOwogICAgICAgIGEubmVnYXRpdmUgIT09IDAgPyBhID0gYS51bW9kKGkpIDogYSA9IGEuY2xvbmUoKTsKICAgICAgICBmb3IgKHZhciBzID0gbmV3IGYoMSksIHUgPSBuZXcgZigwKSwgYyA9IGgyLmNsb25lKCk7YS5jbXBuKDEpID4gMCAmJiBoMi5jbXBuKDEpID4gMDsgKSB7CiAgICAgICAgICBmb3IgKHZhciBiMyA9IDAsIGwgPSAxOyhhLndvcmRzWzBdICYgbCkgPT09IDAgJiYgYjMgPCAyNjsgKytiMywgbCA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKGIzID4gMCkKICAgICAgICAgICAgZm9yIChhLml1c2hybihiMyk7YjMtLSA+IDA7ICkKICAgICAgICAgICAgICBzLmlzT2RkKCkgJiYgcy5pYWRkKGMpLCBzLml1c2hybigxKTsKICAgICAgICAgIGZvciAodmFyIG4gPSAwLCBkID0gMTsoaDIud29yZHNbMF0gJiBkKSA9PT0gMCAmJiBuIDwgMjY7ICsrbiwgZCA8PD0gMSkKICAgICAgICAgICAgOwogICAgICAgICAgaWYgKG4gPiAwKQogICAgICAgICAgICBmb3IgKGgyLml1c2hybihuKTtuLS0gPiAwOyApCiAgICAgICAgICAgICAgdS5pc09kZCgpICYmIHUuaWFkZChjKSwgdS5pdXNocm4oMSk7CiAgICAgICAgICBhLmNtcChoMikgPj0gMCA/IChhLmlzdWIoaDIpLCBzLmlzdWIodSkpIDogKGgyLmlzdWIoYSksIHUuaXN1YihzKSk7CiAgICAgICAgfQogICAgICAgIHZhciB3OwogICAgICAgIHJldHVybiBhLmNtcG4oMSkgPT09IDAgPyB3ID0gcyA6IHcgPSB1LCB3LmNtcG4oMCkgPCAwICYmIHcuaWFkZChpKSwgdzsKICAgICAgfSwgZi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24oaSkgewogICAgICAgIGlmICh0aGlzLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIGkuYWJzKCk7CiAgICAgICAgaWYgKGkuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gdGhpcy5hYnMoKTsKICAgICAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKSwgaDIgPSBpLmNsb25lKCk7CiAgICAgICAgYS5uZWdhdGl2ZSA9IDAsIGgyLm5lZ2F0aXZlID0gMDsKICAgICAgICBmb3IgKHZhciBzID0gMDthLmlzRXZlbigpICYmIGgyLmlzRXZlbigpOyBzKyspCiAgICAgICAgICBhLml1c2hybigxKSwgaDIuaXVzaHJuKDEpOwogICAgICAgIGRvIHsKICAgICAgICAgIGZvciAoO2EuaXNFdmVuKCk7ICkKICAgICAgICAgICAgYS5pdXNocm4oMSk7CiAgICAgICAgICBmb3IgKDtoMi5pc0V2ZW4oKTsgKQogICAgICAgICAgICBoMi5pdXNocm4oMSk7CiAgICAgICAgICB2YXIgdSA9IGEuY21wKGgyKTsKICAgICAgICAgIGlmICh1IDwgMCkgewogICAgICAgICAgICB2YXIgYyA9IGE7CiAgICAgICAgICAgIGEgPSBoMiwgaDIgPSBjOwogICAgICAgICAgfSBlbHNlIGlmICh1ID09PSAwIHx8IGgyLmNtcG4oMSkgPT09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYS5pc3ViKGgyKTsKICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICByZXR1cm4gaDIuaXVzaGxuKHMpOwogICAgICB9LCBmLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmVnY2QoaSkuYS51bW9kKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBpOwogICAgICB9LCBmLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKHR5cGVvZiBpID09ICJudW1iZXIiKTsKICAgICAgICB2YXIgYSA9IGkgJSAyNiwgaDIgPSAoaSAtIGEpIC8gMjYsIHMgPSAxIDw8IGE7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDw9IGgyKQogICAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZChoMiArIDEpLCB0aGlzLndvcmRzW2gyXSB8PSBzLCB0aGlzOwogICAgICAgIGZvciAodmFyIHUgPSBzLCBjID0gaDI7dSAhPT0gMCAmJiBjIDwgdGhpcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgdmFyIGIzID0gdGhpcy53b3Jkc1tjXSB8IDA7CiAgICAgICAgICBiMyArPSB1LCB1ID0gYjMgPj4+IDI2LCBiMyAmPSA2NzEwODg2MywgdGhpcy53b3Jkc1tjXSA9IGIzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdSAhPT0gMCAmJiAodGhpcy53b3Jkc1tjXSA9IHUsIHRoaXMubGVuZ3RoKyspLCB0aGlzOwogICAgICB9LCBmLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkgPCAwOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFhKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGEpCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB0aGlzLnN0cmlwKCk7CiAgICAgICAgdmFyIGgyOwogICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpCiAgICAgICAgICBoMiA9IDE7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBhICYmIChpID0gLWkpLCByKGkgPD0gNjcxMDg4NjMsICJOdW1iZXIgaXMgdG9vIGJpZyIpOwogICAgICAgICAgdmFyIHMgPSB0aGlzLndvcmRzWzBdIHwgMDsKICAgICAgICAgIGgyID0gcyA9PT0gaSA/IDAgOiBzIDwgaSA/IC0xIDogMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgPyAtaDIgfCAwIDogaDI7CiAgICAgIH0sIGYucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBpLm5lZ2F0aXZlID09PSAwKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIGkubmVnYXRpdmUgIT09IDApCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB2YXIgYSA9IHRoaXMudWNtcChpKTsKICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCA/IC1hIHwgMCA6IGE7CiAgICAgIH0sIGYucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gaS5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAodGhpcy5sZW5ndGggPCBpLmxlbmd0aCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBmb3IgKHZhciBhID0gMCwgaDIgPSB0aGlzLmxlbmd0aCAtIDE7aDIgPj0gMDsgaDItLSkgewogICAgICAgICAgdmFyIHMgPSB0aGlzLndvcmRzW2gyXSB8IDAsIHUgPSBpLndvcmRzW2gyXSB8IDA7CiAgICAgICAgICBpZiAocyAhPT0gdSkgewogICAgICAgICAgICBzIDwgdSA/IGEgPSAtMSA6IHMgPiB1ICYmIChhID0gMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IDE7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA9PT0gMTsKICAgICAgfSwgZi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXBuKGkpID49IDA7CiAgICAgIH0sIGYucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPj0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPT09IC0xOwogICAgICB9LCBmLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5jbXAoaSkgPT09IC0xOwogICAgICB9LCBmLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcG4oaSkgPD0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmNtcChpKSA8PSAwOwogICAgICB9LCBmLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihpKSA9PT0gMDsKICAgICAgfSwgZi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGkpID09PSAwOwogICAgICB9LCBmLnJlZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gbmV3IFAoaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSwgcih0aGlzLm5lZ2F0aXZlID09PSAwLCAicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSwgaS5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0IiksIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVkID0gaSwgdGhpczsKICAgICAgfSwgZi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIoIXRoaXMucmVkLCAiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLCB0aGlzLl9mb3JjZVJlZChpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5hZGQodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5pYWRkKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLnN1Yih0aGlzLCBpKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLmlzdWIodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuc2hsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGkpLCB0aGlzLnJlZC5tdWwodGhpcywgaSk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGkpLCB0aGlzLnJlZC5pbXVsKHRoaXMsIGkpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnNxcih0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiByKHRoaXMucmVkLCAicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmlzcXIodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5zcXJ0KHRoaXMpOwogICAgICB9LCBmLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuaW52bSh0aGlzKTsKICAgICAgfSwgZi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsICJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5uZWcodGhpcyk7CiAgICAgIH0sIGYucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gcih0aGlzLnJlZCAmJiAhaS5yZWQsICJyZWRQb3cobm9ybWFsTnVtKSIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQucG93KHRoaXMsIGkpOwogICAgICB9OwogICAgICB2YXIgd2UgPSB7IGsyNTY6IG51bGwsIHAyMjQ6IG51bGwsIHAxOTI6IG51bGwsIHAyNTUxOTogbnVsbCB9OwogICAgICBmdW5jdGlvbiB5ZSh2LCBpKSB7CiAgICAgICAgdGhpcy5uYW1lID0gdiwgdGhpcy5wID0gbmV3IGYoaSwgMTYpLCB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCksIHRoaXMuayA9IG5ldyBmKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSwgdGhpcy50bXAgPSB0aGlzLl90bXAoKTsKICAgICAgfQogICAgICB5ZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpID0gbmV3IGYobnVsbCk7CiAgICAgICAgcmV0dXJuIGkud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSksIGk7CiAgICAgIH0sIHllLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaSwgaDI7CiAgICAgICAgZG8KICAgICAgICAgIHRoaXMuc3BsaXQoYSwgdGhpcy50bXApLCBhID0gdGhpcy5pbXVsSyhhKSwgYSA9IGEuaWFkZCh0aGlzLnRtcCksIGgyID0gYS5iaXRMZW5ndGgoKTsKICAgICAgICB3aGlsZSAoaDIgPiB0aGlzLm4pOwogICAgICAgIHZhciBzID0gaDIgPCB0aGlzLm4gPyAtMSA6IGEudWNtcCh0aGlzLnApOwogICAgICAgIHJldHVybiBzID09PSAwID8gKGEud29yZHNbMF0gPSAwLCBhLmxlbmd0aCA9IDEpIDogcyA+IDAgPyBhLmlzdWIodGhpcy5wKSA6IGEuc3RyaXAgIT09IHVuZGVmaW5lZCA/IGEuc3RyaXAoKSA6IGEuX3N0cmlwKCksIGE7CiAgICAgIH0sIHllLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICBpLml1c2hybih0aGlzLm4sIDAsIGEpOwogICAgICB9LCB5ZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIGkuaW11bCh0aGlzLmspOwogICAgICB9OwogICAgICBmdW5jdGlvbiB4ZSgpIHsKICAgICAgICB5ZS5jYWxsKHRoaXMsICJrMjU2IiwgImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIik7CiAgICAgIH0KICAgICAgbyh4ZSwgeWUpLCB4ZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgZm9yICh2YXIgaDIgPSA0MTk0MzAzLCBzID0gTWF0aC5taW4oaS5sZW5ndGgsIDkpLCB1ID0gMDt1IDwgczsgdSsrKQogICAgICAgICAgYS53b3Jkc1t1XSA9IGkud29yZHNbdV07CiAgICAgICAgaWYgKGEubGVuZ3RoID0gcywgaS5sZW5ndGggPD0gOSkgewogICAgICAgICAgaS53b3Jkc1swXSA9IDAsIGkubGVuZ3RoID0gMTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGMgPSBpLndvcmRzWzldOwogICAgICAgIGZvciAoYS53b3Jkc1thLmxlbmd0aCsrXSA9IGMgJiBoMiwgdSA9IDEwO3UgPCBpLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICB2YXIgYjMgPSBpLndvcmRzW3VdIHwgMDsKICAgICAgICAgIGkud29yZHNbdSAtIDEwXSA9IChiMyAmIGgyKSA8PCA0IHwgYyA+Pj4gMjIsIGMgPSBiMzsKICAgICAgICB9CiAgICAgICAgYyA+Pj49IDIyLCBpLndvcmRzW3UgLSAxMF0gPSBjLCBjID09PSAwICYmIGkubGVuZ3RoID4gMTAgPyBpLmxlbmd0aCAtPSAxMCA6IGkubGVuZ3RoIC09IDk7CiAgICAgIH0sIHhlLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpLndvcmRzW2kubGVuZ3RoXSA9IDAsIGkud29yZHNbaS5sZW5ndGggKyAxXSA9IDAsIGkubGVuZ3RoICs9IDI7CiAgICAgICAgZm9yICh2YXIgYSA9IDAsIGgyID0gMDtoMiA8IGkubGVuZ3RoOyBoMisrKSB7CiAgICAgICAgICB2YXIgcyA9IGkud29yZHNbaDJdIHwgMDsKICAgICAgICAgIGEgKz0gcyAqIDk3NywgaS53b3Jkc1toMl0gPSBhICYgNjcxMDg4NjMsIGEgPSBzICogNjQgKyAoYSAvIDY3MTA4ODY0IHwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpLndvcmRzW2kubGVuZ3RoIC0gMV0gPT09IDAgJiYgKGkubGVuZ3RoLS0sIGkud29yZHNbaS5sZW5ndGggLSAxXSA9PT0gMCAmJiBpLmxlbmd0aC0tKSwgaTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gUmUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAicDIyNCIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpOwogICAgICB9CiAgICAgIG8oUmUsIHllKTsKICAgICAgZnVuY3Rpb24gRWUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAicDE5MiIsICJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIpOwogICAgICB9CiAgICAgIG8oRWUsIHllKTsKICAgICAgZnVuY3Rpb24gQWUoKSB7CiAgICAgICAgeWUuY2FsbCh0aGlzLCAiMjU1MTkiLCAiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIpOwogICAgICB9CiAgICAgIG8oQWUsIHllKSwgQWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oaSkgewogICAgICAgIGZvciAodmFyIGEgPSAwLCBoMiA9IDA7aDIgPCBpLmxlbmd0aDsgaDIrKykgewogICAgICAgICAgdmFyIHMgPSAoaS53b3Jkc1toMl0gfCAwKSAqIDE5ICsgYSwgdSA9IHMgJiA2NzEwODg2MzsKICAgICAgICAgIHMgPj4+PSAyNiwgaS53b3Jkc1toMl0gPSB1LCBhID0gczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGEgIT09IDAgJiYgKGkud29yZHNbaS5sZW5ndGgrK10gPSBhKSwgaTsKICAgICAgfSwgZi5fcHJpbWUgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgaWYgKHdlW2ldKQogICAgICAgICAgcmV0dXJuIHdlW2ldOwogICAgICAgIHZhciBhOwogICAgICAgIGlmIChpID09PSAiazI1NiIpCiAgICAgICAgICBhID0gbmV3IHhlOwogICAgICAgIGVsc2UgaWYgKGkgPT09ICJwMjI0IikKICAgICAgICAgIGEgPSBuZXcgUmU7CiAgICAgICAgZWxzZSBpZiAoaSA9PT0gInAxOTIiKQogICAgICAgICAgYSA9IG5ldyBFZTsKICAgICAgICBlbHNlIGlmIChpID09PSAicDI1NTE5IikKICAgICAgICAgIGEgPSBuZXcgQWU7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHByaW1lICIgKyBpKTsKICAgICAgICByZXR1cm4gd2VbaV0gPSBhLCBhOwogICAgICB9OwogICAgICBmdW5jdGlvbiBQKHYpIHsKICAgICAgICBpZiAodHlwZW9mIHYgPT0gInN0cmluZyIpIHsKICAgICAgICAgIHZhciBpID0gZi5fcHJpbWUodik7CiAgICAgICAgICB0aGlzLm0gPSBpLnAsIHRoaXMucHJpbWUgPSBpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgcih2Lmd0bigxKSwgIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLCB0aGlzLm0gPSB2LCB0aGlzLnByaW1lID0gbnVsbDsKICAgICAgfQogICAgICBQLnByb3RvdHlwZS5fdmVyaWZ5MSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByKGkubmVnYXRpdmUgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCByKGkucmVkLCAicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpOwogICAgICB9LCBQLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByKChpLm5lZ2F0aXZlIHwgYS5uZWdhdGl2ZSkgPT09IDAsICJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLCByKGkucmVkICYmIGkucmVkID09PSBhLnJlZCwgInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcmltZSA/IHRoaXMucHJpbWUuaXJlZHVjZShpKS5fZm9yY2VSZWQodGhpcykgOiBpLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gaS5pc1plcm8oKSA/IGkuY2xvbmUoKSA6IHRoaXMubS5zdWIoaSkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBQLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDIgPSBpLmFkZChhKTsKICAgICAgICByZXR1cm4gaDIuY21wKHRoaXMubSkgPj0gMCAmJiBoMi5pc3ViKHRoaXMubSksIGgyLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgUC5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICB0aGlzLl92ZXJpZnkyKGksIGEpOwogICAgICAgIHZhciBoMiA9IGkuaWFkZChhKTsKICAgICAgICByZXR1cm4gaDIuY21wKHRoaXMubSkgPj0gMCAmJiBoMi5pc3ViKHRoaXMubSksIGgyOwogICAgICB9LCBQLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDIgPSBpLnN1YihhKTsKICAgICAgICByZXR1cm4gaDIuY21wbigwKSA8IDAgJiYgaDIuaWFkZCh0aGlzLm0pLCBoMi5fZm9yY2VSZWQodGhpcyk7CiAgICAgIH0sIFAucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihpLCBhKSB7CiAgICAgICAgdGhpcy5fdmVyaWZ5MihpLCBhKTsKICAgICAgICB2YXIgaDIgPSBpLmlzdWIoYSk7CiAgICAgICAgcmV0dXJuIGgyLmNtcG4oMCkgPCAwICYmIGgyLmlhZGQodGhpcy5tKSwgaDI7CiAgICAgIH0sIFAucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uKGksIGEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MShpKSwgdGhpcy5pbW9kKGkudXNobG4oYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkyKGksIGEpLCB0aGlzLmltb2QoaS5pbXVsKGEpKTsKICAgICAgfSwgUC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkyKGksIGEpLCB0aGlzLmltb2QoaS5tdWwoYSkpOwogICAgICB9LCBQLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLmltdWwoaSwgaS5jbG9uZSgpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiB0aGlzLm11bChpLCBpKTsKICAgICAgfSwgUC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICBpZiAoaS5pc1plcm8oKSkKICAgICAgICAgIHJldHVybiBpLmNsb25lKCk7CiAgICAgICAgdmFyIGEgPSB0aGlzLm0uYW5kbG4oMyk7CiAgICAgICAgaWYgKHIoYSAlIDIgPT09IDEpLCBhID09PSAzKSB7CiAgICAgICAgICB2YXIgaDIgPSB0aGlzLm0uYWRkKG5ldyBmKDEpKS5pdXNocm4oMik7CiAgICAgICAgICByZXR1cm4gdGhpcy5wb3coaSwgaDIpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBzID0gdGhpcy5tLnN1Ym4oMSksIHUgPSAwOyFzLmlzWmVybygpICYmIHMuYW5kbG4oMSkgPT09IDA7ICkKICAgICAgICAgIHUrKywgcy5pdXNocm4oMSk7CiAgICAgICAgcighcy5pc1plcm8oKSk7CiAgICAgICAgdmFyIGMgPSBuZXcgZigxKS50b1JlZCh0aGlzKSwgYjMgPSBjLnJlZE5lZygpLCBsID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLCBuID0gdGhpcy5tLmJpdExlbmd0aCgpOwogICAgICAgIGZvciAobiA9IG5ldyBmKDIgKiBuICogbikudG9SZWQodGhpcyk7dGhpcy5wb3cobiwgbCkuY21wKGIzKSAhPT0gMDsgKQogICAgICAgICAgbi5yZWRJQWRkKGIzKTsKICAgICAgICBmb3IgKHZhciBkID0gdGhpcy5wb3cobiwgcyksIHcgPSB0aGlzLnBvdyhpLCBzLmFkZG4oMSkuaXVzaHJuKDEpKSwgZyA9IHRoaXMucG93KGksIHMpLCBfNCA9IHU7Zy5jbXAoYykgIT09IDA7ICkgewogICAgICAgICAgZm9yICh2YXIgQTIgPSBnLCBSMiA9IDA7QTIuY21wKGMpICE9PSAwOyBSMisrKQogICAgICAgICAgICBBMiA9IEEyLnJlZFNxcigpOwogICAgICAgICAgcihSMiA8IF80KTsKICAgICAgICAgIHZhciBJID0gdGhpcy5wb3coZCwgbmV3IGYoMSkuaXVzaGxuKF80IC0gUjIgLSAxKSk7CiAgICAgICAgICB3ID0gdy5yZWRNdWwoSSksIGQgPSBJLnJlZFNxcigpLCBnID0gZy5yZWRNdWwoZCksIF80ID0gUjI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB3OwogICAgICB9LCBQLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS5faW52bXAodGhpcy5tKTsKICAgICAgICByZXR1cm4gYS5uZWdhdGl2ZSAhPT0gMCA/IChhLm5lZ2F0aXZlID0gMCwgdGhpcy5pbW9kKGEpLnJlZE5lZygpKSA6IHRoaXMuaW1vZChhKTsKICAgICAgfSwgUC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChhLmlzWmVybygpKQogICAgICAgICAgcmV0dXJuIG5ldyBmKDEpLnRvUmVkKHRoaXMpOwogICAgICAgIGlmIChhLmNtcG4oMSkgPT09IDApCiAgICAgICAgICByZXR1cm4gaS5jbG9uZSgpOwogICAgICAgIHZhciBoMiA9IDQsIHMgPSBuZXcgQXJyYXkoMSA8PCBoMik7CiAgICAgICAgc1swXSA9IG5ldyBmKDEpLnRvUmVkKHRoaXMpLCBzWzFdID0gaTsKICAgICAgICBmb3IgKHZhciB1ID0gMjt1IDwgcy5sZW5ndGg7IHUrKykKICAgICAgICAgIHNbdV0gPSB0aGlzLm11bChzW3UgLSAxXSwgaSk7CiAgICAgICAgdmFyIGMgPSBzWzBdLCBiMyA9IDAsIGwgPSAwLCBuID0gYS5iaXRMZW5ndGgoKSAlIDI2OwogICAgICAgIGZvciAobiA9PT0gMCAmJiAobiA9IDI2KSwgdSA9IGEubGVuZ3RoIC0gMTt1ID49IDA7IHUtLSkgewogICAgICAgICAgZm9yICh2YXIgZCA9IGEud29yZHNbdV0sIHcgPSBuIC0gMTt3ID49IDA7IHctLSkgewogICAgICAgICAgICB2YXIgZyA9IGQgPj4gdyAmIDE7CiAgICAgICAgICAgIGlmIChjICE9PSBzWzBdICYmIChjID0gdGhpcy5zcXIoYykpLCBnID09PSAwICYmIGIzID09PSAwKSB7CiAgICAgICAgICAgICAgbCA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYjMgPDw9IDEsIGIzIHw9IGcsIGwrKywgIShsICE9PSBoMiAmJiAodSAhPT0gMCB8fCB3ICE9PSAwKSkgJiYgKGMgPSB0aGlzLm11bChjLCBzW2IzXSksIGwgPSAwLCBiMyA9IDApOwogICAgICAgICAgfQogICAgICAgICAgbiA9IDI2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYzsKICAgICAgfSwgUC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gaS51bW9kKHRoaXMubSk7CiAgICAgICAgcmV0dXJuIGEgPT09IGkgPyBhLmNsb25lKCkgOiBhOwogICAgICB9LCBQLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICB2YXIgYSA9IGkuY2xvbmUoKTsKICAgICAgICByZXR1cm4gYS5yZWQgPSBudWxsLCBhOwogICAgICB9LCBmLm1vbnQgPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTZShpKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gU2UodikgewogICAgICAgIFAuY2FsbCh0aGlzLCB2KSwgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKSwgdGhpcy5zaGlmdCAlIDI2ICE9PSAwICYmICh0aGlzLnNoaWZ0ICs9IDI2IC0gdGhpcy5zaGlmdCAlIDI2KSwgdGhpcy5yID0gbmV3IGYoMSkuaXVzaGxuKHRoaXMuc2hpZnQpLCB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSksIHRoaXMucmludiA9IHRoaXMuci5faW52bXAodGhpcy5tKSwgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLm1pbnYudW1vZCh0aGlzLnIpLCB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7CiAgICAgIH0KICAgICAgbyhTZSwgUCksIFNlLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW1vZChpLnVzaGxuKHRoaXMuc2hpZnQpKTsKICAgICAgfSwgU2UucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oaSkgewogICAgICAgIHZhciBhID0gdGhpcy5pbW9kKGkubXVsKHRoaXMucmludikpOwogICAgICAgIHJldHVybiBhLnJlZCA9IG51bGwsIGE7CiAgICAgIH0sIFNlLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChpLmlzWmVybygpIHx8IGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gaS53b3Jkc1swXSA9IDAsIGkubGVuZ3RoID0gMSwgaTsKICAgICAgICB2YXIgaDIgPSBpLmltdWwoYSksIHMgPSBoMi5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIHUgPSBoMi5pc3ViKHMpLml1c2hybih0aGlzLnNoaWZ0KSwgYyA9IHU7CiAgICAgICAgcmV0dXJuIHUuY21wKHRoaXMubSkgPj0gMCA/IGMgPSB1LmlzdWIodGhpcy5tKSA6IHUuY21wbigwKSA8IDAgJiYgKGMgPSB1LmlhZGQodGhpcy5tKSksIGMuX2ZvcmNlUmVkKHRoaXMpOwogICAgICB9LCBTZS5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oaSwgYSkgewogICAgICAgIGlmIChpLmlzWmVybygpIHx8IGEuaXNaZXJvKCkpCiAgICAgICAgICByZXR1cm4gbmV3IGYoMCkuX2ZvcmNlUmVkKHRoaXMpOwogICAgICAgIHZhciBoMiA9IGkubXVsKGEpLCBzID0gaDIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLCB1ID0gaDIuaXN1YihzKS5pdXNocm4odGhpcy5zaGlmdCksIGMgPSB1OwogICAgICAgIHJldHVybiB1LmNtcCh0aGlzLm0pID49IDAgPyBjID0gdS5pc3ViKHRoaXMubSkgOiB1LmNtcG4oMCkgPCAwICYmIChjID0gdS5pYWRkKHRoaXMubSkpLCBjLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfSwgU2UucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbihpKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmltb2QoaS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpOwogICAgICAgIHJldHVybiBhLl9mb3JjZVJlZCh0aGlzKTsKICAgICAgfTsKICAgIH0pKHR5cGVvZiBTZCA+ICJ1IiB8fCBTZCwgRjMpOwogIH0pOwogIEVkID0gVDIoKHhMLCB6MykgPT4gewogICAgdmFyIFUzID0gdzAoKSwgd3EgPSBUZSgpLkJ1ZmZlcjsKICAgIGZ1bmN0aW9uIE1xKHQsIGUpIHsKICAgICAgcmV0dXJuIHdxLmZyb20odC50b1JlZChVMy5tb250KGUubW9kdWx1cykpLnJlZFBvdyhuZXcgVTMoZS5wdWJsaWNFeHBvbmVudCkpLmZyb21SZWQoKS50b0FycmF5KCkpOwogICAgfQogICAgejMuZXhwb3J0cyA9IE1xOwogIH0pOwogIGozID0gVDIoKFNMLCBLMykgPT4gewogICAgdmFyIF9xID0gSGEoKSwgQWQgPSBvbigpLCB4cSA9IGJmKCksIEgzID0gX2QoKSwgVzMgPSB4ZCgpLCBSZCA9IHcwKCksIFNxID0gRWQoKSwgRXEgPSBLcygpLCBLciA9IFRlKCkuQnVmZmVyOwogICAgSzMuZXhwb3J0cyA9IGZ1bmN0aW9uKGUsIHIsIG8pIHsKICAgICAgdmFyIGY7CiAgICAgIGUucGFkZGluZyA/IGYgPSBlLnBhZGRpbmcgOiBvID8gZiA9IDEgOiBmID0gNDsKICAgICAgdmFyIHAgPSBfcShlKSwgbTI7CiAgICAgIGlmIChmID09PSA0KQogICAgICAgIG0yID0gQXEocCwgcik7CiAgICAgIGVsc2UgaWYgKGYgPT09IDEpCiAgICAgICAgbTIgPSBScShwLCByLCBvKTsKICAgICAgZWxzZSBpZiAoZiA9PT0gMykgewogICAgICAgIGlmIChtMiA9IG5ldyBSZChyKSwgbTIuY21wKHAubW9kdWx1cykgPj0gMCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZGF0YSB0b28gbG9uZyBmb3IgbW9kdWx1cyIpOwogICAgICB9IGVsc2UKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gcGFkZGluZyIpOwogICAgICByZXR1cm4gbyA/IEVxKG0yLCBwKSA6IFNxKG0yLCBwKTsKICAgIH07CiAgICBmdW5jdGlvbiBBcSh0LCBlKSB7CiAgICAgIHZhciByID0gdC5tb2R1bHVzLmJ5dGVMZW5ndGgoKSwgbyA9IGUubGVuZ3RoLCBmID0geHEoInNoYTEiKS51cGRhdGUoS3IuYWxsb2MoMCkpLmRpZ2VzdCgpLCBwID0gZi5sZW5ndGgsIG0yID0gMiAqIHA7CiAgICAgIGlmIChvID4gciAtIG0yIC0gMikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1lc3NhZ2UgdG9vIGxvbmciKTsKICAgICAgdmFyIHkzID0gS3IuYWxsb2MociAtIG8gLSBtMiAtIDIpLCBNID0gciAtIHAgLSAxLCB4ID0gQWQocCksIFMgPSBXMyhLci5jb25jYXQoW2YsIHkzLCBLci5hbGxvYygxLCAxKSwgZV0sIE0pLCBIMyh4LCBNKSksIEUyID0gVzMoeCwgSDMoUywgcCkpOwogICAgICByZXR1cm4gbmV3IFJkKEtyLmNvbmNhdChbS3IuYWxsb2MoMSksIEUyLCBTXSwgcikpOwogICAgfQogICAgZnVuY3Rpb24gUnEodCwgZSwgcikgewogICAgICB2YXIgbyA9IGUubGVuZ3RoLCBmID0gdC5tb2R1bHVzLmJ5dGVMZW5ndGgoKTsKICAgICAgaWYgKG8gPiBmIC0gMTEpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtZXNzYWdlIHRvbyBsb25nIik7CiAgICAgIHZhciBwOwogICAgICByZXR1cm4gciA/IHAgPSBLci5hbGxvYyhmIC0gbyAtIDMsIDI1NSkgOiBwID0gQnEoZiAtIG8gLSAzKSwgbmV3IFJkKEtyLmNvbmNhdChbS3IuZnJvbShbMCwgciA/IDEgOiAyXSksIHAsIEtyLmFsbG9jKDEpLCBlXSwgZikpOwogICAgfQogICAgZnVuY3Rpb24gQnEodCkgewogICAgICBmb3IgKHZhciBlID0gS3IuYWxsb2NVbnNhZmUodCksIHIgPSAwLCBvID0gQWQodCAqIDIpLCBmID0gMCwgcDtyIDwgdDsgKQogICAgICAgIGYgPT09IG8ubGVuZ3RoICYmIChvID0gQWQodCAqIDIpLCBmID0gMCksIHAgPSBvW2YrK10sIHAgJiYgKGVbcisrXSA9IHApOwogICAgICByZXR1cm4gZTsKICAgIH0KICB9KTsKICBZMyA9IFQyKChFTCwgRzMpID0+IHsKICAgIHZhciBxcSA9IEhhKCksIFozID0gX2QoKSwgVjMgPSB4ZCgpLCAkMyA9IHcwKCksIElxID0gS3MoKSwgVHEgPSBiZigpLCBrcSA9IEVkKCksIFphID0gVGUoKS5CdWZmZXI7CiAgICBHMy5leHBvcnRzID0gZnVuY3Rpb24oZSwgciwgbykgewogICAgICB2YXIgZjsKICAgICAgZS5wYWRkaW5nID8gZiA9IGUucGFkZGluZyA6IG8gPyBmID0gMSA6IGYgPSA0OwogICAgICB2YXIgcCA9IHFxKGUpLCBtMiA9IHAubW9kdWx1cy5ieXRlTGVuZ3RoKCk7CiAgICAgIGlmIChyLmxlbmd0aCA+IG0yIHx8IG5ldyAkMyhyKS5jbXAocC5tb2R1bHVzKSA+PSAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpOwogICAgICB2YXIgeTM7CiAgICAgIG8gPyB5MyA9IGtxKG5ldyAkMyhyKSwgcCkgOiB5MyA9IElxKHIsIHApOwogICAgICB2YXIgTSA9IFphLmFsbG9jKG0yIC0geTMubGVuZ3RoKTsKICAgICAgaWYgKHkzID0gWmEuY29uY2F0KFtNLCB5M10sIG0yKSwgZiA9PT0gNCkKICAgICAgICByZXR1cm4gTHEocCwgeTMpOwogICAgICBpZiAoZiA9PT0gMSkKICAgICAgICByZXR1cm4gTnEocCwgeTMsIG8pOwogICAgICBpZiAoZiA9PT0gMykKICAgICAgICByZXR1cm4geTM7CiAgICAgIHRocm93IG5ldyBFcnJvcigidW5rbm93biBwYWRkaW5nIik7CiAgICB9OwogICAgZnVuY3Rpb24gTHEodCwgZSkgewogICAgICB2YXIgciA9IHQubW9kdWx1cy5ieXRlTGVuZ3RoKCksIG8gPSBUcSgic2hhMSIpLnVwZGF0ZShaYS5hbGxvYygwKSkuZGlnZXN0KCksIGYgPSBvLmxlbmd0aDsKICAgICAgaWYgKGVbMF0gIT09IDApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkZWNyeXB0aW9uIGVycm9yIik7CiAgICAgIHZhciBwID0gZS5zbGljZSgxLCBmICsgMSksIG0yID0gZS5zbGljZShmICsgMSksIHkzID0gVjMocCwgWjMobTIsIGYpKSwgTSA9IFYzKG0yLCBaMyh5MywgciAtIGYgLSAxKSk7CiAgICAgIGlmIChEcShvLCBNLnNsaWNlKDAsIGYpKSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTsKICAgICAgZm9yICh2YXIgeCA9IGY7TVt4XSA9PT0gMDsgKQogICAgICAgIHgrKzsKICAgICAgaWYgKE1beCsrXSAhPT0gMSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTsKICAgICAgcmV0dXJuIE0uc2xpY2UoeCk7CiAgICB9CiAgICBmdW5jdGlvbiBOcSh0LCBlLCByKSB7CiAgICAgIGZvciAodmFyIG8gPSBlLnNsaWNlKDAsIDIpLCBmID0gMiwgcCA9IDA7ZVtmKytdICE9PSAwOyApCiAgICAgICAgaWYgKGYgPj0gZS5sZW5ndGgpIHsKICAgICAgICAgIHArKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgdmFyIG0yID0gZS5zbGljZSgyLCBmIC0gMSk7CiAgICAgIGlmICgoby50b1N0cmluZygiaGV4IikgIT09ICIwMDAyIiAmJiAhciB8fCBvLnRvU3RyaW5nKCJoZXgiKSAhPT0gIjAwMDEiICYmIHIpICYmIHArKywgbTIubGVuZ3RoIDwgOCAmJiBwKyssIHApCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkZWNyeXB0aW9uIGVycm9yIik7CiAgICAgIHJldHVybiBlLnNsaWNlKGYpOwogICAgfQogICAgZnVuY3Rpb24gRHEodCwgZSkgewogICAgICB0ID0gWmEuZnJvbSh0KSwgZSA9IFphLmZyb20oZSk7CiAgICAgIHZhciByID0gMCwgbyA9IHQubGVuZ3RoOwogICAgICB0Lmxlbmd0aCAhPT0gZS5sZW5ndGggJiYgKHIrKywgbyA9IE1hdGgubWluKHQubGVuZ3RoLCBlLmxlbmd0aCkpOwogICAgICBmb3IgKHZhciBmID0gLTE7KytmIDwgbzsgKQogICAgICAgIHIgKz0gdFtmXSBeIGVbZl07CiAgICAgIHJldHVybiByOwogICAgfQogIH0pOwogIFgzID0gVDIoKFZuKSA9PiB7CiAgICBWbi5wdWJsaWNFbmNyeXB0ID0gajMoKTsKICAgIFZuLnByaXZhdGVEZWNyeXB0ID0gWTMoKTsKICAgIFZuLnByaXZhdGVFbmNyeXB0ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gVm4ucHVibGljRW5jcnlwdChlLCByLCB0cnVlKTsKICAgIH07CiAgICBWbi5wdWJsaWNEZWNyeXB0ID0gZnVuY3Rpb24oZSwgcikgewogICAgICByZXR1cm4gVm4ucHJpdmF0ZURlY3J5cHQoZSwgciwgdHJ1ZSk7CiAgICB9OwogIH0pOwogIG93ID0gVDIoKFZhKSA9PiB7CiAgICBmdW5jdGlvbiBKMygpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyCnVzZSBjaHJvbWUsIEZpcmVGb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTFgKTsKICAgIH0KICAgIHZhciBldyA9IFRlKCksIFEzID0gb24oKSwgdHcgPSBldy5CdWZmZXIsIHJ3ID0gZXcua01heExlbmd0aCwgQmQgPSBnbG9iYWwuY3J5cHRvIHx8IGdsb2JhbC5tc0NyeXB0bywgaXcgPSBNYXRoLnBvdygyLCAzMikgLSAxOwogICAgZnVuY3Rpb24gbncodCwgZSkgewogICAgICBpZiAodHlwZW9mIHQgIT0gIm51bWJlciIgfHwgdCAhPT0gdCkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJvZmZzZXQgbXVzdCBiZSBhIG51bWJlciIpOwogICAgICBpZiAodCA+IGl3IHx8IHQgPCAwKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm9mZnNldCBtdXN0IGJlIGEgdWludDMyIik7CiAgICAgIGlmICh0ID4gcncgfHwgdCA+IGUpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBvdXQgb2YgcmFuZ2UiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZ3KHQsIGUsIHIpIHsKICAgICAgaWYgKHR5cGVvZiB0ICE9ICJudW1iZXIiIHx8IHQgIT09IHQpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBtdXN0IGJlIGEgbnVtYmVyIik7CiAgICAgIGlmICh0ID4gaXcgfHwgdCA8IDApCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBtdXN0IGJlIGEgdWludDMyIik7CiAgICAgIGlmICh0ICsgZSA+IHIgfHwgdCA+IHJ3KQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJidWZmZXIgdG9vIHNtYWxsIik7CiAgICB9CiAgICBCZCAmJiBCZC5nZXRSYW5kb21WYWx1ZXMgPyAoVmEucmFuZG9tRmlsbCA9IFBxLCBWYS5yYW5kb21GaWxsU3luYyA9IENxKSA6IChWYS5yYW5kb21GaWxsID0gSjMsIFZhLnJhbmRvbUZpbGxTeW5jID0gSjMpOwogICAgZnVuY3Rpb24gUHEodCwgZSwgciwgbykgewogICAgICBpZiAoIXR3LmlzQnVmZmVyKHQpICYmICEodCBpbnN0YW5jZW9mIGdsb2JhbC5VaW50OEFycmF5KSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTsKICAgICAgaWYgKHR5cGVvZiBlID09ICJmdW5jdGlvbiIpCiAgICAgICAgbyA9IGUsIGUgPSAwLCByID0gdC5sZW5ndGg7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiByID09ICJmdW5jdGlvbiIpCiAgICAgICAgbyA9IHIsIHIgPSB0Lmxlbmd0aCAtIGU7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBvICE9ICJmdW5jdGlvbiIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImNiIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTsKICAgICAgcmV0dXJuIG53KGUsIHQubGVuZ3RoKSwgZncociwgZSwgdC5sZW5ndGgpLCBhdyh0LCBlLCByLCBvKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF3KHQsIGUsIHIsIG8pIHsKICAgICAgaWYgKHRydWUpIHsKICAgICAgICB2YXIgZiA9IHQuYnVmZmVyLCBwID0gbmV3IFVpbnQ4QXJyYXkoZiwgZSwgcik7CiAgICAgICAgaWYgKEJkLmdldFJhbmRvbVZhbHVlcyhwKSwgbykgewogICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgbyhudWxsLCB0KTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgICBpZiAobykgewogICAgICAgIFEzKHIsIGZ1bmN0aW9uKHkzLCBNKSB7CiAgICAgICAgICBpZiAoeTMpCiAgICAgICAgICAgIHJldHVybiBvKHkzKTsKICAgICAgICAgIE0uY29weSh0LCBlKSwgbyhudWxsLCB0KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG0yID0gUTMocik7CiAgICAgIHJldHVybiBtMi5jb3B5KHQsIGUpLCB0OwogICAgfQogICAgZnVuY3Rpb24gQ3EodCwgZSwgcikgewogICAgICBpZiAodHlwZW9mIGUgPiAidSIgJiYgKGUgPSAwKSwgIXR3LmlzQnVmZmVyKHQpICYmICEodCBpbnN0YW5jZW9mIGdsb2JhbC5VaW50OEFycmF5KSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTsKICAgICAgcmV0dXJuIG53KGUsIHQubGVuZ3RoKSwgciA9PT0gdW5kZWZpbmVkICYmIChyID0gdC5sZW5ndGggLSBlKSwgZncociwgZSwgdC5sZW5ndGgpLCBhdyh0LCBlLCByKTsKICAgIH0KICB9KTsKICBxZCA9IFQyKChrZSkgPT4gewogICAga2UucmFuZG9tQnl0ZXMgPSBrZS5ybmcgPSBrZS5wc2V1ZG9SYW5kb21CeXRlcyA9IGtlLnBybmcgPSBvbigpOwogICAga2UuY3JlYXRlSGFzaCA9IGtlLkhhc2ggPSBiZigpOwogICAga2UuY3JlYXRlSG1hYyA9IGtlLkhtYWMgPSB3dSgpOwogICAgdmFyIE9xID0gRWIoKSwgRnEgPSBPYmplY3Qua2V5cyhPcSksIFVxID0gWyJzaGExIiwgInNoYTIyNCIsICJzaGEyNTYiLCAic2hhMzg0IiwgInNoYTUxMiIsICJtZDUiLCAicm1kMTYwIl0uY29uY2F0KEZxKTsKICAgIGtlLmdldEhhc2hlcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gVXE7CiAgICB9OwogICAgdmFyIHN3ID0gSXUoKTsKICAgIGtlLnBia2RmMiA9IHN3LnBia2RmMjsKICAgIGtlLnBia2RmMlN5bmMgPSBzdy5wYmtkZjJTeW5jOwogICAgdmFyIHVpID0gVm0oKTsKICAgIGtlLkNpcGhlciA9IHVpLkNpcGhlcjsKICAgIGtlLmNyZWF0ZUNpcGhlciA9IHVpLmNyZWF0ZUNpcGhlcjsKICAgIGtlLkNpcGhlcml2ID0gdWkuQ2lwaGVyaXY7CiAgICBrZS5jcmVhdGVDaXBoZXJpdiA9IHVpLmNyZWF0ZUNpcGhlcml2OwogICAga2UuRGVjaXBoZXIgPSB1aS5EZWNpcGhlcjsKICAgIGtlLmNyZWF0ZURlY2lwaGVyID0gdWkuY3JlYXRlRGVjaXBoZXI7CiAgICBrZS5EZWNpcGhlcml2ID0gdWkuRGVjaXBoZXJpdjsKICAgIGtlLmNyZWF0ZURlY2lwaGVyaXYgPSB1aS5jcmVhdGVEZWNpcGhlcml2OwogICAga2UuZ2V0Q2lwaGVycyA9IHVpLmdldENpcGhlcnM7CiAgICBrZS5saXN0Q2lwaGVycyA9IHVpLmxpc3RDaXBoZXJzOwogICAgdmFyICRhID0gaGcoKTsKICAgIGtlLkRpZmZpZUhlbGxtYW5Hcm91cCA9ICRhLkRpZmZpZUhlbGxtYW5Hcm91cDsKICAgIGtlLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cCA9ICRhLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cDsKICAgIGtlLmdldERpZmZpZUhlbGxtYW4gPSAkYS5nZXREaWZmaWVIZWxsbWFuOwogICAga2UuY3JlYXRlRGlmZmllSGVsbG1hbiA9ICRhLmNyZWF0ZURpZmZpZUhlbGxtYW47CiAgICBrZS5EaWZmaWVIZWxsbWFuID0gJGEuRGlmZmllSGVsbG1hbjsKICAgIHZhciBNMCA9IGszKCk7CiAgICBrZS5jcmVhdGVTaWduID0gTTAuY3JlYXRlU2lnbjsKICAgIGtlLlNpZ24gPSBNMC5TaWduOwogICAga2UuY3JlYXRlVmVyaWZ5ID0gTTAuY3JlYXRlVmVyaWZ5OwogICAga2UuVmVyaWZ5ID0gTTAuVmVyaWZ5OwogICAga2UuY3JlYXRlRUNESCA9IFAzKCk7CiAgICB2YXIgXzAgPSBYMygpOwogICAga2UucHVibGljRW5jcnlwdCA9IF8wLnB1YmxpY0VuY3J5cHQ7CiAgICBrZS5wcml2YXRlRW5jcnlwdCA9IF8wLnByaXZhdGVFbmNyeXB0OwogICAga2UucHVibGljRGVjcnlwdCA9IF8wLnB1YmxpY0RlY3J5cHQ7CiAgICBrZS5wcml2YXRlRGVjcnlwdCA9IF8wLnByaXZhdGVEZWNyeXB0OwogICAgdmFyIGh3ID0gb3coKTsKICAgIGtlLnJhbmRvbUZpbGwgPSBody5yYW5kb21GaWxsOwogICAga2UucmFuZG9tRmlsbFN5bmMgPSBody5yYW5kb21GaWxsU3luYzsKICAgIGtlLmNyZWF0ZUNyZWRlbnRpYWxzID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihbInNvcnJ5LCBjcmVhdGVDcmVkZW50aWFscyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IiwgIndlIGFjY2VwdCBwdWxsIHJlcXVlc3RzIiwgImh0dHBzOi8vZ2l0aHViLmNvbS9jcnlwdG8tYnJvd3NlcmlmeS9jcnlwdG8tYnJvd3NlcmlmeSJdLmpvaW4oYApgKSk7CiAgICB9OwogICAga2UuY29uc3RhbnRzID0geyBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FOiAyLCBESF9DSEVDS19QX05PVF9QUklNRTogMSwgREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUjogNCwgREhfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjogOCwgTlBOX0VOQUJMRUQ6IDEsIEFMUE5fRU5BQkxFRDogMSwgUlNBX1BLQ1MxX1BBRERJTkc6IDEsIFJTQV9TU0xWMjNfUEFERElORzogMiwgUlNBX05PX1BBRERJTkc6IDMsIFJTQV9QS0NTMV9PQUVQX1BBRERJTkc6IDQsIFJTQV9YOTMxX1BBRERJTkc6IDUsIFJTQV9QS0NTMV9QU1NfUEFERElORzogNiwgUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEOiAyLCBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDogNCwgUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQ6IDYgfTsKICB9KTsKICBYdCA9IHt9OwogIEphKFh0LCB7IERFRkFVTFRfRU5DT0RJTkc6ICgpID0+IEdhLCBkZWZhdWx0OiAoKSA9PiBXcSwgZ2V0Q3VydmVzOiAoKSA9PiBkdywgZ2V0UmFuZG9tVmFsdWVzOiAoKSA9PiB1dywgcmFuZG9tVVVJRDogKCkgPT4gbHcsIHNjcnlwdDogKCkgPT4gVGQsIHNjcnlwdFN5bmM6ICgpID0+IElkLCB0aW1pbmdTYWZlRXF1YWw6ICgpID0+IHgwLCB3ZWJjcnlwdG86ICgpID0+IGN3IH0pOwogIG90KFh0LCBybihxZCgpKSk7CiAgenEgPSBybihxZCgpKTsKICBHYSA9ICJidWZmZXIiOwogIHV3ID0gKHQpID0+IGNyeXB0by5nZXRSYW5kb21WYWx1ZXModCk7CiAgbHcgPSAoKSA9PiBjcnlwdG8ucmFuZG9tVVVJRCgpOwogIEhxID0gWyJwMTkyIiwgInAyMjQiLCAicDI1NiIsICJwMzg0IiwgInA1MjEiLCAiY3VydmUyNTUxOSIsICJlZDI1NTE5IiwgInNlY3AyNTZrMSIsICJzZWNwMjI0cjEiLCAicHJpbWUyNTZ2MSIsICJwcmltZTE5MnYxIiwgImVkMjU1MTkiLCAic2VjcDM4NHIxIiwgInNlY3A1MjFyMSJdOwogIHgwID0gInRpbWluZ1NhZmVFcXVhbCIgaW4gY3J5cHRvID8gKHQsIGUpID0+IHsKICAgIGxldCB7IGJ5dGVMZW5ndGg6IHIgfSA9IHQsIHsgYnl0ZUxlbmd0aDogbyB9ID0gZTsKICAgIGlmICh0eXBlb2YgciAhPSAibnVtYmVyIiB8fCB0eXBlb2YgbyAhPSAibnVtYmVyIikKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5wdXQgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldyIpOwogICAgaWYgKHIgIT09IG8pCiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBidWZmZXJzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKTsKICAgIHJldHVybiBjcnlwdG8udGltaW5nU2FmZUVxdWFsKHQsIGUpOwogIH0gOiB1bmRlZmluZWQ7CiAgSWQgPSAic2NyeXB0U3luYyIgaW4gY3J5cHRvID8gKHQsIGUsIHIsIG8pID0+IHsKICAgIGxldCBmID0gY3J5cHRvLnNjcnlwdFN5bmModCwgZSwgciwgbyk7CiAgICByZXR1cm4gR2EgIT09ICJidWZmZXIiID8gbmV3IEJ1ZmZlcihmKS50b1N0cmluZyhHYSkgOiBuZXcgQnVmZmVyKGYpOwogIH0gOiB1bmRlZmluZWQ7CiAgVGQgPSAic2NyeXB0U3luYyIgaW4gY3J5cHRvID8gZnVuY3Rpb24odCwgZSwgciwgbywgZikgewogICAgaWYgKHR5cGVvZiBvID09ICJmdW5jdGlvbiIgJiYgKGYgPSBvLCBvID0gdW5kZWZpbmVkKSwgdHlwZW9mIGYgIT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgcCA9IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiIpOwogICAgICB0aHJvdyBwLmNvZGUgPSAiRVJSX0lOVkFMSURfQ0FMTEJBQ0siLCBwOwogICAgfQogICAgdHJ5IHsKICAgICAgbGV0IG0yID0gY3J5cHRvLnNjcnlwdFN5bmModCwgZSwgciwgbyk7CiAgICAgIHByb2Nlc3MubmV4dFRpY2soZiwgbnVsbCwgR2EgIT09ICJidWZmZXIiID8gbmV3IEJ1ZmZlcihtMikudG9TdHJpbmcoR2EpIDogbmV3IEJ1ZmZlcihtMikpOwogICAgfSBjYXRjaCAobTIpIHsKICAgICAgdGhyb3cgbTI7CiAgICB9CiAgfSA6IHVuZGVmaW5lZDsKICB4MCAmJiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KHgwLCAibmFtZSIsIHsgdmFsdWU6ICI6OmJ1bnRlcm5hbDo6IiB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRkLCAibmFtZSIsIHsgdmFsdWU6ICI6OmJ1bnRlcm5hbDo6IiB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KElkLCAibmFtZSIsIHsgdmFsdWU6ICI6OmJ1bnRlcm5hbDo6IiB9KSk7CiAgY3cgPSBjcnlwdG87CiAgV3EgPSB7IC4uLnpxLCBnZXRSYW5kb21WYWx1ZXM6IHV3LCByYW5kb21VVUlEOiBsdywgdGltaW5nU2FmZUVxdWFsOiB4MCwgc2NyeXB0U3luYzogSWQsIHNjcnlwdDogVGQsIHdlYmNyeXB0bzogY3csIGdldEN1cnZlczogZHcgfTsKICAvKiEKICAgKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci4KICAgKgogICAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+CiAgICogQGxpY2Vuc2UgIE1JVAogICAqLwogIC8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovCiAgLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovCn0pOwoKLy8gc3JjL3BpcGVyLmpzCnZhciBfX2Rpcm5hbWUgPSAiL2hvbWUveHVidW50dS9iaW4vdml0cy13ZWIvc3JjIiwgX19maWxlbmFtZSA9ICIvaG9tZS94dWJ1bnR1L2Jpbi92aXRzLXdlYi9zcmMvcGlwZXIuanMiOwp2YXIgY3JlYXRlUGlwZXJQaG9uZW1pemUgPSAoKCkgPT4gewogIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7CiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAidW5kZWZpbmVkIikKICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZUFyZyA9IHt9KSB7CiAgICB2YXIgTW9kdWxlID0gbW9kdWxlQXJnOwogICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgIE1vZHVsZVsicmVhZHkiXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgIH0pOwogICAgaWYgKCFNb2R1bGUuZXhwZWN0ZWREYXRhRmlsZURvd25sb2FkcykgewogICAgICBNb2R1bGUuZXhwZWN0ZWREYXRhRmlsZURvd25sb2FkcyA9IDA7CiAgICB9CiAgICBNb2R1bGUuZXhwZWN0ZWREYXRhRmlsZURvd25sb2FkcysrOwogICAgKGZ1bmN0aW9uKCkgewogICAgICBpZiAoTW9kdWxlWyJFTlZJUk9OTUVOVF9JU19QVEhSRUFEIl0gfHwgTW9kdWxlWyIkd3ciXSkKICAgICAgICByZXR1cm47CiAgICAgIHZhciBsb2FkUGFja2FnZSA9IGZ1bmN0aW9uKG1ldGFkYXRhKSB7CiAgICAgICAgdmFyIFBBQ0tBR0VfUEFUSCA9ICIiOwogICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IikgewogICAgICAgICAgUEFDS0FHRV9QQVRIID0gd2luZG93WyJlbmNvZGVVUklDb21wb25lbnQiXSh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnRvU3RyaW5nKCkubGFzdEluZGV4T2YoIi8iKSkgKyAiLyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIFBBQ0tBR0VfUEFUSCA9IGVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5wYXRobmFtZS50b1N0cmluZygpLnN1YnN0cmluZygwLCBsb2NhdGlvbi5wYXRobmFtZS50b1N0cmluZygpLmxhc3RJbmRleE9mKCIvIikpICsgIi8iKTsKICAgICAgICB9CiAgICAgICAgdmFyIFBBQ0tBR0VfTkFNRSA9ICJwaXBlcl9waG9uZW1pemUuZGF0YSI7CiAgICAgICAgdmFyIFJFTU9URV9QQUNLQUdFX0JBU0UgPSAicGlwZXJfcGhvbmVtaXplLmRhdGEiOwogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJsb2NhdGVGaWxlUGFja2FnZSJdID09PSAiZnVuY3Rpb24iICYmICFNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgTW9kdWxlWyJsb2NhdGVGaWxlIl0gPSBNb2R1bGVbImxvY2F0ZUZpbGVQYWNrYWdlIl07CiAgICAgICAgICBlcnIoIndhcm5pbmc6IHlvdSBkZWZpbmVkIE1vZHVsZS5sb2NhdGVGaWxlUGFja2FnZSwgdGhhdCBoYXMgYmVlbiByZW5hbWVkIHRvIE1vZHVsZS5sb2NhdGVGaWxlICh1c2luZyB5b3VyIGxvY2F0ZUZpbGVQYWNrYWdlIGZvciBub3cpIik7CiAgICAgICAgfQogICAgICAgIHZhciBSRU1PVEVfUEFDS0FHRV9OQU1FID0gTW9kdWxlWyJsb2NhdGVGaWxlIl0gPyBNb2R1bGVbImxvY2F0ZUZpbGUiXShSRU1PVEVfUEFDS0FHRV9CQVNFLCAiIikgOiBSRU1PVEVfUEFDS0FHRV9CQVNFOwogICAgICAgIHZhciBSRU1PVEVfUEFDS0FHRV9TSVpFID0gbWV0YWRhdGFbInJlbW90ZV9wYWNrYWdlX3NpemUiXTsKICAgICAgICBmdW5jdGlvbiBmZXRjaFJlbW90ZVBhY2thZ2UocGFja2FnZU5hbWUsIHBhY2thZ2VTaXplLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJiB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgKCgpPT4oe30pKS5yZWFkRmlsZShwYWNrYWdlTmFtZSwgZnVuY3Rpb24oZXJyMiwgY29udGVudHMpIHsKICAgICAgICAgICAgICBpZiAoZXJyMikgewogICAgICAgICAgICAgICAgZXJyYmFjayhlcnIyKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGJhY2soY29udGVudHMuYnVmZmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0OwogICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHBhY2thZ2VOYW1lLCB0cnVlKTsKICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICB2YXIgdXJsID0gcGFja2FnZU5hbWU7CiAgICAgICAgICAgIHZhciBzaXplID0gcGFja2FnZVNpemU7CiAgICAgICAgICAgIGlmIChldmVudC50b3RhbCkKICAgICAgICAgICAgICBzaXplID0gZXZlbnQudG90YWw7CiAgICAgICAgICAgIGlmIChldmVudC5sb2FkZWQpIHsKICAgICAgICAgICAgICBpZiAoIXhoci5hZGRlZFRvdGFsKSB7CiAgICAgICAgICAgICAgICB4aHIuYWRkZWRUb3RhbCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoIU1vZHVsZS5kYXRhRmlsZURvd25sb2FkcykKICAgICAgICAgICAgICAgICAgTW9kdWxlLmRhdGFGaWxlRG93bmxvYWRzID0ge307CiAgICAgICAgICAgICAgICBNb2R1bGUuZGF0YUZpbGVEb3dubG9hZHNbdXJsXSA9IHsgbG9hZGVkOiBldmVudC5sb2FkZWQsIHRvdGFsOiBzaXplIH07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE1vZHVsZS5kYXRhRmlsZURvd25sb2Fkc1t1cmxdLmxvYWRlZCA9IGV2ZW50LmxvYWRlZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHRvdGFsID0gMDsKICAgICAgICAgICAgICB2YXIgbG9hZGVkID0gMDsKICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICBmb3IgKHZhciBkb3dubG9hZCBpbiBNb2R1bGUuZGF0YUZpbGVEb3dubG9hZHMpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gTW9kdWxlLmRhdGFGaWxlRG93bmxvYWRzW2Rvd25sb2FkXTsKICAgICAgICAgICAgICAgIHRvdGFsICs9IGRhdGEudG90YWw7CiAgICAgICAgICAgICAgICBsb2FkZWQgKz0gZGF0YS5sb2FkZWQ7CiAgICAgICAgICAgICAgICBudW0rKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdG90YWwgPSBNYXRoLmNlaWwodG90YWwgKiBNb2R1bGUuZXhwZWN0ZWREYXRhRmlsZURvd25sb2FkcyAvIG51bSk7CiAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pCiAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKGBEb3dubG9hZGluZyBkYXRhLi4uICgke2xvYWRlZH0vJHt0b3RhbH0pYCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIU1vZHVsZS5kYXRhRmlsZURvd25sb2FkcykgewogICAgICAgICAgICAgIGlmIChNb2R1bGVbInNldFN0YXR1cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiRG93bmxvYWRpbmcgZGF0YS4uLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5ldHdvcmtFcnJvciBmb3I6ICIgKyBwYWNrYWdlTmFtZSk7CiAgICAgICAgICB9OwogICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHIuc3RhdHVzID09IDIwNiB8fCB4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgdmFyIHBhY2thZ2VEYXRhID0geGhyLnJlc3BvbnNlOwogICAgICAgICAgICAgIGNhbGxiYWNrKHBhY2thZ2VEYXRhKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQgKyAiIDogIiArIHhoci5yZXNwb25zZVVSTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3IpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoInBhY2thZ2UgZXJyb3I6IiwgZXJyb3IpOwogICAgICAgIH0KICAgICAgICB2YXIgZmV0Y2hlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICB2YXIgZmV0Y2hlZCA9IE1vZHVsZVsiZ2V0UHJlbG9hZGVkUGFja2FnZSJdID8gTW9kdWxlWyJnZXRQcmVsb2FkZWRQYWNrYWdlIl0oUkVNT1RFX1BBQ0tBR0VfTkFNRSwgUkVNT1RFX1BBQ0tBR0VfU0laRSkgOiBudWxsOwogICAgICAgIGlmICghZmV0Y2hlZCkKICAgICAgICAgIGZldGNoUmVtb3RlUGFja2FnZShSRU1PVEVfUEFDS0FHRV9OQU1FLCBSRU1PVEVfUEFDS0FHRV9TSVpFLCBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIGlmIChmZXRjaGVkQ2FsbGJhY2spIHsKICAgICAgICAgICAgICBmZXRjaGVkQ2FsbGJhY2soZGF0YSk7CiAgICAgICAgICAgICAgZmV0Y2hlZENhbGxiYWNrID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmZXRjaGVkID0gZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgaGFuZGxlRXJyb3IpOwogICAgICAgIGZ1bmN0aW9uIHJ1bldpdGhGUygpIHsKICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydDIoY2hlY2ssIG1zZykgewogICAgICAgICAgICBpZiAoIWNoZWNrKQogICAgICAgICAgICAgIHRocm93IG1zZyArIG5ldyBFcnJvcigpLnN0YWNrOwogICAgICAgICAgfQogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi8iLCAiZXNwZWFrLW5nLWRhdGEiLCB0cnVlLCB0cnVlKTsKICAgICAgICAgIE1vZHVsZVsiRlNfY3JlYXRlUGF0aCJdKCIvZXNwZWFrLW5nLWRhdGEiLCAibGFuZyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImFhdiIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImFydCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImF6YyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImJhdCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImJudCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImNjcyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImNlbCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImN1cyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImRyYSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImVzeCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImdtcSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImdtdyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImdyayIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImluYyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImluZSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImlyYSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImlybyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgIml0YyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgImpweCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgIm1hcCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgIm1peiIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgIm15biIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInBveiIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInJvYSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInNhaSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInNlbSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInNpdCIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInRhaSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInRyayIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInVyaiIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInpsZSIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInpscyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS9sYW5nIiwgInpsdyIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YSIsICJtYnJvbGFfcGgiLCB0cnVlLCB0cnVlKTsKICAgICAgICAgIE1vZHVsZVsiRlNfY3JlYXRlUGF0aCJdKCIvZXNwZWFrLW5nLWRhdGEiLCAidm9pY2VzIiwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICBNb2R1bGVbIkZTX2NyZWF0ZVBhdGgiXSgiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcyIsICIhdiIsIHRydWUsIHRydWUpOwogICAgICAgICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0oIi9lc3BlYWstbmctZGF0YS92b2ljZXMiLCAibWIiLCB0cnVlLCB0cnVlKTsKICAgICAgICAgIGZ1bmN0aW9uIERhdGFSZXF1ZXN0KHN0YXJ0LCBlbmQsIGF1ZGlvKSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKICAgICAgICAgICAgdGhpcy5lbmQgPSBlbmQ7CiAgICAgICAgICAgIHRoaXMuYXVkaW8gPSBhdWRpbzsKICAgICAgICAgIH0KICAgICAgICAgIERhdGFSZXF1ZXN0LnByb3RvdHlwZSA9IHsgcmVxdWVzdHM6IHt9LCBvcGVuOiBmdW5jdGlvbihtb2RlLCBuYW1lKSB7CiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgIHRoaXMucmVxdWVzdHNbbmFtZV0gPSB0aGlzOwogICAgICAgICAgICBNb2R1bGVbImFkZFJ1bkRlcGVuZGVuY3kiXShgZnAgJHt0aGlzLm5hbWV9YCk7CiAgICAgICAgICB9LCBzZW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIH0sIG9ubG9hZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBieXRlQXJyYXkgPSB0aGlzLmJ5dGVBcnJheS5zdWJhcnJheSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CiAgICAgICAgICAgIHRoaXMuZmluaXNoKGJ5dGVBcnJheSk7CiAgICAgICAgICB9LCBmaW5pc2g6IGZ1bmN0aW9uKGJ5dGVBcnJheSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIE1vZHVsZVsiRlNfY3JlYXRlRGF0YUZpbGUiXSh0aGlzLm5hbWUsIG51bGwsIGJ5dGVBcnJheSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgIE1vZHVsZVsicmVtb3ZlUnVuRGVwZW5kZW5jeSJdKGBmcCAke3RoYXQubmFtZX1gKTsKICAgICAgICAgICAgdGhpcy5yZXF1ZXN0c1t0aGlzLm5hbWVdID0gbnVsbDsKICAgICAgICAgIH0gfTsKICAgICAgICAgIHZhciBmaWxlcyA9IG1ldGFkYXRhWyJmaWxlcyJdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIG5ldyBEYXRhUmVxdWVzdChmaWxlc1tpXVsic3RhcnQiXSwgZmlsZXNbaV1bImVuZCJdLCBmaWxlc1tpXVsiYXVkaW8iXSB8fCAwKS5vcGVuKCJHRVQiLCBmaWxlc1tpXVsiZmlsZW5hbWUiXSk7CiAgICAgICAgICB9CiAgICAgICAgICBmdW5jdGlvbiBwcm9jZXNzUGFja2FnZURhdGEoYXJyYXlCdWZmZXIpIHsKICAgICAgICAgICAgYXNzZXJ0MihhcnJheUJ1ZmZlciwgIkxvYWRpbmcgZGF0YSBmaWxlIGZhaWxlZC4iKTsKICAgICAgICAgICAgYXNzZXJ0MihhcnJheUJ1ZmZlci5jb25zdHJ1Y3Rvci5uYW1lID09PSBBcnJheUJ1ZmZlci5uYW1lLCAiYmFkIGlucHV0IHRvIHByb2Nlc3NQYWNrYWdlRGF0YSIpOwogICAgICAgICAgICB2YXIgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgICAgICAgICBEYXRhUmVxdWVzdC5wcm90b3R5cGUuYnl0ZUFycmF5ID0gYnl0ZUFycmF5OwogICAgICAgICAgICB2YXIgZmlsZXMyID0gbWV0YWRhdGFbImZpbGVzIl07CiAgICAgICAgICAgIGZvciAodmFyIGkzID0gMDtpMyA8IGZpbGVzMi5sZW5ndGg7ICsraTMpIHsKICAgICAgICAgICAgICBEYXRhUmVxdWVzdC5wcm90b3R5cGUucmVxdWVzdHNbZmlsZXMyW2kzXS5maWxlbmFtZV0ub25sb2FkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJyZW1vdmVSdW5EZXBlbmRlbmN5Il0oImRhdGFmaWxlX3BpcGVyX3Bob25lbWl6ZS5kYXRhIik7CiAgICAgICAgICB9CiAgICAgICAgICBNb2R1bGVbImFkZFJ1bkRlcGVuZGVuY3kiXSgiZGF0YWZpbGVfcGlwZXJfcGhvbmVtaXplLmRhdGEiKTsKICAgICAgICAgIGlmICghTW9kdWxlLnByZWxvYWRSZXN1bHRzKQogICAgICAgICAgICBNb2R1bGUucHJlbG9hZFJlc3VsdHMgPSB7fTsKICAgICAgICAgIE1vZHVsZS5wcmVsb2FkUmVzdWx0c1tQQUNLQUdFX05BTUVdID0geyBmcm9tQ2FjaGU6IGZhbHNlIH07CiAgICAgICAgICBpZiAoZmV0Y2hlZCkgewogICAgICAgICAgICBwcm9jZXNzUGFja2FnZURhdGEoZmV0Y2hlZCk7CiAgICAgICAgICAgIGZldGNoZWQgPSBudWxsOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmV0Y2hlZENhbGxiYWNrID0gcHJvY2Vzc1BhY2thZ2VEYXRhOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoTW9kdWxlWyJjYWxsZWRSdW4iXSkgewogICAgICAgICAgcnVuV2l0aEZTKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghTW9kdWxlWyJwcmVSdW4iXSkKICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtdOwogICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXS5wdXNoKHJ1bldpdGhGUyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsb2FkUGFja2FnZSh7IGZpbGVzOiBbeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9hZl9kaWN0Iiwgc3RhcnQ6IDAsIGVuZDogMTIxNDczIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYW1fZGljdCIsIHN0YXJ0OiAxMjE0NzMsIGVuZDogMTg1MzUxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYW5fZGljdCIsIHN0YXJ0OiAxODUzNTEsIGVuZDogMTkyMDQyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYXJfZGljdCIsIHN0YXJ0OiAxOTIwNDIsIGVuZDogNjcwMjA3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYXNfZGljdCIsIHN0YXJ0OiA2NzAyMDcsIGVuZDogNjc1MjEyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYXpfZGljdCIsIHN0YXJ0OiA2NzUyMTIsIGVuZDogNzE4OTg1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYmFfZGljdCIsIHN0YXJ0OiA3MTg5ODUsIGVuZDogNzIxMDgzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYmVfZGljdCIsIHN0YXJ0OiA3MjEwODMsIGVuZDogNzIzNzM1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYmdfZGljdCIsIHN0YXJ0OiA3MjM3MzUsIGVuZDogODEwNzg2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYm5fZGljdCIsIHN0YXJ0OiA4MTA3ODYsIGVuZDogOTAwNzY1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvYnB5X2RpY3QiLCBzdGFydDogOTAwNzY1LCBlbmQ6IDkwNTk5MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2JzX2RpY3QiLCBzdGFydDogOTA1OTkxLCBlbmQ6IDk1MzA1OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2NhX2RpY3QiLCBzdGFydDogOTUzMDU5LCBlbmQ6IDk5ODYyNSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2Nocl9kaWN0Iiwgc3RhcnQ6IDk5ODYyNSwgZW5kOiAxMDAxNDg0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvY21uX2RpY3QiLCBzdGFydDogMTAwMTQ4NCwgZW5kOiAyNTY3ODE5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvY3NfZGljdCIsIHN0YXJ0OiAyNTY3ODE5LCBlbmQ6IDI2MTc0NjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9jdl9kaWN0Iiwgc3RhcnQ6IDI2MTc0NjQsIGVuZDogMjYxODgwOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2N5X2RpY3QiLCBzdGFydDogMjYxODgwOCwgZW5kOiAyNjYxOTM4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvZGFfZGljdCIsIHN0YXJ0OiAyNjYxOTM4LCBlbmQ6IDI5MDcyMjUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9kZV9kaWN0Iiwgc3RhcnQ6IDI5MDcyMjUsIGVuZDogMjk3NTUwMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2VsX2RpY3QiLCBzdGFydDogMjk3NTUwMSwgZW5kOiAzMDQ4MzQyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvZW5fZGljdCIsIHN0YXJ0OiAzMDQ4MzQyLCBlbmQ6IDMyMTUyODYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9lb19kaWN0Iiwgc3RhcnQ6IDMyMTUyODYsIGVuZDogMzIxOTk1MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2VzX2RpY3QiLCBzdGFydDogMzIxOTk1MiwgZW5kOiAzMjY5MjA0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvZXRfZGljdCIsIHN0YXJ0OiAzMjY5MjA0LCBlbmQ6IDMzMTM0NjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9ldV9kaWN0Iiwgc3RhcnQ6IDMzMTM0NjcsIGVuZDogMzM2MjMwOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2ZhX2RpY3QiLCBzdGFydDogMzM2MjMwOCwgZW5kOiAzNjU1NTQzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvZmlfZGljdCIsIHN0YXJ0OiAzNjU1NTQzLCBlbmQ6IDM2OTk0NzEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9mcl9kaWN0Iiwgc3RhcnQ6IDM2OTk0NzEsIGVuZDogMzc2MzE5OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2dhX2RpY3QiLCBzdGFydDogMzc2MzE5OCwgZW5kOiAzODE1ODcxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvZ2RfZGljdCIsIHN0YXJ0OiAzODE1ODcxLCBlbmQ6IDM4NjQ5OTIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9nbl9kaWN0Iiwgc3RhcnQ6IDM4NjQ5OTIsIGVuZDogMzg2ODI0MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2dyY19kaWN0Iiwgc3RhcnQ6IDM4NjgyNDAsIGVuZDogMzg3MTY3MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2d1X2RpY3QiLCBzdGFydDogMzg3MTY3MywgZW5kOiAzOTU0MTUzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaGFrX2RpY3QiLCBzdGFydDogMzk1NDE1MywgZW5kOiAzOTU3NDg4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaGF3X2RpY3QiLCBzdGFydDogMzk1NzQ4OCwgZW5kOiAzOTU5OTMxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaGVfZGljdCIsIHN0YXJ0OiAzOTU5OTMxLCBlbmQ6IDM5NjY4OTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9oaV9kaWN0Iiwgc3RhcnQ6IDM5NjY4OTQsIGVuZDogNDA1OTAzNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2hyX2RpY3QiLCBzdGFydDogNDA1OTAzNywgZW5kOiA0MTA4NDI1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaHRfZGljdCIsIHN0YXJ0OiA0MTA4NDI1LCBlbmQ6IDQxMTAyMjggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9odV9kaWN0Iiwgc3RhcnQ6IDQxMTAyMjgsIGVuZDogNDI2NDAxMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2h5X2RpY3QiLCBzdGFydDogNDI2NDAxMywgZW5kOiA0MzI2Mjc2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaWFfZGljdCIsIHN0YXJ0OiA0MzI2Mjc2LCBlbmQ6IDQ2NTc1NTEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9pZF9kaWN0Iiwgc3RhcnQ6IDQ2NTc1NTEsIGVuZDogNDcwMTAwOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2ludG9uYXRpb25zIiwgc3RhcnQ6IDQ3MDEwMDksIGVuZDogNDcwMzA0OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2lvX2RpY3QiLCBzdGFydDogNDcwMzA0OSwgZW5kOiA0NzA1MjE0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvaXNfZGljdCIsIHN0YXJ0OiA0NzA1MjE0LCBlbmQ6IDQ3NDk1NjggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9pdF9kaWN0Iiwgc3RhcnQ6IDQ3NDk1NjgsIGVuZDogNDkwMjQ1NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2phX2RpY3QiLCBzdGFydDogNDkwMjQ1NywgZW5kOiA0OTUwMTA5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvamJvX2RpY3QiLCBzdGFydDogNDk1MDEwOSwgZW5kOiA0OTUyMzUyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEva2FfZGljdCIsIHN0YXJ0OiA0OTUyMzUyLCBlbmQ6IDUwNDAxMjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9ra19kaWN0Iiwgc3RhcnQ6IDUwNDAxMjcsIGVuZDogNTA0MTk4NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2tsX2RpY3QiLCBzdGFydDogNTA0MTk4NiwgZW5kOiA1MDQ0ODI0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEva25fZGljdCIsIHN0YXJ0OiA1MDQ0ODI0LCBlbmQ6IDUxMzI2NTIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9rb19kaWN0Iiwgc3RhcnQ6IDUxMzI2NTIsIGVuZDogNTE4MDE3NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2tva19kaWN0Iiwgc3RhcnQ6IDUxODAxNzUsIGVuZDogNTE4NjU2OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2t1X2RpY3QiLCBzdGFydDogNTE4NjU2OSwgZW5kOiA1MTg4ODM0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEva3lfZGljdCIsIHN0YXJ0OiA1MTg4ODM0LCBlbmQ6IDUyNTM4MTEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYV9kaWN0Iiwgc3RhcnQ6IDUyNTM4MTEsIGVuZDogNTI1NzYxNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYWF2L3ZpIiwgc3RhcnQ6IDUyNTc2MTcsIGVuZDogNTI1NzcyOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYWF2L3ZpLVZOLXgtY2VudHJhbCIsIHN0YXJ0OiA1MjU3NzI4LCBlbmQ6IDUyNTc4NzEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2Fhdi92aS1WTi14LXNvdXRoIiwgc3RhcnQ6IDUyNTc4NzEsIGVuZDogNTI1ODAxMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYXJ0L2VvIiwgc3RhcnQ6IDUyNTgwMTMsIGVuZDogNTI1ODA1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYXJ0L2lhIiwgc3RhcnQ6IDUyNTgwNTQsIGVuZDogNTI1ODA4MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYXJ0L2lvIiwgc3RhcnQ6IDUyNTgwODMsIGVuZDogNTI1ODEzMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYXJ0L2pibyIsIHN0YXJ0OiA1MjU4MTMzLCBlbmQ6IDUyNTgyMDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2FydC9sZm4iLCBzdGFydDogNTI1ODIwMiwgZW5kOiA1MjU4MzM3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9hcnQvcGlxZCIsIHN0YXJ0OiA1MjU4MzM3LCBlbmQ6IDUyNTgzOTMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2FydC9weSIsIHN0YXJ0OiA1MjU4MzkzLCBlbmQ6IDUyNTg1MzMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2FydC9xZGIiLCBzdGFydDogNTI1ODUzMywgZW5kOiA1MjU4NTkwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9hcnQvcXlhIiwgc3RhcnQ6IDUyNTg1OTAsIGVuZDogNTI1ODc2MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYXJ0L3NqbiIsIHN0YXJ0OiA1MjU4NzYzLCBlbmQ6IDUyNTg5MzggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2F6Yy9uY2kiLCBzdGFydDogNTI1ODkzOCwgZW5kOiA1MjU5MDUyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9iYXQvbHQiLCBzdGFydDogNTI1OTA1MiwgZW5kOiA1MjU5MDgwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9iYXQvbHRnIiwgc3RhcnQ6IDUyNTkwODAsIGVuZDogNTI1OTM5MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYmF0L2x2Iiwgc3RhcnQ6IDUyNTkzOTIsIGVuZDogNTI1OTYyMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYm50L3N3Iiwgc3RhcnQ6IDUyNTk2MjEsIGVuZDogNTI1OTY2MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvYm50L3RuIiwgc3RhcnQ6IDUyNTk2NjIsIGVuZDogNTI1OTcwNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvY2NzL2thIiwgc3RhcnQ6IDUyNTk3MDQsIGVuZDogNTI1OTgyOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvY2VsL2N5Iiwgc3RhcnQ6IDUyNTk4MjgsIGVuZDogNTI1OTg2NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvY2VsL2dhIiwgc3RhcnQ6IDUyNTk4NjUsIGVuZDogNTI1OTkzMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvY2VsL2dkIiwgc3RhcnQ6IDUyNTk5MzEsIGVuZDogNTI1OTk4MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvY3VzL29tIiwgc3RhcnQ6IDUyNTk5ODIsIGVuZDogNTI2MDAyMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZHJhL2tuIiwgc3RhcnQ6IDUyNjAwMjEsIGVuZDogNTI2MDA3NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZHJhL21sIiwgc3RhcnQ6IDUyNjAwNzYsIGVuZDogNTI2MDEzMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZHJhL3RhIiwgc3RhcnQ6IDUyNjAxMzMsIGVuZDogNTI2MDE4NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZHJhL3RlIiwgc3RhcnQ6IDUyNjAxODQsIGVuZDogNTI2MDI1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZXN4L2tsIiwgc3RhcnQ6IDUyNjAyNTQsIGVuZDogNTI2MDI4NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZXUiLCBzdGFydDogNTI2MDI4NCwgZW5kOiA1MjYwMzM4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXEvZGEiLCBzdGFydDogNTI2MDMzOCwgZW5kOiA1MjYwMzgxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXEvaXMiLCBzdGFydDogNTI2MDM4MSwgZW5kOiA1MjYwNDA4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXEvbmIiLCBzdGFydDogNTI2MDQwOCwgZW5kOiA1MjYwNDk1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXEvc3YiLCBzdGFydDogNTI2MDQ5NSwgZW5kOiA1MjYwNTIwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvYWYiLCBzdGFydDogNTI2MDUyMCwgZW5kOiA1MjYwNjQzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvZGUiLCBzdGFydDogNTI2MDY0MywgZW5kOiA1MjYwNjg1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvZW4iLCBzdGFydDogNTI2MDY4NSwgZW5kOiA1MjYwODI1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvZW4tMDI5Iiwgc3RhcnQ6IDUyNjA4MjUsIGVuZDogNTI2MTE2MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L2VuLUdCLXNjb3RsYW5kIiwgc3RhcnQ6IDUyNjExNjAsIGVuZDogNTI2MTQ1NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L2VuLUdCLXgtZ2JjbGFuIiwgc3RhcnQ6IDUyNjE0NTUsIGVuZDogNTI2MTY5MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L2VuLUdCLXgtZ2Jjd21kIiwgc3RhcnQ6IDUyNjE2OTMsIGVuZDogNTI2MTg4MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L2VuLUdCLXgtcnAiLCBzdGFydDogNTI2MTg4MSwgZW5kOiA1MjYyMTMwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvZW4tVVMiLCBzdGFydDogNTI2MjEzMCwgZW5kOiA1MjYyMzg3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9nbXcvZW4tVVMtbnljIiwgc3RhcnQ6IDUyNjIzODcsIGVuZDogNTI2MjY1OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L2xiIiwgc3RhcnQ6IDUyNjI2NTgsIGVuZDogNTI2MjY4OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ213L25sIiwgc3RhcnQ6IDUyNjI2ODksIGVuZDogNTI2MjcxMiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ3JrL2VsIiwgc3RhcnQ6IDUyNjI3MTIsIGVuZDogNTI2MjczNSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvZ3JrL2dyYyIsIHN0YXJ0OiA1MjYyNzM1LCBlbmQ6IDUyNjI4MzQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2luYy9hcyIsIHN0YXJ0OiA1MjYyODM0LCBlbmQ6IDUyNjI4NzYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2luYy9ibiIsIHN0YXJ0OiA1MjYyODc2LCBlbmQ6IDUyNjI5MDEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2luYy9icHkiLCBzdGFydDogNTI2MjkwMSwgZW5kOiA1MjYyOTQwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9pbmMvZ3UiLCBzdGFydDogNTI2Mjk0MCwgZW5kOiA1MjYyOTgyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9pbmMvaGkiLCBzdGFydDogNTI2Mjk4MiwgZW5kOiA1MjYzMDA1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9pbmMva29rIiwgc3RhcnQ6IDUyNjMwMDUsIGVuZDogNTI2MzAzMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL21yIiwgc3RhcnQ6IDUyNjMwMzEsIGVuZDogNTI2MzA3MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL25lIiwgc3RhcnQ6IDUyNjMwNzIsIGVuZDogNTI2MzEwOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL29yIiwgc3RhcnQ6IDUyNjMxMDksIGVuZDogNTI2MzE0OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL3BhIiwgc3RhcnQ6IDUyNjMxNDgsIGVuZDogNTI2MzE3MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL3NkIiwgc3RhcnQ6IDUyNjMxNzMsIGVuZDogNTI2MzIzOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL3NpIiwgc3RhcnQ6IDUyNjMyMzksIGVuZDogNTI2MzI5NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5jL3VyIiwgc3RhcnQ6IDUyNjMyOTQsIGVuZDogNTI2MzM4OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5lL2h5Iiwgc3RhcnQ6IDUyNjMzODgsIGVuZDogNTI2MzQ0OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaW5lL2h5dyIsIHN0YXJ0OiA1MjYzNDQ5LCBlbmQ6IDUyNjM4MTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2luZS9zcSIsIHN0YXJ0OiA1MjYzODE0LCBlbmQ6IDUyNjM5MTcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2lyYS9mYSIsIHN0YXJ0OiA1MjYzOTE3LCBlbmQ6IDUyNjQwMDcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2lyYS9mYS1MYXRuIiwgc3RhcnQ6IDUyNjQwMDcsIGVuZDogNTI2NDI3NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaXJhL2t1Iiwgc3RhcnQ6IDUyNjQyNzYsIGVuZDogNTI2NDMxNiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvaXJvL2NociIsIHN0YXJ0OiA1MjY0MzE2LCBlbmQ6IDUyNjQ4ODUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2l0Yy9sYSIsIHN0YXJ0OiA1MjY0ODg1LCBlbmQ6IDUyNjUxODIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2pweC9qYSIsIHN0YXJ0OiA1MjY1MTgyLCBlbmQ6IDUyNjUyMzQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL2tvIiwgc3RhcnQ6IDUyNjUyMzQsIGVuZDogNTI2NTI4NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvbWFwL2hhdyIsIHN0YXJ0OiA1MjY1Mjg1LCBlbmQ6IDUyNjUzMjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL21pei9tdG8iLCBzdGFydDogNTI2NTMyNywgZW5kOiA1MjY1NTEwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9teW4vcXVjIiwgc3RhcnQ6IDUyNjU1MTAsIGVuZDogNTI2NTcyMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcG96L2lkIiwgc3RhcnQ6IDUyNjU3MjAsIGVuZDogNTI2NTg1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcG96L21pIiwgc3RhcnQ6IDUyNjU4NTQsIGVuZDogNTI2NjIyMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcG96L21zIiwgc3RhcnQ6IDUyNjYyMjEsIGVuZDogNTI2NjY1MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcXUiLCBzdGFydDogNTI2NjY1MSwgZW5kOiA1MjY2NzM5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9yb2EvYW4iLCBzdGFydDogNTI2NjczOSwgZW5kOiA1MjY2NzY2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9yb2EvY2EiLCBzdGFydDogNTI2Njc2NiwgZW5kOiA1MjY2NzkxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9yb2EvZXMiLCBzdGFydDogNTI2Njc5MSwgZW5kOiA1MjY2ODU0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9yb2EvZXMtNDE5Iiwgc3RhcnQ6IDUyNjY4NTQsIGVuZDogNTI2NzAyMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL2ZyIiwgc3RhcnQ6IDUyNjcwMjEsIGVuZDogNTI2NzEwMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL2ZyLUJFIiwgc3RhcnQ6IDUyNjcxMDAsIGVuZDogNTI2NzE4NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL2ZyLUNIIiwgc3RhcnQ6IDUyNjcxODQsIGVuZDogNTI2NzI3MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL2h0Iiwgc3RhcnQ6IDUyNjcyNzAsIGVuZDogNTI2NzQxMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL2l0Iiwgc3RhcnQ6IDUyNjc0MTAsIGVuZDogNTI2NzUxOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvcm9hL3BhcCIsIHN0YXJ0OiA1MjY3NTE5LCBlbmQ6IDUyNjc1ODEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3JvYS9wdCIsIHN0YXJ0OiA1MjY3NTgxLCBlbmQ6IDUyNjc2NzYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3JvYS9wdC1CUiIsIHN0YXJ0OiA1MjY3Njc2LCBlbmQ6IDUyNjc3ODUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3JvYS9ybyIsIHN0YXJ0OiA1MjY3Nzg1LCBlbmQ6IDUyNjc4MTEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NhaS9nbiIsIHN0YXJ0OiA1MjY3ODExLCBlbmQ6IDUyNjc4NTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NlbS9hbSIsIHN0YXJ0OiA1MjY3ODU4LCBlbmQ6IDUyNjc4OTkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NlbS9hciIsIHN0YXJ0OiA1MjY3ODk5LCBlbmQ6IDUyNjc5NDkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NlbS9oZSIsIHN0YXJ0OiA1MjY3OTQ5LCBlbmQ6IDUyNjc5ODkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NlbS9tdCIsIHN0YXJ0OiA1MjY3OTg5LCBlbmQ6IDUyNjgwMzAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NpdC9jbW4iLCBzdGFydDogNTI2ODAzMCwgZW5kOiA1MjY4NzE2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9zaXQvY21uLUxhdG4tcGlueWluIiwgc3RhcnQ6IDUyNjg3MTYsIGVuZDogNTI2ODg3NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvc2l0L2hhayIsIHN0YXJ0OiA1MjY4ODc3LCBlbmQ6IDUyNjkwMDUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NpdC9teSIsIHN0YXJ0OiA1MjY5MDA1LCBlbmQ6IDUyNjkwNjEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3NpdC95dWUiLCBzdGFydDogNTI2OTA2MSwgZW5kOiA1MjY5MjU1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy9zaXQveXVlLUxhdG4tanl1dHBpbmciLCBzdGFydDogNTI2OTI1NSwgZW5kOiA1MjY5NDY4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy90YWkvc2huIiwgc3RhcnQ6IDUyNjk0NjgsIGVuZDogNTI2OTU2MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdGFpL3RoIiwgc3RhcnQ6IDUyNjk1NjAsIGVuZDogNTI2OTU5NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL2F6Iiwgc3RhcnQ6IDUyNjk1OTcsIGVuZDogNTI2OTY0MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL2JhIiwgc3RhcnQ6IDUyNjk2NDIsIGVuZDogNTI2OTY2NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL2N2Iiwgc3RhcnQ6IDUyNjk2NjcsIGVuZDogNTI2OTcwNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL2trIiwgc3RhcnQ6IDUyNjk3MDcsIGVuZDogNTI2OTc0NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL2t5Iiwgc3RhcnQ6IDUyNjk3NDcsIGVuZDogNTI2OTc5MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2xhbmcvdHJrL25vZyIsIHN0YXJ0OiA1MjY5NzkwLCBlbmQ6IDUyNjk4MjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Ryay90ayIsIHN0YXJ0OiA1MjY5ODI5LCBlbmQ6IDUyNjk4NTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Ryay90ciIsIHN0YXJ0OiA1MjY5ODU0LCBlbmQ6IDUyNjk4NzkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Ryay90dCIsIHN0YXJ0OiA1MjY5ODc5LCBlbmQ6IDUyNjk5MDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Ryay91ZyIsIHN0YXJ0OiA1MjY5OTAyLCBlbmQ6IDUyNjk5MjYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Ryay91eiIsIHN0YXJ0OiA1MjY5OTI2LCBlbmQ6IDUyNjk5NjUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Vyai9ldCIsIHN0YXJ0OiA1MjY5OTY1LCBlbmQ6IDUyNzAyMDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Vyai9maSIsIHN0YXJ0OiA1MjcwMjAyLCBlbmQ6IDUyNzA0MzkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Vyai9odSIsIHN0YXJ0OiA1MjcwNDM5LCBlbmQ6IDUyNzA1MTIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sYW5nL3Vyai9zbWoiLCBzdGFydDogNTI3MDUxMiwgZW5kOiA1MjcwNTU3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bGUvYmUiLCBzdGFydDogNTI3MDU1NywgZW5kOiA1MjcwNjA5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bGUvcnUiLCBzdGFydDogNTI3MDYwOSwgZW5kOiA1MjcwNjY2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bGUvcnUtTFYiLCBzdGFydDogNTI3MDY2NiwgZW5kOiA1MjcwOTQ2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bGUvcnUtY2wiLCBzdGFydDogNTI3MDk0NiwgZW5kOiA1MjcxMDM3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bGUvdWsiLCBzdGFydDogNTI3MTAzNywgZW5kOiA1MjcxMTM0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvYmciLCBzdGFydDogNTI3MTEzNCwgZW5kOiA1MjcxMjQ1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvYnMiLCBzdGFydDogNTI3MTI0NSwgZW5kOiA1MjcxNDc1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvaHIiLCBzdGFydDogNTI3MTQ3NSwgZW5kOiA1MjcxNzM3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvbWsiLCBzdGFydDogNTI3MTczNywgZW5kOiA1MjcxNzY1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvc2wiLCBzdGFydDogNTI3MTc2NSwgZW5kOiA1MjcxODA4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHMvc3IiLCBzdGFydDogNTI3MTgwOCwgZW5kOiA1MjcyMDU4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHcvY3MiLCBzdGFydDogNTI3MjA1OCwgZW5kOiA1MjcyMDgxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHcvcGwiLCBzdGFydDogNTI3MjA4MSwgZW5kOiA1MjcyMTE5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGFuZy96bHcvc2siLCBzdGFydDogNTI3MjExOSwgZW5kOiA1MjcyMTQzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbGJfZGljdCIsIHN0YXJ0OiA1MjcyMTQzLCBlbmQ6IDU5NjAwNzQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sZm5fZGljdCIsIHN0YXJ0OiA1OTYwMDc0LCBlbmQ6IDU5NjI4NjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9sdF9kaWN0Iiwgc3RhcnQ6IDU5NjI4NjcsIGVuZDogNjAxMjc1NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL2x2X2RpY3QiLCBzdGFydDogNjAxMjc1NywgZW5kOiA2MDc5MDk0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2FmMV9waHRyYW5zIiwgc3RhcnQ6IDYwNzkwOTQsIGVuZDogNjA4MDczMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9hcjFfcGh0cmFucyIsIHN0YXJ0OiA2MDgwNzMwLCBlbmQ6IDYwODIzNDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvYXIyX3BodHJhbnMiLCBzdGFydDogNjA4MjM0MiwgZW5kOiA2MDgzOTU0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2NhX3BodHJhbnMiLCBzdGFydDogNjA4Mzk1NCwgZW5kOiA2MDg1OTUwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2Ntbl9waHRyYW5zIiwgc3RhcnQ6IDYwODU5NTAsIGVuZDogNjA4NzQ0MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9jcjFfcGh0cmFucyIsIHN0YXJ0OiA2MDg3NDQyLCBlbmQ6IDYwODk2MDYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvY3NfcGh0cmFucyIsIHN0YXJ0OiA2MDg5NjA2LCBlbmQ6IDYwOTAxODYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvZGUyX3BodHJhbnMiLCBzdGFydDogNjA5MDE4NiwgZW5kOiA2MDkxOTE4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2RlNF9waHRyYW5zIiwgc3RhcnQ6IDYwOTE5MTgsIGVuZDogNjA5MzcyMiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9kZTZfcGh0cmFucyIsIHN0YXJ0OiA2MDkzNzIyLCBlbmQ6IDYwOTUxMTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvZGU4X3BodHJhbnMiLCBzdGFydDogNjA5NTExOCwgZW5kOiA2MDk2Mjc0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2VlMV9waHRyYW5zIiwgc3RhcnQ6IDYwOTYyNzQsIGVuZDogNjA5NzcxOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9lbjFfcGh0cmFucyIsIHN0YXJ0OiA2MDk3NzE4LCBlbmQ6IDYwOTg1MTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvZXMzX3BodHJhbnMiLCBzdGFydDogNjA5ODUxNCwgZW5kOiA2MDk5NTc0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2VzNF9waHRyYW5zIiwgc3RhcnQ6IDYwOTk1NzQsIGVuZDogNjEwMDY4MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9lc19waHRyYW5zIiwgc3RhcnQ6IDYxMDA2ODIsIGVuZDogNjEwMjQxNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9mcl9waHRyYW5zIiwgc3RhcnQ6IDYxMDI0MTQsIGVuZDogNjEwNDM4NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9ncjFfcGh0cmFucyIsIHN0YXJ0OiA2MTA0Mzg2LCBlbmQ6IDYxMDY1OTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvZ3IyX3BodHJhbnMiLCBzdGFydDogNjEwNjU5OCwgZW5kOiA2MTA4ODEwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2dyYy1kZTZfcGh0cmFucyIsIHN0YXJ0OiA2MTA4ODEwLCBlbmQ6IDYxMDkyOTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvaGVfcGh0cmFucyIsIHN0YXJ0OiA2MTA5Mjk0LCBlbmQ6IDYxMTAwNDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvaG4xX3BodHJhbnMiLCBzdGFydDogNjExMDA0MiwgZW5kOiA2MTEwNTc0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2h1MV9waHRyYW5zIiwgc3RhcnQ6IDYxMTA1NzQsIGVuZDogNjExMjAxOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9pYzFfcGh0cmFucyIsIHN0YXJ0OiA2MTEyMDE4LCBlbmQ6IDYxMTMxNTAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvaWQxX3BodHJhbnMiLCBzdGFydDogNjExMzE1MCwgZW5kOiA2MTE0ODU4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2luX3BodHJhbnMiLCBzdGFydDogNjExNDg1OCwgZW5kOiA2MTE2MzAyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2lyMV9waHRyYW5zIiwgc3RhcnQ6IDYxMTYzMDIsIGVuZDogNjEyMjExNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9pdDFfcGh0cmFucyIsIHN0YXJ0OiA2MTIyMTE0LCBlbmQ6IDYxMjM0MzggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvaXQzX3BodHJhbnMiLCBzdGFydDogNjEyMzQzOCwgZW5kOiA2MTI0MzMwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2pwX3BodHJhbnMiLCBzdGFydDogNjEyNDMzMCwgZW5kOiA2MTI1MzY2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL2xhMV9waHRyYW5zIiwgc3RhcnQ6IDYxMjUzNjYsIGVuZDogNjEyNjExNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9sdF9waHRyYW5zIiwgc3RhcnQ6IDYxMjYxMTQsIGVuZDogNjEyNzE3NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9tYTFfcGh0cmFucyIsIHN0YXJ0OiA2MTI3MTc0LCBlbmQ6IDYxMjgxMTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvbXgxX3BodHJhbnMiLCBzdGFydDogNjEyODExNCwgZW5kOiA2MTI5OTE4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL214Ml9waHRyYW5zIiwgc3RhcnQ6IDYxMjk5MTgsIGVuZDogNjEzMTc0NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9ubF9waHRyYW5zIiwgc3RhcnQ6IDYxMzE3NDYsIGVuZDogNjEzMzQzMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9uejFfcGh0cmFucyIsIHN0YXJ0OiA2MTMzNDMwLCBlbmQ6IDYxMzQxNTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvcGwxX3BodHJhbnMiLCBzdGFydDogNjEzNDE1NCwgZW5kOiA2MTM1NzQyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL3B0MV9waHRyYW5zIiwgc3RhcnQ6IDYxMzU3NDIsIGVuZDogNjEzNzgzNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9wdGJyNF9waHRyYW5zIiwgc3RhcnQ6IDYxMzc4MzQsIGVuZDogNjE0MDE5MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9wdGJyX3BodHJhbnMiLCBzdGFydDogNjE0MDE5MCwgZW5kOiA2MTQyNzE0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL3JvMV9waHRyYW5zIiwgc3RhcnQ6IDYxNDI3MTQsIGVuZDogNjE0NDg3OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC9zdjJfcGh0cmFucyIsIHN0YXJ0OiA2MTQ0ODc4LCBlbmQ6IDYxNDY0NjYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvc3ZfcGh0cmFucyIsIHN0YXJ0OiA2MTQ2NDY2LCBlbmQ6IDYxNDgwNTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvdGwxX3BodHJhbnMiLCBzdGFydDogNjE0ODA1NCwgZW5kOiA2MTQ4ODI2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWJyb2xhX3BoL3RyMV9waHRyYW5zIiwgc3RhcnQ6IDYxNDg4MjYsIGVuZDogNjE0OTE5MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21icm9sYV9waC91czNfcGh0cmFucyIsIHN0YXJ0OiA2MTQ5MTkwLCBlbmQ6IDYxNTAzNDYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvdXNfcGh0cmFucyIsIHN0YXJ0OiA2MTUwMzQ2LCBlbmQ6IDYxNTE1NzQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tYnJvbGFfcGgvdnpfcGh0cmFucyIsIHN0YXJ0OiA2MTUxNTc0LCBlbmQ6IDYxNTM4NTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9taV9kaWN0Iiwgc3RhcnQ6IDYxNTM4NTgsIGVuZDogNjE1NTIwNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21rX2RpY3QiLCBzdGFydDogNjE1NTIwNCwgZW5kOiA2MjE5MDYzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbWxfZGljdCIsIHN0YXJ0OiA2MjE5MDYzLCBlbmQ6IDYzMTE0MDggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tcl9kaWN0Iiwgc3RhcnQ6IDYzMTE0MDgsIGVuZDogNjM5ODc5OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL21zX2RpY3QiLCBzdGFydDogNjM5ODc5OSwgZW5kOiA2NDUyMzQwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbXRfZGljdCIsIHN0YXJ0OiA2NDUyMzQwLCBlbmQ6IDY0NTY3MjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9tdG9fZGljdCIsIHN0YXJ0OiA2NDU2NzI0LCBlbmQ6IDY0NjA2ODQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9teV9kaWN0Iiwgc3RhcnQ6IDY0NjA2ODQsIGVuZDogNjU1NjYzMiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL25jaV9kaWN0Iiwgc3RhcnQ6IDY1NTY2MzIsIGVuZDogNjU1ODE2NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL25lX2RpY3QiLCBzdGFydDogNjU1ODE2NiwgZW5kOiA2NjUzNTQzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvbmxfZGljdCIsIHN0YXJ0OiA2NjUzNTQzLCBlbmQ6IDY3MTk1MjIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9ub19kaWN0Iiwgc3RhcnQ6IDY3MTk1MjIsIGVuZDogNjcyMzcwMCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL25vZ19kaWN0Iiwgc3RhcnQ6IDY3MjM3MDAsIGVuZDogNjcyNjk5NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL29tX2RpY3QiLCBzdGFydDogNjcyNjk5NCwgZW5kOiA2NzI5Mjk2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvb3JfZGljdCIsIHN0YXJ0OiA2NzI5Mjk2LCBlbmQ6IDY4MTg1NDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9wYV9kaWN0Iiwgc3RhcnQ6IDY4MTg1NDIsIGVuZDogNjg5ODQ5NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3BhcF9kaWN0Iiwgc3RhcnQ6IDY4OTg0OTUsIGVuZDogNjkwMDYyMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3Bob25kYXRhIiwgc3RhcnQ6IDY5MDA2MjMsIGVuZDogNzQ1MTA0NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3Bob25kYXRhLW1hbmlmZXN0Iiwgc3RhcnQ6IDc0NTEwNDcsIGVuZDogNzQ3Mjg2OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3Bob25pbmRleCIsIHN0YXJ0OiA3NDcyODY4LCBlbmQ6IDc1MTE5NDIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9waG9udGFiIiwgc3RhcnQ6IDc1MTE5NDIsIGVuZDogNzU2NzczOCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3BpcWRfZGljdCIsIHN0YXJ0OiA3NTY3NzM4LCBlbmQ6IDc1Njk0NDggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9wbF9kaWN0Iiwgc3RhcnQ6IDc1Njk0NDgsIGVuZDogNzY0NjE3OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3B0X2RpY3QiLCBzdGFydDogNzY0NjE3OCwgZW5kOiA3NzEzOTk1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvcHlfZGljdCIsIHN0YXJ0OiA3NzEzOTk1LCBlbmQ6IDc3MTY0MDQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9xZGJfZGljdCIsIHN0YXJ0OiA3NzE2NDA0LCBlbmQ6IDc3MTk0MzIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9xdV9kaWN0Iiwgc3RhcnQ6IDc3MTk0MzIsIGVuZDogNzcyMTM1MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3F1Y19kaWN0Iiwgc3RhcnQ6IDc3MjEzNTEsIGVuZDogNzcyMjgwMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3F5YV9kaWN0Iiwgc3RhcnQ6IDc3MjI4MDEsIGVuZDogNzcyNDc0MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3JvX2RpY3QiLCBzdGFydDogNzcyNDc0MCwgZW5kOiA3NzkzMjc4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvcnVfZGljdCIsIHN0YXJ0OiA3NzkzMjc4LCBlbmQ6IDE2MzI1NjcwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvc2RfZGljdCIsIHN0YXJ0OiAxNjMyNTY3MCwgZW5kOiAxNjM4NTU5OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3Nobl9kaWN0Iiwgc3RhcnQ6IDE2Mzg1NTk4LCBlbmQ6IDE2NDczNzcwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvc2lfZGljdCIsIHN0YXJ0OiAxNjQ3Mzc3MCwgZW5kOiAxNjU1OTE1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3Nqbl9kaWN0Iiwgc3RhcnQ6IDE2NTU5MTU0LCBlbmQ6IDE2NTYwOTM3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvc2tfZGljdCIsIHN0YXJ0OiAxNjU2MDkzNywgZW5kOiAxNjYxMDkzOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3NsX2RpY3QiLCBzdGFydDogMTY2MTA5MzksIGVuZDogMTY2NTU5ODYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9zbWpfZGljdCIsIHN0YXJ0OiAxNjY1NTk4NiwgZW5kOiAxNjY5MTA4MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3NxX2RpY3QiLCBzdGFydDogMTY2OTEwODEsIGVuZDogMTY3MzYwODQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS9zcl9kaWN0Iiwgc3RhcnQ6IDE2NzM2MDg0LCBlbmQ6IDE2NzgyOTE2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvc3ZfZGljdCIsIHN0YXJ0OiAxNjc4MjkxNiwgZW5kOiAxNjgzMDc1MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3N3X2RpY3QiLCBzdGFydDogMTY4MzA3NTIsIGVuZDogMTY4Nzg1NTYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS90YV9kaWN0Iiwgc3RhcnQ6IDE2ODc4NTU2LCBlbmQ6IDE3MDg4MTA5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdGVfZGljdCIsIHN0YXJ0OiAxNzA4ODEwOSwgZW5kOiAxNzE4Mjk0NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3RoX2RpY3QiLCBzdGFydDogMTcxODI5NDYsIGVuZDogMTcxODUyNDcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS90a19kaWN0Iiwgc3RhcnQ6IDE3MTg1MjQ3LCBlbmQ6IDE3MjA2MTE1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdG5fZGljdCIsIHN0YXJ0OiAxNzIwNjExNSwgZW5kOiAxNzIwOTE4NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3RyX2RpY3QiLCBzdGFydDogMTcyMDkxODcsIGVuZDogMTcyNTU5ODAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS90dF9kaWN0Iiwgc3RhcnQ6IDE3MjU1OTgwLCBlbmQ6IDE3MjU4MTAxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdWdfZGljdCIsIHN0YXJ0OiAxNzI1ODEwMSwgZW5kOiAxNzI2MDE3MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3VrX2RpY3QiLCBzdGFydDogMTcyNjAxNzEsIGVuZDogMTcyNjM2NjMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS91cl9kaWN0Iiwgc3RhcnQ6IDE3MjYzNjYzLCBlbmQ6IDE3Mzk3MjE5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdXpfZGljdCIsIHN0YXJ0OiAxNzM5NzIxOSwgZW5kOiAxNzM5OTc1OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZpX2RpY3QiLCBzdGFydDogMTczOTk3NTksIGVuZDogMTc0NTIzNjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvQWxleCIsIHN0YXJ0OiAxNzQ1MjM2NywgZW5kOiAxNzQ1MjQ5NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9BbGljaWEiLCBzdGFydDogMTc0NTI0OTUsIGVuZDogMTc0NTI5NjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvQW5kcmVhIiwgc3RhcnQ6IDE3NDUyOTY5LCBlbmQ6IDE3NDUzMzI2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L0FuZHkiLCBzdGFydDogMTc0NTMzMjYsIGVuZDogMTc0NTM2NDYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvQW5uaWUiLCBzdGFydDogMTc0NTM2NDYsIGVuZDogMTc0NTM5NjEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvQW54aW91c0FuZHkiLCBzdGFydDogMTc0NTM5NjEsIGVuZDogMTc0NTQzMjIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvRGVtb25pYyIsIHN0YXJ0OiAxNzQ1NDMyMiwgZW5kOiAxNzQ1ODE4MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9EZW5pcyIsIHN0YXJ0OiAxNzQ1ODE4MCwgZW5kOiAxNzQ1ODQ4NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9EaW9nbyIsIHN0YXJ0OiAxNzQ1ODQ4NSwgZW5kOiAxNzQ1ODg2NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9HZW5lIiwgc3RhcnQ6IDE3NDU4ODY0LCBlbmQ6IDE3NDU5MTQ1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L0dlbmUyIiwgc3RhcnQ6IDE3NDU5MTQ1LCBlbmQ6IDE3NDU5NDI4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L0hlbnJpcXVlIiwgc3RhcnQ6IDE3NDU5NDI4LCBlbmQ6IDE3NDU5ODA5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L0h1Z28iLCBzdGFydDogMTc0NTk4MDksIGVuZDogMTc0NjAxODcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvSmFja3kiLCBzdGFydDogMTc0NjAxODcsIGVuZDogMTc0NjA0NTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvTGVlIiwgc3RhcnQ6IDE3NDYwNDU0LCBlbmQ6IDE3NDYwNzkyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L01hcmNvIiwgc3RhcnQ6IDE3NDYwNzkyLCBlbmQ6IDE3NDYxMjU5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L01hcmlvIiwgc3RhcnQ6IDE3NDYxMjU5LCBlbmQ6IDE3NDYxNTI5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L01pY2hhZWwiLCBzdGFydDogMTc0NjE1MjksIGVuZDogMTc0NjE3OTkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvTWlrZSIsIHN0YXJ0OiAxNzQ2MTc5OSwgZW5kOiAxNzQ2MTkxMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9NciBzZXJpb3VzIiwgc3RhcnQ6IDE3NDYxOTExLCBlbmQ6IDE3NDY1MTA0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L05ndXllbiIsIHN0YXJ0OiAxNzQ2NTEwNCwgZW5kOiAxNzQ2NTM4NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9SZWVkIiwgc3RhcnQ6IDE3NDY1Mzg0LCBlbmQ6IDE3NDY1NTg2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L1JpY2lzaGF5TWF4Iiwgc3RhcnQ6IDE3NDY1NTg2LCBlbmQ6IDE3NDY1ODE5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L1JpY2lzaGF5TWF4MiIsIHN0YXJ0OiAxNzQ2NTgxOSwgZW5kOiAxNzQ2NjI1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9SaWNpc2hheU1heDMiLCBzdGFydDogMTc0NjYyNTQsIGVuZDogMTc0NjY2ODkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvU3Rvcm0iLCBzdGFydDogMTc0NjY2ODksIGVuZDogMTc0NjcxMDkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvVHdlYWt5Iiwgc3RhcnQ6IDE3NDY3MTA5LCBlbmQ6IDE3NDcwMjk4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L1VuaVJvYm90Iiwgc3RhcnQ6IDE3NDcwMjk4LCBlbmQ6IDE3NDcwNzE1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2FkYW0iLCBzdGFydDogMTc0NzA3MTUsIGVuZDogMTc0NzA3OTAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvYW5pa2EiLCBzdGFydDogMTc0NzA3OTAsIGVuZDogMTc0NzEyODMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvYW5pa2FSb2JvdCIsIHN0YXJ0OiAxNzQ3MTI4MywgZW5kOiAxNzQ3MTc5NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9hbm5vdW5jZXIiLCBzdGFydDogMTc0NzE3OTUsIGVuZDogMTc0NzIwOTUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvYW50b25pbyIsIHN0YXJ0OiAxNzQ3MjA5NSwgZW5kOiAxNzQ3MjQ3NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9hdW50eSIsIHN0YXJ0OiAxNzQ3MjQ3NiwgZW5kOiAxNzQ3MjgzNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9iZWxpbmRhIiwgc3RhcnQ6IDE3NDcyODM0LCBlbmQ6IDE3NDczMTc0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2JlbmphbWluIiwgc3RhcnQ6IDE3NDczMTc0LCBlbmQ6IDE3NDczMzc1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2JvcmlzIiwgc3RhcnQ6IDE3NDczMzc1LCBlbmQ6IDE3NDczNTk5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2NhbGViIiwgc3RhcnQ6IDE3NDczNTk5LCBlbmQ6IDE3NDczNjU2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2Nyb2FrIiwgc3RhcnQ6IDE3NDczNjU2LCBlbmQ6IDE3NDczNzQ5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2RhdmlkIiwgc3RhcnQ6IDE3NDczNzQ5LCBlbmQ6IDE3NDczODYxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2VkIiwgc3RhcnQ6IDE3NDczODYxLCBlbmQ6IDE3NDc0MTQ4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2Vkd2FyZCIsIHN0YXJ0OiAxNzQ3NDE0OCwgZW5kOiAxNzQ3NDI5OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9lZHdhcmQyIiwgc3RhcnQ6IDE3NDc0Mjk5LCBlbmQ6IDE3NDc0NDUxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2YxIiwgc3RhcnQ6IDE3NDc0NDUxLCBlbmQ6IDE3NDc0Nzc1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2YyIiwgc3RhcnQ6IDE3NDc0Nzc1LCBlbmQ6IDE3NDc1MTMyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2YzIiwgc3RhcnQ6IDE3NDc1MTMyLCBlbmQ6IDE3NDc1NTA3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2Y0Iiwgc3RhcnQ6IDE3NDc1NTA3LCBlbmQ6IDE3NDc1ODU3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2Y1Iiwgc3RhcnQ6IDE3NDc1ODU3LCBlbmQ6IDE3NDc2Mjg5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2Zhc3QiLCBzdGFydDogMTc0NzYyODksIGVuZDogMTc0NzY0MzggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvZ3JhbmRtYSIsIHN0YXJ0OiAxNzQ3NjQzOCwgZW5kOiAxNzQ3NjcwMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9ncmFuZHBhIiwgc3RhcnQ6IDE3NDc2NzAxLCBlbmQ6IDE3NDc2OTU3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2d1c3RhdmUiLCBzdGFydDogMTc0NzY5NTcsIGVuZDogMTc0NzcyMTAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvaWFuIiwgc3RhcnQ6IDE3NDc3MjEwLCBlbmQ6IDE3NDgwMzc4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2l2ZW4iLCBzdGFydDogMTc0ODAzNzgsIGVuZDogMTc0ODA2MzkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvaXZlbjIiLCBzdGFydDogMTc0ODA2MzksIGVuZDogMTc0ODA5MTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvaXZlbjMiLCBzdGFydDogMTc0ODA5MTgsIGVuZDogMTc0ODExODAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvaXZlbjQiLCBzdGFydDogMTc0ODExODAsIGVuZDogMTc0ODE0NDEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvam9obiIsIHN0YXJ0OiAxNzQ4MTQ0MSwgZW5kOiAxNzQ4NDYyNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9rYXVrb3ZhbHRhIiwgc3RhcnQ6IDE3NDg0NjI3LCBlbmQ6IDE3NDg0OTg4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2tsYXR0Iiwgc3RhcnQ6IDE3NDg0OTg4LCBlbmQ6IDE3NDg1MDI2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2tsYXR0MiIsIHN0YXJ0OiAxNzQ4NTAyNiwgZW5kOiAxNzQ4NTA2NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9rbGF0dDMiLCBzdGFydDogMTc0ODUwNjQsIGVuZDogMTc0ODUxMDMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYva2xhdHQ0Iiwgc3RhcnQ6IDE3NDg1MTAzLCBlbmQ6IDE3NDg1MTQyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L2tsYXR0NSIsIHN0YXJ0OiAxNzQ4NTE0MiwgZW5kOiAxNzQ4NTE4MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9rbGF0dDYiLCBzdGFydDogMTc0ODUxODEsIGVuZDogMTc0ODUyMjAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbGluZGEiLCBzdGFydDogMTc0ODUyMjAsIGVuZDogMTc0ODU1NzAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTEiLCBzdGFydDogMTc0ODU1NzAsIGVuZDogMTc0ODU5MDUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTIiLCBzdGFydDogMTc0ODU5MDUsIGVuZDogMTc0ODYxNjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTMiLCBzdGFydDogMTc0ODYxNjksIGVuZDogMTc0ODY0NjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTQiLCBzdGFydDogMTc0ODY0NjksIGVuZDogMTc0ODY3NTkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTUiLCBzdGFydDogMTc0ODY3NTksIGVuZDogMTc0ODcwMjEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTYiLCBzdGFydDogMTc0ODcwMjEsIGVuZDogMTc0ODcyMDkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTciLCBzdGFydDogMTc0ODcyMDksIGVuZDogMTc0ODc0NjMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbTgiLCBzdGFydDogMTc0ODc0NjMsIGVuZDogMTc0ODc3NDcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbWFyY2VsbyIsIHN0YXJ0OiAxNzQ4Nzc0NywgZW5kOiAxNzQ4Nzk5OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9tYXgiLCBzdGFydDogMTc0ODc5OTgsIGVuZDogMTc0ODgyMjMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvbWljaGVsIiwgc3RhcnQ6IDE3NDg4MjIzLCBlbmQ6IDE3NDg4NjI3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L21pZ3VlbCIsIHN0YXJ0OiAxNzQ4ODYyNywgZW5kOiAxNzQ4OTAwOSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9taWtlMiIsIHN0YXJ0OiAxNzQ4OTAwOSwgZW5kOiAxNzQ4OTE5NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9ub3JiZXJ0Iiwgc3RhcnQ6IDE3NDg5MTk3LCBlbmQ6IDE3NDkyMzg2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3BhYmxvIiwgc3RhcnQ6IDE3NDkyMzg2LCBlbmQ6IDE3NDk1NTI4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3BhdWwiLCBzdGFydDogMTc0OTU1MjgsIGVuZDogMTc0OTU4MTIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcGVkcm8iLCBzdGFydDogMTc0OTU4MTIsIGVuZDogMTc0OTYxNjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcXVpbmN5Iiwgc3RhcnQ6IDE3NDk2MTY0LCBlbmQ6IDE3NDk2NTE4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3JvYiIsIHN0YXJ0OiAxNzQ5NjUxOCwgZW5kOiAxNzQ5Njc4MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9yb2JlcnQiLCBzdGFydDogMTc0OTY3ODMsIGVuZDogMTc0OTcwNTcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcm9ib3NvZnQiLCBzdGFydDogMTc0OTcwNTcsIGVuZDogMTc0OTc1MDggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcm9ib3NvZnQyIiwgc3RhcnQ6IDE3NDk3NTA4LCBlbmQ6IDE3NDk3OTYyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3JvYm9zb2Z0MyIsIHN0YXJ0OiAxNzQ5Nzk2MiwgZW5kOiAxNzQ5ODQxNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9yb2Jvc29mdDQiLCBzdGFydDogMTc0OTg0MTcsIGVuZDogMTc0OTg4NjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcm9ib3NvZnQ1Iiwgc3RhcnQ6IDE3NDk4ODY0LCBlbmQ6IDE3NDk5MzA5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3JvYm9zb2Z0NiIsIHN0YXJ0OiAxNzQ5OTMwOSwgZW5kOiAxNzQ5OTU5NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9yb2Jvc29mdDciLCBzdGFydDogMTc0OTk1OTYsIGVuZDogMTc1MDAwMDYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvcm9ib3NvZnQ4Iiwgc3RhcnQ6IDE3NTAwMDA2LCBlbmQ6IDE3NTAwMjQ5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3NhbmRybyIsIHN0YXJ0OiAxNzUwMDI0OSwgZW5kOiAxNzUwMDc3OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi9zaGVsYnkiLCBzdGFydDogMTc1MDA3NzksIGVuZDogMTc1MDEwNTkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvc3RlcGgiLCBzdGFydDogMTc1MDEwNTksIGVuZDogMTc1MDE0MjMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvc3RlcGgyIiwgc3RhcnQ6IDE3NTAxNDIzLCBlbmQ6IDE3NTAxNzkwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3N0ZXBoMyIsIHN0YXJ0OiAxNzUwMTc5MCwgZW5kOiAxNzUwMjE2NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy8hdi90cmF2aXMiLCBzdGFydDogMTc1MDIxNjcsIGVuZDogMTc1MDI1NTAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvdmljdG9yIiwgc3RhcnQ6IDE3NTAyNTUwLCBlbmQ6IDE3NTAyODAzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzLyF2L3doaXNwZXIiLCBzdGFydDogMTc1MDI4MDMsIGVuZDogMTc1MDI5ODkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvd2hpc3BlcmYiLCBzdGFydDogMTc1MDI5ODksIGVuZDogMTc1MDMzODEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvIXYvemFjIiwgc3RhcnQ6IDE3NTAzMzgxLCBlbmQ6IDE3NTAzNjU2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWFmMSIsIHN0YXJ0OiAxNzUwMzY1NiwgZW5kOiAxNzUwMzc0NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1hZjEtZW4iLCBzdGFydDogMTc1MDM3NDQsIGVuZDogMTc1MDM4MjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItYXIxIiwgc3RhcnQ6IDE3NTAzODI3LCBlbmQ6IDE3NTAzOTExIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWFyMiIsIHN0YXJ0OiAxNzUwMzkxMSwgZW5kOiAxNzUwMzk5NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1icjEiLCBzdGFydDogMTc1MDM5OTUsIGVuZDogMTc1MDQxMjcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItYnIyIiwgc3RhcnQ6IDE3NTA0MTI3LCBlbmQ6IDE3NTA0MjYzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWJyMyIsIHN0YXJ0OiAxNzUwNDI2MywgZW5kOiAxNzUwNDM5NSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1icjQiLCBzdGFydDogMTc1MDQzOTUsIGVuZDogMTc1MDQ1MzEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItY2ExIiwgc3RhcnQ6IDE3NTA0NTMxLCBlbmQ6IDE3NTA0NjM2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWNhMiIsIHN0YXJ0OiAxNzUwNDYzNiwgZW5kOiAxNzUwNDc0MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1jbjEiLCBzdGFydDogMTc1MDQ3NDEsIGVuZDogMTc1MDQ4MzMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItY3IxIiwgc3RhcnQ6IDE3NTA0ODMzLCBlbmQ6IDE3NTA0OTQ0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWN6MSIsIHN0YXJ0OiAxNzUwNDk0NCwgZW5kOiAxNzUwNTAxNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1jejIiLCBzdGFydDogMTc1MDUwMTQsIGVuZDogMTc1MDUwOTYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGUxIiwgc3RhcnQ6IDE3NTA1MDk2LCBlbmQ6IDE3NTA1MjQwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWRlMS1lbiIsIHN0YXJ0OiAxNzUwNTI0MCwgZW5kOiAxNzUwNTMzNiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1kZTIiLCBzdGFydDogMTc1MDUzMzYsIGVuZDogMTc1MDU0NjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGUyLWVuIiwgc3RhcnQ6IDE3NTA1NDY0LCBlbmQ6IDE3NTA1NTQ0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWRlMyIsIHN0YXJ0OiAxNzUwNTU0NCwgZW5kOiAxNzUwNTY0MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1kZTMtZW4iLCBzdGFydDogMTc1MDU2NDMsIGVuZDogMTc1MDU3MzkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGU0Iiwgc3RhcnQ6IDE3NTA1NzM5LCBlbmQ6IDE3NTA1ODY4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWRlNC1lbiIsIHN0YXJ0OiAxNzUwNTg2OCwgZW5kOiAxNzUwNTk0OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1kZTUiLCBzdGFydDogMTc1MDU5NDksIGVuZDogMTc1MDYxODUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGU1LWVuIiwgc3RhcnQ6IDE3NTA2MTg1LCBlbmQ6IDE3NTA2Mjc1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWRlNiIsIHN0YXJ0OiAxNzUwNjI3NSwgZW5kOiAxNzUwNjM5NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1kZTYtZW4iLCBzdGFydDogMTc1MDYzOTcsIGVuZDogMTc1MDY0NzEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGU2LWdyYyIsIHN0YXJ0OiAxNzUwNjQ3MSwgZW5kOiAxNzUwNjU1NCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1kZTciLCBzdGFydDogMTc1MDY1NTQsIGVuZDogMTc1MDY3MDQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZGU4Iiwgc3RhcnQ6IDE3NTA2NzA0LCBlbmQ6IDE3NTA2Nzc1IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWVlMSIsIHN0YXJ0OiAxNzUwNjc3NSwgZW5kOiAxNzUwNjg3MiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1lbjEiLCBzdGFydDogMTc1MDY4NzIsIGVuZDogMTc1MDcwMDMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZXMxIiwgc3RhcnQ6IDE3NTA3MDAzLCBlbmQ6IDE3NTA3MTE3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWVzMiIsIHN0YXJ0OiAxNzUwNzExNywgZW5kOiAxNzUwNzIyNSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1lczMiLCBzdGFydDogMTc1MDcyMjUsIGVuZDogMTc1MDczMjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZXM0Iiwgc3RhcnQ6IDE3NTA3MzI5LCBlbmQ6IDE3NTA3NDE3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWZyMSIsIHN0YXJ0OiAxNzUwNzQxNywgZW5kOiAxNzUwNzU4MyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1mcjEtZW4iLCBzdGFydDogMTc1MDc1ODMsIGVuZDogMTc1MDc2ODcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZnIyIiwgc3RhcnQ6IDE3NTA3Njg3LCBlbmQ6IDE3NTA3NzkwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWZyMyIsIHN0YXJ0OiAxNzUwNzc5MCwgZW5kOiAxNzUwNzg5MCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1mcjQiLCBzdGFydDogMTc1MDc4OTAsIGVuZDogMTc1MDgwMTcgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZnI0LWVuIiwgc3RhcnQ6IDE3NTA4MDE3LCBlbmQ6IDE3NTA4MTI0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWZyNSIsIHN0YXJ0OiAxNzUwODEyNCwgZW5kOiAxNzUwODIyNCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1mcjYiLCBzdGFydDogMTc1MDgyMjQsIGVuZDogMTc1MDgzMjQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZnI3Iiwgc3RhcnQ6IDE3NTA4MzI0LCBlbmQ6IDE3NTA4NDA3IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWdyMSIsIHN0YXJ0OiAxNzUwODQwNywgZW5kOiAxNzUwODUwMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1ncjIiLCBzdGFydDogMTc1MDg1MDEsIGVuZDogMTc1MDg1OTUgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItZ3IyLWVuIiwgc3RhcnQ6IDE3NTA4NTk1LCBlbmQ6IDE3NTA4NjgzIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWhiMSIsIHN0YXJ0OiAxNzUwODY4MywgZW5kOiAxNzUwODc1MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1oYjIiLCBzdGFydDogMTc1MDg3NTEsIGVuZDogMTc1MDg4MzQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItaHUxIiwgc3RhcnQ6IDE3NTA4ODM0LCBlbmQ6IDE3NTA4OTM2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWh1MS1lbiIsIHN0YXJ0OiAxNzUwODkzNiwgZW5kOiAxNzUwOTAzMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1pYzEiLCBzdGFydDogMTc1MDkwMzMsIGVuZDogMTc1MDkxMjEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItaWQxIiwgc3RhcnQ6IDE3NTA5MTIxLCBlbmQ6IDE3NTA5MjIyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWluMSIsIHN0YXJ0OiAxNzUwOTIyMiwgZW5kOiAxNzUwOTI5MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1pbjIiLCBzdGFydDogMTc1MDkyOTEsIGVuZDogMTc1MDkzNzYgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItaXIxIiwgc3RhcnQ6IDE3NTA5Mzc2LCBlbmQ6IDE3NTEwMTI5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWl0MSIsIHN0YXJ0OiAxNzUxMDEyOSwgZW5kOiAxNzUxMDIxMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1pdDIiLCBzdGFydDogMTc1MTAyMTMsIGVuZDogMTc1MTAzMDAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItaXQzIiwgc3RhcnQ6IDE3NTEwMzAwLCBlbmQ6IDE3NTEwNDQyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWl0NCIsIHN0YXJ0OiAxNzUxMDQ0MiwgZW5kOiAxNzUxMDU4NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1qcDEiLCBzdGFydDogMTc1MTA1ODcsIGVuZDogMTc1MTA2NTggfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItanAyIiwgc3RhcnQ6IDE3NTEwNjU4LCBlbmQ6IDE3NTEwNzU5IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWpwMyIsIHN0YXJ0OiAxNzUxMDc1OSwgZW5kOiAxNzUxMDg0NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1sYTEiLCBzdGFydDogMTc1MTA4NDYsIGVuZDogMTc1MTA5MjkgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItbHQxIiwgc3RhcnQ6IDE3NTEwOTI5LCBlbmQ6IDE3NTExMDE2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLWx0MiIsIHN0YXJ0OiAxNzUxMTAxNiwgZW5kOiAxNzUxMTEwMyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1tYTEiLCBzdGFydDogMTc1MTExMDMsIGVuZDogMTc1MTEyMDEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItbXgxIiwgc3RhcnQ6IDE3NTExMjAxLCBlbmQ6IDE3NTExMzIxIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLW14MiIsIHN0YXJ0OiAxNzUxMTMyMSwgZW5kOiAxNzUxMTQ0MSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1ubDEiLCBzdGFydDogMTc1MTE0NDEsIGVuZDogMTc1MTE1MTAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItbmwyIiwgc3RhcnQ6IDE3NTExNTEwLCBlbmQ6IDE3NTExNjA2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLW5sMi1lbiIsIHN0YXJ0OiAxNzUxMTYwNiwgZW5kOiAxNzUxMTY5NyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1ubDMiLCBzdGFydDogMTc1MTE2OTcsIGVuZDogMTc1MTE3ODIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItbnoxIiwgc3RhcnQ6IDE3NTExNzgyLCBlbmQ6IDE3NTExODUwIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXBsMSIsIHN0YXJ0OiAxNzUxMTg1MCwgZW5kOiAxNzUxMTk0OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1wbDEtZW4iLCBzdGFydDogMTc1MTE5NDksIGVuZDogMTc1MTIwMzEgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItcHQxIiwgc3RhcnQ6IDE3NTEyMDMxLCBlbmQ6IDE3NTEyMTYyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXJvMSIsIHN0YXJ0OiAxNzUxMjE2MiwgZW5kOiAxNzUxMjI0OSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1ybzEtZW4iLCBzdGFydDogMTc1MTIyNDksIGVuZDogMTc1MTIzMzAgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItc3cxIiwgc3RhcnQ6IDE3NTEyMzMwLCBlbmQ6IDE3NTEyNDI4IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXN3MS1lbiIsIHN0YXJ0OiAxNzUxMjQyOCwgZW5kOiAxNzUxMjUyMSB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi1zdzIiLCBzdGFydDogMTc1MTI1MjEsIGVuZDogMTc1MTI2MjMgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItc3cyLWVuIiwgc3RhcnQ6IDE3NTEyNjIzLCBlbmQ6IDE3NTEyNzIyIH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXRsMSIsIHN0YXJ0OiAxNzUxMjcyMiwgZW5kOiAxNzUxMjgwNyB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi10cjEiLCBzdGFydDogMTc1MTI4MDcsIGVuZDogMTc1MTI4OTIgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItdHIyIiwgc3RhcnQ6IDE3NTEyODkyLCBlbmQ6IDE3NTEzMDA2IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXVzMSIsIHN0YXJ0OiAxNzUxMzAwNiwgZW5kOiAxNzUxMzE3NiB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3ZvaWNlcy9tYi9tYi11czIiLCBzdGFydDogMTc1MTMxNzYsIGVuZDogMTc1MTMzNTQgfSwgeyBmaWxlbmFtZTogIi9lc3BlYWstbmctZGF0YS92b2ljZXMvbWIvbWItdXMzIiwgc3RhcnQ6IDE3NTEzMzU0LCBlbmQ6IDE3NTEzNTM0IH0sIHsgZmlsZW5hbWU6ICIvZXNwZWFrLW5nLWRhdGEvdm9pY2VzL21iL21iLXZ6MSIsIHN0YXJ0OiAxNzUxMzUzNCwgZW5kOiAxNzUxMzY3OCB9LCB7IGZpbGVuYW1lOiAiL2VzcGVhay1uZy1kYXRhL3l1ZV9kaWN0Iiwgc3RhcnQ6IDE3NTEzNjc4LCBlbmQ6IDE4MDc3MjQ5IH1dLCByZW1vdGVfcGFja2FnZV9zaXplOiAxODA3NzI0OSB9KTsKICAgIH0pKCk7CiAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgTW9kdWxlKTsKICAgIHZhciBhcmd1bWVudHNfID0gW107CiAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgdmFyIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4gewogICAgICB0aHJvdyB0b1Rocm93OwogICAgfTsKICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiOwogICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09ICJmdW5jdGlvbiI7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IHR5cGVvZiBwcm9jZXNzID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09ICJvYmplY3QiICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT0gInN0cmluZyI7CiAgICB2YXIgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgaWYgKE1vZHVsZVsibG9jYXRlRmlsZSJdKSB7CiAgICAgICAgcmV0dXJuIE1vZHVsZVsibG9jYXRlRmlsZSJdKHBhdGgsIHNjcmlwdERpcmVjdG9yeSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICB9CiAgICB2YXIgcmVhZF8sIHJlYWRBc3luYywgcmVhZEJpbmFyeTsKICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgIHZhciBmcyA9ICgoKT0+KHt9KSk7CiAgICAgIHZhciBub2RlUGF0aCA9IChpbml0X3BhdGgoKSwgX190b0NvbW1vbkpTKGV4cG9ydHNfcGF0aCkpOwogICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gbm9kZVBhdGguZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgfQogICAgICByZWFkXyA9IChmaWxlbmFtZSwgYmluYXJ5KSA9PiB7CiAgICAgICAgZmlsZW5hbWUgPSBpc0ZpbGVVUkkoZmlsZW5hbWUpID8gbmV3IFVSTChmaWxlbmFtZSkgOiBub2RlUGF0aC5ub3JtYWxpemUoZmlsZW5hbWUpOwogICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIGJpbmFyeSA/IHVuZGVmaW5lZCA6ICJ1dGY4Iik7CiAgICAgIH07CiAgICAgIHJlYWRCaW5hcnkgPSAoZmlsZW5hbWUpID0+IHsKICAgICAgICB2YXIgcmV0ID0gcmVhZF8oZmlsZW5hbWUsIHRydWUpOwogICAgICAgIGlmICghcmV0LmJ1ZmZlcikgewogICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgcmVhZEFzeW5jID0gKGZpbGVuYW1lLCBvbmxvYWQsIG9uZXJyb3IsIGJpbmFyeSA9IHRydWUpID0+IHsKICAgICAgICBmaWxlbmFtZSA9IGlzRmlsZVVSSShmaWxlbmFtZSkgPyBuZXcgVVJMKGZpbGVuYW1lKSA6IG5vZGVQYXRoLm5vcm1hbGl6ZShmaWxlbmFtZSk7CiAgICAgICAgZnMucmVhZEZpbGUoZmlsZW5hbWUsIGJpbmFyeSA/IHVuZGVmaW5lZCA6ICJ1dGY4IiwgKGVycjIsIGRhdGEpID0+IHsKICAgICAgICAgIGlmIChlcnIyKQogICAgICAgICAgICBvbmVycm9yKGVycjIpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBvbmxvYWQoYmluYXJ5ID8gZGF0YS5idWZmZXIgOiBkYXRhKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgaWYgKCFNb2R1bGVbInRoaXNQcm9ncmFtIl0gJiYgcHJvY2Vzcy5hcmd2Lmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzUHJvZ3JhbSA9IHByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCAiLyIpOwogICAgICB9CiAgICAgIGFyZ3VtZW50c18gPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7CiAgICAgIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4gewogICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBzdGF0dXM7CiAgICAgICAgdGhyb3cgdG9UaHJvdzsKICAgICAgfTsKICAgICAgTW9kdWxlWyJpbnNwZWN0Il0gPSAoKSA9PiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgfSBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgfQogICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgIH0KICAgICAgaWYgKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKCJibG9iOiIpICE9PSAwKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2NyaXB0RGlyZWN0b3J5LnN1YnN0cigwLCBzY3JpcHREaXJlY3RvcnkucmVwbGFjZSgvWz8jXS4qLywgIiIpLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgfQogICAgICB7CiAgICAgICAgcmVhZF8gPSAodXJsKSA9PiB7CiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0OwogICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICB9OwogICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgIHJlYWRCaW5hcnkgPSAodXJsKSA9PiB7CiAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7CiAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJlYWRBc3luYyA9ICh1cmwsIG9ubG9hZCwgb25lcnJvcikgPT4gewogICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDsKICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgeGhyLnN0YXR1cyA9PSAwICYmIHhoci5yZXNwb25zZSkgewogICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbmVycm9yKCk7CiAgICAgICAgICB9OwogICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgfTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgIH0KICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpOwogICAgT2JqZWN0LmFzc2lnbihNb2R1bGUsIG1vZHVsZU92ZXJyaWRlcyk7CiAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgaWYgKE1vZHVsZVsiYXJndW1lbnRzIl0pCiAgICAgIGFyZ3VtZW50c18gPSBNb2R1bGVbImFyZ3VtZW50cyJdOwogICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgdGhpc1Byb2dyYW0gPSBNb2R1bGVbInRoaXNQcm9ncmFtIl07CiAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgIHF1aXRfID0gTW9kdWxlWyJxdWl0Il07CiAgICB2YXIgd2FzbUJpbmFyeTsKICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPSAib2JqZWN0IikgewogICAgICBhYm9ydCgibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCIpOwogICAgfQogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgdGV4dCkgewogICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgIGFib3J0KHRleHQpOwogICAgICB9CiAgICB9CiAgICB2YXIgSEVBUDgsIEhFQVBVOCwgSEVBUDE2LCBIRUFQVTE2LCBIRUFQMzIsIEhFQVBVMzIsIEhFQVBGMzIsIEhFQVBGNjQ7CiAgICBmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpIHsKICAgICAgdmFyIGIzID0gd2FzbU1lbW9yeS5idWZmZXI7CiAgICAgIE1vZHVsZVsiSEVBUDgiXSA9IEhFQVA4ID0gbmV3IEludDhBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBIRUFQMTYgPSBuZXcgSW50MTZBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gSEVBUFUxNiA9IG5ldyBVaW50MTZBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiMyk7CiAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYjMpOwogICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IEhFQVBGNjQgPSBuZXcgRmxvYXQ2NEFycmF5KGIzKTsKICAgIH0KICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICB2YXIgX19BVE1BSU5fXyA9IFtdOwogICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgIHZhciBydW50aW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgIGZ1bmN0aW9uIHByZVJ1bigpIHsKICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgIE1vZHVsZVsicHJlUnVuIl0gPSBbTW9kdWxlWyJwcmVSdW4iXV07CiAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgfQogICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgIHJ1bnRpbWVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIGlmICghTW9kdWxlWyJub0ZTSW5pdCJdICYmICFGUy5pbml0LmluaXRpYWxpemVkKQogICAgICAgIEZTLmluaXQoKTsKICAgICAgRlMuaWdub3JlUGVybWlzc2lvbnMgPSBmYWxzZTsKICAgICAgVFRZLmluaXQoKTsKICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICB9CiAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUTUFJTl9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICBhZGRPblBvc3RSdW4oTW9kdWxlWyJwb3N0UnVuIl0uc2hpZnQoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgfQogICAgZnVuY3Rpb24gYWRkT25QcmVSdW4oY2IpIHsKICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgfQogICAgZnVuY3Rpb24gYWRkT25Jbml0KGNiKSB7CiAgICAgIF9fQVRJTklUX18udW5zaGlmdChjYik7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPblBvc3RSdW4oY2IpIHsKICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgIH0KICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgdmFyIHJ1bkRlcGVuZGVuY3lXYXRjaGVyID0gbnVsbDsKICAgIHZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgZnVuY3Rpb24gZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeShpZCkgewogICAgICByZXR1cm4gaWQ7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICB9CiAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgIGlmIChydW5EZXBlbmRlbmN5V2F0Y2hlciAhPT0gbnVsbCkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7CiAgICAgICAgICBydW5EZXBlbmRlbmN5V2F0Y2hlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICBpZiAoTW9kdWxlWyJvbkFib3J0Il0pIHsKICAgICAgICBNb2R1bGVbIm9uQWJvcnQiXSh3aGF0KTsKICAgICAgfQogICAgICB3aGF0ID0gIkFib3J0ZWQoIiArIHdoYXQgKyAiKSI7CiAgICAgIGVycih3aGF0KTsKICAgICAgQUJPUlQgPSB0cnVlOwogICAgICBFWElUU1RBVFVTID0gMTsKICAgICAgd2hhdCArPSAiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7CiAgICAgIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTsKICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICB0aHJvdyBlOwogICAgfQogICAgdmFyIGRhdGFVUklQcmVmaXggPSAiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7CiAgICB2YXIgaXNEYXRhVVJJID0gKGZpbGVuYW1lKSA9PiBmaWxlbmFtZS5zdGFydHNXaXRoKGRhdGFVUklQcmVmaXgpOwogICAgdmFyIGlzRmlsZVVSSSA9IChmaWxlbmFtZSkgPT4gZmlsZW5hbWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpOwogICAgdmFyIHdhc21CaW5hcnlGaWxlOwogICAgd2FzbUJpbmFyeUZpbGUgPSAicGlwZXJfcGhvbmVtaXplLndhc20iOwogICAgaWYgKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHsKICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgfQogICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICB9CiAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKGJpbmFyeUZpbGUpIHsKICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKGJpbmFyeUZpbGUpKSB7CiAgICAgICAgICByZXR1cm4gZmV0Y2goYmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KS50aGVuKChyZXNwb25zZSkgPT4gewogICAgICAgICAgICBpZiAoIXJlc3BvbnNlWyJvayJdKSB7CiAgICAgICAgICAgICAgdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIgKyBiaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpOwogICAgICAgICAgfSkuY2F0Y2goKCkgPT4gZ2V0QmluYXJ5U3luYyhiaW5hcnlGaWxlKSk7CiAgICAgICAgfSBlbHNlIGlmIChyZWFkQXN5bmMpIHsKICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIHJlYWRBc3luYyhiaW5hcnlGaWxlLCAocmVzcG9uc2UpID0+IHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSwgcmVqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBnZXRCaW5hcnlTeW5jKGJpbmFyeUZpbGUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgcmVjZWl2ZXIpIHsKICAgICAgcmV0dXJuIGdldEJpbmFyeVByb21pc2UoYmluYXJ5RmlsZSkudGhlbigoYmluYXJ5KSA9PiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGltcG9ydHMpKS50aGVuKChpbnN0YW5jZSkgPT4gaW5zdGFuY2UpLnRoZW4ocmVjZWl2ZXIsIChyZWFzb24pID0+IHsKICAgICAgICBlcnIoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7cmVhc29ufWApOwogICAgICAgIGFib3J0KHJlYXNvbik7CiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYyhiaW5hcnksIGJpbmFyeUZpbGUsIGltcG9ydHMsIGNhbGxiYWNrKSB7CiAgICAgIGlmICghYmluYXJ5ICYmIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PSAiZnVuY3Rpb24iICYmICFpc0RhdGFVUkkoYmluYXJ5RmlsZSkgJiYgIWlzRmlsZVVSSShiaW5hcnlGaWxlKSAmJiAhRU5WSVJPTk1FTlRfSVNfTk9ERSAmJiB0eXBlb2YgZmV0Y2ggPT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiBmZXRjaChiaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGltcG9ydHMpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKGNhbGxiYWNrLCBmdW5jdGlvbihyZWFzb24pIHsKICAgICAgICAgICAgZXJyKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtyZWFzb259YCk7CiAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgY2FsbGJhY2spOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgdmFyIGluZm8gPSB7IGE6IHdhc21JbXBvcnRzIH07CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sidyJdOwogICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7CiAgICAgICAgYWRkT25Jbml0KHdhc21FeHBvcnRzWyJ4Il0pOwogICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTsKICAgICAgICByZXR1cm4gd2FzbUV4cG9ydHM7CiAgICAgIH0KICAgICAgYWRkUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpOwogICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdChyZXN1bHQpIHsKICAgICAgICByZWNlaXZlSW5zdGFuY2UocmVzdWx0WyJpbnN0YW5jZSJdKTsKICAgICAgfQogICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGVycihgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApOwogICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpbnN0YW50aWF0ZUFzeW5jKHdhc21CaW5hcnksIHdhc21CaW5hcnlGaWxlLCBpbmZvLCByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgcmV0dXJuIHt9OwogICAgfQogICAgdmFyIHRlbXBEb3VibGU7CiAgICB2YXIgdGVtcEk2NDsKICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgdGhpcy5tZXNzYWdlID0gYFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtzdGF0dXN9KWA7CiAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgfQogICAgdmFyIGNhbGxSdW50aW1lQ2FsbGJhY2tzID0gKGNhbGxiYWNrcykgPT4gewogICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICB2YXIgVVRGOEFycmF5VG9TdHJpbmcgPSAoaGVhcE9yQXJyYXksIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICsrZW5kUHRyOwogICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcE9yQXJyYXkuYnVmZmVyICYmIFVURjhEZWNvZGVyKSB7CiAgICAgICAgcmV0dXJuIFVURjhEZWNvZGVyLmRlY29kZShoZWFwT3JBcnJheS5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICB9CiAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgd2hpbGUgKGlkeCA8IGVuZFB0cikgewogICAgICAgIHZhciB1MDIgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAyICYgMTI4KSkgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTAyKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdTEgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwMiAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgodTAyICYgMzEpIDw8IDYgfCB1MSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUyID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MDIgJiAyNDApID09IDIyNCkgewogICAgICAgICAgdTAyID0gKHUwMiAmIDE1KSA8PCAxMiB8IHUxIDw8IDYgfCB1MjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdTAyID0gKHUwMiAmIDcpIDw8IDE4IHwgdTEgPDwgMTIgfCB1MiA8PCA2IHwgaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgfQogICAgICAgIGlmICh1MDIgPCA2NTUzNikgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNoID0gdTAyIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIFVURjhUb1N0cmluZyA9IChwdHIsIG1heEJ5dGVzVG9SZWFkKSA9PiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICB2YXIgX19fYXNzZXJ0X2ZhaWwgPSAoY29uZGl0aW9uLCBmaWxlbmFtZSwgbGluZSwgZnVuYykgPT4gewogICAgICBhYm9ydChgQXNzZXJ0aW9uIGZhaWxlZDogJHtVVEY4VG9TdHJpbmcoY29uZGl0aW9uKX0sIGF0OiBgICsgW2ZpbGVuYW1lID8gVVRGOFRvU3RyaW5nKGZpbGVuYW1lKSA6ICJ1bmtub3duIGZpbGVuYW1lIiwgbGluZSwgZnVuYyA/IFVURjhUb1N0cmluZyhmdW5jKSA6ICJ1bmtub3duIGZ1bmN0aW9uIl0pOwogICAgfTsKICAgIGZ1bmN0aW9uIEV4Y2VwdGlvbkluZm8oZXhjUHRyKSB7CiAgICAgIHRoaXMuZXhjUHRyID0gZXhjUHRyOwogICAgICB0aGlzLnB0ciA9IGV4Y1B0ciAtIDI0OwogICAgICB0aGlzLnNldF90eXBlID0gZnVuY3Rpb24odHlwZSkgewogICAgICAgIEhFQVBVMzJbdGhpcy5wdHIgKyA0ID4+IDJdID0gdHlwZTsKICAgICAgfTsKICAgICAgdGhpcy5nZXRfdHlwZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBIRUFQVTMyW3RoaXMucHRyICsgNCA+PiAyXTsKICAgICAgfTsKICAgICAgdGhpcy5zZXRfZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uKGRlc3RydWN0b3IpIHsKICAgICAgICBIRUFQVTMyW3RoaXMucHRyICsgOCA+PiAyXSA9IGRlc3RydWN0b3I7CiAgICAgIH07CiAgICAgIHRoaXMuZ2V0X2Rlc3RydWN0b3IgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gSEVBUFUzMlt0aGlzLnB0ciArIDggPj4gMl07CiAgICAgIH07CiAgICAgIHRoaXMuc2V0X2NhdWdodCA9IGZ1bmN0aW9uKGNhdWdodCkgewogICAgICAgIGNhdWdodCA9IGNhdWdodCA/IDEgOiAwOwogICAgICAgIEhFQVA4W3RoaXMucHRyICsgMTIgPj4gMF0gPSBjYXVnaHQ7CiAgICAgIH07CiAgICAgIHRoaXMuZ2V0X2NhdWdodCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBIRUFQOFt0aGlzLnB0ciArIDEyID4+IDBdICE9IDA7CiAgICAgIH07CiAgICAgIHRoaXMuc2V0X3JldGhyb3duID0gZnVuY3Rpb24ocmV0aHJvd24pIHsKICAgICAgICByZXRocm93biA9IHJldGhyb3duID8gMSA6IDA7CiAgICAgICAgSEVBUDhbdGhpcy5wdHIgKyAxMyA+PiAwXSA9IHJldGhyb3duOwogICAgICB9OwogICAgICB0aGlzLmdldF9yZXRocm93biA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBIRUFQOFt0aGlzLnB0ciArIDEzID4+IDBdICE9IDA7CiAgICAgIH07CiAgICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKHR5cGUsIGRlc3RydWN0b3IpIHsKICAgICAgICB0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCk7CiAgICAgICAgdGhpcy5zZXRfdHlwZSh0eXBlKTsKICAgICAgICB0aGlzLnNldF9kZXN0cnVjdG9yKGRlc3RydWN0b3IpOwogICAgICB9OwogICAgICB0aGlzLnNldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbihhZGp1c3RlZFB0cikgewogICAgICAgIEhFQVBVMzJbdGhpcy5wdHIgKyAxNiA+PiAyXSA9IGFkanVzdGVkUHRyOwogICAgICB9OwogICAgICB0aGlzLmdldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gSEVBUFUzMlt0aGlzLnB0ciArIDE2ID4+IDJdOwogICAgICB9OwogICAgICB0aGlzLmdldF9leGNlcHRpb25fcHRyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGlzUG9pbnRlciA9IF9fX2N4YV9pc19wb2ludGVyX3R5cGUodGhpcy5nZXRfdHlwZSgpKTsKICAgICAgICBpZiAoaXNQb2ludGVyKSB7CiAgICAgICAgICByZXR1cm4gSEVBUFUzMlt0aGlzLmV4Y1B0ciA+PiAyXTsKICAgICAgICB9CiAgICAgICAgdmFyIGFkanVzdGVkID0gdGhpcy5nZXRfYWRqdXN0ZWRfcHRyKCk7CiAgICAgICAgaWYgKGFkanVzdGVkICE9PSAwKQogICAgICAgICAgcmV0dXJuIGFkanVzdGVkOwogICAgICAgIHJldHVybiB0aGlzLmV4Y1B0cjsKICAgICAgfTsKICAgIH0KICAgIHZhciBleGNlcHRpb25MYXN0ID0gMDsKICAgIHZhciB1bmNhdWdodEV4Y2VwdGlvbkNvdW50ID0gMDsKICAgIHZhciBfX19jeGFfdGhyb3cgPSAocHRyLCB0eXBlLCBkZXN0cnVjdG9yKSA9PiB7CiAgICAgIHZhciBpbmZvID0gbmV3IEV4Y2VwdGlvbkluZm8ocHRyKTsKICAgICAgaW5mby5pbml0KHR5cGUsIGRlc3RydWN0b3IpOwogICAgICBleGNlcHRpb25MYXN0ID0gcHRyOwogICAgICB1bmNhdWdodEV4Y2VwdGlvbkNvdW50Kys7CiAgICAgIHRocm93IGV4Y2VwdGlvbkxhc3Q7CiAgICB9OwogICAgdmFyIHNldEVyck5vID0gKHZhbHVlKSA9PiB7CiAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH07CiAgICB2YXIgUEFUSCA9IHsgaXNBYnM6IChwYXRoKSA9PiBwYXRoLmNoYXJBdCgwKSA9PT0gIi8iLCBzcGxpdFBhdGg6IChmaWxlbmFtZSkgPT4gewogICAgICB2YXIgc3BsaXRQYXRoUmUgPSAvXihcLz98KShbXHNcU10qPykoKD86XC57MSwyfXxbXlwvXSs/fCkoXC5bXi5cL10qfCkpKD86W1wvXSopJC87CiAgICAgIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTsKICAgIH0sIG5vcm1hbGl6ZUFycmF5OiAocGFydHMsIGFsbG93QWJvdmVSb290KSA9PiB7CiAgICAgIHZhciB1cCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxO2kgPj0gMDsgaS0tKSB7CiAgICAgICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTsKICAgICAgICBpZiAobGFzdCA9PT0gIi4iKSB7CiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChsYXN0ID09PSAiLi4iKSB7CiAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICB1cCsrOwogICAgICAgIH0gZWxzZSBpZiAodXApIHsKICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTsKICAgICAgICAgIHVwLS07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkgewogICAgICAgIGZvciAoO3VwOyB1cC0tKSB7CiAgICAgICAgICBwYXJ0cy51bnNoaWZ0KCIuLiIpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcGFydHM7CiAgICB9LCBub3JtYWxpemU6IChwYXRoKSA9PiB7CiAgICAgIHZhciBpc0Fic29sdXRlID0gUEFUSC5pc0FicyhwYXRoKSwgdHJhaWxpbmdTbGFzaCA9IHBhdGguc3Vic3RyKC0xKSA9PT0gIi8iOwogICAgICBwYXRoID0gUEFUSC5ub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCIvIikuZmlsdGVyKChwKSA9PiAhIXApLCAhaXNBYnNvbHV0ZSkuam9pbigiLyIpOwogICAgICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHsKICAgICAgICBwYXRoID0gIi4iOwogICAgICB9CiAgICAgIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHsKICAgICAgICBwYXRoICs9ICIvIjsKICAgICAgfQogICAgICByZXR1cm4gKGlzQWJzb2x1dGUgPyAiLyIgOiAiIikgKyBwYXRoOwogICAgfSwgZGlybmFtZTogKHBhdGgpID0+IHsKICAgICAgdmFyIHJlc3VsdCA9IFBBVEguc3BsaXRQYXRoKHBhdGgpLCByb290ID0gcmVzdWx0WzBdLCBkaXIgPSByZXN1bHRbMV07CiAgICAgIGlmICghcm9vdCAmJiAhZGlyKSB7CiAgICAgICAgcmV0dXJuICIuIjsKICAgICAgfQogICAgICBpZiAoZGlyKSB7CiAgICAgICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJvb3QgKyBkaXI7CiAgICB9LCBiYXNlbmFtZTogKHBhdGgpID0+IHsKICAgICAgaWYgKHBhdGggPT09ICIvIikKICAgICAgICByZXR1cm4gIi8iOwogICAgICBwYXRoID0gUEFUSC5ub3JtYWxpemUocGF0aCk7CiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1wvJC8sICIiKTsKICAgICAgdmFyIGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpCiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIHJldHVybiBwYXRoLnN1YnN0cihsYXN0U2xhc2ggKyAxKTsKICAgIH0sIGpvaW46IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcGF0aHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICByZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aHMuam9pbigiLyIpKTsKICAgIH0sIGpvaW4yOiAobCwgcikgPT4gUEFUSC5ub3JtYWxpemUobCArICIvIiArIHIpIH07CiAgICB2YXIgaW5pdFJhbmRvbUZpbGwgPSAoKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgY3J5cHRvID09ICJvYmplY3QiICYmIHR5cGVvZiBjcnlwdG9bImdldFJhbmRvbVZhbHVlcyJdID09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gKHZpZXcpID0+IGNyeXB0by5nZXRSYW5kb21WYWx1ZXModmlldyk7CiAgICAgIH0gZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgY3J5cHRvX21vZHVsZSA9IChpbml0X2NyeXB0bygpLCBfX3RvQ29tbW9uSlMoZXhwb3J0c19jcnlwdG8pKTsKICAgICAgICAgIHZhciByYW5kb21GaWxsU3luYyA9IGNyeXB0b19tb2R1bGVbInJhbmRvbUZpbGxTeW5jIl07CiAgICAgICAgICBpZiAocmFuZG9tRmlsbFN5bmMpIHsKICAgICAgICAgICAgcmV0dXJuICh2aWV3KSA9PiBjcnlwdG9fbW9kdWxlWyJyYW5kb21GaWxsU3luYyJdKHZpZXcpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJhbmRvbUJ5dGVzID0gY3J5cHRvX21vZHVsZVsicmFuZG9tQnl0ZXMiXTsKICAgICAgICAgIHJldHVybiAodmlldykgPT4gKHZpZXcuc2V0KHJhbmRvbUJ5dGVzKHZpZXcuYnl0ZUxlbmd0aCkpLCB2aWV3KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIGFib3J0KCJpbml0UmFuZG9tRGV2aWNlIik7CiAgICB9OwogICAgdmFyIHJhbmRvbUZpbGwgPSAodmlldykgPT4gKHJhbmRvbUZpbGwgPSBpbml0UmFuZG9tRmlsbCgpKSh2aWV3KTsKICAgIHZhciBQQVRIX0ZTID0geyByZXNvbHZlOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHJlc29sdmVkUGF0aCA9ICIiLCByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7CiAgICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHsKICAgICAgICB2YXIgcGF0aCA9IGkgPj0gMCA/IGFyZ3VtZW50c1tpXSA6IEZTLmN3ZCgpOwogICAgICAgIGlmICh0eXBlb2YgcGF0aCAhPSAic3RyaW5nIikgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTsKICAgICAgICB9IGVsc2UgaWYgKCFwYXRoKSB7CiAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgfQogICAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAiLyIgKyByZXNvbHZlZFBhdGg7CiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IFBBVEguaXNBYnMocGF0aCk7CiAgICAgIH0KICAgICAgcmVzb2x2ZWRQYXRoID0gUEFUSC5ub3JtYWxpemVBcnJheShyZXNvbHZlZFBhdGguc3BsaXQoIi8iKS5maWx0ZXIoKHApID0+ICEhcCksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCIvIik7CiAgICAgIHJldHVybiAocmVzb2x2ZWRBYnNvbHV0ZSA/ICIvIiA6ICIiKSArIHJlc29sdmVkUGF0aCB8fCAiLiI7CiAgICB9LCByZWxhdGl2ZTogKGZyb20sIHRvKSA9PiB7CiAgICAgIGZyb20gPSBQQVRIX0ZTLnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpOwogICAgICB0byA9IFBBVEhfRlMucmVzb2x2ZSh0bykuc3Vic3RyKDEpOwogICAgICBmdW5jdGlvbiB0cmltKGFycikgewogICAgICAgIHZhciBzdGFydCA9IDA7CiAgICAgICAgZm9yICg7c3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7CiAgICAgICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gIiIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7CiAgICAgICAgZm9yICg7ZW5kID49IDA7IGVuZC0tKSB7CiAgICAgICAgICBpZiAoYXJyW2VuZF0gIT09ICIiKQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKQogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CiAgICAgIH0KICAgICAgdmFyIGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgiLyIpKTsKICAgICAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCIvIikpOwogICAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpOwogICAgICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7CiAgICAgICAgICBzYW1lUGFydHNMZW5ndGggPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBvdXRwdXRQYXJ0cyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoO2kgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBvdXRwdXRQYXJ0cy5wdXNoKCIuLiIpOwogICAgICB9CiAgICAgIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7CiAgICAgIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCIvIik7CiAgICB9IH07CiAgICB2YXIgRlNfc3RkaW5fZ2V0Q2hhcl9idWZmZXIgPSBbXTsKICAgIHZhciBsZW5ndGhCeXRlc1VURjggPSAoc3RyKSA9PiB7CiAgICAgIHZhciBsZW4gPSAwOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoYyA8PSAxMjcpIHsKICAgICAgICAgIGxlbisrOwogICAgICAgIH0gZWxzZSBpZiAoYyA8PSAyMDQ3KSB7CiAgICAgICAgICBsZW4gKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKGMgPj0gNTUyOTYgJiYgYyA8PSA1NzM0MykgewogICAgICAgICAgbGVuICs9IDQ7CiAgICAgICAgICArK2k7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxlbiArPSAzOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGVuOwogICAgfTsKICAgIHZhciBzdHJpbmdUb1VURjhBcnJheSA9IChzdHIsIGhlYXAsIG91dElkeCwgbWF4Qnl0ZXNUb1dyaXRlKSA9PiB7CiAgICAgIGlmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKQogICAgICAgIHJldHVybiAwOwogICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7CiAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAodSA+PSA1NTI5NiAmJiB1IDw9IDU3MzQzKSB7CiAgICAgICAgICB2YXIgdTEgPSBzdHIuY2hhckNvZGVBdCgrK2kpOwogICAgICAgICAgdSA9IDY1NTM2ICsgKCh1ICYgMTAyMykgPDwgMTApIHwgdTEgJiAxMDIzOwogICAgICAgIH0KICAgICAgICBpZiAodSA8PSAxMjcpIHsKICAgICAgICAgIGlmIChvdXRJZHggPj0gZW5kSWR4KQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gdTsKICAgICAgICB9IGVsc2UgaWYgKHUgPD0gMjA0NykgewogICAgICAgICAgaWYgKG91dElkeCArIDEgPj0gZW5kSWR4KQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTkyIHwgdSA+PiA2OwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1ICYgNjM7CiAgICAgICAgfSBlbHNlIGlmICh1IDw9IDY1NTM1KSB7CiAgICAgICAgICBpZiAob3V0SWR4ICsgMiA+PSBlbmRJZHgpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAyMjQgfCB1ID4+IDEyOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1ID4+IDYgJiA2MzsKICAgICAgICAgIGhlYXBbb3V0SWR4KytdID0gMTI4IHwgdSAmIDYzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAob3V0SWR4ICsgMyA+PSBlbmRJZHgpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAyNDAgfCB1ID4+IDE4OwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1ID4+IDEyICYgNjM7CiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDEyOCB8IHUgPj4gNiAmIDYzOwogICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAxMjggfCB1ICYgNjM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGhlYXBbb3V0SWR4XSA9IDA7CiAgICAgIHJldHVybiBvdXRJZHggLSBzdGFydElkeDsKICAgIH07CiAgICBmdW5jdGlvbiBpbnRBcnJheUZyb21TdHJpbmcoc3RyaW5neSwgZG9udEFkZE51bGwsIGxlbmd0aCkgewogICAgICB2YXIgbGVuID0gbGVuZ3RoID4gMCA/IGxlbmd0aCA6IGxlbmd0aEJ5dGVzVVRGOChzdHJpbmd5KSArIDE7CiAgICAgIHZhciB1OGFycmF5ID0gbmV3IEFycmF5KGxlbik7CiAgICAgIHZhciBudW1CeXRlc1dyaXR0ZW4gPSBzdHJpbmdUb1VURjhBcnJheShzdHJpbmd5LCB1OGFycmF5LCAwLCB1OGFycmF5Lmxlbmd0aCk7CiAgICAgIGlmIChkb250QWRkTnVsbCkKICAgICAgICB1OGFycmF5Lmxlbmd0aCA9IG51bUJ5dGVzV3JpdHRlbjsKICAgICAgcmV0dXJuIHU4YXJyYXk7CiAgICB9CiAgICB2YXIgRlNfc3RkaW5fZ2V0Q2hhciA9ICgpID0+IHsKICAgICAgaWYgKCFGU19zdGRpbl9nZXRDaGFyX2J1ZmZlci5sZW5ndGgpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgdmFyIEJVRlNJWkUgPSAyNTY7CiAgICAgICAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKEJVRlNJWkUpOwogICAgICAgICAgdmFyIGJ5dGVzUmVhZCA9IDA7CiAgICAgICAgICB2YXIgZmQgPSBwcm9jZXNzLnN0ZGluLmZkOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYnl0ZXNSZWFkID0gZnMucmVhZFN5bmMoZmQsIGJ1Zik7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmIChlLnRvU3RyaW5nKCkuaW5jbHVkZXMoIkVPRiIpKQogICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IDA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKICAgICAgICAgICAgcmVzdWx0ID0gYnVmLnNsaWNlKDAsIGJ5dGVzUmVhZCkudG9TdHJpbmcoInV0Zi04Iik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygd2luZG93LnByb21wdCA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXN1bHQgPSB3aW5kb3cucHJvbXB0KCJJbnB1dDogIik7CiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiXG4iOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYWRsaW5lID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJlc3VsdCA9IHJlYWRsaW5lKCk7CiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiXG4iOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIEZTX3N0ZGluX2dldENoYXJfYnVmZmVyID0gaW50QXJyYXlGcm9tU3RyaW5nKHJlc3VsdCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIEZTX3N0ZGluX2dldENoYXJfYnVmZmVyLnNoaWZ0KCk7CiAgICB9OwogICAgdmFyIFRUWSA9IHsgdHR5czogW10sIGluaXQoKSB7CiAgICB9LCBzaHV0ZG93bigpIHsKICAgIH0sIHJlZ2lzdGVyKGRldiwgb3BzKSB7CiAgICAgIFRUWS50dHlzW2Rldl0gPSB7IGlucHV0OiBbXSwgb3V0cHV0OiBbXSwgb3BzIH07CiAgICAgIEZTLnJlZ2lzdGVyRGV2aWNlKGRldiwgVFRZLnN0cmVhbV9vcHMpOwogICAgfSwgc3RyZWFtX29wczogeyBvcGVuKHN0cmVhbSkgewogICAgICB2YXIgdHR5ID0gVFRZLnR0eXNbc3RyZWFtLm5vZGUucmRldl07CiAgICAgIGlmICghdHR5KSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICB9CiAgICAgIHN0cmVhbS50dHkgPSB0dHk7CiAgICAgIHN0cmVhbS5zZWVrYWJsZSA9IGZhbHNlOwogICAgfSwgY2xvc2Uoc3RyZWFtKSB7CiAgICAgIHN0cmVhbS50dHkub3BzLmZzeW5jKHN0cmVhbS50dHkpOwogICAgfSwgZnN5bmMoc3RyZWFtKSB7CiAgICAgIHN0cmVhbS50dHkub3BzLmZzeW5jKHN0cmVhbS50dHkpOwogICAgfSwgcmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgewogICAgICBpZiAoIXN0cmVhbS50dHkgfHwgIXN0cmVhbS50dHkub3BzLmdldF9jaGFyKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjApOwogICAgICB9CiAgICAgIHZhciBieXRlc1JlYWQgPSAwOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXN1bHQgPSBzdHJlYW0udHR5Lm9wcy5nZXRfY2hhcihzdHJlYW0udHR5KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiBieXRlc1JlYWQgPT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYpOwogICAgICAgIH0KICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgYnJlYWs7CiAgICAgICAgYnl0ZXNSZWFkKys7CiAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChieXRlc1JlYWQpIHsKICAgICAgICBzdHJlYW0ubm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlc1JlYWQ7CiAgICB9LCB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgewogICAgICBpZiAoIXN0cmVhbS50dHkgfHwgIXN0cmVhbS50dHkub3BzLnB1dF9jaGFyKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjApOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcihzdHJlYW0udHR5LCBidWZmZXJbb2Zmc2V0ICsgaV0pOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsKICAgICAgfQogICAgICBpZiAobGVuZ3RoKSB7CiAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgfQogICAgICByZXR1cm4gaTsKICAgIH0gfSwgZGVmYXVsdF90dHlfb3BzOiB7IGdldF9jaGFyKHR0eSkgewogICAgICByZXR1cm4gRlNfc3RkaW5fZ2V0Q2hhcigpOwogICAgfSwgcHV0X2NoYXIodHR5LCB2YWwpIHsKICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IDEwKSB7CiAgICAgICAgb3V0KFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsIDApKTsKICAgICAgICB0dHkub3V0cHV0ID0gW107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHZhbCAhPSAwKQogICAgICAgICAgdHR5Lm91dHB1dC5wdXNoKHZhbCk7CiAgICAgIH0KICAgIH0sIGZzeW5jKHR0eSkgewogICAgICBpZiAodHR5Lm91dHB1dCAmJiB0dHkub3V0cHV0Lmxlbmd0aCA+IDApIHsKICAgICAgICBvdXQoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwgMCkpOwogICAgICAgIHR0eS5vdXRwdXQgPSBbXTsKICAgICAgfQogICAgfSwgaW9jdGxfdGNnZXRzKHR0eSkgewogICAgICByZXR1cm4geyBjX2lmbGFnOiAyNTg1NiwgY19vZmxhZzogNSwgY19jZmxhZzogMTkxLCBjX2xmbGFnOiAzNTM4NywgY19jYzogWzMsIDI4LCAxMjcsIDIxLCA0LCAwLCAxLCAwLCAxNywgMTksIDI2LCAwLCAxOCwgMTUsIDIzLCAyMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0gfTsKICAgIH0sIGlvY3RsX3Rjc2V0cyh0dHksIG9wdGlvbmFsX2FjdGlvbnMsIGRhdGEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9LCBpb2N0bF90aW9jZ3dpbnN6KHR0eSkgewogICAgICByZXR1cm4gWzI0LCA4MF07CiAgICB9IH0sIGRlZmF1bHRfdHR5MV9vcHM6IHsgcHV0X2NoYXIodHR5LCB2YWwpIHsKICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IDEwKSB7CiAgICAgICAgZXJyKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsIDApKTsKICAgICAgICB0dHkub3V0cHV0ID0gW107CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHZhbCAhPSAwKQogICAgICAgICAgdHR5Lm91dHB1dC5wdXNoKHZhbCk7CiAgICAgIH0KICAgIH0sIGZzeW5jKHR0eSkgewogICAgICBpZiAodHR5Lm91dHB1dCAmJiB0dHkub3V0cHV0Lmxlbmd0aCA+IDApIHsKICAgICAgICBlcnIoVVRGOEFycmF5VG9TdHJpbmcodHR5Lm91dHB1dCwgMCkpOwogICAgICAgIHR0eS5vdXRwdXQgPSBbXTsKICAgICAgfQogICAgfSB9IH07CiAgICB2YXIgbW1hcEFsbG9jID0gKHNpemUpID0+IHsKICAgICAgYWJvcnQoKTsKICAgIH07CiAgICB2YXIgTUVNRlMgPSB7IG9wc190YWJsZTogbnVsbCwgbW91bnQobW91bnQpIHsKICAgICAgcmV0dXJuIE1FTUZTLmNyZWF0ZU5vZGUobnVsbCwgIi8iLCAxNjM4NCB8IDUxMSwgMCk7CiAgICB9LCBjcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KSB7CiAgICAgIGlmIChGUy5pc0Jsa2Rldihtb2RlKSB8fCBGUy5pc0ZJRk8obW9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgIH0KICAgICAgaWYgKCFNRU1GUy5vcHNfdGFibGUpIHsKICAgICAgICBNRU1GUy5vcHNfdGFibGUgPSB7IGRpcjogeyBub2RlOiB7IGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIsIGxvb2t1cDogTUVNRlMubm9kZV9vcHMubG9va3VwLCBta25vZDogTUVNRlMubm9kZV9vcHMubWtub2QsIHJlbmFtZTogTUVNRlMubm9kZV9vcHMucmVuYW1lLCB1bmxpbms6IE1FTUZTLm5vZGVfb3BzLnVubGluaywgcm1kaXI6IE1FTUZTLm5vZGVfb3BzLnJtZGlyLCByZWFkZGlyOiBNRU1GUy5ub2RlX29wcy5yZWFkZGlyLCBzeW1saW5rOiBNRU1GUy5ub2RlX29wcy5zeW1saW5rIH0sIHN0cmVhbTogeyBsbHNlZWs6IE1FTUZTLnN0cmVhbV9vcHMubGxzZWVrIH0gfSwgZmlsZTogeyBub2RlOiB7IGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIgfSwgc3RyZWFtOiB7IGxsc2VlazogTUVNRlMuc3RyZWFtX29wcy5sbHNlZWssIHJlYWQ6IE1FTUZTLnN0cmVhbV9vcHMucmVhZCwgd3JpdGU6IE1FTUZTLnN0cmVhbV9vcHMud3JpdGUsIGFsbG9jYXRlOiBNRU1GUy5zdHJlYW1fb3BzLmFsbG9jYXRlLCBtbWFwOiBNRU1GUy5zdHJlYW1fb3BzLm1tYXAsIG1zeW5jOiBNRU1GUy5zdHJlYW1fb3BzLm1zeW5jIH0gfSwgbGluazogeyBub2RlOiB7IGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIsIHJlYWRsaW5rOiBNRU1GUy5ub2RlX29wcy5yZWFkbGluayB9LCBzdHJlYW06IHt9IH0sIGNocmRldjogeyBub2RlOiB7IGdldGF0dHI6IE1FTUZTLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IE1FTUZTLm5vZGVfb3BzLnNldGF0dHIgfSwgc3RyZWFtOiBGUy5jaHJkZXZfc3RyZWFtX29wcyB9IH07CiAgICAgIH0KICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KTsKICAgICAgaWYgKEZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICBub2RlLm5vZGVfb3BzID0gTUVNRlMub3BzX3RhYmxlLmRpci5ub2RlOwogICAgICAgIG5vZGUuc3RyZWFtX29wcyA9IE1FTUZTLm9wc190YWJsZS5kaXIuc3RyZWFtOwogICAgICAgIG5vZGUuY29udGVudHMgPSB7fTsKICAgICAgfSBlbHNlIGlmIChGUy5pc0ZpbGUobm9kZS5tb2RlKSkgewogICAgICAgIG5vZGUubm9kZV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuZmlsZS5ub2RlOwogICAgICAgIG5vZGUuc3RyZWFtX29wcyA9IE1FTUZTLm9wc190YWJsZS5maWxlLnN0cmVhbTsKICAgICAgICBub2RlLnVzZWRCeXRlcyA9IDA7CiAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7CiAgICAgIH0gZWxzZSBpZiAoRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsKICAgICAgICBub2RlLm5vZGVfb3BzID0gTUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTsKICAgICAgICBub2RlLnN0cmVhbV9vcHMgPSBNRU1GUy5vcHNfdGFibGUubGluay5zdHJlYW07CiAgICAgIH0gZWxzZSBpZiAoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSkgewogICAgICAgIG5vZGUubm9kZV9vcHMgPSBNRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7CiAgICAgICAgbm9kZS5zdHJlYW1fb3BzID0gTUVNRlMub3BzX3RhYmxlLmNocmRldi5zdHJlYW07CiAgICAgIH0KICAgICAgbm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgcGFyZW50LmNvbnRlbnRzW25hbWVdID0gbm9kZTsKICAgICAgICBwYXJlbnQudGltZXN0YW1wID0gbm9kZS50aW1lc3RhbXA7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LCBnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShub2RlKSB7CiAgICAgIGlmICghbm9kZS5jb250ZW50cykKICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICAgIGlmIChub2RlLmNvbnRlbnRzLnN1YmFycmF5KQogICAgICAgIHJldHVybiBub2RlLmNvbnRlbnRzLnN1YmFycmF5KDAsIG5vZGUudXNlZEJ5dGVzKTsKICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5vZGUuY29udGVudHMpOwogICAgfSwgZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSwgbmV3Q2FwYWNpdHkpIHsKICAgICAgdmFyIHByZXZDYXBhY2l0eSA9IG5vZGUuY29udGVudHMgPyBub2RlLmNvbnRlbnRzLmxlbmd0aCA6IDA7CiAgICAgIGlmIChwcmV2Q2FwYWNpdHkgPj0gbmV3Q2FwYWNpdHkpCiAgICAgICAgcmV0dXJuOwogICAgICB2YXIgQ0FQQUNJVFlfRE9VQkxJTkdfTUFYID0gMTAyNCAqIDEwMjQ7CiAgICAgIG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgobmV3Q2FwYWNpdHksIHByZXZDYXBhY2l0eSAqIChwcmV2Q2FwYWNpdHkgPCBDQVBBQ0lUWV9ET1VCTElOR19NQVggPyAyIDogMS4xMjUpID4+PiAwKTsKICAgICAgaWYgKHByZXZDYXBhY2l0eSAhPSAwKQogICAgICAgIG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgobmV3Q2FwYWNpdHksIDI1Nik7CiAgICAgIHZhciBvbGRDb250ZW50cyA9IG5vZGUuY29udGVudHM7CiAgICAgIG5vZGUuY29udGVudHMgPSBuZXcgVWludDhBcnJheShuZXdDYXBhY2l0eSk7CiAgICAgIGlmIChub2RlLnVzZWRCeXRlcyA+IDApCiAgICAgICAgbm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCwgbm9kZS51c2VkQnl0ZXMpLCAwKTsKICAgIH0sIHJlc2l6ZUZpbGVTdG9yYWdlKG5vZGUsIG5ld1NpemUpIHsKICAgICAgaWYgKG5vZGUudXNlZEJ5dGVzID09IG5ld1NpemUpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAobmV3U2l6ZSA9PSAwKSB7CiAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7CiAgICAgICAgbm9kZS51c2VkQnl0ZXMgPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBvbGRDb250ZW50cyA9IG5vZGUuY29udGVudHM7CiAgICAgICAgbm9kZS5jb250ZW50cyA9IG5ldyBVaW50OEFycmF5KG5ld1NpemUpOwogICAgICAgIGlmIChvbGRDb250ZW50cykgewogICAgICAgICAgbm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCwgTWF0aC5taW4obmV3U2l6ZSwgbm9kZS51c2VkQnl0ZXMpKSk7CiAgICAgICAgfQogICAgICAgIG5vZGUudXNlZEJ5dGVzID0gbmV3U2l6ZTsKICAgICAgfQogICAgfSwgbm9kZV9vcHM6IHsgZ2V0YXR0cihub2RlKSB7CiAgICAgIHZhciBhdHRyID0ge307CiAgICAgIGF0dHIuZGV2ID0gRlMuaXNDaHJkZXYobm9kZS5tb2RlKSA/IG5vZGUuaWQgOiAxOwogICAgICBhdHRyLmlubyA9IG5vZGUuaWQ7CiAgICAgIGF0dHIubW9kZSA9IG5vZGUubW9kZTsKICAgICAgYXR0ci5ubGluayA9IDE7CiAgICAgIGF0dHIudWlkID0gMDsKICAgICAgYXR0ci5naWQgPSAwOwogICAgICBhdHRyLnJkZXYgPSBub2RlLnJkZXY7CiAgICAgIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgYXR0ci5zaXplID0gNDA5NjsKICAgICAgfSBlbHNlIGlmIChGUy5pc0ZpbGUobm9kZS5tb2RlKSkgewogICAgICAgIGF0dHIuc2l6ZSA9IG5vZGUudXNlZEJ5dGVzOwogICAgICB9IGVsc2UgaWYgKEZTLmlzTGluayhub2RlLm1vZGUpKSB7CiAgICAgICAgYXR0ci5zaXplID0gbm9kZS5saW5rLmxlbmd0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhdHRyLnNpemUgPSAwOwogICAgICB9CiAgICAgIGF0dHIuYXRpbWUgPSBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7CiAgICAgIGF0dHIubXRpbWUgPSBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7CiAgICAgIGF0dHIuY3RpbWUgPSBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCk7CiAgICAgIGF0dHIuYmxrc2l6ZSA9IDQwOTY7CiAgICAgIGF0dHIuYmxvY2tzID0gTWF0aC5jZWlsKGF0dHIuc2l6ZSAvIGF0dHIuYmxrc2l6ZSk7CiAgICAgIHJldHVybiBhdHRyOwogICAgfSwgc2V0YXR0cihub2RlLCBhdHRyKSB7CiAgICAgIGlmIChhdHRyLm1vZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIG5vZGUubW9kZSA9IGF0dHIubW9kZTsKICAgICAgfQogICAgICBpZiAoYXR0ci50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCkgewogICAgICAgIG5vZGUudGltZXN0YW1wID0gYXR0ci50aW1lc3RhbXA7CiAgICAgIH0KICAgICAgaWYgKGF0dHIuc2l6ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgTUVNRlMucmVzaXplRmlsZVN0b3JhZ2Uobm9kZSwgYXR0ci5zaXplKTsKICAgICAgfQogICAgfSwgbG9va3VwKHBhcmVudCwgbmFtZSkgewogICAgICB0aHJvdyBGUy5nZW5lcmljRXJyb3JzWzQ0XTsKICAgIH0sIG1rbm9kKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KSB7CiAgICAgIHJldHVybiBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KTsKICAgIH0sIHJlbmFtZShvbGRfbm9kZSwgbmV3X2RpciwgbmV3X25hbWUpIHsKICAgICAgaWYgKEZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpKSB7CiAgICAgICAgdmFyIG5ld19ub2RlOwogICAgICAgIHRyeSB7CiAgICAgICAgICBuZXdfbm9kZSA9IEZTLmxvb2t1cE5vZGUobmV3X2RpciwgbmV3X25hbWUpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB9CiAgICAgICAgaWYgKG5ld19ub2RlKSB7CiAgICAgICAgICBmb3IgKHZhciBpIGluIG5ld19ub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU1KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlIG9sZF9ub2RlLnBhcmVudC5jb250ZW50c1tvbGRfbm9kZS5uYW1lXTsKICAgICAgb2xkX25vZGUucGFyZW50LnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgIG9sZF9ub2RlLm5hbWUgPSBuZXdfbmFtZTsKICAgICAgbmV3X2Rpci5jb250ZW50c1tuZXdfbmFtZV0gPSBvbGRfbm9kZTsKICAgICAgbmV3X2Rpci50aW1lc3RhbXAgPSBvbGRfbm9kZS5wYXJlbnQudGltZXN0YW1wOwogICAgICBvbGRfbm9kZS5wYXJlbnQgPSBuZXdfZGlyOwogICAgfSwgdW5saW5rKHBhcmVudCwgbmFtZSkgewogICAgICBkZWxldGUgcGFyZW50LmNvbnRlbnRzW25hbWVdOwogICAgICBwYXJlbnQudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgIH0sIHJtZGlyKHBhcmVudCwgbmFtZSkgewogICAgICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUocGFyZW50LCBuYW1lKTsKICAgICAgZm9yICh2YXIgaSBpbiBub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpOwogICAgICB9CiAgICAgIGRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV07CiAgICAgIHBhcmVudC50aW1lc3RhbXAgPSBEYXRlLm5vdygpOwogICAgfSwgcmVhZGRpcihub2RlKSB7CiAgICAgIHZhciBlbnRyaWVzID0gWyIuIiwgIi4uIl07CiAgICAgIGZvciAodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKSB7CiAgICAgICAgaWYgKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbnRyaWVzLnB1c2goa2V5KTsKICAgICAgfQogICAgICByZXR1cm4gZW50cmllczsKICAgIH0sIHN5bWxpbmsocGFyZW50LCBuZXduYW1lLCBvbGRwYXRoKSB7CiAgICAgIHZhciBub2RlID0gTUVNRlMuY3JlYXRlTm9kZShwYXJlbnQsIG5ld25hbWUsIDUxMSB8IDQwOTYwLCAwKTsKICAgICAgbm9kZS5saW5rID0gb2xkcGF0aDsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LCByZWFkbGluayhub2RlKSB7CiAgICAgIGlmICghRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGUubGluazsKICAgIH0gfSwgc3RyZWFtX29wczogeyByZWFkKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGNvbnRlbnRzID0gc3RyZWFtLm5vZGUuY29udGVudHM7CiAgICAgIGlmIChwb3NpdGlvbiA+PSBzdHJlYW0ubm9kZS51c2VkQnl0ZXMpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIHZhciBzaXplID0gTWF0aC5taW4oc3RyZWFtLm5vZGUudXNlZEJ5dGVzIC0gcG9zaXRpb24sIGxlbmd0aCk7CiAgICAgIGlmIChzaXplID4gOCAmJiBjb250ZW50cy5zdWJhcnJheSkgewogICAgICAgIGJ1ZmZlci5zZXQoY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgc2l6ZSksIG9mZnNldCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IHNpemU7IGkrKykKICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGNvbnRlbnRzW3Bvc2l0aW9uICsgaV07CiAgICAgIH0KICAgICAgcmV0dXJuIHNpemU7CiAgICB9LCB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pIHsKICAgICAgaWYgKCFsZW5ndGgpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIHZhciBub2RlID0gc3RyZWFtLm5vZGU7CiAgICAgIG5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgaWYgKGJ1ZmZlci5zdWJhcnJheSAmJiAoIW5vZGUuY29udGVudHMgfHwgbm9kZS5jb250ZW50cy5zdWJhcnJheSkpIHsKICAgICAgICBpZiAoY2FuT3duKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIG5vZGUudXNlZEJ5dGVzID0gbGVuZ3RoOwogICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUudXNlZEJ5dGVzID09PSAwICYmIHBvc2l0aW9uID09PSAwKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIG5vZGUudXNlZEJ5dGVzID0gbGVuZ3RoOwogICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICsgbGVuZ3RoIDw9IG5vZGUudXNlZEJ5dGVzKSB7CiAgICAgICAgICBub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLCBwb3NpdGlvbik7CiAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBNRU1GUy5leHBhbmRGaWxlU3RvcmFnZShub2RlLCBwb3NpdGlvbiArIGxlbmd0aCk7CiAgICAgIGlmIChub2RlLmNvbnRlbnRzLnN1YmFycmF5ICYmIGJ1ZmZlci5zdWJhcnJheSkgewogICAgICAgIG5vZGUuY29udGVudHMuc2V0KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCksIHBvc2l0aW9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG5vZGUuY29udGVudHNbcG9zaXRpb24gKyBpXSA9IGJ1ZmZlcltvZmZzZXQgKyBpXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbm9kZS51c2VkQnl0ZXMgPSBNYXRoLm1heChub2RlLnVzZWRCeXRlcywgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICByZXR1cm4gbGVuZ3RoOwogICAgfSwgbGxzZWVrKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgdmFyIHBvc2l0aW9uID0gb2Zmc2V0OwogICAgICBpZiAod2hlbmNlID09PSAxKSB7CiAgICAgICAgcG9zaXRpb24gKz0gc3RyZWFtLnBvc2l0aW9uOwogICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMikgewogICAgICAgIGlmIChGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICAgIHBvc2l0aW9uICs9IHN0cmVhbS5ub2RlLnVzZWRCeXRlczsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9LCBhbGxvY2F0ZShzdHJlYW0sIG9mZnNldCwgbGVuZ3RoKSB7CiAgICAgIE1FTUZTLmV4cGFuZEZpbGVTdG9yYWdlKHN0cmVhbS5ub2RlLCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICBzdHJlYW0ubm9kZS51c2VkQnl0ZXMgPSBNYXRoLm1heChzdHJlYW0ubm9kZS51c2VkQnl0ZXMsIG9mZnNldCArIGxlbmd0aCk7CiAgICB9LCBtbWFwKHN0cmVhbSwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpIHsKICAgICAgaWYgKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myk7CiAgICAgIH0KICAgICAgdmFyIHB0cjsKICAgICAgdmFyIGFsbG9jYXRlZDsKICAgICAgdmFyIGNvbnRlbnRzID0gc3RyZWFtLm5vZGUuY29udGVudHM7CiAgICAgIGlmICghKGZsYWdzICYgMikgJiYgY29udGVudHMuYnVmZmVyID09PSBIRUFQOC5idWZmZXIpIHsKICAgICAgICBhbGxvY2F0ZWQgPSBmYWxzZTsKICAgICAgICBwdHIgPSBjb250ZW50cy5ieXRlT2Zmc2V0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwb3NpdGlvbiA+IDAgfHwgcG9zaXRpb24gKyBsZW5ndGggPCBjb250ZW50cy5sZW5ndGgpIHsKICAgICAgICAgIGlmIChjb250ZW50cy5zdWJhcnJheSkgewogICAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLCBwb3NpdGlvbiArIGxlbmd0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb250ZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbnRlbnRzLCBwb3NpdGlvbiwgcG9zaXRpb24gKyBsZW5ndGgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhbGxvY2F0ZWQgPSB0cnVlOwogICAgICAgIHB0ciA9IG1tYXBBbGxvYyhsZW5ndGgpOwogICAgICAgIGlmICghcHRyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0OCk7CiAgICAgICAgfQogICAgICAgIEhFQVA4LnNldChjb250ZW50cywgcHRyKTsKICAgICAgfQogICAgICByZXR1cm4geyBwdHIsIGFsbG9jYXRlZCB9OwogICAgfSwgbXN5bmMoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBtbWFwRmxhZ3MpIHsKICAgICAgTUVNRlMuc3RyZWFtX29wcy53cml0ZShzdHJlYW0sIGJ1ZmZlciwgMCwgbGVuZ3RoLCBvZmZzZXQsIGZhbHNlKTsKICAgICAgcmV0dXJuIDA7CiAgICB9IH0gfTsKICAgIHZhciBhc3luY0xvYWQgPSAodXJsLCBvbmxvYWQsIG9uZXJyb3IsIG5vUnVuRGVwKSA9PiB7CiAgICAgIHZhciBkZXAgPSAhbm9SdW5EZXAgPyBnZXRVbmlxdWVSdW5EZXBlbmRlbmN5KGBhbCAke3VybH1gKSA6ICIiOwogICAgICByZWFkQXN5bmModXJsLCAoYXJyYXlCdWZmZXIpID0+IHsKICAgICAgICBhc3NlcnQoYXJyYXlCdWZmZXIsIGBMb2FkaW5nIGRhdGEgZmlsZSAiJHt1cmx9IiBmYWlsZWQgKG5vIGFycmF5QnVmZmVyKS5gKTsKICAgICAgICBvbmxvYWQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTsKICAgICAgICBpZiAoZGVwKQogICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApOwogICAgICB9LCAoZXZlbnQpID0+IHsKICAgICAgICBpZiAob25lcnJvcikgewogICAgICAgICAgb25lcnJvcigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBgTG9hZGluZyBkYXRhIGZpbGUgIiR7dXJsfSIgZmFpbGVkLmA7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKGRlcCkKICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICB9OwogICAgdmFyIEZTX2NyZWF0ZURhdGFGaWxlID0gKHBhcmVudCwgbmFtZSwgZmlsZURhdGEsIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pID0+IEZTLmNyZWF0ZURhdGFGaWxlKHBhcmVudCwgbmFtZSwgZmlsZURhdGEsIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pOwogICAgdmFyIHByZWxvYWRQbHVnaW5zID0gTW9kdWxlWyJwcmVsb2FkUGx1Z2lucyJdIHx8IFtdOwogICAgdmFyIEZTX2hhbmRsZWRCeVByZWxvYWRQbHVnaW4gPSAoYnl0ZUFycmF5LCBmdWxsbmFtZSwgZmluaXNoLCBvbmVycm9yKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgQnJvd3NlciAhPSAidW5kZWZpbmVkIikKICAgICAgICBCcm93c2VyLmluaXQoKTsKICAgICAgdmFyIGhhbmRsZWQgPSBmYWxzZTsKICAgICAgcHJlbG9hZFBsdWdpbnMuZm9yRWFjaCgocGx1Z2luKSA9PiB7CiAgICAgICAgaWYgKGhhbmRsZWQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHBsdWdpblsiY2FuSGFuZGxlIl0oZnVsbG5hbWUpKSB7CiAgICAgICAgICBwbHVnaW5bImhhbmRsZSJdKGJ5dGVBcnJheSwgZnVsbG5hbWUsIGZpbmlzaCwgb25lcnJvcik7CiAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gaGFuZGxlZDsKICAgIH07CiAgICB2YXIgRlNfY3JlYXRlUHJlbG9hZGVkRmlsZSA9IChwYXJlbnQsIG5hbWUsIHVybCwgY2FuUmVhZCwgY2FuV3JpdGUsIG9ubG9hZCwgb25lcnJvciwgZG9udENyZWF0ZUZpbGUsIGNhbk93biwgcHJlRmluaXNoKSA9PiB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWUgPyBQQVRIX0ZTLnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsIG5hbWUpKSA6IHBhcmVudDsKICAgICAgdmFyIGRlcCA9IGdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koYGNwICR7ZnVsbG5hbWV9YCk7CiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEYXRhKGJ5dGVBcnJheSkgewogICAgICAgIGZ1bmN0aW9uIGZpbmlzaChieXRlQXJyYXkyKSB7CiAgICAgICAgICBpZiAocHJlRmluaXNoKQogICAgICAgICAgICBwcmVGaW5pc2goKTsKICAgICAgICAgIGlmICghZG9udENyZWF0ZUZpbGUpIHsKICAgICAgICAgICAgRlNfY3JlYXRlRGF0YUZpbGUocGFyZW50LCBuYW1lLCBieXRlQXJyYXkyLCBjYW5SZWFkLCBjYW5Xcml0ZSwgY2FuT3duKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvbmxvYWQpCiAgICAgICAgICAgIG9ubG9hZCgpOwogICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApOwogICAgICAgIH0KICAgICAgICBpZiAoRlNfaGFuZGxlZEJ5UHJlbG9hZFBsdWdpbihieXRlQXJyYXksIGZ1bGxuYW1lLCBmaW5pc2gsICgpID0+IHsKICAgICAgICAgIGlmIChvbmVycm9yKQogICAgICAgICAgICBvbmVycm9yKCk7CiAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KGRlcCk7CiAgICAgICAgfSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZmluaXNoKGJ5dGVBcnJheSk7CiAgICAgIH0KICAgICAgYWRkUnVuRGVwZW5kZW5jeShkZXApOwogICAgICBpZiAodHlwZW9mIHVybCA9PSAic3RyaW5nIikgewogICAgICAgIGFzeW5jTG9hZCh1cmwsIChieXRlQXJyYXkpID0+IHByb2Nlc3NEYXRhKGJ5dGVBcnJheSksIG9uZXJyb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2Nlc3NEYXRhKHVybCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgRlNfbW9kZVN0cmluZ1RvRmxhZ3MgPSAoc3RyKSA9PiB7CiAgICAgIHZhciBmbGFnTW9kZXMgPSB7IHI6IDAsICJyKyI6IDIsIHc6IDUxMiB8IDY0IHwgMSwgIncrIjogNTEyIHwgNjQgfCAyLCBhOiAxMDI0IHwgNjQgfCAxLCAiYSsiOiAxMDI0IHwgNjQgfCAyIH07CiAgICAgIHZhciBmbGFncyA9IGZsYWdNb2Rlc1tzdHJdOwogICAgICBpZiAodHlwZW9mIGZsYWdzID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke3N0cn1gKTsKICAgICAgfQogICAgICByZXR1cm4gZmxhZ3M7CiAgICB9OwogICAgdmFyIEZTX2dldE1vZGUgPSAoY2FuUmVhZCwgY2FuV3JpdGUpID0+IHsKICAgICAgdmFyIG1vZGUgPSAwOwogICAgICBpZiAoY2FuUmVhZCkKICAgICAgICBtb2RlIHw9IDI5MiB8IDczOwogICAgICBpZiAoY2FuV3JpdGUpCiAgICAgICAgbW9kZSB8PSAxNDY7CiAgICAgIHJldHVybiBtb2RlOwogICAgfTsKICAgIHZhciBGUyA9IHsgcm9vdDogbnVsbCwgbW91bnRzOiBbXSwgZGV2aWNlczoge30sIHN0cmVhbXM6IFtdLCBuZXh0SW5vZGU6IDEsIG5hbWVUYWJsZTogbnVsbCwgY3VycmVudFBhdGg6ICIvIiwgaW5pdGlhbGl6ZWQ6IGZhbHNlLCBpZ25vcmVQZXJtaXNzaW9uczogdHJ1ZSwgRXJybm9FcnJvcjogbnVsbCwgZ2VuZXJpY0Vycm9yczoge30sIGZpbGVzeXN0ZW1zOiBudWxsLCBzeW5jRlNSZXF1ZXN0czogMCwgbG9va3VwUGF0aChwYXRoLCBvcHRzID0ge30pIHsKICAgICAgcGF0aCA9IFBBVEhfRlMucmVzb2x2ZShwYXRoKTsKICAgICAgaWYgKCFwYXRoKQogICAgICAgIHJldHVybiB7IHBhdGg6ICIiLCBub2RlOiBudWxsIH07CiAgICAgIHZhciBkZWZhdWx0cyA9IHsgZm9sbG93X21vdW50OiB0cnVlLCByZWN1cnNlX2NvdW50OiAwIH07CiAgICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRzLCBvcHRzKTsKICAgICAgaWYgKG9wdHMucmVjdXJzZV9jb3VudCA+IDgpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMik7CiAgICAgIH0KICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgiLyIpLmZpbHRlcigocCkgPT4gISFwKTsKICAgICAgdmFyIGN1cnJlbnQgPSBGUy5yb290OwogICAgICB2YXIgY3VycmVudF9wYXRoID0gIi8iOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaXNsYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTsKICAgICAgICBpZiAoaXNsYXN0ICYmIG9wdHMucGFyZW50KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY3VycmVudCA9IEZTLmxvb2t1cE5vZGUoY3VycmVudCwgcGFydHNbaV0pOwogICAgICAgIGN1cnJlbnRfcGF0aCA9IFBBVEguam9pbjIoY3VycmVudF9wYXRoLCBwYXJ0c1tpXSk7CiAgICAgICAgaWYgKEZTLmlzTW91bnRwb2ludChjdXJyZW50KSkgewogICAgICAgICAgaWYgKCFpc2xhc3QgfHwgaXNsYXN0ICYmIG9wdHMuZm9sbG93X21vdW50KSB7CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm1vdW50ZWQucm9vdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFpc2xhc3QgfHwgb3B0cy5mb2xsb3cpIHsKICAgICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgICB3aGlsZSAoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSBGUy5yZWFkbGluayhjdXJyZW50X3BhdGgpOwogICAgICAgICAgICBjdXJyZW50X3BhdGggPSBQQVRIX0ZTLnJlc29sdmUoUEFUSC5kaXJuYW1lKGN1cnJlbnRfcGF0aCksIGxpbmspOwogICAgICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChjdXJyZW50X3BhdGgsIHsgcmVjdXJzZV9jb3VudDogb3B0cy5yZWN1cnNlX2NvdW50ICsgMSB9KTsKICAgICAgICAgICAgY3VycmVudCA9IGxvb2t1cC5ub2RlOwogICAgICAgICAgICBpZiAoY291bnQrKyA+IDQwKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IHBhdGg6IGN1cnJlbnRfcGF0aCwgbm9kZTogY3VycmVudCB9OwogICAgfSwgZ2V0UGF0aChub2RlKSB7CiAgICAgIHZhciBwYXRoOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChGUy5pc1Jvb3Qobm9kZSkpIHsKICAgICAgICAgIHZhciBtb3VudCA9IG5vZGUubW91bnQubW91bnRwb2ludDsKICAgICAgICAgIGlmICghcGF0aCkKICAgICAgICAgICAgcmV0dXJuIG1vdW50OwogICAgICAgICAgcmV0dXJuIG1vdW50W21vdW50Lmxlbmd0aCAtIDFdICE9PSAiLyIgPyBgJHttb3VudH0vJHtwYXRofWAgOiBtb3VudCArIHBhdGg7CiAgICAgICAgfQogICAgICAgIHBhdGggPSBwYXRoID8gYCR7bm9kZS5uYW1lfS8ke3BhdGh9YCA6IG5vZGUubmFtZTsKICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICAgIH0KICAgIH0sIGhhc2hOYW1lKHBhcmVudGlkLCBuYW1lKSB7CiAgICAgIHZhciBoYXNoID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IG5hbWUubGVuZ3RoOyBpKyspIHsKICAgICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgbmFtZS5jaGFyQ29kZUF0KGkpIHwgMDsKICAgICAgfQogICAgICByZXR1cm4gKHBhcmVudGlkICsgaGFzaCA+Pj4gMCkgJSBGUy5uYW1lVGFibGUubGVuZ3RoOwogICAgfSwgaGFzaEFkZE5vZGUobm9kZSkgewogICAgICB2YXIgaGFzaCA9IEZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLCBub2RlLm5hbWUpOwogICAgICBub2RlLm5hbWVfbmV4dCA9IEZTLm5hbWVUYWJsZVtoYXNoXTsKICAgICAgRlMubmFtZVRhYmxlW2hhc2hdID0gbm9kZTsKICAgIH0sIGhhc2hSZW1vdmVOb2RlKG5vZGUpIHsKICAgICAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShub2RlLnBhcmVudC5pZCwgbm9kZS5uYW1lKTsKICAgICAgaWYgKEZTLm5hbWVUYWJsZVtoYXNoXSA9PT0gbm9kZSkgewogICAgICAgIEZTLm5hbWVUYWJsZVtoYXNoXSA9IG5vZGUubmFtZV9uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBjdXJyZW50ID0gRlMubmFtZVRhYmxlW2hhc2hdOwogICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICBpZiAoY3VycmVudC5uYW1lX25leHQgPT09IG5vZGUpIHsKICAgICAgICAgICAgY3VycmVudC5uYW1lX25leHQgPSBub2RlLm5hbWVfbmV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uYW1lX25leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9LCBsb29rdXBOb2RlKHBhcmVudCwgbmFtZSkgewogICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heUxvb2t1cChwYXJlbnQpOwogICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUsIHBhcmVudCk7CiAgICAgIH0KICAgICAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShwYXJlbnQuaWQsIG5hbWUpOwogICAgICBmb3IgKHZhciBub2RlID0gRlMubmFtZVRhYmxlW2hhc2hdO25vZGU7IG5vZGUgPSBub2RlLm5hbWVfbmV4dCkgewogICAgICAgIHZhciBub2RlTmFtZSA9IG5vZGUubmFtZTsKICAgICAgICBpZiAobm9kZS5wYXJlbnQuaWQgPT09IHBhcmVudC5pZCAmJiBub2RlTmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBGUy5sb29rdXAocGFyZW50LCBuYW1lKTsKICAgIH0sIGNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCByZGV2KSB7CiAgICAgIHZhciBub2RlID0gbmV3IEZTLkZTTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUsIHJkZXYpOwogICAgICBGUy5oYXNoQWRkTm9kZShub2RlKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LCBkZXN0cm95Tm9kZShub2RlKSB7CiAgICAgIEZTLmhhc2hSZW1vdmVOb2RlKG5vZGUpOwogICAgfSwgaXNSb290KG5vZGUpIHsKICAgICAgcmV0dXJuIG5vZGUgPT09IG5vZGUucGFyZW50OwogICAgfSwgaXNNb3VudHBvaW50KG5vZGUpIHsKICAgICAgcmV0dXJuICEhbm9kZS5tb3VudGVkOwogICAgfSwgaXNGaWxlKG1vZGUpIHsKICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSAzMjc2ODsKICAgIH0sIGlzRGlyKG1vZGUpIHsKICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSAxNjM4NDsKICAgIH0sIGlzTGluayhtb2RlKSB7CiAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjA7CiAgICB9LCBpc0NocmRldihtb2RlKSB7CiAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gODE5MjsKICAgIH0sIGlzQmxrZGV2KG1vZGUpIHsKICAgICAgcmV0dXJuIChtb2RlICYgNjE0NDApID09PSAyNDU3NjsKICAgIH0sIGlzRklGTyhtb2RlKSB7CiAgICAgIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjsKICAgIH0sIGlzU29ja2V0KG1vZGUpIHsKICAgICAgcmV0dXJuIChtb2RlICYgNDkxNTIpID09PSA0OTE1MjsKICAgIH0sIGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWcpIHsKICAgICAgdmFyIHBlcm1zID0gWyJyIiwgInciLCAicnciXVtmbGFnICYgM107CiAgICAgIGlmIChmbGFnICYgNTEyKSB7CiAgICAgICAgcGVybXMgKz0gInciOwogICAgICB9CiAgICAgIHJldHVybiBwZXJtczsKICAgIH0sIG5vZGVQZXJtaXNzaW9ucyhub2RlLCBwZXJtcykgewogICAgICBpZiAoRlMuaWdub3JlUGVybWlzc2lvbnMpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAocGVybXMuaW5jbHVkZXMoInIiKSAmJiAhKG5vZGUubW9kZSAmIDI5MikpIHsKICAgICAgICByZXR1cm4gMjsKICAgICAgfSBlbHNlIGlmIChwZXJtcy5pbmNsdWRlcygidyIpICYmICEobm9kZS5tb2RlICYgMTQ2KSkgewogICAgICAgIHJldHVybiAyOwogICAgICB9IGVsc2UgaWYgKHBlcm1zLmluY2x1ZGVzKCJ4IikgJiYgIShub2RlLm1vZGUgJiA3MykpIHsKICAgICAgICByZXR1cm4gMjsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0sIG1heUxvb2t1cChkaXIpIHsKICAgICAgdmFyIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCAieCIpOwogICAgICBpZiAoZXJyQ29kZSkKICAgICAgICByZXR1cm4gZXJyQ29kZTsKICAgICAgaWYgKCFkaXIubm9kZV9vcHMubG9va3VwKQogICAgICAgIHJldHVybiAyOwogICAgICByZXR1cm4gMDsKICAgIH0sIG1heUNyZWF0ZShkaXIsIG5hbWUpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUoZGlyLCBuYW1lKTsKICAgICAgICByZXR1cm4gMjA7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgfQogICAgICByZXR1cm4gRlMubm9kZVBlcm1pc3Npb25zKGRpciwgInd4Iik7CiAgICB9LCBtYXlEZWxldGUoZGlyLCBuYW1lLCBpc2RpcikgewogICAgICB2YXIgbm9kZTsKICAgICAgdHJ5IHsKICAgICAgICBub2RlID0gRlMubG9va3VwTm9kZShkaXIsIG5hbWUpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgICAgdmFyIGVyckNvZGUgPSBGUy5ub2RlUGVybWlzc2lvbnMoZGlyLCAid3giKTsKICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICByZXR1cm4gZXJyQ29kZTsKICAgICAgfQogICAgICBpZiAoaXNkaXIpIHsKICAgICAgICBpZiAoIUZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICAgIHJldHVybiA1NDsKICAgICAgICB9CiAgICAgICAgaWYgKEZTLmlzUm9vdChub2RlKSB8fCBGUy5nZXRQYXRoKG5vZGUpID09PSBGUy5jd2QoKSkgewogICAgICAgICAgcmV0dXJuIDEwOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgewogICAgICAgICAgcmV0dXJuIDMxOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0sIG1heU9wZW4obm9kZSwgZmxhZ3MpIHsKICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgcmV0dXJuIDQ0OwogICAgICB9CiAgICAgIGlmIChGUy5pc0xpbmsobm9kZS5tb2RlKSkgewogICAgICAgIHJldHVybiAzMjsKICAgICAgfSBlbHNlIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgaWYgKEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSAhPT0gInIiIHx8IGZsYWdzICYgNTEyKSB7CiAgICAgICAgICByZXR1cm4gMzE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBGUy5ub2RlUGVybWlzc2lvbnMobm9kZSwgRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpKTsKICAgIH0sIE1BWF9PUEVOX0ZEUzogNDA5NiwgbmV4dGZkKCkgewogICAgICBmb3IgKHZhciBmZCA9IDA7ZmQgPD0gRlMuTUFYX09QRU5fRkRTOyBmZCsrKSB7CiAgICAgICAgaWYgKCFGUy5zdHJlYW1zW2ZkXSkgewogICAgICAgICAgcmV0dXJuIGZkOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMyk7CiAgICB9LCBnZXRTdHJlYW1DaGVja2VkKGZkKSB7CiAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW0oZmQpOwogICAgICBpZiAoIXN0cmVhbSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICB9CiAgICAgIHJldHVybiBzdHJlYW07CiAgICB9LCBnZXRTdHJlYW06IChmZCkgPT4gRlMuc3RyZWFtc1tmZF0sIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGZkID0gLTEpIHsKICAgICAgaWYgKCFGUy5GU1N0cmVhbSkgewogICAgICAgIEZTLkZTU3RyZWFtID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLnNoYXJlZCA9IHt9OwogICAgICAgIH07CiAgICAgICAgRlMuRlNTdHJlYW0ucHJvdG90eXBlID0ge307CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlMuRlNTdHJlYW0ucHJvdG90eXBlLCB7IG9iamVjdDogeyBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlOwogICAgICAgIH0sIHNldCh2YWwpIHsKICAgICAgICAgIHRoaXMubm9kZSA9IHZhbDsKICAgICAgICB9IH0sIGlzUmVhZDogeyBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyMDk3MTU1KSAhPT0gMTsKICAgICAgICB9IH0sIGlzV3JpdGU6IHsgZ2V0KCkgewogICAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMjA5NzE1NSkgIT09IDA7CiAgICAgICAgfSB9LCBpc0FwcGVuZDogeyBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5mbGFncyAmIDEwMjQ7CiAgICAgICAgfSB9LCBmbGFnczogeyBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWQuZmxhZ3M7CiAgICAgICAgfSwgc2V0KHZhbCkgewogICAgICAgICAgdGhpcy5zaGFyZWQuZmxhZ3MgPSB2YWw7CiAgICAgICAgfSB9LCBwb3NpdGlvbjogeyBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWQucG9zaXRpb247CiAgICAgICAgfSwgc2V0KHZhbCkgewogICAgICAgICAgdGhpcy5zaGFyZWQucG9zaXRpb24gPSB2YWw7CiAgICAgICAgfSB9IH0pOwogICAgICB9CiAgICAgIHN0cmVhbSA9IE9iamVjdC5hc3NpZ24obmV3IEZTLkZTU3RyZWFtLCBzdHJlYW0pOwogICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICBmZCA9IEZTLm5leHRmZCgpOwogICAgICB9CiAgICAgIHN0cmVhbS5mZCA9IGZkOwogICAgICBGUy5zdHJlYW1zW2ZkXSA9IHN0cmVhbTsKICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0sIGNsb3NlU3RyZWFtKGZkKSB7CiAgICAgIEZTLnN0cmVhbXNbZmRdID0gbnVsbDsKICAgIH0sIGNocmRldl9zdHJlYW1fb3BzOiB7IG9wZW4oc3RyZWFtKSB7CiAgICAgIHZhciBkZXZpY2UgPSBGUy5nZXREZXZpY2Uoc3RyZWFtLm5vZGUucmRldik7CiAgICAgIHN0cmVhbS5zdHJlYW1fb3BzID0gZGV2aWNlLnN0cmVhbV9vcHM7CiAgICAgIGlmIChzdHJlYW0uc3RyZWFtX29wcy5vcGVuKSB7CiAgICAgICAgc3RyZWFtLnN0cmVhbV9vcHMub3BlbihzdHJlYW0pOwogICAgICB9CiAgICB9LCBsbHNlZWsoKSB7CiAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKTsKICAgIH0gfSwgbWFqb3I6IChkZXYpID0+IGRldiA+PiA4LCBtaW5vcjogKGRldikgPT4gZGV2ICYgMjU1LCBtYWtlZGV2OiAobWEsIG1pKSA9PiBtYSA8PCA4IHwgbWksIHJlZ2lzdGVyRGV2aWNlKGRldiwgb3BzKSB7CiAgICAgIEZTLmRldmljZXNbZGV2XSA9IHsgc3RyZWFtX29wczogb3BzIH07CiAgICB9LCBnZXREZXZpY2U6IChkZXYpID0+IEZTLmRldmljZXNbZGV2XSwgZ2V0TW91bnRzKG1vdW50KSB7CiAgICAgIHZhciBtb3VudHMgPSBbXTsKICAgICAgdmFyIGNoZWNrID0gW21vdW50XTsKICAgICAgd2hpbGUgKGNoZWNrLmxlbmd0aCkgewogICAgICAgIHZhciBtMiA9IGNoZWNrLnBvcCgpOwogICAgICAgIG1vdW50cy5wdXNoKG0yKTsKICAgICAgICBjaGVjay5wdXNoLmFwcGx5KGNoZWNrLCBtMi5tb3VudHMpOwogICAgICB9CiAgICAgIHJldHVybiBtb3VudHM7CiAgICB9LCBzeW5jZnMocG9wdWxhdGUsIGNhbGxiYWNrKSB7CiAgICAgIGlmICh0eXBlb2YgcG9wdWxhdGUgPT0gImZ1bmN0aW9uIikgewogICAgICAgIGNhbGxiYWNrID0gcG9wdWxhdGU7CiAgICAgICAgcG9wdWxhdGUgPSBmYWxzZTsKICAgICAgfQogICAgICBGUy5zeW5jRlNSZXF1ZXN0cysrOwogICAgICBpZiAoRlMuc3luY0ZTUmVxdWVzdHMgPiAxKSB7CiAgICAgICAgZXJyKGB3YXJuaW5nOiAke0ZTLnN5bmNGU1JlcXVlc3RzfSBGUy5zeW5jZnMgb3BlcmF0aW9ucyBpbiBmbGlnaHQgYXQgb25jZSwgcHJvYmFibHkganVzdCBkb2luZyBleHRyYSB3b3JrYCk7CiAgICAgIH0KICAgICAgdmFyIG1vdW50cyA9IEZTLmdldE1vdW50cyhGUy5yb290Lm1vdW50KTsKICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7CiAgICAgIGZ1bmN0aW9uIGRvQ2FsbGJhY2soZXJyQ29kZSkgewogICAgICAgIEZTLnN5bmNGU1JlcXVlc3RzLS07CiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyckNvZGUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyQ29kZSkgewogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICBpZiAoIWRvbmUuZXJyb3JlZCkgewogICAgICAgICAgICBkb25lLmVycm9yZWQgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gZG9DYWxsYmFjayhlcnJDb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCsrY29tcGxldGVkID49IG1vdW50cy5sZW5ndGgpIHsKICAgICAgICAgIGRvQ2FsbGJhY2sobnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG1vdW50cy5mb3JFYWNoKChtb3VudCkgPT4gewogICAgICAgIGlmICghbW91bnQudHlwZS5zeW5jZnMpIHsKICAgICAgICAgIHJldHVybiBkb25lKG51bGwpOwogICAgICAgIH0KICAgICAgICBtb3VudC50eXBlLnN5bmNmcyhtb3VudCwgcG9wdWxhdGUsIGRvbmUpOwogICAgICB9KTsKICAgIH0sIG1vdW50KHR5cGUsIG9wdHMsIG1vdW50cG9pbnQpIHsKICAgICAgdmFyIHJvb3QgPSBtb3VudHBvaW50ID09PSAiLyI7CiAgICAgIHZhciBwc2V1ZG8gPSAhbW91bnRwb2ludDsKICAgICAgdmFyIG5vZGU7CiAgICAgIGlmIChyb290ICYmIEZTLnJvb3QpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgIH0gZWxzZSBpZiAoIXJvb3QgJiYgIXBzZXVkbykgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG1vdW50cG9pbnQsIHsgZm9sbG93X21vdW50OiBmYWxzZSB9KTsKICAgICAgICBtb3VudHBvaW50ID0gbG9va3VwLnBhdGg7CiAgICAgICAgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEwKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1NCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBtb3VudCA9IHsgdHlwZSwgb3B0cywgbW91bnRwb2ludCwgbW91bnRzOiBbXSB9OwogICAgICB2YXIgbW91bnRSb290ID0gdHlwZS5tb3VudChtb3VudCk7CiAgICAgIG1vdW50Um9vdC5tb3VudCA9IG1vdW50OwogICAgICBtb3VudC5yb290ID0gbW91bnRSb290OwogICAgICBpZiAocm9vdCkgewogICAgICAgIEZTLnJvb3QgPSBtb3VudFJvb3Q7CiAgICAgIH0gZWxzZSBpZiAobm9kZSkgewogICAgICAgIG5vZGUubW91bnRlZCA9IG1vdW50OwogICAgICAgIGlmIChub2RlLm1vdW50KSB7CiAgICAgICAgICBub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1vdW50Um9vdDsKICAgIH0sIHVubW91bnQobW91bnRwb2ludCkgewogICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChtb3VudHBvaW50LCB7IGZvbGxvd19tb3VudDogZmFsc2UgfSk7CiAgICAgIGlmICghRlMuaXNNb3VudHBvaW50KGxvb2t1cC5ub2RlKSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICB2YXIgbW91bnQgPSBub2RlLm1vdW50ZWQ7CiAgICAgIHZhciBtb3VudHMgPSBGUy5nZXRNb3VudHMobW91bnQpOwogICAgICBPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goKGhhc2gpID0+IHsKICAgICAgICB2YXIgY3VycmVudCA9IEZTLm5hbWVUYWJsZVtoYXNoXTsKICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgdmFyIG5leHQgPSBjdXJyZW50Lm5hbWVfbmV4dDsKICAgICAgICAgIGlmIChtb3VudHMuaW5jbHVkZXMoY3VycmVudC5tb3VudCkpIHsKICAgICAgICAgICAgRlMuZGVzdHJveU5vZGUoY3VycmVudCk7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBub2RlLm1vdW50ZWQgPSBudWxsOwogICAgICB2YXIgaWR4ID0gbm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7CiAgICAgIG5vZGUubW91bnQubW91bnRzLnNwbGljZShpZHgsIDEpOwogICAgfSwgbG9va3VwKHBhcmVudCwgbmFtZSkgewogICAgICByZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsIG5hbWUpOwogICAgfSwgbWtub2QocGF0aCwgbW9kZSwgZGV2KSB7CiAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgIHZhciBuYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsKICAgICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09ICIuIiB8fCBuYW1lID09PSAiLi4iKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICB9CiAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5Q3JlYXRlKHBhcmVudCwgbmFtZSk7CiAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgIH0KICAgICAgaWYgKCFwYXJlbnQubm9kZV9vcHMubWtub2QpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcmVudC5ub2RlX29wcy5ta25vZChwYXJlbnQsIG5hbWUsIG1vZGUsIGRldik7CiAgICB9LCBjcmVhdGUocGF0aCwgbW9kZSkgewogICAgICBtb2RlID0gbW9kZSAhPT0gdW5kZWZpbmVkID8gbW9kZSA6IDQzODsKICAgICAgbW9kZSAmPSA0MDk1OwogICAgICBtb2RlIHw9IDMyNzY4OwogICAgICByZXR1cm4gRlMubWtub2QocGF0aCwgbW9kZSwgMCk7CiAgICB9LCBta2RpcihwYXRoLCBtb2RlKSB7CiAgICAgIG1vZGUgPSBtb2RlICE9PSB1bmRlZmluZWQgPyBtb2RlIDogNTExOwogICAgICBtb2RlICY9IDUxMSB8IDUxMjsKICAgICAgbW9kZSB8PSAxNjM4NDsKICAgICAgcmV0dXJuIEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOwogICAgfSwgbWtkaXJUcmVlKHBhdGgsIG1vZGUpIHsKICAgICAgdmFyIGRpcnMgPSBwYXRoLnNwbGl0KCIvIik7CiAgICAgIHZhciBkID0gIiI7CiAgICAgIGZvciAodmFyIGkgPSAwO2kgPCBkaXJzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCFkaXJzW2ldKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgZCArPSAiLyIgKyBkaXJzW2ldOwogICAgICAgIHRyeSB7CiAgICAgICAgICBGUy5ta2RpcihkLCBtb2RlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAoZS5lcnJubyAhPSAyMCkKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sIG1rZGV2KHBhdGgsIG1vZGUsIGRldikgewogICAgICBpZiAodHlwZW9mIGRldiA9PSAidW5kZWZpbmVkIikgewogICAgICAgIGRldiA9IG1vZGU7CiAgICAgICAgbW9kZSA9IDQzODsKICAgICAgfQogICAgICBtb2RlIHw9IDgxOTI7CiAgICAgIHJldHVybiBGUy5ta25vZChwYXRoLCBtb2RlLCBkZXYpOwogICAgfSwgc3ltbGluayhvbGRwYXRoLCBuZXdwYXRoKSB7CiAgICAgIGlmICghUEFUSF9GUy5yZXNvbHZlKG9sZHBhdGgpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICB9CiAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG5ld3BhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7CiAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDQpOwogICAgICB9CiAgICAgIHZhciBuZXduYW1lID0gUEFUSC5iYXNlbmFtZShuZXdwYXRoKTsKICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlDcmVhdGUocGFyZW50LCBuZXduYW1lKTsKICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5ub2RlX29wcy5zeW1saW5rKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnQubm9kZV9vcHMuc3ltbGluayhwYXJlbnQsIG5ld25hbWUsIG9sZHBhdGgpOwogICAgfSwgcmVuYW1lKG9sZF9wYXRoLCBuZXdfcGF0aCkgewogICAgICB2YXIgb2xkX2Rpcm5hbWUgPSBQQVRILmRpcm5hbWUob2xkX3BhdGgpOwogICAgICB2YXIgbmV3X2Rpcm5hbWUgPSBQQVRILmRpcm5hbWUobmV3X3BhdGgpOwogICAgICB2YXIgb2xkX25hbWUgPSBQQVRILmJhc2VuYW1lKG9sZF9wYXRoKTsKICAgICAgdmFyIG5ld19uYW1lID0gUEFUSC5iYXNlbmFtZShuZXdfcGF0aCk7CiAgICAgIHZhciBsb29rdXAsIG9sZF9kaXIsIG5ld19kaXI7CiAgICAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgob2xkX3BhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICBvbGRfZGlyID0gbG9va3VwLm5vZGU7CiAgICAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobmV3X3BhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICBuZXdfZGlyID0gbG9va3VwLm5vZGU7CiAgICAgIGlmICghb2xkX2RpciB8fCAhbmV3X2RpcikKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgIGlmIChvbGRfZGlyLm1vdW50ICE9PSBuZXdfZGlyLm1vdW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzUpOwogICAgICB9CiAgICAgIHZhciBvbGRfbm9kZSA9IEZTLmxvb2t1cE5vZGUob2xkX2Rpciwgb2xkX25hbWUpOwogICAgICB2YXIgcmVsYXRpdmUgPSBQQVRIX0ZTLnJlbGF0aXZlKG9sZF9wYXRoLCBuZXdfZGlybmFtZSk7CiAgICAgIGlmIChyZWxhdGl2ZS5jaGFyQXQoMCkgIT09ICIuIikgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICByZWxhdGl2ZSA9IFBBVEhfRlMucmVsYXRpdmUobmV3X3BhdGgsIG9sZF9kaXJuYW1lKTsKICAgICAgaWYgKHJlbGF0aXZlLmNoYXJBdCgwKSAhPT0gIi4iKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTUpOwogICAgICB9CiAgICAgIHZhciBuZXdfbm9kZTsKICAgICAgdHJ5IHsKICAgICAgICBuZXdfbm9kZSA9IEZTLmxvb2t1cE5vZGUobmV3X2RpciwgbmV3X25hbWUpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgIH0KICAgICAgaWYgKG9sZF9ub2RlID09PSBuZXdfbm9kZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgaXNkaXIgPSBGUy5pc0RpcihvbGRfbm9kZS5tb2RlKTsKICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlEZWxldGUob2xkX2Rpciwgb2xkX25hbWUsIGlzZGlyKTsKICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgfQogICAgICBlcnJDb2RlID0gbmV3X25vZGUgPyBGUy5tYXlEZWxldGUobmV3X2RpciwgbmV3X25hbWUsIGlzZGlyKSA6IEZTLm1heUNyZWF0ZShuZXdfZGlyLCBuZXdfbmFtZSk7CiAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgIH0KICAgICAgaWYgKCFvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYzKTsKICAgICAgfQogICAgICBpZiAoRlMuaXNNb3VudHBvaW50KG9sZF9ub2RlKSB8fCBuZXdfbm9kZSAmJiBGUy5pc01vdW50cG9pbnQobmV3X25vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTApOwogICAgICB9CiAgICAgIGlmIChuZXdfZGlyICE9PSBvbGRfZGlyKSB7CiAgICAgICAgZXJyQ29kZSA9IEZTLm5vZGVQZXJtaXNzaW9ucyhvbGRfZGlyLCAidyIpOwogICAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnJDb2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpOwogICAgICB0cnkgewogICAgICAgIG9sZF9kaXIubm9kZV9vcHMucmVuYW1lKG9sZF9ub2RlLCBuZXdfZGlyLCBuZXdfbmFtZSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB0aHJvdyBlOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIEZTLmhhc2hBZGROb2RlKG9sZF9ub2RlKTsKICAgICAgfQogICAgfSwgcm1kaXIocGF0aCkgewogICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IHBhcmVudDogdHJ1ZSB9KTsKICAgICAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOwogICAgICB2YXIgbmFtZSA9IFBBVEguYmFzZW5hbWUocGF0aCk7CiAgICAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOwogICAgICB2YXIgZXJyQ29kZSA9IEZTLm1heURlbGV0ZShwYXJlbnQsIG5hbWUsIHRydWUpOwogICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICB9CiAgICAgIGlmICghcGFyZW50Lm5vZGVfb3BzLnJtZGlyKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICB9CiAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgIH0KICAgICAgcGFyZW50Lm5vZGVfb3BzLnJtZGlyKHBhcmVudCwgbmFtZSk7CiAgICAgIEZTLmRlc3Ryb3lOb2RlKG5vZGUpOwogICAgfSwgcmVhZGRpcihwYXRoKSB7CiAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiB0cnVlIH0pOwogICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICBpZiAoIW5vZGUubm9kZV9vcHMucmVhZGRpcikgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDU0KTsKICAgICAgfQogICAgICByZXR1cm4gbm9kZS5ub2RlX29wcy5yZWFkZGlyKG5vZGUpOwogICAgfSwgdW5saW5rKHBhdGgpIHsKICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBwYXJlbnQ6IHRydWUgfSk7CiAgICAgIHZhciBwYXJlbnQgPSBsb29rdXAubm9kZTsKICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgIH0KICAgICAgdmFyIG5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOwogICAgICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUocGFyZW50LCBuYW1lKTsKICAgICAgdmFyIGVyckNvZGUgPSBGUy5tYXlEZWxldGUocGFyZW50LCBuYW1lLCBmYWxzZSk7CiAgICAgIGlmIChlcnJDb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoZXJyQ29kZSk7CiAgICAgIH0KICAgICAgaWYgKCFwYXJlbnQubm9kZV9vcHMudW5saW5rKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICB9CiAgICAgIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMCk7CiAgICAgIH0KICAgICAgcGFyZW50Lm5vZGVfb3BzLnVubGluayhwYXJlbnQsIG5hbWUpOwogICAgICBGUy5kZXN0cm95Tm9kZShub2RlKTsKICAgIH0sIHJlYWRsaW5rKHBhdGgpIHsKICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCk7CiAgICAgIHZhciBsaW5rID0gbG9va3VwLm5vZGU7CiAgICAgIGlmICghbGluaykgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgfQogICAgICBpZiAoIWxpbmsubm9kZV9vcHMucmVhZGxpbmspIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFBBVEhfRlMucmVzb2x2ZShGUy5nZXRQYXRoKGxpbmsucGFyZW50KSwgbGluay5ub2RlX29wcy5yZWFkbGluayhsaW5rKSk7CiAgICB9LCBzdGF0KHBhdGgsIGRvbnRGb2xsb3cpIHsKICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250Rm9sbG93IH0pOwogICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICBpZiAoIW5vZGUpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgIH0KICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGUubm9kZV9vcHMuZ2V0YXR0cihub2RlKTsKICAgIH0sIGxzdGF0KHBhdGgpIHsKICAgICAgcmV0dXJuIEZTLnN0YXQocGF0aCwgdHJ1ZSk7CiAgICB9LCBjaG1vZChwYXRoLCBtb2RlLCBkb250Rm9sbG93KSB7CiAgICAgIHZhciBub2RlOwogICAgICBpZiAodHlwZW9mIHBhdGggPT0gInN0cmluZyIpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogIWRvbnRGb2xsb3cgfSk7CiAgICAgICAgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUgPSBwYXRoOwogICAgICB9CiAgICAgIGlmICghbm9kZS5ub2RlX29wcy5zZXRhdHRyKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNjMpOwogICAgICB9CiAgICAgIG5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLCB7IG1vZGU6IG1vZGUgJiA0MDk1IHwgbm9kZS5tb2RlICYgfjQwOTUsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgIH0sIGxjaG1vZChwYXRoLCBtb2RlKSB7CiAgICAgIEZTLmNobW9kKHBhdGgsIG1vZGUsIHRydWUpOwogICAgfSwgZmNobW9kKGZkLCBtb2RlKSB7CiAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW1DaGVja2VkKGZkKTsKICAgICAgRlMuY2htb2Qoc3RyZWFtLm5vZGUsIG1vZGUpOwogICAgfSwgY2hvd24ocGF0aCwgdWlkLCBnaWQsIGRvbnRGb2xsb3cpIHsKICAgICAgdmFyIG5vZGU7CiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAic3RyaW5nIikgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiAhZG9udEZvbGxvdyB9KTsKICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZSA9IHBhdGg7CiAgICAgIH0KICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgIH0KICAgICAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgfSwgbGNob3duKHBhdGgsIHVpZCwgZ2lkKSB7CiAgICAgIEZTLmNob3duKHBhdGgsIHVpZCwgZ2lkLCB0cnVlKTsKICAgIH0sIGZjaG93bihmZCwgdWlkLCBnaWQpIHsKICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICBGUy5jaG93bihzdHJlYW0ubm9kZSwgdWlkLCBnaWQpOwogICAgfSwgdHJ1bmNhdGUocGF0aCwgbGVuKSB7CiAgICAgIGlmIChsZW4gPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICB9CiAgICAgIHZhciBub2RlOwogICAgICBpZiAodHlwZW9mIHBhdGggPT0gInN0cmluZyIpIHsKICAgICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7IGZvbGxvdzogdHJ1ZSB9KTsKICAgICAgICBub2RlID0gbG9va3VwLm5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZSA9IHBhdGg7CiAgICAgIH0KICAgICAgaWYgKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig2Myk7CiAgICAgIH0KICAgICAgaWYgKEZTLmlzRGlyKG5vZGUubW9kZSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzMSk7CiAgICAgIH0KICAgICAgaWYgKCFGUy5pc0ZpbGUobm9kZS5tb2RlKSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICB2YXIgZXJyQ29kZSA9IEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLCAidyIpOwogICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICB9CiAgICAgIG5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLCB7IHNpemU6IGxlbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgfSwgZnRydW5jYXRlKGZkLCBsZW4pIHsKICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICBpZiAoKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICB9CiAgICAgIEZTLnRydW5jYXRlKHN0cmVhbS5ub2RlLCBsZW4pOwogICAgfSwgdXRpbWUocGF0aCwgYXRpbWUsIG10aW1lKSB7CiAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiB0cnVlIH0pOwogICAgICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOwogICAgICBub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSwgeyB0aW1lc3RhbXA6IE1hdGgubWF4KGF0aW1lLCBtdGltZSkgfSk7CiAgICB9LCBvcGVuKHBhdGgsIGZsYWdzLCBtb2RlKSB7CiAgICAgIGlmIChwYXRoID09PSAiIikgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgfQogICAgICBmbGFncyA9IHR5cGVvZiBmbGFncyA9PSAic3RyaW5nIiA/IEZTX21vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKSA6IGZsYWdzOwogICAgICBtb2RlID0gdHlwZW9mIG1vZGUgPT0gInVuZGVmaW5lZCIgPyA0MzggOiBtb2RlOwogICAgICBpZiAoZmxhZ3MgJiA2NCkgewogICAgICAgIG1vZGUgPSBtb2RlICYgNDA5NSB8IDMyNzY4OwogICAgICB9IGVsc2UgewogICAgICAgIG1vZGUgPSAwOwogICAgICB9CiAgICAgIHZhciBub2RlOwogICAgICBpZiAodHlwZW9mIHBhdGggPT0gIm9iamVjdCIpIHsKICAgICAgICBub2RlID0gcGF0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXRoID0gUEFUSC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiAhKGZsYWdzICYgMTMxMDcyKSB9KTsKICAgICAgICAgIG5vZGUgPSBsb29rdXAubm9kZTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBjcmVhdGVkID0gZmFsc2U7CiAgICAgIGlmIChmbGFncyAmIDY0KSB7CiAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgIGlmIChmbGFncyAmIDEyOCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUgPSBGUy5ta25vZChwYXRoLCBtb2RlLCAwKTsKICAgICAgICAgIGNyZWF0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIW5vZGUpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgIH0KICAgICAgaWYgKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpIHsKICAgICAgICBmbGFncyAmPSB+NTEyOwogICAgICB9CiAgICAgIGlmIChmbGFncyAmIDY1NTM2ICYmICFGUy5pc0Rpcihub2RlLm1vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTQpOwogICAgICB9CiAgICAgIGlmICghY3JlYXRlZCkgewogICAgICAgIHZhciBlcnJDb2RlID0gRlMubWF5T3Blbihub2RlLCBmbGFncyk7CiAgICAgICAgaWYgKGVyckNvZGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmxhZ3MgJiA1MTIgJiYgIWNyZWF0ZWQpIHsKICAgICAgICBGUy50cnVuY2F0ZShub2RlLCAwKTsKICAgICAgfQogICAgICBmbGFncyAmPSB+KDEyOCB8IDUxMiB8IDEzMTA3Mik7CiAgICAgIHZhciBzdHJlYW0gPSBGUy5jcmVhdGVTdHJlYW0oeyBub2RlLCBwYXRoOiBGUy5nZXRQYXRoKG5vZGUpLCBmbGFncywgc2Vla2FibGU6IHRydWUsIHBvc2l0aW9uOiAwLCBzdHJlYW1fb3BzOiBub2RlLnN0cmVhbV9vcHMsIHVuZ290dGVuOiBbXSwgZXJyb3I6IGZhbHNlIH0pOwogICAgICBpZiAoc3RyZWFtLnN0cmVhbV9vcHMub3BlbikgewogICAgICAgIHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKTsKICAgICAgfQogICAgICBpZiAoTW9kdWxlWyJsb2dSZWFkRmlsZXMiXSAmJiAhKGZsYWdzICYgMSkpIHsKICAgICAgICBpZiAoIUZTLnJlYWRGaWxlcykKICAgICAgICAgIEZTLnJlYWRGaWxlcyA9IHt9OwogICAgICAgIGlmICghKHBhdGggaW4gRlMucmVhZEZpbGVzKSkgewogICAgICAgICAgRlMucmVhZEZpbGVzW3BhdGhdID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0sIGNsb3NlKHN0cmVhbSkgewogICAgICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZ2V0ZGVudHMpCiAgICAgICAgc3RyZWFtLmdldGRlbnRzID0gbnVsbDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoc3RyZWFtLnN0cmVhbV9vcHMuY2xvc2UpIHsKICAgICAgICAgIHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKHN0cmVhbSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBGUy5jbG9zZVN0cmVhbShzdHJlYW0uZmQpOwogICAgICB9CiAgICAgIHN0cmVhbS5mZCA9IG51bGw7CiAgICB9LCBpc0Nsb3NlZChzdHJlYW0pIHsKICAgICAgcmV0dXJuIHN0cmVhbS5mZCA9PT0gbnVsbDsKICAgIH0sIGxsc2VlayhzdHJlYW0sIG9mZnNldCwgd2hlbmNlKSB7CiAgICAgIGlmIChGUy5pc0Nsb3NlZChzdHJlYW0pKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgIH0KICAgICAgaWYgKCFzdHJlYW0uc2Vla2FibGUgfHwgIXN0cmVhbS5zdHJlYW1fb3BzLmxsc2VlaykgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKTsKICAgICAgfQogICAgICBpZiAod2hlbmNlICE9IDAgJiYgd2hlbmNlICE9IDEgJiYgd2hlbmNlICE9IDIpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvc2l0aW9uID0gc3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpOwogICAgICBzdHJlYW0udW5nb3R0ZW4gPSBbXTsKICAgICAgcmV0dXJuIHN0cmVhbS5wb3NpdGlvbjsKICAgIH0sIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikgewogICAgICBpZiAobGVuZ3RoIDwgMCB8fCBwb3NpdGlvbiA8IDApIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOCk7CiAgICAgIH0KICAgICAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgfQogICAgICBpZiAoKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpID09PSAxKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgIH0KICAgICAgaWYgKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMzEpOwogICAgICB9CiAgICAgIGlmICghc3RyZWFtLnN0cmVhbV9vcHMucmVhZCkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICB2YXIgc2Vla2luZyA9IHR5cGVvZiBwb3NpdGlvbiAhPSAidW5kZWZpbmVkIjsKICAgICAgaWYgKCFzZWVraW5nKSB7CiAgICAgICAgcG9zaXRpb24gPSBzdHJlYW0ucG9zaXRpb247CiAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5zZWVrYWJsZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDcwKTsKICAgICAgfQogICAgICB2YXIgYnl0ZXNSZWFkID0gc3RyZWFtLnN0cmVhbV9vcHMucmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsKICAgICAgaWYgKCFzZWVraW5nKQogICAgICAgIHN0cmVhbS5wb3NpdGlvbiArPSBieXRlc1JlYWQ7CiAgICAgIHJldHVybiBieXRlc1JlYWQ7CiAgICB9LCB3cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pIHsKICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgcG9zaXRpb24gPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICB9CiAgICAgIGlmIChGUy5pc0Nsb3NlZChzdHJlYW0pKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgIH0KICAgICAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDgpOwogICAgICB9CiAgICAgIGlmIChGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDMxKTsKICAgICAgfQogICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjgpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc2Vla2FibGUgJiYgc3RyZWFtLmZsYWdzICYgMTAyNCkgewogICAgICAgIEZTLmxsc2VlayhzdHJlYW0sIDAsIDIpOwogICAgICB9CiAgICAgIHZhciBzZWVraW5nID0gdHlwZW9mIHBvc2l0aW9uICE9ICJ1bmRlZmluZWQiOwogICAgICBpZiAoIXNlZWtpbmcpIHsKICAgICAgICBwb3NpdGlvbiA9IHN0cmVhbS5wb3NpdGlvbjsKICAgICAgfSBlbHNlIGlmICghc3RyZWFtLnNlZWthYmxlKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNzApOwogICAgICB9CiAgICAgIHZhciBieXRlc1dyaXR0ZW4gPSBzdHJlYW0uc3RyZWFtX29wcy53cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pOwogICAgICBpZiAoIXNlZWtpbmcpCiAgICAgICAgc3RyZWFtLnBvc2l0aW9uICs9IGJ5dGVzV3JpdHRlbjsKICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKICAgIH0sIGFsbG9jYXRlKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig4KTsKICAgICAgfQogICAgICBpZiAob2Zmc2V0IDwgMCB8fCBsZW5ndGggPD0gMCkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI4KTsKICAgICAgfQogICAgICBpZiAoKHN0cmVhbS5mbGFncyAmIDIwOTcxNTUpID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOCk7CiAgICAgIH0KICAgICAgaWYgKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkgJiYgIUZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDMpOwogICAgICB9CiAgICAgIGlmICghc3RyZWFtLnN0cmVhbV9vcHMuYWxsb2NhdGUpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxMzgpOwogICAgICB9CiAgICAgIHN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpOwogICAgfSwgbW1hcChzdHJlYW0sIGxlbmd0aCwgcG9zaXRpb24sIHByb3QsIGZsYWdzKSB7CiAgICAgIGlmICgocHJvdCAmIDIpICE9PSAwICYmIChmbGFncyAmIDIpID09PSAwICYmIChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSAhPT0gMikgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIpOwogICAgICB9CiAgICAgIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDEpIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyKTsKICAgICAgfQogICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLm1tYXApIHsKICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0Myk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1tYXAoc3RyZWFtLCBsZW5ndGgsIHBvc2l0aW9uLCBwcm90LCBmbGFncyk7CiAgICB9LCBtc3luYyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncykgewogICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmVhbS5zdHJlYW1fb3BzLm1zeW5jKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgbW1hcEZsYWdzKTsKICAgIH0sIG11bm1hcDogKHN0cmVhbSkgPT4gMCwgaW9jdGwoc3RyZWFtLCBjbWQsIGFyZykgewogICAgICBpZiAoIXN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTkpOwogICAgICB9CiAgICAgIHJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5pb2N0bChzdHJlYW0sIGNtZCwgYXJnKTsKICAgIH0sIHJlYWRGaWxlKHBhdGgsIG9wdHMgPSB7fSkgewogICAgICBvcHRzLmZsYWdzID0gb3B0cy5mbGFncyB8fCAwOwogICAgICBvcHRzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZyB8fCAiYmluYXJ5IjsKICAgICAgaWYgKG9wdHMuZW5jb2RpbmcgIT09ICJ1dGY4IiAmJiBvcHRzLmVuY29kaW5nICE9PSAiYmluYXJ5IikgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbmNvZGluZyB0eXBlICIke29wdHMuZW5jb2Rpbmd9ImApOwogICAgICB9CiAgICAgIHZhciByZXQ7CiAgICAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKHBhdGgsIG9wdHMuZmxhZ3MpOwogICAgICB2YXIgc3RhdCA9IEZTLnN0YXQocGF0aCk7CiAgICAgIHZhciBsZW5ndGggPSBzdGF0LnNpemU7CiAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgICBGUy5yZWFkKHN0cmVhbSwgYnVmLCAwLCBsZW5ndGgsIDApOwogICAgICBpZiAob3B0cy5lbmNvZGluZyA9PT0gInV0ZjgiKSB7CiAgICAgICAgcmV0ID0gVVRGOEFycmF5VG9TdHJpbmcoYnVmLCAwKTsKICAgICAgfSBlbHNlIGlmIChvcHRzLmVuY29kaW5nID09PSAiYmluYXJ5IikgewogICAgICAgIHJldCA9IGJ1ZjsKICAgICAgfQogICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICByZXR1cm4gcmV0OwogICAgfSwgd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdHMgPSB7fSkgewogICAgICBvcHRzLmZsYWdzID0gb3B0cy5mbGFncyB8fCA1Nzc7CiAgICAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKHBhdGgsIG9wdHMuZmxhZ3MsIG9wdHMubW9kZSk7CiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAic3RyaW5nIikgewogICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGhCeXRlc1VURjgoZGF0YSkgKyAxKTsKICAgICAgICB2YXIgYWN0dWFsTnVtQnl0ZXMgPSBzdHJpbmdUb1VURjhBcnJheShkYXRhLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOwogICAgICAgIEZTLndyaXRlKHN0cmVhbSwgYnVmLCAwLCBhY3R1YWxOdW1CeXRlcywgdW5kZWZpbmVkLCBvcHRzLmNhbk93bik7CiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7CiAgICAgICAgRlMud3JpdGUoc3RyZWFtLCBkYXRhLCAwLCBkYXRhLmJ5dGVMZW5ndGgsIHVuZGVmaW5lZCwgb3B0cy5jYW5Pd24pOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIik7CiAgICAgIH0KICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgIH0sIGN3ZDogKCkgPT4gRlMuY3VycmVudFBhdGgsIGNoZGlyKHBhdGgpIHsKICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6IHRydWUgfSk7CiAgICAgIGlmIChsb29rdXAubm9kZSA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQ0KTsKICAgICAgfQogICAgICBpZiAoIUZTLmlzRGlyKGxvb2t1cC5ub2RlLm1vZGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNTQpOwogICAgICB9CiAgICAgIHZhciBlcnJDb2RlID0gRlMubm9kZVBlcm1pc3Npb25zKGxvb2t1cC5ub2RlLCAieCIpOwogICAgICBpZiAoZXJyQ29kZSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVyckNvZGUpOwogICAgICB9CiAgICAgIEZTLmN1cnJlbnRQYXRoID0gbG9va3VwLnBhdGg7CiAgICB9LCBjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKSB7CiAgICAgIEZTLm1rZGlyKCIvdG1wIik7CiAgICAgIEZTLm1rZGlyKCIvaG9tZSIpOwogICAgICBGUy5ta2RpcigiL2hvbWUvd2ViX3VzZXIiKTsKICAgIH0sIGNyZWF0ZURlZmF1bHREZXZpY2VzKCkgewogICAgICBGUy5ta2RpcigiL2RldiIpOwogICAgICBGUy5yZWdpc3RlckRldmljZShGUy5tYWtlZGV2KDEsIDMpLCB7IHJlYWQ6ICgpID0+IDAsIHdyaXRlOiAoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpID0+IGxlbmd0aCB9KTsKICAgICAgRlMubWtkZXYoIi9kZXYvbnVsbCIsIEZTLm1ha2VkZXYoMSwgMykpOwogICAgICBUVFkucmVnaXN0ZXIoRlMubWFrZWRldig1LCAwKSwgVFRZLmRlZmF1bHRfdHR5X29wcyk7CiAgICAgIFRUWS5yZWdpc3RlcihGUy5tYWtlZGV2KDYsIDApLCBUVFkuZGVmYXVsdF90dHkxX29wcyk7CiAgICAgIEZTLm1rZGV2KCIvZGV2L3R0eSIsIEZTLm1ha2VkZXYoNSwgMCkpOwogICAgICBGUy5ta2RldigiL2Rldi90dHkxIiwgRlMubWFrZWRldig2LCAwKSk7CiAgICAgIHZhciByYW5kb21CdWZmZXIgPSBuZXcgVWludDhBcnJheSgxMDI0KSwgcmFuZG9tTGVmdCA9IDA7CiAgICAgIHZhciByYW5kb21CeXRlID0gKCkgPT4gewogICAgICAgIGlmIChyYW5kb21MZWZ0ID09PSAwKSB7CiAgICAgICAgICByYW5kb21MZWZ0ID0gcmFuZG9tRmlsbChyYW5kb21CdWZmZXIpLmJ5dGVMZW5ndGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5kb21CdWZmZXJbLS1yYW5kb21MZWZ0XTsKICAgICAgfTsKICAgICAgRlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwgInJhbmRvbSIsIHJhbmRvbUJ5dGUpOwogICAgICBGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCAidXJhbmRvbSIsIHJhbmRvbUJ5dGUpOwogICAgICBGUy5ta2RpcigiL2Rldi9zaG0iKTsKICAgICAgRlMubWtkaXIoIi9kZXYvc2htL3RtcCIpOwogICAgfSwgY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCkgewogICAgICBGUy5ta2RpcigiL3Byb2MiKTsKICAgICAgdmFyIHByb2Nfc2VsZiA9IEZTLm1rZGlyKCIvcHJvYy9zZWxmIik7CiAgICAgIEZTLm1rZGlyKCIvcHJvYy9zZWxmL2ZkIik7CiAgICAgIEZTLm1vdW50KHsgbW91bnQoKSB7CiAgICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGVOb2RlKHByb2Nfc2VsZiwgImZkIiwgMTYzODQgfCA1MTEsIDczKTsKICAgICAgICBub2RlLm5vZGVfb3BzID0geyBsb29rdXAocGFyZW50LCBuYW1lKSB7CiAgICAgICAgICB2YXIgZmQgPSArbmFtZTsKICAgICAgICAgIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW1DaGVja2VkKGZkKTsKICAgICAgICAgIHZhciByZXQgPSB7IHBhcmVudDogbnVsbCwgbW91bnQ6IHsgbW91bnRwb2ludDogImZha2UiIH0sIG5vZGVfb3BzOiB7IHJlYWRsaW5rOiAoKSA9PiBzdHJlYW0ucGF0aCB9IH07CiAgICAgICAgICByZXQucGFyZW50ID0gcmV0OwogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9IH07CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0gfSwge30sICIvcHJvYy9zZWxmL2ZkIik7CiAgICB9LCBjcmVhdGVTdGFuZGFyZFN0cmVhbXMoKSB7CiAgICAgIGlmIChNb2R1bGVbInN0ZGluIl0pIHsKICAgICAgICBGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCAic3RkaW4iLCBNb2R1bGVbInN0ZGluIl0pOwogICAgICB9IGVsc2UgewogICAgICAgIEZTLnN5bWxpbmsoIi9kZXYvdHR5IiwgIi9kZXYvc3RkaW4iKTsKICAgICAgfQogICAgICBpZiAoTW9kdWxlWyJzdGRvdXQiXSkgewogICAgICAgIEZTLmNyZWF0ZURldmljZSgiL2RldiIsICJzdGRvdXQiLCBudWxsLCBNb2R1bGVbInN0ZG91dCJdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBGUy5zeW1saW5rKCIvZGV2L3R0eSIsICIvZGV2L3N0ZG91dCIpOwogICAgICB9CiAgICAgIGlmIChNb2R1bGVbInN0ZGVyciJdKSB7CiAgICAgICAgRlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwgInN0ZGVyciIsIG51bGwsIE1vZHVsZVsic3RkZXJyIl0pOwogICAgICB9IGVsc2UgewogICAgICAgIEZTLnN5bWxpbmsoIi9kZXYvdHR5MSIsICIvZGV2L3N0ZGVyciIpOwogICAgICB9CiAgICAgIHZhciBzdGRpbiA9IEZTLm9wZW4oIi9kZXYvc3RkaW4iLCAwKTsKICAgICAgdmFyIHN0ZG91dCA9IEZTLm9wZW4oIi9kZXYvc3Rkb3V0IiwgMSk7CiAgICAgIHZhciBzdGRlcnIgPSBGUy5vcGVuKCIvZGV2L3N0ZGVyciIsIDEpOwogICAgfSwgZW5zdXJlRXJybm9FcnJvcigpIHsKICAgICAgaWYgKEZTLkVycm5vRXJyb3IpCiAgICAgICAgcmV0dXJuOwogICAgICBGUy5FcnJub0Vycm9yID0gZnVuY3Rpb24gRXJybm9FcnJvcihlcnJubywgbm9kZSkgewogICAgICAgIHRoaXMubmFtZSA9ICJFcnJub0Vycm9yIjsKICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgIHRoaXMuc2V0RXJybm8gPSBmdW5jdGlvbihlcnJubzIpIHsKICAgICAgICAgIHRoaXMuZXJybm8gPSBlcnJubzI7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnNldEVycm5vKGVycm5vKTsKICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiRlMgZXJyb3IiOwogICAgICB9OwogICAgICBGUy5FcnJub0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcjsKICAgICAgRlMuRXJybm9FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGUy5FcnJub0Vycm9yOwogICAgICBbNDRdLmZvckVhY2goKGNvZGUpID0+IHsKICAgICAgICBGUy5nZW5lcmljRXJyb3JzW2NvZGVdID0gbmV3IEZTLkVycm5vRXJyb3IoY29kZSk7CiAgICAgICAgRlMuZ2VuZXJpY0Vycm9yc1tjb2RlXS5zdGFjayA9ICI8Z2VuZXJpYyBlcnJvciwgbm8gc3RhY2s+IjsKICAgICAgfSk7CiAgICB9LCBzdGF0aWNJbml0KCkgewogICAgICBGUy5lbnN1cmVFcnJub0Vycm9yKCk7CiAgICAgIEZTLm5hbWVUYWJsZSA9IG5ldyBBcnJheSg0MDk2KTsKICAgICAgRlMubW91bnQoTUVNRlMsIHt9LCAiLyIpOwogICAgICBGUy5jcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKTsKICAgICAgRlMuY3JlYXRlRGVmYXVsdERldmljZXMoKTsKICAgICAgRlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7CiAgICAgIEZTLmZpbGVzeXN0ZW1zID0geyBNRU1GUyB9OwogICAgfSwgaW5pdChpbnB1dCwgb3V0cHV0LCBlcnJvcikgewogICAgICBGUy5pbml0LmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgRlMuZW5zdXJlRXJybm9FcnJvcigpOwogICAgICBNb2R1bGVbInN0ZGluIl0gPSBpbnB1dCB8fCBNb2R1bGVbInN0ZGluIl07CiAgICAgIE1vZHVsZVsic3Rkb3V0Il0gPSBvdXRwdXQgfHwgTW9kdWxlWyJzdGRvdXQiXTsKICAgICAgTW9kdWxlWyJzdGRlcnIiXSA9IGVycm9yIHx8IE1vZHVsZVsic3RkZXJyIl07CiAgICAgIEZTLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpOwogICAgfSwgcXVpdCgpIHsKICAgICAgRlMuaW5pdC5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgRlMuc3RyZWFtcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzdHJlYW0gPSBGUy5zdHJlYW1zW2ldOwogICAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgRlMuY2xvc2Uoc3RyZWFtKTsKICAgICAgfQogICAgfSwgZmluZE9iamVjdChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKSB7CiAgICAgIHZhciByZXQgPSBGUy5hbmFseXplUGF0aChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKTsKICAgICAgaWYgKCFyZXQuZXhpc3RzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHJldC5vYmplY3Q7CiAgICB9LCBhbmFseXplUGF0aChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgeyBmb2xsb3c6ICFkb250UmVzb2x2ZUxhc3RMaW5rIH0pOwogICAgICAgIHBhdGggPSBsb29rdXAucGF0aDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICB9CiAgICAgIHZhciByZXQgPSB7IGlzUm9vdDogZmFsc2UsIGV4aXN0czogZmFsc2UsIGVycm9yOiAwLCBuYW1lOiBudWxsLCBwYXRoOiBudWxsLCBvYmplY3Q6IG51bGwsIHBhcmVudEV4aXN0czogZmFsc2UsIHBhcmVudFBhdGg6IG51bGwsIHBhcmVudE9iamVjdDogbnVsbCB9OwogICAgICB0cnkgewogICAgICAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgIHJldC5wYXJlbnRFeGlzdHMgPSB0cnVlOwogICAgICAgIHJldC5wYXJlbnRQYXRoID0gbG9va3VwLnBhdGg7CiAgICAgICAgcmV0LnBhcmVudE9iamVjdCA9IGxvb2t1cC5ub2RlOwogICAgICAgIHJldC5uYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsKICAgICAgICBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsgZm9sbG93OiAhZG9udFJlc29sdmVMYXN0TGluayB9KTsKICAgICAgICByZXQuZXhpc3RzID0gdHJ1ZTsKICAgICAgICByZXQucGF0aCA9IGxvb2t1cC5wYXRoOwogICAgICAgIHJldC5vYmplY3QgPSBsb29rdXAubm9kZTsKICAgICAgICByZXQubmFtZSA9IGxvb2t1cC5ub2RlLm5hbWU7CiAgICAgICAgcmV0LmlzUm9vdCA9IGxvb2t1cC5wYXRoID09PSAiLyI7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXQuZXJyb3IgPSBlLmVycm5vOwogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9LCBjcmVhdGVQYXRoKHBhcmVudCwgcGF0aCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsKICAgICAgcGFyZW50ID0gdHlwZW9mIHBhcmVudCA9PSAic3RyaW5nIiA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KTsKICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgiLyIpLnJldmVyc2UoKTsKICAgICAgd2hpbGUgKHBhcnRzLmxlbmd0aCkgewogICAgICAgIHZhciBwYXJ0ID0gcGFydHMucG9wKCk7CiAgICAgICAgaWYgKCFwYXJ0KQogICAgICAgICAgY29udGludWU7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBQQVRILmpvaW4yKHBhcmVudCwgcGFydCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIEZTLm1rZGlyKGN1cnJlbnQpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB9CiAgICAgICAgcGFyZW50ID0gY3VycmVudDsKICAgICAgfQogICAgICByZXR1cm4gY3VycmVudDsKICAgIH0sIGNyZWF0ZUZpbGUocGFyZW50LCBuYW1lLCBwcm9wZXJ0aWVzLCBjYW5SZWFkLCBjYW5Xcml0ZSkgewogICAgICB2YXIgcGF0aCA9IFBBVEguam9pbjIodHlwZW9mIHBhcmVudCA9PSAic3RyaW5nIiA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KSwgbmFtZSk7CiAgICAgIHZhciBtb2RlID0gRlNfZ2V0TW9kZShjYW5SZWFkLCBjYW5Xcml0ZSk7CiAgICAgIHJldHVybiBGUy5jcmVhdGUocGF0aCwgbW9kZSk7CiAgICB9LCBjcmVhdGVEYXRhRmlsZShwYXJlbnQsIG5hbWUsIGRhdGEsIGNhblJlYWQsIGNhbldyaXRlLCBjYW5Pd24pIHsKICAgICAgdmFyIHBhdGggPSBuYW1lOwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgcGFyZW50ID0gdHlwZW9mIHBhcmVudCA9PSAic3RyaW5nIiA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KTsKICAgICAgICBwYXRoID0gbmFtZSA/IFBBVEguam9pbjIocGFyZW50LCBuYW1lKSA6IHBhcmVudDsKICAgICAgfQogICAgICB2YXIgbW9kZSA9IEZTX2dldE1vZGUoY2FuUmVhZCwgY2FuV3JpdGUpOwogICAgICB2YXIgbm9kZSA9IEZTLmNyZWF0ZShwYXRoLCBtb2RlKTsKICAgICAgaWYgKGRhdGEpIHsKICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gInN0cmluZyIpIHsKICAgICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRhdGEubGVuZ3RoO2kgPCBsZW47ICsraSkKICAgICAgICAgICAgYXJyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgZGF0YSA9IGFycjsKICAgICAgICB9CiAgICAgICAgRlMuY2htb2Qobm9kZSwgbW9kZSB8IDE0Nik7CiAgICAgICAgdmFyIHN0cmVhbSA9IEZTLm9wZW4obm9kZSwgNTc3KTsKICAgICAgICBGUy53cml0ZShzdHJlYW0sIGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwLCBjYW5Pd24pOwogICAgICAgIEZTLmNsb3NlKHN0cmVhbSk7CiAgICAgICAgRlMuY2htb2Qobm9kZSwgbW9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LCBjcmVhdGVEZXZpY2UocGFyZW50LCBuYW1lLCBpbnB1dCwgb3V0cHV0KSB7CiAgICAgIHZhciBwYXRoID0gUEFUSC5qb2luMih0eXBlb2YgcGFyZW50ID09ICJzdHJpbmciID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpLCBuYW1lKTsKICAgICAgdmFyIG1vZGUgPSBGU19nZXRNb2RlKCEhaW5wdXQsICEhb3V0cHV0KTsKICAgICAgaWYgKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpCiAgICAgICAgRlMuY3JlYXRlRGV2aWNlLm1ham9yID0gNjQ7CiAgICAgIHZhciBkZXYgPSBGUy5tYWtlZGV2KEZTLmNyZWF0ZURldmljZS5tYWpvcisrLCAwKTsKICAgICAgRlMucmVnaXN0ZXJEZXZpY2UoZGV2LCB7IG9wZW4oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLnNlZWthYmxlID0gZmFsc2U7CiAgICAgIH0sIGNsb3NlKHN0cmVhbSkgewogICAgICAgIGlmIChvdXRwdXQgJiYgb3V0cHV0LmJ1ZmZlciAmJiBvdXRwdXQuYnVmZmVyLmxlbmd0aCkgewogICAgICAgICAgb3V0cHV0KDEwKTsKICAgICAgICB9CiAgICAgIH0sIHJlYWQoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpIHsKICAgICAgICB2YXIgYnl0ZXNSZWFkID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSBpbnB1dCgpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgYnl0ZXNSZWFkID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDYpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBieXRlc1JlYWQrKzsKICAgICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaWYgKGJ5dGVzUmVhZCkgewogICAgICAgICAgc3RyZWFtLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKICAgICAgfSwgd3JpdGUoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dHB1dChidWZmZXJbb2Zmc2V0ICsgaV0pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChsZW5ndGgpIHsKICAgICAgICAgIHN0cmVhbS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgICB9IH0pOwogICAgICByZXR1cm4gRlMubWtkZXYocGF0aCwgbW9kZSwgZGV2KTsKICAgIH0sIGZvcmNlTG9hZEZpbGUob2JqKSB7CiAgICAgIGlmIChvYmouaXNEZXZpY2UgfHwgb2JqLmlzRm9sZGVyIHx8IG9iai5saW5rIHx8IG9iai5jb250ZW50cykKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAidW5kZWZpbmVkIikgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTGF6eSBsb2FkaW5nIHNob3VsZCBoYXZlIGJlZW4gcGVyZm9ybWVkIChjb250ZW50cyBzZXQpIGluIGNyZWF0ZUxhenlGaWxlLCBidXQgaXQgd2FzIG5vdC4gTGF6eSBsb2FkaW5nIG9ubHkgd29ya3MgaW4gd2ViIHdvcmtlcnMuIFVzZSAtLWVtYmVkLWZpbGUgb3IgLS1wcmVsb2FkLWZpbGUgaW4gZW1jYyBvbiB0aGUgbWFpbiB0aHJlYWQuIik7CiAgICAgIH0gZWxzZSBpZiAocmVhZF8pIHsKICAgICAgICB0cnkgewogICAgICAgICAgb2JqLmNvbnRlbnRzID0gaW50QXJyYXlGcm9tU3RyaW5nKHJlYWRfKG9iai51cmwpLCB0cnVlKTsKICAgICAgICAgIG9iai51c2VkQnl0ZXMgPSBvYmouY29udGVudHMubGVuZ3RoOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbG9hZCB3aXRob3V0IHJlYWQoKSBvciBYTUxIdHRwUmVxdWVzdC4iKTsKICAgICAgfQogICAgfSwgY3JlYXRlTGF6eUZpbGUocGFyZW50LCBuYW1lLCB1cmwsIGNhblJlYWQsIGNhbldyaXRlKSB7CiAgICAgIGZ1bmN0aW9uIExhenlVaW50OEFycmF5KCkgewogICAgICAgIHRoaXMubGVuZ3RoS25vd24gPSBmYWxzZTsKICAgICAgICB0aGlzLmNodW5rcyA9IFtdOwogICAgICB9CiAgICAgIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9nZXQoaWR4KSB7CiAgICAgICAgaWYgKGlkeCA+IHRoaXMubGVuZ3RoIC0gMSB8fCBpZHggPCAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBjaHVua09mZnNldCA9IGlkeCAlIHRoaXMuY2h1bmtTaXplOwogICAgICAgIHZhciBjaHVua051bSA9IGlkeCAvIHRoaXMuY2h1bmtTaXplIHwgMDsKICAgICAgICByZXR1cm4gdGhpcy5nZXR0ZXIoY2h1bmtOdW0pW2NodW5rT2Zmc2V0XTsKICAgICAgfTsKICAgICAgTGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLnNldERhdGFHZXR0ZXIgPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9zZXREYXRhR2V0dGVyKGdldHRlcikgewogICAgICAgIHRoaXMuZ2V0dGVyID0gZ2V0dGVyOwogICAgICB9OwogICAgICBMYXp5VWludDhBcnJheS5wcm90b3R5cGUuY2FjaGVMZW5ndGggPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpIHsKICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0OwogICAgICAgIHhoci5vcGVuKCJIRUFEIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgaWYgKCEoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIgKyB1cmwgKyAiLiBTdGF0dXM6ICIgKyB4aHIuc3RhdHVzKTsKICAgICAgICB2YXIgZGF0YWxlbmd0aCA9IE51bWJlcih4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIikpOwogICAgICAgIHZhciBoZWFkZXI7CiAgICAgICAgdmFyIGhhc0J5dGVTZXJ2aW5nID0gKGhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiQWNjZXB0LVJhbmdlcyIpKSAmJiBoZWFkZXIgPT09ICJieXRlcyI7CiAgICAgICAgdmFyIHVzZXNHemlwID0gKGhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSAmJiBoZWFkZXIgPT09ICJnemlwIjsKICAgICAgICB2YXIgY2h1bmtTaXplID0gMTAyNCAqIDEwMjQ7CiAgICAgICAgaWYgKCFoYXNCeXRlU2VydmluZykKICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGg7CiAgICAgICAgdmFyIGRvWEhSID0gKGZyb20sIHRvKSA9PiB7CiAgICAgICAgICBpZiAoZnJvbSA+IHRvKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIgKyBmcm9tICsgIiwgIiArIHRvICsgIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpOwogICAgICAgICAgaWYgKHRvID4gZGF0YWxlbmd0aCAtIDEpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigib25seSAiICsgZGF0YWxlbmd0aCArICIgYnl0ZXMgYXZhaWxhYmxlISBwcm9ncmFtbWVyIGVycm9yISIpOwogICAgICAgICAgdmFyIHhocjIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7CiAgICAgICAgICB4aHIyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgaWYgKGRhdGFsZW5ndGggIT09IGNodW5rU2l6ZSkKICAgICAgICAgICAgeGhyMi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsICJieXRlcz0iICsgZnJvbSArICItIiArIHRvKTsKICAgICAgICAgIHhocjIucmVzcG9uc2VUeXBlID0gImFycmF5YnVmZmVyIjsKICAgICAgICAgIGlmICh4aHIyLm92ZXJyaWRlTWltZVR5cGUpIHsKICAgICAgICAgICAgeGhyMi5vdmVycmlkZU1pbWVUeXBlKCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkIik7CiAgICAgICAgICB9CiAgICAgICAgICB4aHIyLnNlbmQobnVsbCk7CiAgICAgICAgICBpZiAoISh4aHIyLnN0YXR1cyA+PSAyMDAgJiYgeGhyMi5zdGF0dXMgPCAzMDAgfHwgeGhyMi5zdGF0dXMgPT09IDMwNCkpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiICsgdXJsICsgIi4gU3RhdHVzOiAiICsgeGhyMi5zdGF0dXMpOwogICAgICAgICAgaWYgKHhocjIucmVzcG9uc2UgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyMi5yZXNwb25zZSB8fCBbXSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaW50QXJyYXlGcm9tU3RyaW5nKHhocjIucmVzcG9uc2VUZXh0IHx8ICIiLCB0cnVlKTsKICAgICAgICB9OwogICAgICAgIHZhciBsYXp5QXJyYXkyID0gdGhpczsKICAgICAgICBsYXp5QXJyYXkyLnNldERhdGFHZXR0ZXIoKGNodW5rTnVtKSA9PiB7CiAgICAgICAgICB2YXIgc3RhcnQgPSBjaHVua051bSAqIGNodW5rU2l6ZTsKICAgICAgICAgIHZhciBlbmQgPSAoY2h1bmtOdW0gKyAxKSAqIGNodW5rU2l6ZSAtIDE7CiAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGRhdGFsZW5ndGggLSAxKTsKICAgICAgICAgIGlmICh0eXBlb2YgbGF6eUFycmF5Mi5jaHVua3NbY2h1bmtOdW1dID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIGxhenlBcnJheTIuY2h1bmtzW2NodW5rTnVtXSA9IGRvWEhSKHN0YXJ0LCBlbmQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBsYXp5QXJyYXkyLmNodW5rc1tjaHVua051bV0gPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiZG9YSFIgZmFpbGVkISIpOwogICAgICAgICAgcmV0dXJuIGxhenlBcnJheTIuY2h1bmtzW2NodW5rTnVtXTsKICAgICAgICB9KTsKICAgICAgICBpZiAodXNlc0d6aXAgfHwgIWRhdGFsZW5ndGgpIHsKICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGggPSAxOwogICAgICAgICAgZGF0YWxlbmd0aCA9IHRoaXMuZ2V0dGVyKDApLmxlbmd0aDsKICAgICAgICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGg7CiAgICAgICAgICBvdXQoIkxhenlGaWxlcyBvbiBnemlwIGZvcmNlcyBkb3dubG9hZCBvZiB0aGUgd2hvbGUgZmlsZSB3aGVuIGxlbmd0aCBpcyBhY2Nlc3NlZCIpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9sZW5ndGggPSBkYXRhbGVuZ3RoOwogICAgICAgIHRoaXMuX2NodW5rU2l6ZSA9IGNodW5rU2l6ZTsKICAgICAgICB0aGlzLmxlbmd0aEtub3duID0gdHJ1ZTsKICAgICAgfTsKICAgICAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPSAidW5kZWZpbmVkIikgewogICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfV09SS0VSKQogICAgICAgICAgdGhyb3cgIkNhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2MiOwogICAgICAgIHZhciBsYXp5QXJyYXkgPSBuZXcgTGF6eVVpbnQ4QXJyYXk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eUFycmF5LCB7IGxlbmd0aDogeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCF0aGlzLmxlbmd0aEtub3duKSB7CiAgICAgICAgICAgIHRoaXMuY2FjaGVMZW5ndGgoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLl9sZW5ndGg7CiAgICAgICAgfSB9LCBjaHVua1NpemU6IHsgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghdGhpcy5sZW5ndGhLbm93bikgewogICAgICAgICAgICB0aGlzLmNhY2hlTGVuZ3RoKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplOwogICAgICAgIH0gfSB9KTsKICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgaXNEZXZpY2U6IGZhbHNlLCBjb250ZW50czogbGF6eUFycmF5IH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7IGlzRGV2aWNlOiBmYWxzZSwgdXJsIH07CiAgICAgIH0KICAgICAgdmFyIG5vZGUgPSBGUy5jcmVhdGVGaWxlKHBhcmVudCwgbmFtZSwgcHJvcGVydGllcywgY2FuUmVhZCwgY2FuV3JpdGUpOwogICAgICBpZiAocHJvcGVydGllcy5jb250ZW50cykgewogICAgICAgIG5vZGUuY29udGVudHMgPSBwcm9wZXJ0aWVzLmNvbnRlbnRzOwogICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMudXJsKSB7CiAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7CiAgICAgICAgbm9kZS51cmwgPSBwcm9wZXJ0aWVzLnVybDsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhub2RlLCB7IHVzZWRCeXRlczogeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLmxlbmd0aDsKICAgICAgfSB9IH0pOwogICAgICB2YXIgc3RyZWFtX29wcyA9IHt9OwogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUuc3RyZWFtX29wcyk7CiAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgICAgdmFyIGZuID0gbm9kZS5zdHJlYW1fb3BzW2tleV07CiAgICAgICAgc3RyZWFtX29wc1trZXldID0gZnVuY3Rpb24gZm9yY2VMb2FkTGF6eUZpbGUoKSB7CiAgICAgICAgICBGUy5mb3JjZUxvYWRGaWxlKG5vZGUpOwogICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIGZ1bmN0aW9uIHdyaXRlQ2h1bmtzKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsKICAgICAgICB2YXIgY29udGVudHMgPSBzdHJlYW0ubm9kZS5jb250ZW50czsKICAgICAgICBpZiAocG9zaXRpb24gPj0gY29udGVudHMubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgdmFyIHNpemUgPSBNYXRoLm1pbihjb250ZW50cy5sZW5ndGggLSBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgICBpZiAoY29udGVudHMuc2xpY2UpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gY29udGVudHNbcG9zaXRpb24gKyBpXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IHNpemU7IGkrKykgewogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBjb250ZW50cy5nZXQocG9zaXRpb24gKyBpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgIH0KICAgICAgc3RyZWFtX29wcy5yZWFkID0gKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pID0+IHsKICAgICAgICBGUy5mb3JjZUxvYWRGaWxlKG5vZGUpOwogICAgICAgIHJldHVybiB3cml0ZUNodW5rcyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsKICAgICAgfTsKICAgICAgc3RyZWFtX29wcy5tbWFwID0gKHN0cmVhbSwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpID0+IHsKICAgICAgICBGUy5mb3JjZUxvYWRGaWxlKG5vZGUpOwogICAgICAgIHZhciBwdHIgPSBtbWFwQWxsb2MobGVuZ3RoKTsKICAgICAgICBpZiAoIXB0cikgewogICAgICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDgpOwogICAgICAgIH0KICAgICAgICB3cml0ZUNodW5rcyhzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbmd0aCwgcG9zaXRpb24pOwogICAgICAgIHJldHVybiB7IHB0ciwgYWxsb2NhdGVkOiB0cnVlIH07CiAgICAgIH07CiAgICAgIG5vZGUuc3RyZWFtX29wcyA9IHN0cmVhbV9vcHM7CiAgICAgIHJldHVybiBub2RlOwogICAgfSB9OwogICAgdmFyIFNZU0NBTExTID0geyBERUZBVUxUX1BPTExNQVNLOiA1LCBjYWxjdWxhdGVBdChkaXJmZCwgcGF0aCwgYWxsb3dFbXB0eSkgewogICAgICBpZiAoUEFUSC5pc0FicyhwYXRoKSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHZhciBkaXI7CiAgICAgIGlmIChkaXJmZCA9PT0gLTEwMCkgewogICAgICAgIGRpciA9IEZTLmN3ZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBkaXJzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZGlyZmQpOwogICAgICAgIGRpciA9IGRpcnN0cmVhbS5wYXRoOwogICAgICB9CiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgaWYgKCFhbGxvd0VtcHR5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0NCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkaXI7CiAgICAgIH0KICAgICAgcmV0dXJuIFBBVEguam9pbjIoZGlyLCBwYXRoKTsKICAgIH0sIGRvU3RhdChmdW5jLCBwYXRoLCBidWYpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RhdCA9IGZ1bmMocGF0aCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSAmJiBlLm5vZGUgJiYgUEFUSC5ub3JtYWxpemUocGF0aCkgIT09IFBBVEgubm9ybWFsaXplKEZTLmdldFBhdGgoZS5ub2RlKSkpIHsKICAgICAgICAgIHJldHVybiAtNTQ7CiAgICAgICAgfQogICAgICAgIHRocm93IGU7CiAgICAgIH0KICAgICAgSEVBUDMyW2J1ZiA+PiAyXSA9IHN0YXQuZGV2OwogICAgICBIRUFQMzJbYnVmICsgNCA+PiAyXSA9IHN0YXQubW9kZTsKICAgICAgSEVBUFUzMltidWYgKyA4ID4+IDJdID0gc3RhdC5ubGluazsKICAgICAgSEVBUDMyW2J1ZiArIDEyID4+IDJdID0gc3RhdC51aWQ7CiAgICAgIEhFQVAzMltidWYgKyAxNiA+PiAyXSA9IHN0YXQuZ2lkOwogICAgICBIRUFQMzJbYnVmICsgMjAgPj4gMl0gPSBzdGF0LnJkZXY7CiAgICAgIHRlbXBJNjQgPSBbc3RhdC5zaXplID4+PiAwLCAodGVtcERvdWJsZSA9IHN0YXQuc2l6ZSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2J1ZiArIDI0ID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW2J1ZiArIDI4ID4+IDJdID0gdGVtcEk2NFsxXTsKICAgICAgSEVBUDMyW2J1ZiArIDMyID4+IDJdID0gNDA5NjsKICAgICAgSEVBUDMyW2J1ZiArIDM2ID4+IDJdID0gc3RhdC5ibG9ja3M7CiAgICAgIHZhciBhdGltZSA9IHN0YXQuYXRpbWUuZ2V0VGltZSgpOwogICAgICB2YXIgbXRpbWUgPSBzdGF0Lm10aW1lLmdldFRpbWUoKTsKICAgICAgdmFyIGN0aW1lID0gc3RhdC5jdGltZS5nZXRUaW1lKCk7CiAgICAgIHRlbXBJNjQgPSBbTWF0aC5mbG9vcihhdGltZSAvIDEwMDApID4+PiAwLCAodGVtcERvdWJsZSA9IE1hdGguZmxvb3IoYXRpbWUgLyAxMDAwKSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2J1ZiArIDQwID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW2J1ZiArIDQ0ID4+IDJdID0gdGVtcEk2NFsxXTsKICAgICAgSEVBUFUzMltidWYgKyA0OCA+PiAyXSA9IGF0aW1lICUgMTAwMCAqIDEwMDA7CiAgICAgIHRlbXBJNjQgPSBbTWF0aC5mbG9vcihtdGltZSAvIDEwMDApID4+PiAwLCAodGVtcERvdWJsZSA9IE1hdGguZmxvb3IobXRpbWUgLyAxMDAwKSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2J1ZiArIDU2ID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW2J1ZiArIDYwID4+IDJdID0gdGVtcEk2NFsxXTsKICAgICAgSEVBUFUzMltidWYgKyA2NCA+PiAyXSA9IG10aW1lICUgMTAwMCAqIDEwMDA7CiAgICAgIHRlbXBJNjQgPSBbTWF0aC5mbG9vcihjdGltZSAvIDEwMDApID4+PiAwLCAodGVtcERvdWJsZSA9IE1hdGguZmxvb3IoY3RpbWUgLyAxMDAwKSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2J1ZiArIDcyID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW2J1ZiArIDc2ID4+IDJdID0gdGVtcEk2NFsxXTsKICAgICAgSEVBUFUzMltidWYgKyA4MCA+PiAyXSA9IGN0aW1lICUgMTAwMCAqIDEwMDA7CiAgICAgIHRlbXBJNjQgPSBbc3RhdC5pbm8gPj4+IDAsICh0ZW1wRG91YmxlID0gc3RhdC5pbm8sICtNYXRoLmFicyh0ZW1wRG91YmxlKSA+PSAxID8gdGVtcERvdWJsZSA+IDAgPyArTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NikgPj4+IDAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAgOiAwKV0sIEhFQVAzMltidWYgKyA4OCA+PiAyXSA9IHRlbXBJNjRbMF0sIEhFQVAzMltidWYgKyA5MiA+PiAyXSA9IHRlbXBJNjRbMV07CiAgICAgIHJldHVybiAwOwogICAgfSwgZG9Nc3luYyhhZGRyLCBzdHJlYW0sIGxlbiwgZmxhZ3MsIG9mZnNldCkgewogICAgICBpZiAoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkgewogICAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDQzKTsKICAgICAgfQogICAgICBpZiAoZmxhZ3MgJiAyKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgdmFyIGJ1ZmZlciA9IEhFQVBVOC5zbGljZShhZGRyLCBhZGRyICsgbGVuKTsKICAgICAgRlMubXN5bmMoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuLCBmbGFncyk7CiAgICB9LCB2YXJhcmdzOiB1bmRlZmluZWQsIGdldCgpIHsKICAgICAgdmFyIHJldCA9IEhFQVAzMlsrU1lTQ0FMTFMudmFyYXJncyA+PiAyXTsKICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICByZXR1cm4gcmV0OwogICAgfSwgZ2V0cCgpIHsKICAgICAgcmV0dXJuIFNZU0NBTExTLmdldCgpOwogICAgfSwgZ2V0U3RyKHB0cikgewogICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgIHJldHVybiByZXQ7CiAgICB9LCBnZXRTdHJlYW1Gcm9tRkQoZmQpIHsKICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbUNoZWNrZWQoZmQpOwogICAgICByZXR1cm4gc3RyZWFtOwogICAgfSB9OwogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9mY250bDY0KGZkLCBjbWQsIHZhcmFyZ3MpIHsKICAgICAgU1lTQ0FMTFMudmFyYXJncyA9IHZhcmFyZ3M7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgc3dpdGNoIChjbWQpIHsKICAgICAgICAgIGNhc2UgMDogewogICAgICAgICAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0KCk7CiAgICAgICAgICAgIGlmIChhcmcgPCAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIC0yODsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoRlMuc3RyZWFtc1thcmddKSB7CiAgICAgICAgICAgICAgYXJnKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG5ld1N0cmVhbTsKICAgICAgICAgICAgbmV3U3RyZWFtID0gRlMuY3JlYXRlU3RyZWFtKHN0cmVhbSwgYXJnKTsKICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmVhbS5mZDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMToKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0uZmxhZ3M7CiAgICAgICAgICBjYXNlIDQ6IHsKICAgICAgICAgICAgdmFyIGFyZyA9IFNZU0NBTExTLmdldCgpOwogICAgICAgICAgICBzdHJlYW0uZmxhZ3MgfD0gYXJnOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgNTogewogICAgICAgICAgICB2YXIgYXJnID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgSEVBUDE2W2FyZyArIG9mZnNldCA+PiAxXSA9IDI7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICByZXR1cm4gLTI4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gInVuZGVmaW5lZCIgfHwgIShlLm5hbWUgPT09ICJFcnJub0Vycm9yIikpCiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgdmFyIHN0cmluZ1RvVVRGOCA9IChzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSA9PiBzdHJpbmdUb1VURjhBcnJheShzdHIsIEhFQVBVOCwgb3V0UHRyLCBtYXhCeXRlc1RvV3JpdGUpOwogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9nZXRkZW50czY0KGZkLCBkaXJwLCBjb3VudCkgewogICAgICB0cnkgewogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIGlmICghc3RyZWFtLmdldGRlbnRzKSB7CiAgICAgICAgICBzdHJlYW0uZ2V0ZGVudHMgPSBGUy5yZWFkZGlyKHN0cmVhbS5wYXRoKTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0cnVjdF9zaXplID0gMjgwOwogICAgICAgIHZhciBwb3MgPSAwOwogICAgICAgIHZhciBvZmYgPSBGUy5sbHNlZWsoc3RyZWFtLCAwLCAxKTsKICAgICAgICB2YXIgaWR4ID0gTWF0aC5mbG9vcihvZmYgLyBzdHJ1Y3Rfc2l6ZSk7CiAgICAgICAgd2hpbGUgKGlkeCA8IHN0cmVhbS5nZXRkZW50cy5sZW5ndGggJiYgcG9zICsgc3RydWN0X3NpemUgPD0gY291bnQpIHsKICAgICAgICAgIHZhciBpZDsKICAgICAgICAgIHZhciB0eXBlOwogICAgICAgICAgdmFyIG5hbWUgPSBzdHJlYW0uZ2V0ZGVudHNbaWR4XTsKICAgICAgICAgIGlmIChuYW1lID09PSAiLiIpIHsKICAgICAgICAgICAgaWQgPSBzdHJlYW0ubm9kZS5pZDsKICAgICAgICAgICAgdHlwZSA9IDQ7CiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICIuLiIpIHsKICAgICAgICAgICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgoc3RyZWFtLnBhdGgsIHsgcGFyZW50OiB0cnVlIH0pOwogICAgICAgICAgICBpZCA9IGxvb2t1cC5ub2RlLmlkOwogICAgICAgICAgICB0eXBlID0gNDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IEZTLmxvb2t1cE5vZGUoc3RyZWFtLm5vZGUsIG5hbWUpOwogICAgICAgICAgICBpZCA9IGNoaWxkLmlkOwogICAgICAgICAgICB0eXBlID0gRlMuaXNDaHJkZXYoY2hpbGQubW9kZSkgPyAyIDogRlMuaXNEaXIoY2hpbGQubW9kZSkgPyA0IDogRlMuaXNMaW5rKGNoaWxkLm1vZGUpID8gMTAgOiA4OwogICAgICAgICAgfQogICAgICAgICAgdGVtcEk2NCA9IFtpZCA+Pj4gMCwgKHRlbXBEb3VibGUgPSBpZCwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2RpcnAgKyBwb3MgPj4gMl0gPSB0ZW1wSTY0WzBdLCBIRUFQMzJbZGlycCArIHBvcyArIDQgPj4gMl0gPSB0ZW1wSTY0WzFdOwogICAgICAgICAgdGVtcEk2NCA9IFsoaWR4ICsgMSkgKiBzdHJ1Y3Rfc2l6ZSA+Pj4gMCwgKHRlbXBEb3VibGUgPSAoaWR4ICsgMSkgKiBzdHJ1Y3Rfc2l6ZSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/ICtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXSwgSEVBUDMyW2RpcnAgKyBwb3MgKyA4ID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW2RpcnAgKyBwb3MgKyAxMiA+PiAyXSA9IHRlbXBJNjRbMV07CiAgICAgICAgICBIRUFQMTZbZGlycCArIHBvcyArIDE2ID4+IDFdID0gMjgwOwogICAgICAgICAgSEVBUDhbZGlycCArIHBvcyArIDE4ID4+IDBdID0gdHlwZTsKICAgICAgICAgIHN0cmluZ1RvVVRGOChuYW1lLCBkaXJwICsgcG9zICsgMTksIDI1Nik7CiAgICAgICAgICBwb3MgKz0gc3RydWN0X3NpemU7CiAgICAgICAgICBpZHggKz0gMTsKICAgICAgICB9CiAgICAgICAgRlMubGxzZWVrKHN0cmVhbSwgaWR4ICogc3RydWN0X3NpemUsIDApOwogICAgICAgIHJldHVybiBwb3M7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICJ1bmRlZmluZWQiIHx8ICEoZS5uYW1lID09PSAiRXJybm9FcnJvciIpKQogICAgICAgICAgdGhyb3cgZTsKICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9fX3N5c2NhbGxfaW9jdGwoZmQsIG9wLCB2YXJhcmdzKSB7CiAgICAgIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOwogICAgICB0cnkgewogICAgICAgIHZhciBzdHJlYW0gPSBTWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoZmQpOwogICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgIGNhc2UgMjE1MDk6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KQogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUwNTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpCiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgaWYgKHN0cmVhbS50dHkub3BzLmlvY3RsX3RjZ2V0cykgewogICAgICAgICAgICAgIHZhciB0ZXJtaW9zID0gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNnZXRzKHN0cmVhbSk7CiAgICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgICAgSEVBUDMyW2FyZ3AgPj4gMl0gPSB0ZXJtaW9zLmNfaWZsYWcgfHwgMDsKICAgICAgICAgICAgICBIRUFQMzJbYXJncCArIDQgPj4gMl0gPSB0ZXJtaW9zLmNfb2ZsYWcgfHwgMDsKICAgICAgICAgICAgICBIRUFQMzJbYXJncCArIDggPj4gMl0gPSB0ZXJtaW9zLmNfY2ZsYWcgfHwgMDsKICAgICAgICAgICAgICBIRUFQMzJbYXJncCArIDEyID4+IDJdID0gdGVybWlvcy5jX2xmbGFnIHx8IDA7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IDMyOyBpKyspIHsKICAgICAgICAgICAgICAgIEhFQVA4W2FyZ3AgKyBpICsgMTcgPj4gMF0gPSB0ZXJtaW9zLmNfY2NbaV0gfHwgMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTEwOgogICAgICAgICAgY2FzZSAyMTUxMToKICAgICAgICAgIGNhc2UgMjE1MTI6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KQogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUwNjoKICAgICAgICAgIGNhc2UgMjE1MDc6CiAgICAgICAgICBjYXNlIDIxNTA4OiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICBpZiAoc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNzZXRzKSB7CiAgICAgICAgICAgICAgdmFyIGFyZ3AgPSBTWVNDQUxMUy5nZXRwKCk7CiAgICAgICAgICAgICAgdmFyIGNfaWZsYWcgPSBIRUFQMzJbYXJncCA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19vZmxhZyA9IEhFQVAzMlthcmdwICsgNCA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19jZmxhZyA9IEhFQVAzMlthcmdwICsgOCA+PiAyXTsKICAgICAgICAgICAgICB2YXIgY19sZmxhZyA9IEhFQVAzMlthcmdwICsgMTIgPj4gMl07CiAgICAgICAgICAgICAgdmFyIGNfY2MgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgMzI7IGkrKykgewogICAgICAgICAgICAgICAgY19jYy5wdXNoKEhFQVA4W2FyZ3AgKyBpICsgMTcgPj4gMF0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGNzZXRzKHN0cmVhbS50dHksIG9wLCB7IGNfaWZsYWcsIGNfb2ZsYWcsIGNfY2ZsYWcsIGNfbGZsYWcsIGNfY2MgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTE5OiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICB2YXIgYXJncCA9IFNZU0NBTExTLmdldHAoKTsKICAgICAgICAgICAgSEVBUDMyW2FyZ3AgPj4gMl0gPSAwOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MjA6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KQogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTMxOiB7CiAgICAgICAgICAgIHZhciBhcmdwID0gU1lTQ0FMTFMuZ2V0cCgpOwogICAgICAgICAgICByZXR1cm4gRlMuaW9jdGwoc3RyZWFtLCBvcCwgYXJncCk7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDIxNTIzOiB7CiAgICAgICAgICAgIGlmICghc3RyZWFtLnR0eSkKICAgICAgICAgICAgICByZXR1cm4gLTU5OwogICAgICAgICAgICBpZiAoc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeikgewogICAgICAgICAgICAgIHZhciB3aW5zaXplID0gc3RyZWFtLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihzdHJlYW0udHR5KTsKICAgICAgICAgICAgICB2YXIgYXJncCA9IFNZU0NBTExTLmdldHAoKTsKICAgICAgICAgICAgICBIRUFQMTZbYXJncCA+PiAxXSA9IHdpbnNpemVbMF07CiAgICAgICAgICAgICAgSEVBUDE2W2FyZ3AgKyAyID4+IDFdID0gd2luc2l6ZVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjE1MjQ6IHsKICAgICAgICAgICAgaWYgKCFzdHJlYW0udHR5KQogICAgICAgICAgICAgIHJldHVybiAtNTk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyMTUxNTogewogICAgICAgICAgICBpZiAoIXN0cmVhbS50dHkpCiAgICAgICAgICAgICAgcmV0dXJuIC01OTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gLTI4OwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gInVuZGVmaW5lZCIgfHwgIShlLm5hbWUgPT09ICJFcnJub0Vycm9yIikpCiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF9vcGVuYXQoZGlyZmQsIHBhdGgsIGZsYWdzLCB2YXJhcmdzKSB7CiAgICAgIFNZU0NBTExTLnZhcmFyZ3MgPSB2YXJhcmdzOwogICAgICB0cnkgewogICAgICAgIHBhdGggPSBTWVNDQUxMUy5nZXRTdHIocGF0aCk7CiAgICAgICAgcGF0aCA9IFNZU0NBTExTLmNhbGN1bGF0ZUF0KGRpcmZkLCBwYXRoKTsKICAgICAgICB2YXIgbW9kZSA9IHZhcmFyZ3MgPyBTWVNDQUxMUy5nZXQoKSA6IDA7CiAgICAgICAgcmV0dXJuIEZTLm9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUpLmZkOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAidW5kZWZpbmVkIiB8fCAhKGUubmFtZSA9PT0gIkVycm5vRXJyb3IiKSkKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX3JtZGlyKHBhdGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIEZTLnJtZGlyKHBhdGgpOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAidW5kZWZpbmVkIiB8fCAhKGUubmFtZSA9PT0gIkVycm5vRXJyb3IiKSkKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfX19zeXNjYWxsX3N0YXQ2NChwYXRoLCBidWYpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHJldHVybiBTWVNDQUxMUy5kb1N0YXQoRlMuc3RhdCwgcGF0aCwgYnVmKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gInVuZGVmaW5lZCIgfHwgIShlLm5hbWUgPT09ICJFcnJub0Vycm9yIikpCiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX19fc3lzY2FsbF91bmxpbmthdChkaXJmZCwgcGF0aCwgZmxhZ3MpIHsKICAgICAgdHJ5IHsKICAgICAgICBwYXRoID0gU1lTQ0FMTFMuZ2V0U3RyKHBhdGgpOwogICAgICAgIHBhdGggPSBTWVNDQUxMUy5jYWxjdWxhdGVBdChkaXJmZCwgcGF0aCk7CiAgICAgICAgaWYgKGZsYWdzID09PSAwKSB7CiAgICAgICAgICBGUy51bmxpbmsocGF0aCk7CiAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PT0gNTEyKSB7CiAgICAgICAgICBGUy5ybWRpcihwYXRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWJvcnQoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAidW5kZWZpbmVkIiB8fCAhKGUubmFtZSA9PT0gIkVycm5vRXJyb3IiKSkKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgcmV0dXJuIC1lLmVycm5vOwogICAgICB9CiAgICB9CiAgICB2YXIgbm93SXNNb25vdG9uaWMgPSB0cnVlOwogICAgdmFyIF9fZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9ICgpID0+IG5vd0lzTW9ub3RvbmljOwogICAgdmFyIF9hYm9ydCA9ICgpID0+IHsKICAgICAgYWJvcnQoIiIpOwogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9kYXRlX25vdyA9ICgpID0+IERhdGUubm93KCk7CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSAoKSA9PiBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBfZW1zY3JpcHRlbl9tZW1jcHlfanMgPSAoZGVzdCwgc3JjLCBudW0pID0+IEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgIHZhciBhYm9ydE9uQ2Fubm90R3Jvd01lbW9yeSA9IChyZXF1ZXN0ZWRTaXplKSA9PiB7CiAgICAgIGFib3J0KCJPT00iKTsKICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAgPSAocmVxdWVzdGVkU2l6ZSkgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICBhYm9ydE9uQ2Fubm90R3Jvd01lbW9yeShyZXF1ZXN0ZWRTaXplKTsKICAgIH07CiAgICB2YXIgRU5WID0ge307CiAgICB2YXIgZ2V0RXhlY3V0YWJsZU5hbWUgPSAoKSA9PiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgdmFyIGdldEVudlN0cmluZ3MgPSAoKSA9PiB7CiAgICAgIGlmICghZ2V0RW52U3RyaW5ncy5zdHJpbmdzKSB7CiAgICAgICAgdmFyIGxhbmcgPSAodHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgIkMiKS5yZXBsYWNlKCItIiwgIl8iKSArICIuVVRGLTgiOwogICAgICAgIHZhciBlbnYgPSB7IFVTRVI6ICJ3ZWJfdXNlciIsIExPR05BTUU6ICJ3ZWJfdXNlciIsIFBBVEg6ICIvIiwgUFdEOiAiLyIsIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsIExBTkc6IGxhbmcsIF86IGdldEV4ZWN1dGFibGVOYW1lKCkgfTsKICAgICAgICBmb3IgKHZhciB4IGluIEVOVikgewogICAgICAgICAgaWYgKEVOVlt4XSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICBkZWxldGUgZW52W3hdOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBlbnZbeF0gPSBFTlZbeF07CiAgICAgICAgfQogICAgICAgIHZhciBzdHJpbmdzID0gW107CiAgICAgICAgZm9yICh2YXIgeCBpbiBlbnYpIHsKICAgICAgICAgIHN0cmluZ3MucHVzaChgJHt4fT0ke2Vudlt4XX1gKTsKICAgICAgICB9CiAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgfQogICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgfTsKICAgIHZhciBzdHJpbmdUb0FzY2lpID0gKHN0ciwgYnVmZmVyKSA9PiB7CiAgICAgIGZvciAodmFyIGkgPSAwO2kgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICB9CiAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICB9OwogICAgdmFyIF9lbnZpcm9uX2dldCA9IChfX2Vudmlyb24sIGVudmlyb25fYnVmKSA9PiB7CiAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgZ2V0RW52U3RyaW5ncygpLmZvckVhY2goKHN0cmluZywgaSkgPT4gewogICAgICAgIHZhciBwdHIgPSBlbnZpcm9uX2J1ZiArIGJ1ZlNpemU7CiAgICAgICAgSEVBUFUzMltfX2Vudmlyb24gKyBpICogNCA+PiAyXSA9IHB0cjsKICAgICAgICBzdHJpbmdUb0FzY2lpKHN0cmluZywgcHRyKTsKICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICB9KTsKICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgdmFyIF9lbnZpcm9uX3NpemVzX2dldCA9IChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpID0+IHsKICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBzdHJpbmdzLmZvckVhY2goKHN0cmluZykgPT4gYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgdmFyIGtlZXBSdW50aW1lQWxpdmUgPSAoKSA9PiBub0V4aXRSdW50aW1lIHx8IHJ1bnRpbWVLZWVwYWxpdmVDb3VudGVyID4gMDsKICAgIHZhciBfcHJvY19leGl0ID0gKGNvZGUpID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IGNvZGU7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgaWYgKE1vZHVsZVsib25FeGl0Il0pCiAgICAgICAgICBNb2R1bGVbIm9uRXhpdCJdKGNvZGUpOwogICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgfQogICAgICBxdWl0Xyhjb2RlLCBuZXcgRXhpdFN0YXR1cyhjb2RlKSk7CiAgICB9OwogICAgdmFyIGV4aXRKUyA9IChzdGF0dXMsIGltcGxpY2l0KSA9PiB7CiAgICAgIEVYSVRTVEFUVVMgPSBzdGF0dXM7CiAgICAgIF9wcm9jX2V4aXQoc3RhdHVzKTsKICAgIH07CiAgICB2YXIgX2V4aXQgPSBleGl0SlM7CiAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBGUy5jbG9zZShzdHJlYW0pOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAidW5kZWZpbmVkIiB8fCAhKGUubmFtZSA9PT0gIkVycm5vRXJyb3IiKSkKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBkb1JlYWR2ID0gKHN0cmVhbSwgaW92LCBpb3ZjbnQsIG9mZnNldCkgPT4gewogICAgICB2YXIgcmV0ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgdmFyIHB0ciA9IEhFQVBVMzJbaW92ID4+IDJdOwogICAgICAgIHZhciBsZW4gPSBIRUFQVTMyW2lvdiArIDQgPj4gMl07CiAgICAgICAgaW92ICs9IDg7CiAgICAgICAgdmFyIGN1cnIgPSBGUy5yZWFkKHN0cmVhbSwgSEVBUDgsIHB0ciwgbGVuLCBvZmZzZXQpOwogICAgICAgIGlmIChjdXJyIDwgMCkKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICByZXQgKz0gY3VycjsKICAgICAgICBpZiAoY3VyciA8IGxlbikKICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgb2Zmc2V0ICs9IGN1cnI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgZnVuY3Rpb24gX2ZkX3JlYWQoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgdmFyIG51bSA9IGRvUmVhZHYoc3RyZWFtLCBpb3YsIGlvdmNudCk7CiAgICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgIHJldHVybiAwOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBGUyA9PSAidW5kZWZpbmVkIiB8fCAhKGUubmFtZSA9PT0gIkVycm5vRXJyb3IiKSkKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgIH0KICAgIH0KICAgIHZhciBjb252ZXJ0STMyUGFpclRvSTUzQ2hlY2tlZCA9IChsbywgaGkpID0+IGhpICsgMjA5NzE1MiA+Pj4gMCA8IDQxOTQzMDUgLSAhIWxvID8gKGxvID4+PiAwKSArIGhpICogNDI5NDk2NzI5NiA6IE5hTjsKICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsKICAgICAgdmFyIG9mZnNldCA9IGNvbnZlcnRJMzJQYWlyVG9JNTNDaGVja2VkKG9mZnNldF9sb3csIG9mZnNldF9oaWdoKTsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaXNOYU4ob2Zmc2V0KSkKICAgICAgICAgIHJldHVybiA2MTsKICAgICAgICB2YXIgc3RyZWFtID0gU1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKGZkKTsKICAgICAgICBGUy5sbHNlZWsoc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSk7CiAgICAgICAgdGVtcEk2NCA9IFtzdHJlYW0ucG9zaXRpb24gPj4+IDAsICh0ZW1wRG91YmxlID0gc3RyZWFtLnBvc2l0aW9uLCArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMSA/IHRlbXBEb3VibGUgPiAwID8gK01hdGguZmxvb3IodGVtcERvdWJsZSAvIDQyOTQ5NjcyOTYpID4+PiAwIDogfn4rTWF0aC5jZWlsKCh0ZW1wRG91YmxlIC0gKyh+fnRlbXBEb3VibGUgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwIDogMCldLCBIRUFQMzJbbmV3T2Zmc2V0ID4+IDJdID0gdGVtcEk2NFswXSwgSEVBUDMyW25ld09mZnNldCArIDQgPj4gMl0gPSB0ZW1wSTY0WzFdOwogICAgICAgIGlmIChzdHJlYW0uZ2V0ZGVudHMgJiYgb2Zmc2V0ID09PSAwICYmIHdoZW5jZSA9PT0gMCkKICAgICAgICAgIHN0cmVhbS5nZXRkZW50cyA9IG51bGw7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodHlwZW9mIEZTID09ICJ1bmRlZmluZWQiIHx8ICEoZS5uYW1lID09PSAiRXJybm9FcnJvciIpKQogICAgICAgICAgdGhyb3cgZTsKICAgICAgICByZXR1cm4gZS5lcnJubzsKICAgICAgfQogICAgfQogICAgdmFyIGRvV3JpdGV2ID0gKHN0cmVhbSwgaW92LCBpb3ZjbnQsIG9mZnNldCkgPT4gewogICAgICB2YXIgcmV0ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgdmFyIHB0ciA9IEhFQVBVMzJbaW92ID4+IDJdOwogICAgICAgIHZhciBsZW4gPSBIRUFQVTMyW2lvdiArIDQgPj4gMl07CiAgICAgICAgaW92ICs9IDg7CiAgICAgICAgdmFyIGN1cnIgPSBGUy53cml0ZShzdHJlYW0sIEhFQVA4LCBwdHIsIGxlbiwgb2Zmc2V0KTsKICAgICAgICBpZiAoY3VyciA8IDApCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgcmV0ICs9IGN1cnI7CiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICBvZmZzZXQgKz0gY3VycjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHN0cmVhbSA9IFNZU0NBTExTLmdldFN0cmVhbUZyb21GRChmZCk7CiAgICAgICAgdmFyIG51bSA9IGRvV3JpdGV2KHN0cmVhbSwgaW92LCBpb3ZjbnQpOwogICAgICAgIEhFQVBVMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmICh0eXBlb2YgRlMgPT0gInVuZGVmaW5lZCIgfHwgIShlLm5hbWUgPT09ICJFcnJub0Vycm9yIikpCiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICB9CiAgICB9CiAgICB2YXIgaXNMZWFwWWVhciA9ICh5ZWFyKSA9PiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTsKICAgIHZhciBhcnJheVN1bSA9IChhcnJheSwgaW5kZXgpID0+IHsKICAgICAgdmFyIHN1bSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwO2kgPD0gaW5kZXg7IHN1bSArPSBhcnJheVtpKytdKSB7CiAgICAgIH0KICAgICAgcmV0dXJuIHN1bTsKICAgIH07CiAgICB2YXIgTU9OVEhfREFZU19MRUFQID0gWzMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdOwogICAgdmFyIE1PTlRIX0RBWVNfUkVHVUxBUiA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgIHZhciBhZGREYXlzID0gKGRhdGUsIGRheXMpID0+IHsKICAgICAgdmFyIG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7CiAgICAgIHdoaWxlIChkYXlzID4gMCkgewogICAgICAgIHZhciBsZWFwID0gaXNMZWFwWWVhcihuZXdEYXRlLmdldEZ1bGxZZWFyKCkpOwogICAgICAgIHZhciBjdXJyZW50TW9udGggPSBuZXdEYXRlLmdldE1vbnRoKCk7CiAgICAgICAgdmFyIGRheXNJbkN1cnJlbnRNb250aCA9IChsZWFwID8gTU9OVEhfREFZU19MRUFQIDogTU9OVEhfREFZU19SRUdVTEFSKVtjdXJyZW50TW9udGhdOwogICAgICAgIGlmIChkYXlzID4gZGF5c0luQ3VycmVudE1vbnRoIC0gbmV3RGF0ZS5nZXREYXRlKCkpIHsKICAgICAgICAgIGRheXMgLT0gZGF5c0luQ3VycmVudE1vbnRoIC0gbmV3RGF0ZS5nZXREYXRlKCkgKyAxOwogICAgICAgICAgbmV3RGF0ZS5zZXREYXRlKDEpOwogICAgICAgICAgaWYgKGN1cnJlbnRNb250aCA8IDExKSB7CiAgICAgICAgICAgIG5ld0RhdGUuc2V0TW9udGgoY3VycmVudE1vbnRoICsgMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdEYXRlLnNldE1vbnRoKDApOwogICAgICAgICAgICBuZXdEYXRlLnNldEZ1bGxZZWFyKG5ld0RhdGUuZ2V0RnVsbFllYXIoKSArIDEpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdEYXRlLnNldERhdGUobmV3RGF0ZS5nZXREYXRlKCkgKyBkYXlzKTsKICAgICAgICAgIHJldHVybiBuZXdEYXRlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3RGF0ZTsKICAgIH07CiAgICB2YXIgd3JpdGVBcnJheVRvTWVtb3J5ID0gKGFycmF5LCBidWZmZXIpID0+IHsKICAgICAgSEVBUDguc2V0KGFycmF5LCBidWZmZXIpOwogICAgfTsKICAgIHZhciBfc3RyZnRpbWUgPSAocywgbWF4c2l6ZSwgZm9ybWF0LCB0bSkgPT4gewogICAgICB2YXIgdG1fem9uZSA9IEhFQVBVMzJbdG0gKyA0MCA+PiAyXTsKICAgICAgdmFyIGRhdGUgPSB7IHRtX3NlYzogSEVBUDMyW3RtID4+IDJdLCB0bV9taW46IEhFQVAzMlt0bSArIDQgPj4gMl0sIHRtX2hvdXI6IEhFQVAzMlt0bSArIDggPj4gMl0sIHRtX21kYXk6IEhFQVAzMlt0bSArIDEyID4+IDJdLCB0bV9tb246IEhFQVAzMlt0bSArIDE2ID4+IDJdLCB0bV95ZWFyOiBIRUFQMzJbdG0gKyAyMCA+PiAyXSwgdG1fd2RheTogSEVBUDMyW3RtICsgMjQgPj4gMl0sIHRtX3lkYXk6IEhFQVAzMlt0bSArIDI4ID4+IDJdLCB0bV9pc2RzdDogSEVBUDMyW3RtICsgMzIgPj4gMl0sIHRtX2dtdG9mZjogSEVBUDMyW3RtICsgMzYgPj4gMl0sIHRtX3pvbmU6IHRtX3pvbmUgPyBVVEY4VG9TdHJpbmcodG1fem9uZSkgOiAiIiB9OwogICAgICB2YXIgcGF0dGVybiA9IFVURjhUb1N0cmluZyhmb3JtYXQpOwogICAgICB2YXIgRVhQQU5TSU9OX1JVTEVTXzEgPSB7ICIlYyI6ICIlYSAlYiAlZCAlSDolTTolUyAlWSIsICIlRCI6ICIlbS8lZC8leSIsICIlRiI6ICIlWS0lbS0lZCIsICIlaCI6ICIlYiIsICIlciI6ICIlSTolTTolUyAlcCIsICIlUiI6ICIlSDolTSIsICIlVCI6ICIlSDolTTolUyIsICIleCI6ICIlbS8lZC8leSIsICIlWCI6ICIlSDolTTolUyIsICIlRWMiOiAiJWMiLCAiJUVDIjogIiVDIiwgIiVFeCI6ICIlbS8lZC8leSIsICIlRVgiOiAiJUg6JU06JVMiLCAiJUV5IjogIiV5IiwgIiVFWSI6ICIlWSIsICIlT2QiOiAiJWQiLCAiJU9lIjogIiVlIiwgIiVPSCI6ICIlSCIsICIlT0kiOiAiJUkiLCAiJU9tIjogIiVtIiwgIiVPTSI6ICIlTSIsICIlT1MiOiAiJVMiLCAiJU91IjogIiV1IiwgIiVPVSI6ICIlVSIsICIlT1YiOiAiJVYiLCAiJU93IjogIiV3IiwgIiVPVyI6ICIlVyIsICIlT3kiOiAiJXkiIH07CiAgICAgIGZvciAodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzEpIHsKICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAocnVsZSwgImciKSwgRVhQQU5TSU9OX1JVTEVTXzFbcnVsZV0pOwogICAgICB9CiAgICAgIHZhciBXRUVLREFZUyA9IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXTsKICAgICAgdmFyIE1PTlRIUyA9IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdOwogICAgICBmdW5jdGlvbiBsZWFkaW5nU29tZXRoaW5nKHZhbHVlLCBkaWdpdHMsIGNoYXJhY3RlcikgewogICAgICAgIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT0gIm51bWJlciIgPyB2YWx1ZS50b1N0cmluZygpIDogdmFsdWUgfHwgIiI7CiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBkaWdpdHMpIHsKICAgICAgICAgIHN0ciA9IGNoYXJhY3RlclswXSArIHN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfQogICAgICBmdW5jdGlvbiBsZWFkaW5nTnVsbHModmFsdWUsIGRpZ2l0cykgewogICAgICAgIHJldHVybiBsZWFkaW5nU29tZXRoaW5nKHZhbHVlLCBkaWdpdHMsICIwIik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY29tcGFyZUJ5RGF5KGRhdGUxLCBkYXRlMikgewogICAgICAgIGZ1bmN0aW9uIHNnbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/IC0xIDogdmFsdWUgPiAwID8gMSA6IDA7CiAgICAgICAgfQogICAgICAgIHZhciBjb21wYXJlOwogICAgICAgIGlmICgoY29tcGFyZSA9IHNnbihkYXRlMS5nZXRGdWxsWWVhcigpIC0gZGF0ZTIuZ2V0RnVsbFllYXIoKSkpID09PSAwKSB7CiAgICAgICAgICBpZiAoKGNvbXBhcmUgPSBzZ24oZGF0ZTEuZ2V0TW9udGgoKSAtIGRhdGUyLmdldE1vbnRoKCkpKSA9PT0gMCkgewogICAgICAgICAgICBjb21wYXJlID0gc2duKGRhdGUxLmdldERhdGUoKSAtIGRhdGUyLmdldERhdGUoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb21wYXJlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGgpIHsKICAgICAgICBzd2l0Y2ggKGphbkZvdXJ0aC5nZXREYXkoKSkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMjkpOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gamFuRm91cnRoOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDMpOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDIpOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCksIDAsIDEpOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMzEpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoamFuRm91cnRoLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMzApOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBnZXRXZWVrQmFzZWRZZWFyKGRhdGUyKSB7CiAgICAgICAgdmFyIHRoaXNEYXRlID0gYWRkRGF5cyhuZXcgRGF0ZShkYXRlMi50bV95ZWFyICsgMTkwMCwgMCwgMSksIGRhdGUyLnRtX3lkYXkpOwogICAgICAgIHZhciBqYW5Gb3VydGhUaGlzWWVhciA9IG5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCksIDAsIDQpOwogICAgICAgIHZhciBqYW5Gb3VydGhOZXh0WWVhciA9IG5ldyBEYXRlKHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkgKyAxLCAwLCA0KTsKICAgICAgICB2YXIgZmlyc3RXZWVrU3RhcnRUaGlzWWVhciA9IGdldEZpcnN0V2Vla1N0YXJ0RGF0ZShqYW5Gb3VydGhUaGlzWWVhcik7CiAgICAgICAgdmFyIGZpcnN0V2Vla1N0YXJ0TmV4dFllYXIgPSBnZXRGaXJzdFdlZWtTdGFydERhdGUoamFuRm91cnRoTmV4dFllYXIpOwogICAgICAgIGlmIChjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnRUaGlzWWVhciwgdGhpc0RhdGUpIDw9IDApIHsKICAgICAgICAgIGlmIChjb21wYXJlQnlEYXkoZmlyc3RXZWVrU3RhcnROZXh0WWVhciwgdGhpc0RhdGUpIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCkgKyAxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXNEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzRGF0ZS5nZXRGdWxsWWVhcigpIC0gMTsKICAgICAgfQogICAgICB2YXIgRVhQQU5TSU9OX1JVTEVTXzIgPSB7ICIlYSI6IChkYXRlMikgPT4gV0VFS0RBWVNbZGF0ZTIudG1fd2RheV0uc3Vic3RyaW5nKDAsIDMpLCAiJUEiOiAoZGF0ZTIpID0+IFdFRUtEQVlTW2RhdGUyLnRtX3dkYXldLCAiJWIiOiAoZGF0ZTIpID0+IE1PTlRIU1tkYXRlMi50bV9tb25dLnN1YnN0cmluZygwLCAzKSwgIiVCIjogKGRhdGUyKSA9PiBNT05USFNbZGF0ZTIudG1fbW9uXSwgIiVDIjogKGRhdGUyKSA9PiB7CiAgICAgICAgdmFyIHllYXIgPSBkYXRlMi50bV95ZWFyICsgMTkwMDsKICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKHllYXIgLyAxMDAgfCAwLCAyKTsKICAgICAgfSwgIiVkIjogKGRhdGUyKSA9PiBsZWFkaW5nTnVsbHMoZGF0ZTIudG1fbWRheSwgMiksICIlZSI6IChkYXRlMikgPT4gbGVhZGluZ1NvbWV0aGluZyhkYXRlMi50bV9tZGF5LCAyLCAiICIpLCAiJWciOiAoZGF0ZTIpID0+IGdldFdlZWtCYXNlZFllYXIoZGF0ZTIpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCAiJUciOiAoZGF0ZTIpID0+IGdldFdlZWtCYXNlZFllYXIoZGF0ZTIpLCAiJUgiOiAoZGF0ZTIpID0+IGxlYWRpbmdOdWxscyhkYXRlMi50bV9ob3VyLCAyKSwgIiVJIjogKGRhdGUyKSA9PiB7CiAgICAgICAgdmFyIHR3ZWx2ZUhvdXIgPSBkYXRlMi50bV9ob3VyOwogICAgICAgIGlmICh0d2VsdmVIb3VyID09IDApCiAgICAgICAgICB0d2VsdmVIb3VyID0gMTI7CiAgICAgICAgZWxzZSBpZiAodHdlbHZlSG91ciA+IDEyKQogICAgICAgICAgdHdlbHZlSG91ciAtPSAxMjsKICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKHR3ZWx2ZUhvdXIsIDIpOwogICAgICB9LCAiJWoiOiAoZGF0ZTIpID0+IGxlYWRpbmdOdWxscyhkYXRlMi50bV9tZGF5ICsgYXJyYXlTdW0oaXNMZWFwWWVhcihkYXRlMi50bV95ZWFyICsgMTkwMCkgPyBNT05USF9EQVlTX0xFQVAgOiBNT05USF9EQVlTX1JFR1VMQVIsIGRhdGUyLnRtX21vbiAtIDEpLCAzKSwgIiVtIjogKGRhdGUyKSA9PiBsZWFkaW5nTnVsbHMoZGF0ZTIudG1fbW9uICsgMSwgMiksICIlTSI6IChkYXRlMikgPT4gbGVhZGluZ051bGxzKGRhdGUyLnRtX21pbiwgMiksICIlbiI6ICgpID0+ICJcbiIsICIlcCI6IChkYXRlMikgPT4gewogICAgICAgIGlmIChkYXRlMi50bV9ob3VyID49IDAgJiYgZGF0ZTIudG1faG91ciA8IDEyKSB7CiAgICAgICAgICByZXR1cm4gIkFNIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJQTSI7CiAgICAgIH0sICIlUyI6IChkYXRlMikgPT4gbGVhZGluZ051bGxzKGRhdGUyLnRtX3NlYywgMiksICIldCI6ICgpID0+ICJcdCIsICIldSI6IChkYXRlMikgPT4gZGF0ZTIudG1fd2RheSB8fCA3LCAiJVUiOiAoZGF0ZTIpID0+IHsKICAgICAgICB2YXIgZGF5cyA9IGRhdGUyLnRtX3lkYXkgKyA3IC0gZGF0ZTIudG1fd2RheTsKICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKE1hdGguZmxvb3IoZGF5cyAvIDcpLCAyKTsKICAgICAgfSwgIiVWIjogKGRhdGUyKSA9PiB7CiAgICAgICAgdmFyIHZhbCA9IE1hdGguZmxvb3IoKGRhdGUyLnRtX3lkYXkgKyA3IC0gKGRhdGUyLnRtX3dkYXkgKyA2KSAlIDcpIC8gNyk7CiAgICAgICAgaWYgKChkYXRlMi50bV93ZGF5ICsgMzcxIC0gZGF0ZTIudG1feWRheSAtIDIpICUgNyA8PSAyKSB7CiAgICAgICAgICB2YWwrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgIHZhbCA9IDUyOwogICAgICAgICAgdmFyIGRlYzMxID0gKGRhdGUyLnRtX3dkYXkgKyA3IC0gZGF0ZTIudG1feWRheSAtIDEpICUgNzsKICAgICAgICAgIGlmIChkZWMzMSA9PSA0IHx8IGRlYzMxID09IDUgJiYgaXNMZWFwWWVhcihkYXRlMi50bV95ZWFyICUgNDAwIC0gMSkpIHsKICAgICAgICAgICAgdmFsKys7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gNTMpIHsKICAgICAgICAgIHZhciBqYW4xID0gKGRhdGUyLnRtX3dkYXkgKyAzNzEgLSBkYXRlMi50bV95ZGF5KSAlIDc7CiAgICAgICAgICBpZiAoamFuMSAhPSA0ICYmIChqYW4xICE9IDMgfHwgIWlzTGVhcFllYXIoZGF0ZTIudG1feWVhcikpKQogICAgICAgICAgICB2YWwgPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVhZGluZ051bGxzKHZhbCwgMik7CiAgICAgIH0sICIldyI6IChkYXRlMikgPT4gZGF0ZTIudG1fd2RheSwgIiVXIjogKGRhdGUyKSA9PiB7CiAgICAgICAgdmFyIGRheXMgPSBkYXRlMi50bV95ZGF5ICsgNyAtIChkYXRlMi50bV93ZGF5ICsgNikgJSA3OwogICAgICAgIHJldHVybiBsZWFkaW5nTnVsbHMoTWF0aC5mbG9vcihkYXlzIC8gNyksIDIpOwogICAgICB9LCAiJXkiOiAoZGF0ZTIpID0+IChkYXRlMi50bV95ZWFyICsgMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksICIlWSI6IChkYXRlMikgPT4gZGF0ZTIudG1feWVhciArIDE5MDAsICIleiI6IChkYXRlMikgPT4gewogICAgICAgIHZhciBvZmYgPSBkYXRlMi50bV9nbXRvZmY7CiAgICAgICAgdmFyIGFoZWFkID0gb2ZmID49IDA7CiAgICAgICAgb2ZmID0gTWF0aC5hYnMob2ZmKSAvIDYwOwogICAgICAgIG9mZiA9IG9mZiAvIDYwICogMTAwICsgb2ZmICUgNjA7CiAgICAgICAgcmV0dXJuIChhaGVhZCA/ICIrIiA6ICItIikgKyBTdHJpbmcoIjAwMDAiICsgb2ZmKS5zbGljZSgtNCk7CiAgICAgIH0sICIlWiI6IChkYXRlMikgPT4gZGF0ZTIudG1fem9uZSwgIiUlIjogKCkgPT4gIiUiIH07CiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLyUlL2csICJcMFwwIik7CiAgICAgIGZvciAodmFyIHJ1bGUgaW4gRVhQQU5TSU9OX1JVTEVTXzIpIHsKICAgICAgICBpZiAocGF0dGVybi5pbmNsdWRlcyhydWxlKSkgewogICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZShuZXcgUmVnRXhwKHJ1bGUsICJnIiksIEVYUEFOU0lPTl9SVUxFU18yW3J1bGVdKGRhdGUpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvXDBcMC9nLCAiJSIpOwogICAgICB2YXIgYnl0ZXMgPSBpbnRBcnJheUZyb21TdHJpbmcocGF0dGVybiwgZmFsc2UpOwogICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gbWF4c2l6ZSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHdyaXRlQXJyYXlUb01lbW9yeShieXRlcywgcyk7CiAgICAgIHJldHVybiBieXRlcy5sZW5ndGggLSAxOwogICAgfTsKICAgIHZhciBfc3RyZnRpbWVfbCA9IChzLCBtYXhzaXplLCBmb3JtYXQsIHRtLCBsb2MpID0+IF9zdHJmdGltZShzLCBtYXhzaXplLCBmb3JtYXQsIHRtKTsKICAgIHZhciBoYW5kbGVFeGNlcHRpb24gPSAoZSkgPT4gewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMgfHwgZSA9PSAidW53aW5kIikgewogICAgICAgIHJldHVybiBFWElUU1RBVFVTOwogICAgICB9CiAgICAgIHF1aXRfKDEsIGUpOwogICAgfTsKICAgIHZhciBzdHJpbmdUb1VURjhPblN0YWNrID0gKHN0cikgPT4gewogICAgICB2YXIgc2l6ZSA9IGxlbmd0aEJ5dGVzVVRGOChzdHIpICsgMTsKICAgICAgdmFyIHJldCA9IHN0YWNrQWxsb2Moc2l6ZSk7CiAgICAgIHN0cmluZ1RvVVRGOChzdHIsIHJldCwgc2l6ZSk7CiAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgdmFyIEZTTm9kZSA9IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSwgbW9kZSwgcmRldikgewogICAgICBpZiAoIXBhcmVudCkgewogICAgICAgIHBhcmVudCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMubW91bnQgPSBwYXJlbnQubW91bnQ7CiAgICAgIHRoaXMubW91bnRlZCA9IG51bGw7CiAgICAgIHRoaXMuaWQgPSBGUy5uZXh0SW5vZGUrKzsKICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgdGhpcy5tb2RlID0gbW9kZTsKICAgICAgdGhpcy5ub2RlX29wcyA9IHt9OwogICAgICB0aGlzLnN0cmVhbV9vcHMgPSB7fTsKICAgICAgdGhpcy5yZGV2ID0gcmRldjsKICAgIH07CiAgICB2YXIgcmVhZE1vZGUgPSAyOTIgfCA3MzsKICAgIHZhciB3cml0ZU1vZGUgPSAxNDY7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGU05vZGUucHJvdG90eXBlLCB7IHJlYWQ6IHsgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICh0aGlzLm1vZGUgJiByZWFkTW9kZSkgPT09IHJlYWRNb2RlOwogICAgfSwgc2V0OiBmdW5jdGlvbih2YWwpIHsKICAgICAgdmFsID8gdGhpcy5tb2RlIHw9IHJlYWRNb2RlIDogdGhpcy5tb2RlICY9IH5yZWFkTW9kZTsKICAgIH0gfSwgd3JpdGU6IHsgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICh0aGlzLm1vZGUgJiB3cml0ZU1vZGUpID09PSB3cml0ZU1vZGU7CiAgICB9LCBzZXQ6IGZ1bmN0aW9uKHZhbCkgewogICAgICB2YWwgPyB0aGlzLm1vZGUgfD0gd3JpdGVNb2RlIDogdGhpcy5tb2RlICY9IH53cml0ZU1vZGU7CiAgICB9IH0sIGlzRm9sZGVyOiB7IGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBGUy5pc0Rpcih0aGlzLm1vZGUpOwogICAgfSB9LCBpc0RldmljZTogeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gRlMuaXNDaHJkZXYodGhpcy5tb2RlKTsKICAgIH0gfSB9KTsKICAgIEZTLkZTTm9kZSA9IEZTTm9kZTsKICAgIEZTLmNyZWF0ZVByZWxvYWRlZEZpbGUgPSBGU19jcmVhdGVQcmVsb2FkZWRGaWxlOwogICAgRlMuc3RhdGljSW5pdCgpOwogICAgTW9kdWxlWyJGU19jcmVhdGVQYXRoIl0gPSBGUy5jcmVhdGVQYXRoOwogICAgTW9kdWxlWyJGU19jcmVhdGVEYXRhRmlsZSJdID0gRlMuY3JlYXRlRGF0YUZpbGU7CiAgICBNb2R1bGVbIkZTX2NyZWF0ZVByZWxvYWRlZEZpbGUiXSA9IEZTLmNyZWF0ZVByZWxvYWRlZEZpbGU7CiAgICBNb2R1bGVbIkZTX3VubGluayJdID0gRlMudW5saW5rOwogICAgTW9kdWxlWyJGU19jcmVhdGVMYXp5RmlsZSJdID0gRlMuY3JlYXRlTGF6eUZpbGU7CiAgICBNb2R1bGVbIkZTX2NyZWF0ZURldmljZSJdID0gRlMuY3JlYXRlRGV2aWNlOwogICAgdmFyIHdhc21JbXBvcnRzID0geyBhOiBfX19hc3NlcnRfZmFpbCwgYjogX19fY3hhX3Rocm93LCBlOiBfX19zeXNjYWxsX2ZjbnRsNjQsIHI6IF9fX3N5c2NhbGxfZ2V0ZGVudHM2NCwgdjogX19fc3lzY2FsbF9pb2N0bCwgZjogX19fc3lzY2FsbF9vcGVuYXQsIHA6IF9fX3N5c2NhbGxfcm1kaXIsIG86IF9fX3N5c2NhbGxfc3RhdDY0LCBxOiBfX19zeXNjYWxsX3VubGlua2F0LCBqOiBfX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMsIGg6IF9hYm9ydCwgZzogX2Vtc2NyaXB0ZW5fZGF0ZV9ub3csIGs6IF9lbXNjcmlwdGVuX21lbWNweV9qcywgbjogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsIHM6IF9lbnZpcm9uX2dldCwgdDogX2Vudmlyb25fc2l6ZXNfZ2V0LCBkOiBfZXhpdCwgYzogX2ZkX2Nsb3NlLCB1OiBfZmRfcmVhZCwgbDogX2ZkX3NlZWssIGk6IF9mZF93cml0ZSwgbTogX3N0cmZ0aW1lX2wgfTsKICAgIHZhciB3YXNtRXhwb3J0cyA9IGNyZWF0ZVdhc20oKTsKICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoKSA9PiAoX19fd2FzbV9jYWxsX2N0b3JzID0gd2FzbUV4cG9ydHNbIngiXSkoKTsKICAgIHZhciBfbWFpbiA9IE1vZHVsZVsiX21haW4iXSA9IChhMCwgYTEpID0+IChfbWFpbiA9IE1vZHVsZVsiX21haW4iXSA9IHdhc21FeHBvcnRzWyJ5Il0pKGEwLCBhMSk7CiAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoKSA9PiAoX19fZXJybm9fbG9jYXRpb24gPSB3YXNtRXhwb3J0c1sieiJdKSgpOwogICAgdmFyIF9mcmVlID0gKGEwKSA9PiAoX2ZyZWUgPSB3YXNtRXhwb3J0c1siZnJlZSJdKShhMCk7CiAgICB2YXIgX21hbGxvYyA9IChhMCkgPT4gKF9tYWxsb2MgPSB3YXNtRXhwb3J0c1sibWFsbG9jIl0pKGEwKTsKICAgIHZhciBzdGFja0FsbG9jID0gKGEwKSA9PiAoc3RhY2tBbGxvYyA9IHdhc21FeHBvcnRzWyJCIl0pKGEwKTsKICAgIHZhciBfX19jeGFfaXNfcG9pbnRlcl90eXBlID0gKGEwKSA9PiAoX19fY3hhX2lzX3BvaW50ZXJfdHlwZSA9IHdhc21FeHBvcnRzWyJDIl0pKGEwKTsKICAgIE1vZHVsZVsiYWRkUnVuRGVwZW5kZW5jeSJdID0gYWRkUnVuRGVwZW5kZW5jeTsKICAgIE1vZHVsZVsicmVtb3ZlUnVuRGVwZW5kZW5jeSJdID0gcmVtb3ZlUnVuRGVwZW5kZW5jeTsKICAgIE1vZHVsZVsiRlNfY3JlYXRlUGF0aCJdID0gRlMuY3JlYXRlUGF0aDsKICAgIE1vZHVsZVsiRlNfY3JlYXRlTGF6eUZpbGUiXSA9IEZTLmNyZWF0ZUxhenlGaWxlOwogICAgTW9kdWxlWyJGU19jcmVhdGVEZXZpY2UiXSA9IEZTLmNyZWF0ZURldmljZTsKICAgIE1vZHVsZVsiY2FsbE1haW4iXSA9IGNhbGxNYWluOwogICAgTW9kdWxlWyJGU19jcmVhdGVQcmVsb2FkZWRGaWxlIl0gPSBGUy5jcmVhdGVQcmVsb2FkZWRGaWxlOwogICAgTW9kdWxlWyJGUyJdID0gRlM7CiAgICBNb2R1bGVbIkZTX2NyZWF0ZURhdGFGaWxlIl0gPSBGUy5jcmVhdGVEYXRhRmlsZTsKICAgIE1vZHVsZVsiRlNfdW5saW5rIl0gPSBGUy51bmxpbms7CiAgICB2YXIgY2FsbGVkUnVuOwogICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICBydW4oKTsKICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOwogICAgfTsKICAgIGZ1bmN0aW9uIGNhbGxNYWluKGFyZ3MgPSBbXSkgewogICAgICB2YXIgZW50cnlGdW5jdGlvbiA9IF9tYWluOwogICAgICBhcmdzLnVuc2hpZnQodGhpc1Byb2dyYW0pOwogICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoOwogICAgICB2YXIgYXJndiA9IHN0YWNrQWxsb2MoKGFyZ2MgKyAxKSAqIDQpOwogICAgICB2YXIgYXJndl9wdHIgPSBhcmd2OwogICAgICBhcmdzLmZvckVhY2goKGFyZykgPT4gewogICAgICAgIEhFQVBVMzJbYXJndl9wdHIgPj4gMl0gPSBzdHJpbmdUb1VURjhPblN0YWNrKGFyZyk7CiAgICAgICAgYXJndl9wdHIgKz0gNDsKICAgICAgfSk7CiAgICAgIEhFQVBVMzJbYXJndl9wdHIgPj4gMl0gPSAwOwogICAgICB0cnkgewogICAgICAgIHZhciByZXQgPSBlbnRyeUZ1bmN0aW9uKGFyZ2MsIGFyZ3YpOwogICAgICAgIGV4aXRKUyhyZXQsIHRydWUpOwogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gaGFuZGxlRXhjZXB0aW9uKGUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBydW4oYXJncyA9IGFyZ3VtZW50c18pIHsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcHJlUnVuKCk7CiAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICByZXR1cm47CiAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICBwcmVNYWluKCk7CiAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpOwogICAgICAgIGlmIChNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pCiAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICBpZiAoc2hvdWxkUnVuTm93KQogICAgICAgICAgY2FsbE1haW4oYXJncyk7CiAgICAgICAgcG9zdFJ1bigpOwogICAgICB9CiAgICAgIGlmIChNb2R1bGVbInNldFN0YXR1cyJdKSB7CiAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgIH0sIDEpOwogICAgICAgICAgZG9SdW4oKTsKICAgICAgICB9LCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb1J1bigpOwogICAgICB9CiAgICB9CiAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXSA9PSAiZnVuY3Rpb24iKQogICAgICAgIE1vZHVsZVsicHJlSW5pdCJdID0gW01vZHVsZVsicHJlSW5pdCJdXTsKICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICB9CiAgICB9CiAgICB2YXIgc2hvdWxkUnVuTm93ID0gZmFsc2U7CiAgICBpZiAoTW9kdWxlWyJub0luaXRpYWxSdW4iXSkKICAgICAgc2hvdWxkUnVuTm93ID0gZmFsc2U7CiAgICBydW4oKTsKICAgIHJldHVybiBtb2R1bGVBcmcucmVhZHk7CiAgfTsKfSkoKTsKZXhwb3J0IHsKICBjcmVhdGVQaXBlclBob25lbWl6ZQp9Owo=');
+  const ort = await import(`data:text/javascript;base64,LyohCiAqIE9OTlggUnVudGltZSBXZWIgdjEuMTguMAogKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KdmFyIHZkPU9iamVjdC5jcmVhdGU7dmFyIFBuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgX2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgT2Q9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIElkPU9iamVjdC5nZXRQcm90b3R5cGVPZixTZD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBMPShhLHQpPT4oKT0+KGEmJih0PWEoYT0wKSksdCk7dmFyIG1lPShhLHQpPT4oKT0+KHR8fGEoKHQ9e2V4cG9ydHM6e319KS5leHBvcnRzLHQpLHQuZXhwb3J0cyksU3I9KGEsdCk9Pntmb3IodmFyIG8gaW4gdClQbihhLG8se2dldDp0W29dLGVudW1lcmFibGU6ITB9KX0sVmE9KGEsdCxvLGUpPT57aWYodCYmdHlwZW9mIHQ9PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIilmb3IobGV0IHIgb2YgT2QodCkpIVNkLmNhbGwoYSxyKSYmciE9PW8mJlBuKGEscix7Z2V0OigpPT50W3JdLGVudW1lcmFibGU6IShlPV9kKHQscikpfHxlLmVudW1lcmFibGV9KTtyZXR1cm4gYX07dmFyIEFyPShhLHQsbyk9PihvPWEhPW51bGw/dmQoSWQoYSkpOnt9LFZhKHR8fCFhfHwhYS5fX2VzTW9kdWxlP1BuKG8sImRlZmF1bHQiLHt2YWx1ZTphLGVudW1lcmFibGU6ITB9KTpvLGEpKSxhcj1hPT5WYShQbih7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYSk7dmFyIEVuLHNyLFByLEFkLERuLExuPUwoKCk9PnsidXNlIHN0cmljdCI7RW49bmV3IE1hcCxzcj1bXSxQcj0oYSx0LG8pPT57aWYodCYmdHlwZW9mIHQuaW5pdD09ImZ1bmN0aW9uIiYmdHlwZW9mIHQuY3JlYXRlSW5mZXJlbmNlU2Vzc2lvbkhhbmRsZXI9PSJmdW5jdGlvbiIpe2xldCBlPUVuLmdldChhKTtpZihlPT09dm9pZCAwKUVuLnNldChhLHtiYWNrZW5kOnQscHJpb3JpdHk6b30pO2Vsc2V7aWYoZS5wcmlvcml0eT5vKXJldHVybjtpZihlLnByaW9yaXR5PT09byYmZS5iYWNrZW5kIT09dCl0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWdpc3RlciBiYWNrZW5kICIke2F9IiB1c2luZyBwcmlvcml0eSAke299YCl9aWYobz49MCl7bGV0IHI9c3IuaW5kZXhPZihhKTtyIT09LTEmJnNyLnNwbGljZShyLDEpO2ZvcihsZXQgbj0wO248c3IubGVuZ3RoO24rKylpZihFbi5nZXQoc3Jbbl0pLnByaW9yaXR5PD1vKXtzci5zcGxpY2UobiwwLGEpO3JldHVybn1zci5wdXNoKGEpfXJldHVybn10aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSB2YWxpZCBiYWNrZW5kIil9LEFkPWFzeW5jIGE9PntsZXQgdD1Fbi5nZXQoYSk7aWYoIXQpcmV0dXJuImJhY2tlbmQgbm90IGZvdW5kLiI7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZClyZXR1cm4gdC5lcnJvcjt7bGV0IG89ISF0LmluaXRQcm9taXNlO3RyeXtyZXR1cm4gb3x8KHQuaW5pdFByb21pc2U9dC5iYWNrZW5kLmluaXQoYSkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2goZSl7cmV0dXJuIG98fCh0LmVycm9yPWAke2V9YCx0LmFib3J0ZWQ9ITApLHQuZXJyb3J9ZmluYWxseXtkZWxldGUgdC5pbml0UHJvbWlzZX19fSxEbj1hc3luYyBhPT57bGV0IHQ9YS5leGVjdXRpb25Qcm92aWRlcnN8fFtdLG89dC5tYXAodT0+dHlwZW9mIHU9PSJzdHJpbmciP3U6dS5uYW1lKSxlPW8ubGVuZ3RoPT09MD9zcjpvLHIsbj1bXSxzPW5ldyBTZXQ7Zm9yKGxldCB1IG9mIGUpe2xldCBsPWF3YWl0IEFkKHUpO3R5cGVvZiBsPT0ic3RyaW5nIj9uLnB1c2goe25hbWU6dSxlcnI6bH0pOihyfHwocj1sKSxyPT09bCYmcy5hZGQodSkpfWlmKCFyKXRocm93IG5ldyBFcnJvcihgbm8gYXZhaWxhYmxlIGJhY2tlbmQgZm91bmQuIEVSUjogJHtuLm1hcCh1PT5gWyR7dS5uYW1lfV0gJHt1LmVycn1gKS5qb2luKCIsICIpfWApO2ZvcihsZXR7bmFtZTp1LGVycjpsfW9mIG4pby5pbmNsdWRlcyh1KSYmY29uc29sZS53YXJuKGByZW1vdmluZyByZXF1ZXN0ZWQgZXhlY3V0aW9uIHByb3ZpZGVyICIke3V9IiBmcm9tIHNlc3Npb24gb3B0aW9ucyBiZWNhdXNlIGl0IGlzIG5vdCBhdmFpbGFibGU6ICR7bH1gKTtsZXQgaT10LmZpbHRlcih1PT5zLmhhcyh0eXBlb2YgdT09InN0cmluZyI/dTp1Lm5hbWUpKTtyZXR1cm5bcixuZXcgUHJveHkoYSx7Z2V0Oih1LGwpPT5sPT09ImV4ZWN1dGlvblByb3ZpZGVycyI/aTpSZWZsZWN0LmdldCh1LGwpfSldfX0pO3ZhciBXYT1MKCgpPT57InVzZSBzdHJpY3QiO0xuKCl9KTt2YXIgSGEscWE9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtIYT0iMS4xOC4wIn0pO3ZhciBqYSx1dCxWbz1MKCgpPT57InVzZSBzdHJpY3QiO3FhKCk7amE9Indhcm5pbmciLHV0PXt3YXNtOnt9LHdlYmdsOnt9LHdlYmdwdTp7fSx2ZXJzaW9uczp7Y29tbW9uOkhhfSxzZXQgbG9nTGV2ZWwoYSl7aWYoYSE9PXZvaWQgMCl7aWYodHlwZW9mIGEhPSJzdHJpbmcifHxbInZlcmJvc2UiLCJpbmZvIiwid2FybmluZyIsImVycm9yIiwiZmF0YWwiXS5pbmRleE9mKGEpPT09LTEpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2F9YCk7amE9YX19LGdldCBsb2dMZXZlbCgpe3JldHVybiBqYX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1dCwibG9nTGV2ZWwiLHtlbnVtZXJhYmxlOiEwfSl9KTt2YXIgWixZYT1MKCgpPT57InVzZSBzdHJpY3QiO1ZvKCk7Wj11dH0pO3ZhciBYYSxLYSxKYT1MKCgpPT57InVzZSBzdHJpY3QiO1hhPShhLHQpPT57bGV0IG89dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTpuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSk7by53aWR0aD1hLmRpbXNbM10sby5oZWlnaHQ9YS5kaW1zWzJdO2xldCBlPW8uZ2V0Q29udGV4dCgiMmQiKTtpZihlIT1udWxsKXtsZXQgcixuO3Q/LnRlbnNvckxheW91dCE9PXZvaWQgMCYmdC50ZW5zb3JMYXlvdXQ9PT0iTkhXQyI/KHI9YS5kaW1zWzJdLG49YS5kaW1zWzNdKToocj1hLmRpbXNbM10sbj1hLmRpbXNbMl0pO2xldCBzPXQ/LmZvcm1hdCE9PXZvaWQgMD90LmZvcm1hdDoiUkdCIixpPXQ/Lm5vcm0sdSxsO2k9PT12b2lkIDB8fGkubWVhbj09PXZvaWQgMD91PVsyNTUsMjU1LDI1NSwyNTVdOnR5cGVvZiBpLm1lYW49PSJudW1iZXIiP3U9W2kubWVhbixpLm1lYW4saS5tZWFuLGkubWVhbl06KHU9W2kubWVhblswXSxpLm1lYW5bMV0saS5tZWFuWzJdLDBdLGkubWVhblszXSE9PXZvaWQgMCYmKHVbM109aS5tZWFuWzNdKSksaT09PXZvaWQgMHx8aS5iaWFzPT09dm9pZCAwP2w9WzAsMCwwLDBdOnR5cGVvZiBpLmJpYXM9PSJudW1iZXIiP2w9W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106KGw9W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLDBdLGkuYmlhc1szXSE9PXZvaWQgMCYmKGxbM109aS5iaWFzWzNdKSk7bGV0IGM9bipyLHA9MCxkPWMsVD1jKjIsdz0tMTtzPT09IlJHQkEiPyhwPTAsZD1jLFQ9YyoyLHc9YyozKTpzPT09IlJHQiI/KHA9MCxkPWMsVD1jKjIpOnM9PT0iUkJHIiYmKHA9MCxUPWMsZD1jKjIpO2ZvcihsZXQgdj0wO3Y8bjt2KyspZm9yKGxldCBTPTA7UzxyO1MrKyl7bGV0IEE9KGEuZGF0YVtwKytdLWxbMF0pKnVbMF0sQz0oYS5kYXRhW2QrK10tbFsxXSkqdVsxXSxGPShhLmRhdGFbVCsrXS1sWzJdKSp1WzJdLEo9dz09PS0xPzI1NTooYS5kYXRhW3crK10tbFszXSkqdVszXTtlLmZpbGxTdHlsZT0icmdiYSgiK0ErIiwiK0MrIiwiK0YrIiwiK0orIikiLGUuZmlsbFJlY3QoUyx2LDEsMSl9aWYoInRvRGF0YVVSTCJpbiBvKXJldHVybiBvLnRvRGF0YVVSTCgpO3Rocm93IG5ldyBFcnJvcigidG9EYXRhVVJMIGlzIG5vdCBzdXBwb3J0ZWQiKX1lbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfSxLYT0oYSx0KT0+e2xldCBvPXR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTpuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKSxlO2lmKG8hPW51bGwpe2xldCByLG4sczt0Py50ZW5zb3JMYXlvdXQhPT12b2lkIDAmJnQudGVuc29yTGF5b3V0PT09Ik5IV0MiPyhyPWEuZGltc1syXSxuPWEuZGltc1sxXSxzPWEuZGltc1szXSk6KHI9YS5kaW1zWzNdLG49YS5kaW1zWzJdLHM9YS5kaW1zWzFdKTtsZXQgaT10IT09dm9pZCAwJiZ0LmZvcm1hdCE9PXZvaWQgMD90LmZvcm1hdDoiUkdCIix1PXQ/Lm5vcm0sbCxjO3U9PT12b2lkIDB8fHUubWVhbj09PXZvaWQgMD9sPVsyNTUsMjU1LDI1NSwyNTVdOnR5cGVvZiB1Lm1lYW49PSJudW1iZXIiP2w9W3UubWVhbix1Lm1lYW4sdS5tZWFuLHUubWVhbl06KGw9W3UubWVhblswXSx1Lm1lYW5bMV0sdS5tZWFuWzJdLDI1NV0sdS5tZWFuWzNdIT09dm9pZCAwJiYobFszXT11Lm1lYW5bM10pKSx1PT09dm9pZCAwfHx1LmJpYXM9PT12b2lkIDA/Yz1bMCwwLDAsMF06dHlwZW9mIHUuYmlhcz09Im51bWJlciI/Yz1bdS5iaWFzLHUuYmlhcyx1LmJpYXMsdS5iaWFzXTooYz1bdS5iaWFzWzBdLHUuYmlhc1sxXSx1LmJpYXNbMl0sMF0sdS5iaWFzWzNdIT09dm9pZCAwJiYoY1szXT11LmJpYXNbM10pKTtsZXQgcD1uKnI7aWYodCE9PXZvaWQgMCYmKHQuZm9ybWF0IT09dm9pZCAwJiZzPT09NCYmdC5mb3JtYXQhPT0iUkdCQSJ8fHM9PT0zJiZ0LmZvcm1hdCE9PSJSR0IiJiZ0LmZvcm1hdCE9PSJCR1IiKSl0aHJvdyBuZXcgRXJyb3IoIlRlbnNvciBmb3JtYXQgZG9lc24ndCBtYXRjaCBpbnB1dCB0ZW5zb3IgZGltcyIpO2xldCBkPTQsVD0wLHc9MSx2PTIsUz0zLEE9MCxDPXAsRj1wKjIsSj0tMTtpPT09IlJHQkEiPyhBPTAsQz1wLEY9cCoyLEo9cCozKTppPT09IlJHQiI/KEE9MCxDPXAsRj1wKjIpOmk9PT0iUkJHIiYmKEE9MCxGPXAsQz1wKjIpLGU9by5jcmVhdGVJbWFnZURhdGEocixuKTtmb3IobGV0IGo9MDtqPG4qcjtUKz1kLHcrPWQsdis9ZCxTKz1kLGorKyllLmRhdGFbVF09KGEuZGF0YVtBKytdLWNbMF0pKmxbMF0sZS5kYXRhW3ddPShhLmRhdGFbQysrXS1jWzFdKSpsWzFdLGUuZGF0YVt2XT0oYS5kYXRhW0YrK10tY1syXSkqbFsyXSxlLmRhdGFbU109Sj09PS0xPzI1NTooYS5kYXRhW0orK10tY1szXSkqbFszXX1lbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3JldHVybiBlfX0pO3ZhciBXbyxaYSxRYSxlcyx0cyxycz1MKCgpPT57InVzZSBzdHJpY3QiO0NuKCk7V289KGEsdCk9PntpZihhPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHQuaGVpZ2h0PT09dm9pZCAwfHx0LndpZHRoPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtpZih0LnRlbnNvckxheW91dD09PSJOSFdDIil0aHJvdyBuZXcgRXJyb3IoIk5IV0MgVGVuc29yIGxheW91dCBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2xldHtoZWlnaHQ6byx3aWR0aDplfT10LHI9dC5ub3JtPz97bWVhbjoyNTUsYmlhczowfSxuLHM7dHlwZW9mIHIubWVhbj09Im51bWJlciI/bj1bci5tZWFuLHIubWVhbixyLm1lYW4sci5tZWFuXTpuPVtyLm1lYW5bMF0sci5tZWFuWzFdLHIubWVhblsyXSxyLm1lYW5bM10/PzI1NV0sdHlwZW9mIHIuYmlhcz09Im51bWJlciI/cz1bci5iaWFzLHIuYmlhcyxyLmJpYXMsci5iaWFzXTpzPVtyLmJpYXNbMF0sci5iaWFzWzFdLHIuYmlhc1syXSxyLmJpYXNbM10/PzBdO2xldCBpPXQuZm9ybWF0IT09dm9pZCAwP3QuZm9ybWF0OiJSR0JBIix1PXQudGVuc29yRm9ybWF0IT09dm9pZCAwJiZ0LnRlbnNvckZvcm1hdCE9PXZvaWQgMD90LnRlbnNvckZvcm1hdDoiUkdCIixsPW8qZSxjPXU9PT0iUkdCQSI/bmV3IEZsb2F0MzJBcnJheShsKjQpOm5ldyBGbG9hdDMyQXJyYXkobCozKSxwPTQsZD0wLFQ9MSx3PTIsdj0zLFM9MCxBPWwsQz1sKjIsRj0tMTtpPT09IlJHQiImJihwPTMsZD0wLFQ9MSx3PTIsdj0tMSksdT09PSJSR0JBIj9GPWwqMzp1PT09IlJCRyI/KFM9MCxDPWwsQT1sKjIpOnU9PT0iQkdSIiYmKEM9MCxBPWwsUz1sKjIpO2ZvcihsZXQgaj0wO2o8bDtqKyssZCs9cCx3Kz1wLFQrPXAsdis9cCljW1MrK109KGFbZF0rc1swXSkvblswXSxjW0ErK109KGFbVF0rc1sxXSkvblsxXSxjW0MrK109KGFbd10rc1syXSkvblsyXSxGIT09LTEmJnYhPT0tMSYmKGNbRisrXT0oYVt2XStzWzNdKS9uWzNdKTtyZXR1cm4gdT09PSJSR0JBIj9uZXcgSmUoImZsb2F0MzIiLGMsWzEsNCxvLGVdKTpuZXcgSmUoImZsb2F0MzIiLGMsWzEsMyxvLGVdKX0sWmE9YXN5bmMoYSx0KT0+e2xldCBvPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50PCJ1IiYmYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQsZT10eXBlb2YgSW1hZ2VEYXRhPCJ1IiYmYSBpbnN0YW5jZW9mIEltYWdlRGF0YSxyPXR5cGVvZiBJbWFnZUJpdG1hcDwidSImJmEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCxuPXR5cGVvZiBhPT0ic3RyaW5nIixzLGk9dD8/e30sdT0oKT0+e2lmKHR5cGVvZiBkb2N1bWVudDwidSIpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2lmKHR5cGVvZiBPZmZzY3JlZW5DYW52YXM8InUiKXJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSk7dGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHN1cHBvcnRlZCIpfSxsPWM9PmMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8YyBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcz9jLmdldENvbnRleHQoIjJkIik6bnVsbDtpZihvKXtsZXQgYz11KCk7Yy53aWR0aD1hLndpZHRoLGMuaGVpZ2h0PWEuaGVpZ2h0O2xldCBwPWwoYyk7aWYocCE9bnVsbCl7bGV0IGQ9YS5oZWlnaHQsVD1hLndpZHRoO2lmKHQhPT12b2lkIDAmJnQucmVzaXplZEhlaWdodCE9PXZvaWQgMCYmdC5yZXNpemVkV2lkdGghPT12b2lkIDAmJihkPXQucmVzaXplZEhlaWdodCxUPXQucmVzaXplZFdpZHRoKSx0IT09dm9pZCAwKXtpZihpPXQsdC50ZW5zb3JGb3JtYXQhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJJbWFnZSBpbnB1dCBjb25maWcgZm9ybWF0IG11c3QgYmUgUkdCQSBmb3IgSFRNTEltYWdlRWxlbWVudCIpO2kudGVuc29yRm9ybWF0PSJSR0JBIixpLmhlaWdodD1kLGkud2lkdGg9VH1lbHNlIGkudGVuc29yRm9ybWF0PSJSR0JBIixpLmhlaWdodD1kLGkud2lkdGg9VDtwLmRyYXdJbWFnZShhLDAsMCkscz1wLmdldEltYWdlRGF0YSgwLDAsVCxkKS5kYXRhfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIil9ZWxzZSBpZihlKXtsZXQgYyxwO2lmKHQhPT12b2lkIDAmJnQucmVzaXplZFdpZHRoIT09dm9pZCAwJiZ0LnJlc2l6ZWRIZWlnaHQhPT12b2lkIDA/KGM9dC5yZXNpemVkSGVpZ2h0LHA9dC5yZXNpemVkV2lkdGgpOihjPWEuaGVpZ2h0LHA9YS53aWR0aCksdCE9PXZvaWQgMCYmKGk9dCksaS5mb3JtYXQ9IlJHQkEiLGkuaGVpZ2h0PWMsaS53aWR0aD1wLHQhPT12b2lkIDApe2xldCBkPXUoKTtkLndpZHRoPXAsZC5oZWlnaHQ9YztsZXQgVD1sKGQpO2lmKFQhPW51bGwpVC5wdXRJbWFnZURhdGEoYSwwLDApLHM9VC5nZXRJbWFnZURhdGEoMCwwLHAsYykuZGF0YTtlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWVsc2Ugcz1hLmRhdGF9ZWxzZSBpZihyKXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHByb3ZpZGUgaW1hZ2UgY29uZmlnIHdpdGggZm9ybWF0IGZvciBJbWFnZWJpdG1hcCIpO2xldCBjPXUoKTtjLndpZHRoPWEud2lkdGgsYy5oZWlnaHQ9YS5oZWlnaHQ7bGV0IHA9bChjKTtpZihwIT1udWxsKXtsZXQgZD1hLmhlaWdodCxUPWEud2lkdGg7cmV0dXJuIHAuZHJhd0ltYWdlKGEsMCwwLFQsZCkscz1wLmdldEltYWdlRGF0YSgwLDAsVCxkKS5kYXRhLGkuaGVpZ2h0PWQsaS53aWR0aD1ULFdvKHMsaSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX1lbHNle2lmKG4pcmV0dXJuIG5ldyBQcm9taXNlKChjLHApPT57bGV0IGQ9dSgpLFQ9bChkKTtpZighYXx8IVQpcmV0dXJuIHAoKTtsZXQgdz1uZXcgSW1hZ2U7dy5jcm9zc09yaWdpbj0iQW5vbnltb3VzIix3LnNyYz1hLHcub25sb2FkPSgpPT57ZC53aWR0aD13LndpZHRoLGQuaGVpZ2h0PXcuaGVpZ2h0LFQuZHJhd0ltYWdlKHcsMCwwLGQud2lkdGgsZC5oZWlnaHQpO2xldCB2PVQuZ2V0SW1hZ2VEYXRhKDAsMCxkLndpZHRoLGQuaGVpZ2h0KTtpLmhlaWdodD1kLmhlaWdodCxpLndpZHRoPWQud2lkdGgsYyhXbyh2LmRhdGEsaSkpfX0pO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX1pZihzIT09dm9pZCAwKXJldHVybiBXbyhzLGkpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX0sUWE9KGEsdCk9PntsZXR7d2lkdGg6byxoZWlnaHQ6ZSxkb3dubG9hZDpyLGRpc3Bvc2U6bn09dCxzPVsxLGUsbyw0XTtyZXR1cm4gbmV3IEplKHtsb2NhdGlvbjoidGV4dHVyZSIsdHlwZToiZmxvYXQzMiIsdGV4dHVyZTphLGRpbXM6cyxkb3dubG9hZDpyLGRpc3Bvc2U6bn0pfSxlcz0oYSx0KT0+e2xldHtkYXRhVHlwZTpvLGRpbXM6ZSxkb3dubG9hZDpyLGRpc3Bvc2U6bn09dDtyZXR1cm4gbmV3IEplKHtsb2NhdGlvbjoiZ3B1LWJ1ZmZlciIsdHlwZTpvPz8iZmxvYXQzMiIsZ3B1QnVmZmVyOmEsZGltczplLGRvd25sb2FkOnIsZGlzcG9zZTpufSl9LHRzPShhLHQsbyk9Pm5ldyBKZSh7bG9jYXRpb246ImNwdS1waW5uZWQiLHR5cGU6YSxkYXRhOnQsZGltczpvPz9bdC5sZW5ndGhdfSl9KTt2YXIgdXIsUXIsbnMsb3MsaXM9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt1cj1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XV0pLFFyPW5ldyBNYXAoW1tGbG9hdDMyQXJyYXksImZsb2F0MzIiXSxbVWludDhBcnJheSwidWludDgiXSxbSW50OEFycmF5LCJpbnQ4Il0sW1VpbnQxNkFycmF5LCJ1aW50MTYiXSxbSW50MTZBcnJheSwiaW50MTYiXSxbSW50MzJBcnJheSwiaW50MzIiXSxbRmxvYXQ2NEFycmF5LCJmbG9hdDY0Il0sW1VpbnQzMkFycmF5LCJ1aW50MzIiXV0pLG5zPSExLG9zPSgpPT57aWYoIW5zKXtucz0hMDtsZXQgYT10eXBlb2YgQmlnSW50NjRBcnJheTwidSImJkJpZ0ludDY0QXJyYXkuZnJvbSx0PXR5cGVvZiBCaWdVaW50NjRBcnJheTwidSImJkJpZ1VpbnQ2NEFycmF5LmZyb20sbz10eXBlb2YgRmxvYXQxNkFycmF5PCJ1IiYmRmxvYXQxNkFycmF5LmZyb207YSYmKHVyLnNldCgiaW50NjQiLEJpZ0ludDY0QXJyYXkpLFFyLnNldChCaWdJbnQ2NEFycmF5LCJpbnQ2NCIpKSx0JiYodXIuc2V0KCJ1aW50NjQiLEJpZ1VpbnQ2NEFycmF5KSxRci5zZXQoQmlnVWludDY0QXJyYXksInVpbnQ2NCIpKSxvPyh1ci5zZXQoImZsb2F0MTYiLEZsb2F0MTZBcnJheSksUXIuc2V0KEZsb2F0MTZBcnJheSwiZmxvYXQxNiIpKTp1ci5zZXQoImZsb2F0MTYiLFVpbnQxNkFycmF5KX19fSk7dmFyIGFzLHNzLHVzPUwoKCk9PnsidXNlIHN0cmljdCI7Q24oKTthcz1hPT57bGV0IHQ9MTtmb3IobGV0IG89MDtvPGEubGVuZ3RoO28rKyl7bGV0IGU9YVtvXTtpZih0eXBlb2YgZSE9Im51bWJlciJ8fCFOdW1iZXIuaXNTYWZlSW50ZWdlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBkaW1zWyR7b31dIG11c3QgYmUgYW4gaW50ZWdlciwgZ290OiAke2V9YCk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBkaW1zWyR7b31dIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290OiAke2V9YCk7dCo9ZX1yZXR1cm4gdH0sc3M9KGEsdCk9Pntzd2l0Y2goYS5sb2NhdGlvbil7Y2FzZSJjcHUiOnJldHVybiBuZXcgSmUoYS50eXBlLGEuZGF0YSx0KTtjYXNlImNwdS1waW5uZWQiOnJldHVybiBuZXcgSmUoe2xvY2F0aW9uOiJjcHUtcGlubmVkIixkYXRhOmEuZGF0YSx0eXBlOmEudHlwZSxkaW1zOnR9KTtjYXNlInRleHR1cmUiOnJldHVybiBuZXcgSmUoe2xvY2F0aW9uOiJ0ZXh0dXJlIix0ZXh0dXJlOmEudGV4dHVyZSx0eXBlOmEudHlwZSxkaW1zOnR9KTtjYXNlImdwdS1idWZmZXIiOnJldHVybiBuZXcgSmUoe2xvY2F0aW9uOiJncHUtYnVmZmVyIixncHVCdWZmZXI6YS5ncHVCdWZmZXIsdHlwZTphLnR5cGUsZGltczp0fSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHRlbnNvclJlc2hhcGU6IHRlbnNvciBsb2NhdGlvbiAke2EubG9jYXRpb259IGlzIG5vdCBzdXBwb3J0ZWRgKX19fSk7dmFyIEplLENuPUwoKCk9PnsidXNlIHN0cmljdCI7SmEoKTtycygpO2lzKCk7dXMoKTtKZT1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8sZSl7b3MoKTtsZXQgcixuO2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmImxvY2F0aW9uImluIHQpc3dpdGNoKHRoaXMuZGF0YUxvY2F0aW9uPXQubG9jYXRpb24scj10LnR5cGUsbj10LmRpbXMsdC5sb2NhdGlvbil7Y2FzZSJjcHUtcGlubmVkIjp7bGV0IGk9dXIuZ2V0KHIpO2lmKCFpKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7cn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSBwaW5uZWQgYnVmZmVyYCk7aWYoISh0LmRhdGEgaW5zdGFuY2VvZiBpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBidWZmZXIgc2hvdWxkIGJlIG9mIHR5cGUgJHtpLm5hbWV9YCk7dGhpcy5jcHVEYXRhPXQuZGF0YTticmVha31jYXNlInRleHR1cmUiOntpZihyIT09ImZsb2F0MzIiKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7cn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSB0ZXh0dXJlYCk7dGhpcy5ncHVUZXh0dXJlRGF0YT10LnRleHR1cmUsdGhpcy5kb3dubG9hZGVyPXQuZG93bmxvYWQsdGhpcy5kaXNwb3Nlcj10LmRpc3Bvc2U7YnJlYWt9Y2FzZSJncHUtYnVmZmVyIjp7aWYociE9PSJmbG9hdDMyIiYmciE9PSJmbG9hdDE2IiYmciE9PSJpbnQzMiImJnIhPT0iaW50NjQiJiZyIT09InVpbnQzMiImJnIhPT0idWludDgiJiZyIT09ImJvb2wiKXRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGUgIiR7cn0iIHRvIGNyZWF0ZSB0ZW5zb3IgZnJvbSBncHUgYnVmZmVyYCk7dGhpcy5ncHVCdWZmZXJEYXRhPXQuZ3B1QnVmZmVyLHRoaXMuZG93bmxvYWRlcj10LmRvd25sb2FkLHRoaXMuZGlzcG9zZXI9dC5kaXNwb3NlO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3IgY29uc3RydWN0b3I6IHVuc3VwcG9ydGVkIGxvY2F0aW9uICcke3RoaXMuZGF0YUxvY2F0aW9ufSdgKX1lbHNle2xldCBpLHU7aWYodHlwZW9mIHQ9PSJzdHJpbmciKWlmKHI9dCx1PWUsdD09PSJzdHJpbmciKXtpZighQXJyYXkuaXNBcnJheShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHN0cmluZyB0ZW5zb3IncyBkYXRhIG11c3QgYmUgYSBzdHJpbmcgYXJyYXkuIik7aT1vfWVsc2V7bGV0IGw9dXIuZ2V0KHQpO2lmKGw9PT12b2lkIDApdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgdGVuc29yIHR5cGU6ICR7dH0uYCk7aWYoQXJyYXkuaXNBcnJheShvKSl7aWYodD09PSJmbG9hdDE2IiYmbD09PVVpbnQxNkFycmF5KXRocm93IG5ldyBUeXBlRXJyb3IoIkNyZWF0aW5nIGEgZmxvYXQxNiB0ZW5zb3IgZnJvbSBudW1iZXIgYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBVaW50MTZBcnJheSBhcyBkYXRhLiIpO3Q9PT0idWludDY0Inx8dD09PSJpbnQ2NCI/aT1sLmZyb20obyxCaWdJbnQpOmk9bC5mcm9tKG8pfWVsc2UgaWYobyBpbnN0YW5jZW9mIGwpaT1vO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgQSAke3J9IHRlbnNvcidzIGRhdGEgbXVzdCBiZSB0eXBlIG9mICR7bH1gKX1lbHNlIGlmKHU9byxBcnJheS5pc0FycmF5KHQpKXtpZih0Lmxlbmd0aD09PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7bGV0IGw9dHlwZW9mIHRbMF07aWYobD09PSJzdHJpbmciKXI9InN0cmluZyIsaT10O2Vsc2UgaWYobD09PSJib29sZWFuIilyPSJib29sIixpPVVpbnQ4QXJyYXkuZnJvbSh0KTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlIG9mIGRhdGEgYXJyYXk6ICR7bH0uYCl9ZWxzZXtsZXQgbD1Rci5nZXQodC5jb25zdHJ1Y3Rvcik7aWYobD09PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0eXBlIGZvciB0ZW5zb3IgZGF0YTogJHt0LmNvbnN0cnVjdG9yfS5gKTtyPWwsaT10fWlmKHU9PT12b2lkIDApdT1baS5sZW5ndGhdO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkodSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSB0ZW5zb3IncyBkaW1zIG11c3QgYmUgYSBudW1iZXIgYXJyYXkiKTtuPXUsdGhpcy5jcHVEYXRhPWksdGhpcy5kYXRhTG9jYXRpb249ImNwdSJ9bGV0IHM9YXMobik7aWYodGhpcy5jcHVEYXRhJiZzIT09dGhpcy5jcHVEYXRhLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRlbnNvcidzIHNpemUoJHtzfSkgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGgoJHt0aGlzLmNwdURhdGEubGVuZ3RofSkuYCk7dGhpcy50eXBlPXIsdGhpcy5kaW1zPW4sdGhpcy5zaXplPXN9c3RhdGljIGFzeW5jIGZyb21JbWFnZSh0LG8pe3JldHVybiBaYSh0LG8pfXN0YXRpYyBmcm9tVGV4dHVyZSh0LG8pe3JldHVybiBRYSh0LG8pfXN0YXRpYyBmcm9tR3B1QnVmZmVyKHQsbyl7cmV0dXJuIGVzKHQsbyl9c3RhdGljIGZyb21QaW5uZWRCdWZmZXIodCxvLGUpe3JldHVybiB0cyh0LG8sZSl9dG9EYXRhVVJMKHQpe3JldHVybiBYYSh0aGlzLHQpfXRvSW1hZ2VEYXRhKHQpe3JldHVybiBLYSh0aGlzLHQpfWdldCBkYXRhKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmNwdURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgb24gQ1BVLiBVc2UgYGdldERhdGEoKWAgdG8gZG93bmxvYWQgR1BVIGRhdGEgdG8gQ1BVLCBvciB1c2UgYHRleHR1cmVgIG9yIGBncHVCdWZmZXJgIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgR1BVIGRhdGEgZGlyZWN0bHkuIik7cmV0dXJuIHRoaXMuY3B1RGF0YX1nZXQgbG9jYXRpb24oKXtyZXR1cm4gdGhpcy5kYXRhTG9jYXRpb259Z2V0IHRleHR1cmUoKXtpZih0aGlzLmVuc3VyZVZhbGlkKCksIXRoaXMuZ3B1VGV4dHVyZURhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR0wgdGV4dHVyZS4iKTtyZXR1cm4gdGhpcy5ncHVUZXh0dXJlRGF0YX1nZXQgZ3B1QnVmZmVyKCl7aWYodGhpcy5lbnN1cmVWYWxpZCgpLCF0aGlzLmdwdUJ1ZmZlckRhdGEpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBpcyBub3Qgc3RvcmVkIGFzIGEgV2ViR1BVIGJ1ZmZlci4iKTtyZXR1cm4gdGhpcy5ncHVCdWZmZXJEYXRhfWFzeW5jIGdldERhdGEodCl7c3dpdGNoKHRoaXMuZW5zdXJlVmFsaWQoKSx0aGlzLmRhdGFMb2NhdGlvbil7Y2FzZSJjcHUiOmNhc2UiY3B1LXBpbm5lZCI6cmV0dXJuIHRoaXMuZGF0YTtjYXNlInRleHR1cmUiOmNhc2UiZ3B1LWJ1ZmZlciI6e2lmKCF0aGlzLmRvd25sb2FkZXIpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgbm90IGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBkYXRhIGRvd25sb2FkZXIuIik7aWYodGhpcy5pc0Rvd25sb2FkaW5nKXRocm93IG5ldyBFcnJvcigiVGhlIGN1cnJlbnQgdGVuc29yIGlzIGJlaW5nIGRvd25sb2FkZWQuIik7dHJ5e3RoaXMuaXNEb3dubG9hZGluZz0hMDtsZXQgbz1hd2FpdCB0aGlzLmRvd25sb2FkZXIoKTtyZXR1cm4gdGhpcy5kb3dubG9hZGVyPXZvaWQgMCx0aGlzLmRhdGFMb2NhdGlvbj0iY3B1Iix0aGlzLmNwdURhdGE9byx0JiZ0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSxvfWZpbmFsbHl7dGhpcy5pc0Rvd25sb2FkaW5nPSExfX1kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IGdldCBkYXRhIGZyb20gbG9jYXRpb246ICR7dGhpcy5kYXRhTG9jYXRpb259YCl9fWRpc3Bvc2UoKXtpZih0aGlzLmlzRG93bmxvYWRpbmcpdGhyb3cgbmV3IEVycm9yKCJUaGUgY3VycmVudCB0ZW5zb3IgaXMgYmVpbmcgZG93bmxvYWRlZC4iKTt0aGlzLmRpc3Bvc2VyJiYodGhpcy5kaXNwb3NlcigpLHRoaXMuZGlzcG9zZXI9dm9pZCAwKSx0aGlzLmNwdURhdGE9dm9pZCAwLHRoaXMuZ3B1VGV4dHVyZURhdGE9dm9pZCAwLHRoaXMuZ3B1QnVmZmVyRGF0YT12b2lkIDAsdGhpcy5kb3dubG9hZGVyPXZvaWQgMCx0aGlzLmlzRG93bmxvYWRpbmc9dm9pZCAwLHRoaXMuZGF0YUxvY2F0aW9uPSJub25lIn1lbnN1cmVWYWxpZCgpe2lmKHRoaXMuZGF0YUxvY2F0aW9uPT09Im5vbmUiKXRocm93IG5ldyBFcnJvcigiVGhlIHRlbnNvciBpcyBkaXNwb3NlZC4iKX1yZXNoYXBlKHQpe2lmKHRoaXMuZW5zdXJlVmFsaWQoKSx0aGlzLmRvd25sb2FkZXJ8fHRoaXMuZGlzcG9zZXIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVzaGFwZSBhIHRlbnNvciB0aGF0IG93bnMgR1BVIHJlc291cmNlLiIpO3JldHVybiBzcyh0aGlzLHQpfX19KTt2YXIgTWUsRm49TCgoKT0+eyJ1c2Ugc3RyaWN0IjtDbigpO01lPUplfSk7dmFyIGxzLGZzLGxyLGZyLEhvPUwoKCk9PnsidXNlIHN0cmljdCI7Vm8oKTtscz0oYSx0KT0+eyh0eXBlb2YgdXQudHJhY2U+InUiPyF1dC53YXNtLnRyYWNlOiF1dC50cmFjZSl8fGNvbnNvbGUudGltZVN0YW1wKGAke2F9OjpPUlQ6OiR7dH1gKX0sZnM9KGEsdCk9PntsZXQgbz1uZXcgRXJyb3IoKS5zdGFjaz8uc3BsaXQoL1xyXG58XHJ8XG4vZyl8fFtdLGU9ITE7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspe2lmKGUmJiFvW3JdLmluY2x1ZGVzKCJUUkFDRV9GVU5DIikpe2xldCBuPWBGVU5DXyR7YX06OiR7b1tyXS50cmltKCkuc3BsaXQoIiAiKVsxXX1gO3QmJihuKz1gOjoke3R9YCksbHMoIkNQVSIsbik7cmV0dXJufW9bcl0uaW5jbHVkZXMoIlRSQUNFX0ZVTkMiKSYmKGU9ITApfX0sbHI9YT0+eyh0eXBlb2YgdXQudHJhY2U+InUiPyF1dC53YXNtLnRyYWNlOiF1dC50cmFjZSl8fGZzKCJCRUdJTiIsYSl9LGZyPWE9PnsodHlwZW9mIHV0LnRyYWNlPiJ1Ij8hdXQud2FzbS50cmFjZTohdXQudHJhY2UpfHxmcygiRU5EIixhKX19KTt2YXIgJG4sY3M9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtMbigpO0ZuKCk7SG8oKTskbj1jbGFzcyBhe2NvbnN0cnVjdG9yKHQpe3RoaXMuaGFuZGxlcj10fWFzeW5jIHJ1bih0LG8sZSl7bHIoKTtsZXQgcj17fSxuPXt9O2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGx8fHQgaW5zdGFuY2VvZiBNZXx8QXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmVlZHMnIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgdXNlIGlucHV0IG5hbWVzIGFzIGtleXMgYW5kIE9ubnhWYWx1ZSBhcyBjb3JyZXNwb25kaW5nIHZhbHVlcy4iKTtsZXQgcz0hMDtpZih0eXBlb2Ygbz09Im9iamVjdCIpe2lmKG89PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMV06IGNhbm5vdCBiZSBudWxsLiIpO2lmKG8gaW5zdGFuY2VvZiBNZSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgY2Fubm90IGJlIGEgVGVuc29yIik7aWYoQXJyYXkuaXNBcnJheShvKSl7aWYoby5sZW5ndGg9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYW4gZW1wdHkgYXJyYXkuIik7cz0hMTtmb3IobGV0IGwgb2Ygbyl7aWYodHlwZW9mIGwhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBtdXN0IGJlIGEgc3RyaW5nIGFycmF5IG9yIGFuIG9iamVjdC4iKTtpZih0aGlzLm91dHB1dE5hbWVzLmluZGV4T2YobCk9PT0tMSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2ZldGNoZXMnIGNvbnRhaW5zIGludmFsaWQgb3V0cHV0IG5hbWU6ICR7bH0uYCk7cltsXT1udWxsfWlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpbj1lO2Vsc2UgaWYodHlwZW9mIGU8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNle2xldCBsPSExLGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobyk7Zm9yKGxldCBwIG9mIHRoaXMub3V0cHV0TmFtZXMpaWYoYy5pbmRleE9mKHApIT09LTEpe2xldCBkPW9bcF07KGQ9PT1udWxsfHxkIGluc3RhbmNlb2YgTWUpJiYobD0hMCxzPSExLHJbcF09ZCl9aWYobCl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCluPWU7ZWxzZSBpZih0eXBlb2YgZTwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2Ugbj1vfX1lbHNlIGlmKHR5cGVvZiBvPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBtdXN0IGJlICdmZXRjaGVzJyBvciAnb3B0aW9ucycuIik7Zm9yKGxldCBsIG9mIHRoaXMuaW5wdXROYW1lcylpZih0eXBlb2YgdFtsXT4idSIpdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHtsfScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKHMpZm9yKGxldCBsIG9mIHRoaXMub3V0cHV0TmFtZXMpcltsXT1udWxsO2xldCBpPWF3YWl0IHRoaXMuaGFuZGxlci5ydW4odCxyLG4pLHU9e307Zm9yKGxldCBsIGluIGkpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoaSxsKSl7bGV0IGM9aVtsXTtjIGluc3RhbmNlb2YgTWU/dVtsXT1jOnVbbF09bmV3IE1lKGMudHlwZSxjLmRhdGEsYy5kaW1zKX1yZXR1cm4gZnIoKSx1fWFzeW5jIHJlbGVhc2UoKXtyZXR1cm4gdGhpcy5oYW5kbGVyLmRpc3Bvc2UoKX1zdGF0aWMgYXN5bmMgY3JlYXRlKHQsbyxlLHIpe2xyKCk7bGV0IG4scz17fTtpZih0eXBlb2YgdD09InN0cmluZyIpe2lmKG49dCx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsKXM9bztlbHNlIGlmKHR5cGVvZiBvPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIil9ZWxzZSBpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYobj10LHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpcz1vO2Vsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXtsZXQgYz10LHA9MCxkPXQuYnl0ZUxlbmd0aDtpZih0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsKXM9bztlbHNlIGlmKHR5cGVvZiBvPT0ibnVtYmVyIil7aWYocD1vLCFOdW1iZXIuaXNTYWZlSW50ZWdlcihwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVPZmZzZXQnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihwPDB8fHA+PWMuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVPZmZzZXQnIGlzIG91dCBvZiByYW5nZSBbMCwgJHtjLmJ5dGVMZW5ndGh9KS5gKTtpZihkPXQuYnl0ZUxlbmd0aC1wLHR5cGVvZiBlPT0ibnVtYmVyIil7aWYoZD1lLCFOdW1iZXIuaXNTYWZlSW50ZWdlcihkKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihkPD0wfHxwK2Q+Yy5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZUxlbmd0aCcgaXMgb3V0IG9mIHJhbmdlICgwLCAke2MuYnl0ZUxlbmd0aC1wfV0uYCk7aWYodHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbClzPXI7ZWxzZSBpZih0eXBlb2YgcjwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYodHlwZW9mIGU8InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidieXRlTGVuZ3RoJyBtdXN0IGJlIGEgbnVtYmVyLiIpfWVsc2UgaWYodHlwZW9mIG88InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKTtuPW5ldyBVaW50OEFycmF5KGMscCxkKX1lbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMF06IG11c3QgYmUgJ3BhdGgnIG9yICdidWZmZXInLiIpO2xldFtpLHVdPWF3YWl0IERuKHMpLGw9YXdhaXQgaS5jcmVhdGVJbmZlcmVuY2VTZXNzaW9uSGFuZGxlcihuLHUpO3JldHVybiBmcigpLG5ldyBhKGwpfXN0YXJ0UHJvZmlsaW5nKCl7dGhpcy5oYW5kbGVyLnN0YXJ0UHJvZmlsaW5nKCl9ZW5kUHJvZmlsaW5nKCl7dGhpcy5oYW5kbGVyLmVuZFByb2ZpbGluZygpfWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5pbnB1dE5hbWVzfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9fX0pO3ZhciBQZCxwcz1MKCgpPT57InVzZSBzdHJpY3QiO2NzKCk7UGQ9JG59KTt2YXIgZHM9TCgoKT0+eyJ1c2Ugc3RyaWN0In0pO3ZhciBocz1MKCgpPT57InVzZSBzdHJpY3QifSk7dmFyIG1zPUwoKCk9PnsidXNlIHN0cmljdCJ9KTt2YXIgYnM9TCgoKT0+eyJ1c2Ugc3RyaWN0In0pO3ZhciBFZCxrbixncz1MKCgpPT57InVzZSBzdHJpY3QiO0xuKCk7Rm4oKTtFZD0iVHJhaW5pbmcgYmFja2VuZCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuIE1ha2Ugc3VyZSB5b3UncmUgdXNpbmcgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbiAmIFdlYkFzc2VtYmx5IGZpbGVzLiIsa249Y2xhc3MgYXtjb25zdHJ1Y3Rvcih0LG8sZSl7dGhpcy5oYW5kbGVyPXQsdGhpcy5oYXNPcHRpbWl6ZXJNb2RlbD1vLHRoaXMuaGFzRXZhbE1vZGVsPWV9Z2V0IHRyYWluaW5nSW5wdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIuaW5wdXROYW1lc31nZXQgdHJhaW5pbmdPdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9Z2V0IGV2YWxJbnB1dE5hbWVzKCl7aWYodGhpcy5oYXNFdmFsTW9kZWwpcmV0dXJuIHRoaXMuaGFuZGxlci5ldmFsSW5wdXROYW1lczt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgdHJhaW5pbmcgc2Vzc2lvbiBoYXMgbm8gZXZhbE1vZGVsIGxvYWRlZC4iKX1nZXQgZXZhbE91dHB1dE5hbWVzKCl7aWYodGhpcy5oYXNFdmFsTW9kZWwpcmV0dXJuIHRoaXMuaGFuZGxlci5ldmFsT3V0cHV0TmFtZXM7dGhyb3cgbmV3IEVycm9yKCJUaGlzIHRyYWluaW5nIHNlc3Npb24gaGFzIG5vIGV2YWxNb2RlbCBsb2FkZWQuIil9c3RhdGljIGFzeW5jIGNyZWF0ZSh0LG8pe2xldCBlPXQuZXZhbE1vZGVsfHwiIixyPXQub3B0aW1pemVyTW9kZWx8fCIiLG49b3x8e30sW3MsaV09YXdhaXQgRG4obik7aWYocy5jcmVhdGVUcmFpbmluZ1Nlc3Npb25IYW5kbGVyKXtsZXQgdT1hd2FpdCBzLmNyZWF0ZVRyYWluaW5nU2Vzc2lvbkhhbmRsZXIodC5jaGVja3BvaW50U3RhdGUsdC50cmFpbk1vZGVsLGUscixpKTtyZXR1cm4gbmV3IGEodSwhIXQub3B0aW1pemVyTW9kZWwsISF0LmV2YWxNb2RlbCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoRWQpfXR5cGVOYXJyb3dpbmdGb3JSdW5TdGVwKHQsbyxlLHIsbil7bGV0IHM9e30saT17fTtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHxlIGluc3RhbmNlb2YgTWV8fEFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZlZWRzJyBtdXN0IGJlIGFuIG9iamVjdCB0aGF0IHVzZSBpbnB1dCBuYW1lcyBhcyBrZXlzIGFuZCBPbm54VmFsdWUgYXMgY29ycmVzcG9uZGluZyB2YWx1ZXMuIik7bGV0IHU9ITA7aWYodHlwZW9mIHI9PSJvYmplY3QiKXtpZihyPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBjYW5ub3QgYmUgbnVsbC4iKTtpZihyIGluc3RhbmNlb2YgTWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhIFRlbnNvciIpO2lmKEFycmF5LmlzQXJyYXkocikpe2lmKHIubGVuZ3RoPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5LiIpO3U9ITE7Zm9yKGxldCBsIG9mIHIpe2lmKHR5cGVvZiBsIT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgbXVzdCBiZSBhIHN0cmluZyBhcnJheSBvciBhbiBvYmplY3QuIik7aWYoby5pbmRleE9mKGwpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdmZXRjaGVzJyBjb250YWlucyBpbnZhbGlkIG91dHB1dCBuYW1lOiAke2x9LmApO3NbbF09bnVsbH1pZih0eXBlb2Ygbj09Im9iamVjdCImJm4hPT1udWxsKWk9bjtlbHNlIGlmKHR5cGVvZiBuPCJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCInb3B0aW9ucycgbXVzdCBiZSBhbiBvYmplY3QuIil9ZWxzZXtsZXQgbD0hMSxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpO2ZvcihsZXQgcCBvZiBvKWlmKGMuaW5kZXhPZihwKSE9PS0xKXtsZXQgZD1yW3BdOyhkPT09bnVsbHx8ZCBpbnN0YW5jZW9mIE1lKSYmKGw9ITAsdT0hMSxzW3BdPWQpfWlmKGwpe2lmKHR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGwpaT1uO2Vsc2UgaWYodHlwZW9mIG48InUiKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGk9cn19ZWxzZSBpZih0eXBlb2YgcjwidSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogbXVzdCBiZSAnZmV0Y2hlcycgb3IgJ29wdGlvbnMnLiIpO2ZvcihsZXQgbCBvZiB0KWlmKHR5cGVvZiBlW2xdPiJ1Iil0aHJvdyBuZXcgRXJyb3IoYGlucHV0ICcke2x9JyBpcyBtaXNzaW5nIGluICdmZWVkcycuYCk7aWYodSlmb3IobGV0IGwgb2YgbylzW2xdPW51bGw7cmV0dXJuW3MsaV19Y29udmVydEhhbmRsZXJSZXR1cm5UeXBlVG9NYXBPZlRlbnNvcnModCl7bGV0IG89e307Zm9yKGxldCBlIGluIHQpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxlKSl7bGV0IHI9dFtlXTtyIGluc3RhbmNlb2YgTWU/b1tlXT1yOm9bZV09bmV3IE1lKHIudHlwZSxyLmRhdGEsci5kaW1zKX1yZXR1cm4gb31hc3luYyBsYXp5UmVzZXRHcmFkKCl7YXdhaXQgdGhpcy5oYW5kbGVyLmxhenlSZXNldEdyYWQoKX1hc3luYyBydW5UcmFpblN0ZXAodCxvLGUpe2xldFtyLG5dPXRoaXMudHlwZU5hcnJvd2luZ0ZvclJ1blN0ZXAodGhpcy50cmFpbmluZ0lucHV0TmFtZXMsdGhpcy50cmFpbmluZ091dHB1dE5hbWVzLHQsbyxlKSxzPWF3YWl0IHRoaXMuaGFuZGxlci5ydW5UcmFpblN0ZXAodCxyLG4pO3JldHVybiB0aGlzLmNvbnZlcnRIYW5kbGVyUmV0dXJuVHlwZVRvTWFwT2ZUZW5zb3JzKHMpfWFzeW5jIHJ1bk9wdGltaXplclN0ZXAodCl7aWYodGhpcy5oYXNPcHRpbWl6ZXJNb2RlbClhd2FpdCB0aGlzLmhhbmRsZXIucnVuT3B0aW1pemVyU3RlcCh0fHx7fSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgVHJhaW5pbmdTZXNzaW9uIGhhcyBubyBPcHRpbWl6ZXJNb2RlbCBsb2FkZWQuIil9YXN5bmMgcnVuRXZhbFN0ZXAodCxvLGUpe2lmKHRoaXMuaGFzRXZhbE1vZGVsKXtsZXRbcixuXT10aGlzLnR5cGVOYXJyb3dpbmdGb3JSdW5TdGVwKHRoaXMuZXZhbElucHV0TmFtZXMsdGhpcy5ldmFsT3V0cHV0TmFtZXMsdCxvLGUpLHM9YXdhaXQgdGhpcy5oYW5kbGVyLnJ1bkV2YWxTdGVwKHQscixuKTtyZXR1cm4gdGhpcy5jb252ZXJ0SGFuZGxlclJldHVyblR5cGVUb01hcE9mVGVuc29ycyhzKX1lbHNlIHRocm93IG5ldyBFcnJvcigiVGhpcyBUcmFpbmluZ1Nlc3Npb24gaGFzIG5vIEV2YWxNb2RlbCBsb2FkZWQuIil9YXN5bmMgZ2V0UGFyYW1ldGVyc1NpemUodD0hMCl7cmV0dXJuIHRoaXMuaGFuZGxlci5nZXRQYXJhbWV0ZXJzU2l6ZSh0KX1hc3luYyBsb2FkUGFyYW1ldGVyc0J1ZmZlcih0LG89ITApe2xldCBlPWF3YWl0IHRoaXMuZ2V0UGFyYW1ldGVyc1NpemUobyk7aWYodC5sZW5ndGghPT00KmUpdGhyb3cgbmV3IEVycm9yKCJTaXplIG9mIHRoZSBidWZmZXIgcGFzc2VkIGludG8gbG9hZFBhcmFtZXRlcnNCdWZmZXIgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIG1vZGVsLiBQbGVhc2UgdXNlIGdldFBhcmFtZXRlcnNTaXplIG1ldGhvZCB0byBjaGVjay4iKTtyZXR1cm4gdGhpcy5oYW5kbGVyLmxvYWRQYXJhbWV0ZXJzQnVmZmVyKHQsbyl9YXN5bmMgZ2V0Q29udGlndW91c1BhcmFtZXRlcnModD0hMCl7cmV0dXJuIHRoaXMuaGFuZGxlci5nZXRDb250aWd1b3VzUGFyYW1ldGVycyh0KX1hc3luYyByZWxlYXNlKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5kaXNwb3NlKCl9fX0pO3ZhciBEZCx5cz1MKCgpPT57InVzZSBzdHJpY3QiO2dzKCk7RGQ9a259KTt2YXIgcW89e307U3IocW8se0luZmVyZW5jZVNlc3Npb246KCk9PlBkLFRSQUNFOigpPT5scyxUUkFDRV9GVU5DX0JFR0lOOigpPT5scixUUkFDRV9GVU5DX0VORDooKT0+ZnIsVGVuc29yOigpPT5NZSxUcmFpbmluZ1Nlc3Npb246KCk9PkRkLGVudjooKT0+WixyZWdpc3RlckJhY2tlbmQ6KCk9PlByfSk7dmFyIE90PUwoKCk9PnsidXNlIHN0cmljdCI7V2EoKTtZYSgpO3BzKCk7Rm4oKTtkcygpO2hzKCk7SG8oKTttcygpO2JzKCk7eXMoKX0pO2Z1bmN0aW9uIFh0KGEsdCxvLGUpe2lmKHQ9PT12b2lkIDApcmV0dXJuIENkKGEpO2lmKG89PT12b2lkIDApQm4oYSx0LDEpO2Vsc2UgaWYodHlwZW9mIG89PSJudW1iZXIiJiZlPT09dm9pZCAwKUJuKGEsdCxvKTtlbHNlIGlmKHR5cGVvZiBvPT0ic3RyaW5nIiYmZT09PXZvaWQgMClCbihhLG8sMSx0KTtlbHNlIGlmKHR5cGVvZiBvPT0ic3RyaW5nIiYmdHlwZW9mIGU9PSJudW1iZXIiKUJuKGEsbyxlLHQpO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgaXMgdmFsaWQiKX1mdW5jdGlvbiBDZChhKXtyZXR1cm57dmVyYm9zZTpYdC52ZXJib3NlLmJpbmQobnVsbCxhKSxpbmZvOlh0LmluZm8uYmluZChudWxsLGEpLHdhcm5pbmc6WHQud2FybmluZy5iaW5kKG51bGwsYSksZXJyb3I6WHQuZXJyb3IuYmluZChudWxsLGEpLGZhdGFsOlh0LmZhdGFsLmJpbmQobnVsbCxhKX19ZnVuY3Rpb24gQm4oYSx0LG8sZSl7bGV0IHI9ZW5bZXx8IiJdfHxlblsiIl07eHNbYV08eHNbci5taW5pbWFsU2V2ZXJpdHldfHwoci5sb2dEYXRlVGltZSYmKHQ9YCR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfXwke3R9YCksci5sb2dTb3VyY2VMb2NhdGlvbixMZFtyLnByb3ZpZGVyXS5sb2coYSx0LGUpKX12YXIgam8sWW8seHMsTGQsd3MsZW4sY2UsUm4sTW4sR24sTm4sbHQ9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijtqbz1jbGFzc3tsb2codCxvLGUpe319LFlvPWNsYXNze2xvZyh0LG8sZSl7Y29uc29sZS5sb2coYCR7dGhpcy5jb2xvcih0KX0gJHtlPyJceDFCWzM1bSIrZSsiXHgxQlswbSAiOiIifSR7b31gKX1jb2xvcih0KXtzd2l0Y2godCl7Y2FzZSJ2ZXJib3NlIjpyZXR1cm4iXHgxQlszNDs0MG12XHgxQlswbSI7Y2FzZSJpbmZvIjpyZXR1cm4iXHgxQlszMm1pXHgxQlswbSI7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4iXHgxQlszMDs0M213XHgxQlswbSI7Y2FzZSJlcnJvciI6cmV0dXJuIlx4MUJbMzE7NDBtZVx4MUJbMG0iO2Nhc2UiZmF0YWwiOnJldHVybiJceDFCWzEwMW1mXHgxQlswbSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHNldmVyaXR5OiAke3R9YCl9fX0seHM9e3ZlcmJvc2U6MWUzLGluZm86MmUzLHdhcm5pbmc6NGUzLGVycm9yOjVlMyxmYXRhbDo2ZTN9LExkPXtub25lOm5ldyBqbyxjb25zb2xlOm5ldyBZb30sd3M9e3Byb3ZpZGVyOiJjb25zb2xlIixtaW5pbWFsU2V2ZXJpdHk6Indhcm5pbmciLGxvZ0RhdGVUaW1lOiEwLGxvZ1NvdXJjZUxvY2F0aW9uOiExfSxlbj17IiI6d3N9Oyh1PT57ZnVuY3Rpb24gYShsLGMpe3UoInZlcmJvc2UiLGwsYyl9dS52ZXJib3NlPWE7ZnVuY3Rpb24gdChsLGMpe3UoImluZm8iLGwsYyl9dS5pbmZvPXQ7ZnVuY3Rpb24gbyhsLGMpe3UoIndhcm5pbmciLGwsYyl9dS53YXJuaW5nPW87ZnVuY3Rpb24gZShsLGMpe3UoImVycm9yIixsLGMpfXUuZXJyb3I9ZTtmdW5jdGlvbiByKGwsYyl7dSgiZmF0YWwiLGwsYyl9dS5mYXRhbD1yO2Z1bmN0aW9uIG4obCl7ZW49e30scygiIixsfHx7fSl9dS5yZXNldD1uO2Z1bmN0aW9uIHMobCxjKXtpZihsPT09IioiKW4oYyk7ZWxzZXtsZXQgcD1lbltsXXx8d3M7ZW5bbF09e3Byb3ZpZGVyOmMucHJvdmlkZXJ8fHAucHJvdmlkZXIsbWluaW1hbFNldmVyaXR5OmMubWluaW1hbFNldmVyaXR5fHxwLm1pbmltYWxTZXZlcml0eSxsb2dEYXRlVGltZTpjLmxvZ0RhdGVUaW1lPT09dm9pZCAwP3AubG9nRGF0ZVRpbWU6Yy5sb2dEYXRlVGltZSxsb2dTb3VyY2VMb2NhdGlvbjpjLmxvZ1NvdXJjZUxvY2F0aW9uPT09dm9pZCAwP3AubG9nU291cmNlTG9jYXRpb246Yy5sb2dTb3VyY2VMb2NhdGlvbn19fXUuc2V0PXM7ZnVuY3Rpb24gaShsKXtsZXQgYz17fTtsLmxvZ0xldmVsJiYoYy5taW5pbWFsU2V2ZXJpdHk9bC5sb2dMZXZlbCkscygiIixjKX11LnNldFdpdGhFbnY9aX0pKFh0fHw9e30pO2NlPVh0LFJuPWNsYXNze2NvbnN0cnVjdG9yKHQsbyxlLHIsbixzKXt0aGlzLmNhdGVnb3J5PXQ7dGhpcy5uYW1lPW87dGhpcy5zdGFydFRpbWU9ZTt0aGlzLmVuZENhbGxiYWNrPXI7dGhpcy50aW1lcj1uO3RoaXMuY3R4PXN9YXN5bmMgZW5kKCl7cmV0dXJuIHRoaXMuZW5kQ2FsbGJhY2sodGhpcyl9YXN5bmMgY2hlY2tUaW1lcigpe2lmKHRoaXMuY3R4PT09dm9pZCAwfHx0aGlzLnRpbWVyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiTm8gd2ViZ2wgdGltZXIgZm91bmQiKTtyZXR1cm4gdGhpcy5jdHguZW5kVGltZXIoKSx0aGlzLmN0eC53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHRoaXMudGltZXIpfX0sTW49Y2xhc3N7Y29uc3RydWN0b3IodCxvLGUscil7dGhpcy5jYXRlZ29yeT10O3RoaXMubmFtZT1vO3RoaXMuc3RhcnRUaW1lPWU7dGhpcy5lbmRUaW1lPXJ9fSxHbj1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8sZSl7dGhpcy5fc3RhcnRlZD0hMTt0aGlzLl9mbHVzaFBvaW50ZXI9MDt0aGlzLl9zdGFydGVkPSExLHRoaXMuX21heE51bWJlckV2ZW50cz10PT09dm9pZCAwPzFlNDp0LHRoaXMuX2ZsdXNoQmF0Y2hTaXplPW89PT12b2lkIDA/MTA6byx0aGlzLl9mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHM9ZT09PXZvaWQgMD81ZTM6ZX1zdGF0aWMgY3JlYXRlKHQpe3JldHVybiB0PT09dm9pZCAwP25ldyB0aGlzOm5ldyB0aGlzKHQubWF4TnVtYmVyRXZlbnRzLHQuZmx1c2hCYXRjaFNpemUsdC5mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpfXN0YXJ0KCl7dGhpcy5fc3RhcnRlZD0hMCx0aGlzLl90aW1pbmdFdmVudHM9W10sdGhpcy5fZmx1c2hUaW1lPU5uKCksdGhpcy5fZmx1c2hQb2ludGVyPTB9c3RvcCgpe2Zvcih0aGlzLl9zdGFydGVkPSExO3RoaXMuX2ZsdXNoUG9pbnRlcjx0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoO3RoaXMuX2ZsdXNoUG9pbnRlcisrKXRoaXMubG9nT25lRXZlbnQodGhpcy5fdGltaW5nRXZlbnRzW3RoaXMuX2ZsdXNoUG9pbnRlcl0pfWV2ZW50KHQsbyxlLHIpe2xldCBuPXRoaXMuX3N0YXJ0ZWQ/dGhpcy5iZWdpbih0LG8scik6dm9pZCAwLHM9ITEsaT1lKCk7aWYoaSYmdHlwZW9mIGkudGhlbj09ImZ1bmN0aW9uIilyZXR1cm4gcz0hMCxuZXcgUHJvbWlzZSgodSxsKT0+e2kudGhlbihhc3luYyBjPT57biYmYXdhaXQgbi5lbmQoKSx1KGMpfSxhc3luYyBjPT57biYmYXdhaXQgbi5lbmQoKSxsKGMpfSl9KTtpZighcyYmbil7bGV0IHU9bi5lbmQoKTtpZih1JiZ0eXBlb2YgdS50aGVuPT0iZnVuY3Rpb24iKXJldHVybiBuZXcgUHJvbWlzZSgobCxjKT0+e3UudGhlbigoKT0+e2woaSl9LHA9PntjKHApfSl9KX1yZXR1cm4gaX1iZWdpbih0LG8sZSl7aWYoIXRoaXMuX3N0YXJ0ZWQpdGhyb3cgbmV3IEVycm9yKCJwcm9maWxlciBpcyBub3Qgc3RhcnRlZCB5ZXQiKTtpZihlPT09dm9pZCAwKXtsZXQgcj1ObigpO3JldHVybiB0aGlzLmZsdXNoKHIpLG5ldyBSbih0LG8scixuPT50aGlzLmVuZFN5bmMobikpfWVsc2V7bGV0IHI9ZS5iZWdpblRpbWVyKCk7cmV0dXJuIG5ldyBSbih0LG8sMCxhc3luYyBuPT50aGlzLmVuZChuKSxyLGUpfX1hc3luYyBlbmQodCl7bGV0IG89YXdhaXQgdC5jaGVja1RpbWVyKCk7dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDx0aGlzLl9tYXhOdW1iZXJFdmVudHMmJih0aGlzLl90aW1pbmdFdmVudHMucHVzaChuZXcgTW4odC5jYXRlZ29yeSx0Lm5hbWUsdC5zdGFydFRpbWUsbykpLHRoaXMuZmx1c2gobykpfWVuZFN5bmModCl7bGV0IG89Tm4oKTt0aGlzLl90aW1pbmdFdmVudHMubGVuZ3RoPHRoaXMuX21heE51bWJlckV2ZW50cyYmKHRoaXMuX3RpbWluZ0V2ZW50cy5wdXNoKG5ldyBNbih0LmNhdGVnb3J5LHQubmFtZSx0LnN0YXJ0VGltZSxvKSksdGhpcy5mbHVzaChvKSl9bG9nT25lRXZlbnQodCl7Y2UudmVyYm9zZShgUHJvZmlsZXIuJHt0LmNhdGVnb3J5fWAsYCR7KHQuZW5kVGltZS10LnN0YXJ0VGltZSkudG9GaXhlZCgyKX1tcyBvbiBldmVudCAnJHt0Lm5hbWV9JyBhdCAke3QuZW5kVGltZS50b0ZpeGVkKDIpfWApfWZsdXNoKHQpe2lmKHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGgtdGhpcy5fZmx1c2hQb2ludGVyPj10aGlzLl9mbHVzaEJhdGNoU2l6ZXx8dC10aGlzLl9mbHVzaFRpbWU+PXRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyl7Zm9yKGxldCBvPXRoaXMuX2ZsdXNoUG9pbnRlcjt0aGlzLl9mbHVzaFBvaW50ZXI8byt0aGlzLl9mbHVzaEJhdGNoU2l6ZSYmdGhpcy5fZmx1c2hQb2ludGVyPHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg7dGhpcy5fZmx1c2hQb2ludGVyKyspdGhpcy5sb2dPbmVFdmVudCh0aGlzLl90aW1pbmdFdmVudHNbdGhpcy5fZmx1c2hQb2ludGVyXSk7dGhpcy5fZmx1c2hUaW1lPU5uKCl9fWdldCBzdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9fSxObj10eXBlb2YgcGVyZm9ybWFuY2U8InUiJiZwZXJmb3JtYW5jZS5ub3c/KCk9PnBlcmZvcm1hbmNlLm5vdygpOkRhdGUubm93fSk7ZnVuY3Rpb24gdnMoYSx0LG8pe2ZvcihsZXQgZSBvZiBvKXtsZXQgcj1lWzBdLG49ZVsxXSxzPWVbMl0saT1lWzNdLHU9ZVs0XTtpZihhLm9wVHlwZT09PXIpe2ZvcihsZXQgbCBvZiB0KWlmKChsLmRvbWFpbj09PW58fGwuZG9tYWluPT09ImFpLm9ubngiJiZuPT09IiIpJiZGZChsLnZlcnNpb24scykpcmV0dXJue29wSW1wbDppLG9wSW5pdDp1fX19dGhyb3cgbmV3IFR5cGVFcnJvcihgY2Fubm90IHJlc29sdmUgb3BlcmF0b3IgJyR7YS5vcFR5cGV9JyB3aXRoIG9wc2V0czogJHt0Lm1hcChlPT5gJHtlLmRvbWFpbnx8ImFpLm9ubngifSB2JHtlLnZlcnNpb259YCkuam9pbigiLCAiKX1gKX1mdW5jdGlvbiBGZChhLHQpe2lmKHQuZW5kc1dpdGgoIisiKSl7bGV0IG89TnVtYmVyLnBhcnNlSW50KHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtMSksMTApO3JldHVybiFpc05hTihvKSYmbzw9YX1lbHNlIGlmKHQuc3BsaXQoIi0iKS5sZW5ndGg9PT0yKXtsZXQgbz10LnNwbGl0KCItIiksZT1OdW1iZXIucGFyc2VJbnQob1swXSwxMCkscj1OdW1iZXIucGFyc2VJbnQob1sxXSwxMCk7cmV0dXJuIWlzTmFOKGUpJiYhaXNOYU4ocikmJmU8PWEmJmE8PXJ9ZWxzZSByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHQsMTApPT09YX12YXIgX3M9TCgoKT0+eyJ1c2Ugc3RyaWN0In0pO3ZhciBPcz1tZShYbz0+eyJ1c2Ugc3RyaWN0IjtYby5fX2VzTW9kdWxlPSEwO3ZhciAkZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEodCl7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuIik7dGhpcy52YWx1ZT1hLkVNUFRZLHQmJmEuaXNHdWlkKHQpJiYodGhpcy52YWx1ZT10KX1yZXR1cm4gYS5pc0d1aWQ9ZnVuY3Rpb24odCl7dmFyIG89dC50b1N0cmluZygpO3JldHVybiB0JiYodCBpbnN0YW5jZW9mIGF8fGEudmFsaWRhdG9yLnRlc3QobykpfSxhLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgYShbYS5nZW4oMiksYS5nZW4oMSksYS5nZW4oMSksYS5nZW4oMSksYS5nZW4oMyldLmpvaW4oIi0iKSl9LGEuY3JlYXRlRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEoImVtcHR5Z3VpZCIpfSxhLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYSh0KX0sYS5yYXc9ZnVuY3Rpb24oKXtyZXR1cm5bYS5nZW4oMiksYS5nZW4oMSksYS5nZW4oMSksYS5nZW4oMSksYS5nZW4oMyldLmpvaW4oIi0iKX0sYS5nZW49ZnVuY3Rpb24odCl7Zm9yKHZhciBvPSIiLGU9MDtlPHQ7ZSsrKW8rPSgoMStNYXRoLnJhbmRvbSgpKSo2NTUzNnwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO3JldHVybiBvfSxhLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGEuaXNHdWlkKHQpJiZ0aGlzLnZhbHVlPT09dC50b1N0cmluZygpfSxhLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWU9PT1hLkVNUFRZfSxhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxhLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6dGhpcy52YWx1ZX19LGEudmFsaWRhdG9yPW5ldyBSZWdFeHAoIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kIiwiaSIpLGEuRU1QVFk9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsYX0oKTtYby5HdWlkPSRkfSk7ZnVuY3Rpb24gYmUoYSx0LG8pe3RoaXMubG93PWF8MCx0aGlzLmhpZ2g9dHwwLHRoaXMudW5zaWduZWQ9ISFvfWZ1bmN0aW9uIFhlKGEpe3JldHVybihhJiZhLl9faXNMb25nX18pPT09ITB9ZnVuY3Rpb24gSXMoYSl7dmFyIHQ9TWF0aC5jbHozMihhJi1hKTtyZXR1cm4gYT8zMS10OnR9ZnVuY3Rpb24gY3IoYSx0KXt2YXIgbyxlLHI7cmV0dXJuIHQ/KGE+Pj49MCwocj0wPD1hJiZhPDI1NikmJihlPUFzW2FdLGUpP2U6KG89bGUoYSwwLCEwKSxyJiYoQXNbYV09byksbykpOihhfD0wLChyPS0xMjg8PWEmJmE8MTI4KSYmKGU9U3NbYV0sZSk/ZToobz1sZShhLGE8MD8tMTowLCExKSxyJiYoU3NbYV09byksbykpfWZ1bmN0aW9uIGN0KGEsdCl7aWYoaXNOYU4oYSkpcmV0dXJuIHQ/enQ6SXQ7aWYodCl7aWYoYTwwKXJldHVybiB6dDtpZihhPj1McylyZXR1cm4gJHN9ZWxzZXtpZihhPD0tRXMpcmV0dXJuIG50O2lmKGErMT49RXMpcmV0dXJuIEZzfXJldHVybiBhPDA/Y3QoLWEsdCkubmVnKCk6bGUoYSVEcnwwLGEvRHJ8MCx0KX1mdW5jdGlvbiBsZShhLHQsbyl7cmV0dXJuIG5ldyBiZShhLHQsbyl9ZnVuY3Rpb24gSm8oYSx0LG8pe2lmKGEubGVuZ3RoPT09MCl0aHJvdyBFcnJvcigiZW1wdHkgc3RyaW5nIik7aWYodHlwZW9mIHQ9PSJudW1iZXIiPyhvPXQsdD0hMSk6dD0hIXQsYT09PSJOYU4ifHxhPT09IkluZmluaXR5Inx8YT09PSIrSW5maW5pdHkifHxhPT09Ii1JbmZpbml0eSIpcmV0dXJuIHQ/enQ6SXQ7aWYobz1vfHwxMCxvPDJ8fDM2PG8pdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTt2YXIgZTtpZigoZT1hLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7aWYoZT09PTApcmV0dXJuIEpvKGEuc3Vic3RyaW5nKDEpLHQsbykubmVnKCk7Zm9yKHZhciByPWN0KFVuKG8sOCkpLG49SXQscz0wO3M8YS5sZW5ndGg7cys9OCl7dmFyIGk9TWF0aC5taW4oOCxhLmxlbmd0aC1zKSx1PXBhcnNlSW50KGEuc3Vic3RyaW5nKHMscytpKSxvKTtpZihpPDgpe3ZhciBsPWN0KFVuKG8saSkpO249bi5tdWwobCkuYWRkKGN0KHUpKX1lbHNlIG49bi5tdWwociksbj1uLmFkZChjdCh1KSl9cmV0dXJuIG4udW5zaWduZWQ9dCxufWZ1bmN0aW9uIFN0KGEsdCl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIj9jdChhLHQpOnR5cGVvZiBhPT0ic3RyaW5nIj9KbyhhLHQpOmxlKGEubG93LGEuaGlnaCx0eXBlb2YgdD09ImJvb2xlYW4iP3Q6YS51bnNpZ25lZCl9dmFyIGZ0LFNzLEFzLFVuLFBzLGtkLERyLExzLEVzLERzLEl0LHp0LEVyLENzLEtvLEZzLCRzLG50LEIsVnQsWm89TCgoKT0+e2Z0PW51bGw7dHJ5e2Z0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9YmUucHJvdG90eXBlLl9faXNMb25nX187T2JqZWN0LmRlZmluZVByb3BlcnR5KGJlLnByb3RvdHlwZSwiX19pc0xvbmdfXyIse3ZhbHVlOiEwfSk7YmUuaXNMb25nPVhlO1NzPXt9LEFzPXt9O2JlLmZyb21JbnQ9Y3I7YmUuZnJvbU51bWJlcj1jdDtiZS5mcm9tQml0cz1sZTtVbj1NYXRoLnBvdztiZS5mcm9tU3RyaW5nPUpvO2JlLmZyb21WYWx1ZT1TdDtQcz02NTUzNixrZD0xPDwyNCxEcj1QcypQcyxMcz1EcipEcixFcz1Mcy8yLERzPWNyKGtkKSxJdD1jcigwKTtiZS5aRVJPPUl0O3p0PWNyKDAsITApO2JlLlVaRVJPPXp0O0VyPWNyKDEpO2JlLk9ORT1FcjtDcz1jcigxLCEwKTtiZS5VT05FPUNzO0tvPWNyKC0xKTtiZS5ORUdfT05FPUtvO0ZzPWxlKC0xLDIxNDc0ODM2NDcsITEpO2JlLk1BWF9WQUxVRT1Gczskcz1sZSgtMSwtMSwhMCk7YmUuTUFYX1VOU0lHTkVEX1ZBTFVFPSRzO250PWxlKDAsLTIxNDc0ODM2NDgsITEpO2JlLk1JTl9WQUxVRT1udDtCPWJlLnByb3RvdHlwZTtCLnRvSW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpcy5sb3c+Pj4wOnRoaXMubG93fTtCLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/KHRoaXMuaGlnaD4+PjApKkRyKyh0aGlzLmxvdz4+PjApOnRoaXMuaGlnaCpEcisodGhpcy5sb3c+Pj4wKX07Qi50b1N0cmluZz1mdW5jdGlvbih0KXtpZih0PXR8fDEwLHQ8Mnx8MzY8dCl0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIjAiO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKWlmKHRoaXMuZXEobnQpKXt2YXIgbz1jdCh0KSxlPXRoaXMuZGl2KG8pLHI9ZS5tdWwobykuc3ViKHRoaXMpO3JldHVybiBlLnRvU3RyaW5nKHQpK3IudG9JbnQoKS50b1N0cmluZyh0KX1lbHNlIHJldHVybiItIit0aGlzLm5lZygpLnRvU3RyaW5nKHQpO2Zvcih2YXIgbj1jdChVbih0LDYpLHRoaXMudW5zaWduZWQpLHM9dGhpcyxpPSIiOzspe3ZhciB1PXMuZGl2KG4pLGw9cy5zdWIodS5tdWwobikpLnRvSW50KCk+Pj4wLGM9bC50b1N0cmluZyh0KTtpZihzPXUscy5pc1plcm8oKSlyZXR1cm4gYytpO2Zvcig7Yy5sZW5ndGg8NjspYz0iMCIrYztpPSIiK2MraX19O0IuZ2V0SGlnaEJpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdofTtCLmdldEhpZ2hCaXRzVW5zaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH07Qi5nZXRMb3dCaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93fTtCLmdldExvd0JpdHNVbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvdz4+PjB9O0IuZ2V0TnVtQml0c0Ficz1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxKG50KT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtmb3IodmFyIHQ9dGhpcy5oaWdoIT0wP3RoaXMuaGlnaDp0aGlzLmxvdyxvPTMxO28+MCYmISh0JjE8PG8pO28tLSk7cmV0dXJuIHRoaXMuaGlnaCE9MD9vKzMzOm8rMX07Qi5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oaWdoPT09MCYmdGhpcy5sb3c9PT0wfTtCLmVxej1CLmlzWmVybztCLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9O0IuaXNQb3NpdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkfHx0aGlzLmhpZ2g+PTB9O0IuaXNPZGQ9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5sb3cmMSk9PT0xfTtCLmlzRXZlbj1mdW5jdGlvbigpe3JldHVybih0aGlzLmxvdyYxKT09PTB9O0IuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBYZSh0KXx8KHQ9U3QodCkpLHRoaXMudW5zaWduZWQhPT10LnVuc2lnbmVkJiZ0aGlzLmhpZ2g+Pj4zMT09PTEmJnQuaGlnaD4+PjMxPT09MT8hMTp0aGlzLmhpZ2g9PT10LmhpZ2gmJnRoaXMubG93PT09dC5sb3d9O0IuZXE9Qi5lcXVhbHM7Qi5ub3RFcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuZXEodCl9O0IubmVxPUIubm90RXF1YWxzO0IubmU9Qi5ub3RFcXVhbHM7Qi5sZXNzVGhhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wKHQpPDB9O0IubHQ9Qi5sZXNzVGhhbjtCLmxlc3NUaGFuT3JFcXVhbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wKHQpPD0wfTtCLmx0ZT1CLmxlc3NUaGFuT3JFcXVhbDtCLmxlPUIubGVzc1RoYW5PckVxdWFsO0IuZ3JlYXRlclRoYW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcCh0KT4wfTtCLmd0PUIuZ3JlYXRlclRoYW47Qi5ncmVhdGVyVGhhbk9yRXF1YWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcCh0KT49MH07Qi5ndGU9Qi5ncmVhdGVyVGhhbk9yRXF1YWw7Qi5nZT1CLmdyZWF0ZXJUaGFuT3JFcXVhbDtCLmNvbXBhcmU9ZnVuY3Rpb24odCl7aWYoWGUodCl8fCh0PVN0KHQpKSx0aGlzLmVxKHQpKXJldHVybiAwO3ZhciBvPXRoaXMuaXNOZWdhdGl2ZSgpLGU9dC5pc05lZ2F0aXZlKCk7cmV0dXJuIG8mJiFlPy0xOiFvJiZlPzE6dGhpcy51bnNpZ25lZD90LmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fHQuaGlnaD09PXRoaXMuaGlnaCYmdC5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKHQpLmlzTmVnYXRpdmUoKT8tMToxfTtCLmNvbXA9Qi5jb21wYXJlO0IubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMudW5zaWduZWQmJnRoaXMuZXEobnQpP250OnRoaXMubm90KCkuYWRkKEVyKX07Qi5uZWc9Qi5uZWdhdGU7Qi5hZGQ9ZnVuY3Rpb24odCl7WGUodCl8fCh0PVN0KHQpKTt2YXIgbz10aGlzLmhpZ2g+Pj4xNixlPXRoaXMuaGlnaCY2NTUzNSxyPXRoaXMubG93Pj4+MTYsbj10aGlzLmxvdyY2NTUzNSxzPXQuaGlnaD4+PjE2LGk9dC5oaWdoJjY1NTM1LHU9dC5sb3c+Pj4xNixsPXQubG93JjY1NTM1LGM9MCxwPTAsZD0wLFQ9MDtyZXR1cm4gVCs9bitsLGQrPVQ+Pj4xNixUJj02NTUzNSxkKz1yK3UscCs9ZD4+PjE2LGQmPTY1NTM1LHArPWUraSxjKz1wPj4+MTYscCY9NjU1MzUsYys9bytzLGMmPTY1NTM1LGxlKGQ8PDE2fFQsYzw8MTZ8cCx0aGlzLnVuc2lnbmVkKX07Qi5zdWJ0cmFjdD1mdW5jdGlvbih0KXtyZXR1cm4gWGUodCl8fCh0PVN0KHQpKSx0aGlzLmFkZCh0Lm5lZygpKX07Qi5zdWI9Qi5zdWJ0cmFjdDtCLm11bHRpcGx5PWZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXM7aWYoWGUodCl8fCh0PVN0KHQpKSxmdCl7dmFyIG89ZnQubXVsKHRoaXMubG93LHRoaXMuaGlnaCx0Lmxvdyx0LmhpZ2gpO3JldHVybiBsZShvLGZ0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYodC5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD96dDpJdDtpZih0aGlzLmVxKG50KSlyZXR1cm4gdC5pc09kZCgpP250Okl0O2lmKHQuZXEobnQpKXJldHVybiB0aGlzLmlzT2RkKCk/bnQ6SXQ7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHQuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKHQubmVnKCkpOnRoaXMubmVnKCkubXVsKHQpLm5lZygpO2lmKHQuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bCh0Lm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KERzKSYmdC5sdChEcykpcmV0dXJuIGN0KHRoaXMudG9OdW1iZXIoKSp0LnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7dmFyIGU9dGhpcy5oaWdoPj4+MTYscj10aGlzLmhpZ2gmNjU1MzUsbj10aGlzLmxvdz4+PjE2LHM9dGhpcy5sb3cmNjU1MzUsaT10LmhpZ2g+Pj4xNix1PXQuaGlnaCY2NTUzNSxsPXQubG93Pj4+MTYsYz10LmxvdyY2NTUzNSxwPTAsZD0wLFQ9MCx3PTA7cmV0dXJuIHcrPXMqYyxUKz13Pj4+MTYsdyY9NjU1MzUsVCs9bipjLGQrPVQ+Pj4xNixUJj02NTUzNSxUKz1zKmwsZCs9VD4+PjE2LFQmPTY1NTM1LGQrPXIqYyxwKz1kPj4+MTYsZCY9NjU1MzUsZCs9bipsLHArPWQ+Pj4xNixkJj02NTUzNSxkKz1zKnUscCs9ZD4+PjE2LGQmPTY1NTM1LHArPWUqYytyKmwrbip1K3MqaSxwJj02NTUzNSxsZShUPDwxNnx3LHA8PDE2fGQsdGhpcy51bnNpZ25lZCl9O0IubXVsPUIubXVsdGlwbHk7Qi5kaXZpZGU9ZnVuY3Rpb24odCl7aWYoWGUodCl8fCh0PVN0KHQpKSx0LmlzWmVybygpKXRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7aWYoZnQpe2lmKCF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g9PT0tMjE0NzQ4MzY0OCYmdC5sb3c9PT0tMSYmdC5oaWdoPT09LTEpcmV0dXJuIHRoaXM7dmFyIG89KHRoaXMudW5zaWduZWQ/ZnQuZGl2X3U6ZnQuZGl2X3MpKHRoaXMubG93LHRoaXMuaGlnaCx0Lmxvdyx0LmhpZ2gpO3JldHVybiBsZShvLGZ0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD96dDpJdDt2YXIgZSxyLG47aWYodGhpcy51bnNpZ25lZCl7aWYodC51bnNpZ25lZHx8KHQ9dC50b1Vuc2lnbmVkKCkpLHQuZ3QodGhpcykpcmV0dXJuIHp0O2lmKHQuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gQ3M7bj16dH1lbHNle2lmKHRoaXMuZXEobnQpKXtpZih0LmVxKEVyKXx8dC5lcShLbykpcmV0dXJuIG50O2lmKHQuZXEobnQpKXJldHVybiBFcjt2YXIgcz10aGlzLnNocigxKTtyZXR1cm4gZT1zLmRpdih0KS5zaGwoMSksZS5lcShJdCk/dC5pc05lZ2F0aXZlKCk/RXI6S286KHI9dGhpcy5zdWIodC5tdWwoZSkpLG49ZS5hZGQoci5kaXYodCkpLG4pfWVsc2UgaWYodC5lcShudCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/enQ6SXQ7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHQuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkuZGl2KHQubmVnKCkpOnRoaXMubmVnKCkuZGl2KHQpLm5lZygpO2lmKHQuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmRpdih0Lm5lZygpKS5uZWcoKTtuPUl0fWZvcihyPXRoaXM7ci5ndGUodCk7KXtlPU1hdGgubWF4KDEsTWF0aC5mbG9vcihyLnRvTnVtYmVyKCkvdC50b051bWJlcigpKSk7Zm9yKHZhciBpPU1hdGguY2VpbChNYXRoLmxvZyhlKS9NYXRoLkxOMiksdT1pPD00OD8xOlVuKDIsaS00OCksbD1jdChlKSxjPWwubXVsKHQpO2MuaXNOZWdhdGl2ZSgpfHxjLmd0KHIpOyllLT11LGw9Y3QoZSx0aGlzLnVuc2lnbmVkKSxjPWwubXVsKHQpO2wuaXNaZXJvKCkmJihsPUVyKSxuPW4uYWRkKGwpLHI9ci5zdWIoYyl9cmV0dXJuIG59O0IuZGl2PUIuZGl2aWRlO0IubW9kdWxvPWZ1bmN0aW9uKHQpe2lmKFhlKHQpfHwodD1TdCh0KSksZnQpe3ZhciBvPSh0aGlzLnVuc2lnbmVkP2Z0LnJlbV91OmZ0LnJlbV9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsdC5sb3csdC5oaWdoKTtyZXR1cm4gbGUobyxmdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfXJldHVybiB0aGlzLnN1Yih0aGlzLmRpdih0KS5tdWwodCkpfTtCLm1vZD1CLm1vZHVsbztCLnJlbT1CLm1vZHVsbztCLm5vdD1mdW5jdGlvbigpe3JldHVybiBsZSh+dGhpcy5sb3csfnRoaXMuaGlnaCx0aGlzLnVuc2lnbmVkKX07Qi5jb3VudExlYWRpbmdaZXJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g/TWF0aC5jbHozMih0aGlzLmhpZ2gpOk1hdGguY2x6MzIodGhpcy5sb3cpKzMyfTtCLmNsej1CLmNvdW50TGVhZGluZ1plcm9zO0IuY291bnRUcmFpbGluZ1plcm9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93P0lzKHRoaXMubG93KTpJcyh0aGlzLmhpZ2gpKzMyfTtCLmN0ej1CLmNvdW50VHJhaWxpbmdaZXJvcztCLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gWGUodCl8fCh0PVN0KHQpKSxsZSh0aGlzLmxvdyZ0Lmxvdyx0aGlzLmhpZ2gmdC5oaWdoLHRoaXMudW5zaWduZWQpfTtCLm9yPWZ1bmN0aW9uKHQpe3JldHVybiBYZSh0KXx8KHQ9U3QodCkpLGxlKHRoaXMubG93fHQubG93LHRoaXMuaGlnaHx0LmhpZ2gsdGhpcy51bnNpZ25lZCl9O0IueG9yPWZ1bmN0aW9uKHQpe3JldHVybiBYZSh0KXx8KHQ9U3QodCkpLGxlKHRoaXMubG93XnQubG93LHRoaXMuaGlnaF50LmhpZ2gsdGhpcy51bnNpZ25lZCl9O0Iuc2hpZnRMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBYZSh0KSYmKHQ9dC50b0ludCgpKSwodCY9NjMpPT09MD90aGlzOnQ8MzI/bGUodGhpcy5sb3c8PHQsdGhpcy5oaWdoPDx0fHRoaXMubG93Pj4+MzItdCx0aGlzLnVuc2lnbmVkKTpsZSgwLHRoaXMubG93PDx0LTMyLHRoaXMudW5zaWduZWQpfTtCLnNobD1CLnNoaWZ0TGVmdDtCLnNoaWZ0UmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFhlKHQpJiYodD10LnRvSW50KCkpLCh0Jj02Myk9PT0wP3RoaXM6dDwzMj9sZSh0aGlzLmxvdz4+PnR8dGhpcy5oaWdoPDwzMi10LHRoaXMuaGlnaD4+dCx0aGlzLnVuc2lnbmVkKTpsZSh0aGlzLmhpZ2g+PnQtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9O0Iuc2hyPUIuc2hpZnRSaWdodDtCLnNoaWZ0UmlnaHRVbnNpZ25lZD1mdW5jdGlvbih0KXtyZXR1cm4gWGUodCkmJih0PXQudG9JbnQoKSksKHQmPTYzKT09PTA/dGhpczp0PDMyP2xlKHRoaXMubG93Pj4+dHx0aGlzLmhpZ2g8PDMyLXQsdGhpcy5oaWdoPj4+dCx0aGlzLnVuc2lnbmVkKTp0PT09MzI/bGUodGhpcy5oaWdoLDAsdGhpcy51bnNpZ25lZCk6bGUodGhpcy5oaWdoPj4+dC0zMiwwLHRoaXMudW5zaWduZWQpfTtCLnNocnU9Qi5zaGlmdFJpZ2h0VW5zaWduZWQ7Qi5zaHJfdT1CLnNoaWZ0UmlnaHRVbnNpZ25lZDtCLnJvdGF0ZUxlZnQ9ZnVuY3Rpb24odCl7dmFyIG87cmV0dXJuIFhlKHQpJiYodD10LnRvSW50KCkpLCh0Jj02Myk9PT0wP3RoaXM6dD09PTMyP2xlKHRoaXMuaGlnaCx0aGlzLmxvdyx0aGlzLnVuc2lnbmVkKTp0PDMyPyhvPTMyLXQsbGUodGhpcy5sb3c8PHR8dGhpcy5oaWdoPj4+byx0aGlzLmhpZ2g8PHR8dGhpcy5sb3c+Pj5vLHRoaXMudW5zaWduZWQpKToodC09MzIsbz0zMi10LGxlKHRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+Pm8sdGhpcy5sb3c8PHR8dGhpcy5oaWdoPj4+byx0aGlzLnVuc2lnbmVkKSl9O0Iucm90bD1CLnJvdGF0ZUxlZnQ7Qi5yb3RhdGVSaWdodD1mdW5jdGlvbih0KXt2YXIgbztyZXR1cm4gWGUodCkmJih0PXQudG9JbnQoKSksKHQmPTYzKT09PTA/dGhpczp0PT09MzI/bGUodGhpcy5oaWdoLHRoaXMubG93LHRoaXMudW5zaWduZWQpOnQ8MzI/KG89MzItdCxsZSh0aGlzLmhpZ2g8PG98dGhpcy5sb3c+Pj50LHRoaXMubG93PDxvfHRoaXMuaGlnaD4+PnQsdGhpcy51bnNpZ25lZCkpOih0LT0zMixvPTMyLXQsbGUodGhpcy5sb3c8PG98dGhpcy5oaWdoPj4+dCx0aGlzLmhpZ2g8PG98dGhpcy5sb3c+Pj50LHRoaXMudW5zaWduZWQpKX07Qi5yb3RyPUIucm90YXRlUmlnaHQ7Qi50b1NpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuc2lnbmVkP2xlKHRoaXMubG93LHRoaXMuaGlnaCwhMSk6dGhpc307Qi50b1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpczpsZSh0aGlzLmxvdyx0aGlzLmhpZ2gsITApfTtCLnRvQnl0ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfTtCLnRvQnl0ZXNMRT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaGlnaCxvPXRoaXMubG93O3JldHVybltvJjI1NSxvPj4+OCYyNTUsbz4+PjE2JjI1NSxvPj4+MjQsdCYyNTUsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0XX07Qi50b0J5dGVzQkU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmhpZ2gsbz10aGlzLmxvdztyZXR1cm5bdD4+PjI0LHQ+Pj4xNiYyNTUsdD4+PjgmMjU1LHQmMjU1LG8+Pj4yNCxvPj4+MTYmMjU1LG8+Pj44JjI1NSxvJjI1NV19O2JlLmZyb21CeXRlcz1mdW5jdGlvbih0LG8sZSl7cmV0dXJuIGU/YmUuZnJvbUJ5dGVzTEUodCxvKTpiZS5mcm9tQnl0ZXNCRSh0LG8pfTtiZS5mcm9tQnl0ZXNMRT1mdW5jdGlvbih0LG8pe3JldHVybiBuZXcgYmUodFswXXx0WzFdPDw4fHRbMl08PDE2fHRbM108PDI0LHRbNF18dFs1XTw8OHx0WzZdPDwxNnx0WzddPDwyNCxvKX07YmUuZnJvbUJ5dGVzQkU9ZnVuY3Rpb24odCxvKXtyZXR1cm4gbmV3IGJlKHRbNF08PDI0fHRbNV08PDE2fHRbNl08PDh8dFs3XSx0WzBdPDwyNHx0WzFdPDwxNnx0WzJdPDw4fHRbM10sbyl9O1Z0PWJlfSk7dmFyIF8sem49TCgoKT0+e189e307Xy5PZmZzZXQ7Xy5UYWJsZTtfLlNJWkVPRl9TSE9SVD0yO18uU0laRU9GX0lOVD00O18uRklMRV9JREVOVElGSUVSX0xFTkdUSD00O18uU0laRV9QUkVGSVhfTEVOR1RIPTQ7Xy5FbmNvZGluZz17VVRGOF9CWVRFUzoxLFVURjE2X1NUUklORzoyfTtfLmludDMyPW5ldyBJbnQzMkFycmF5KDIpO18uZmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KF8uaW50MzIuYnVmZmVyKTtfLmZsb2F0NjQ9bmV3IEZsb2F0NjRBcnJheShfLmludDMyLmJ1ZmZlcik7Xy5pc0xpdHRsZUVuZGlhbj1uZXcgVWludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoWzEsMF0pLmJ1ZmZlcilbMF09PT0xO18uTG9uZz1mdW5jdGlvbihhLHQpe3RoaXMubG93PWF8MCx0aGlzLmhpZ2g9dHwwfTtfLkxvbmcuY3JlYXRlPWZ1bmN0aW9uKGEsdCl7cmV0dXJuIGE9PTAmJnQ9PTA/Xy5Mb25nLlpFUk86bmV3IF8uTG9uZyhhLHQpfTtfLkxvbmcucHJvdG90eXBlLnRvRmxvYXQ2ND1mdW5jdGlvbigpe3JldHVybih0aGlzLmxvdz4+PjApK3RoaXMuaGlnaCo0Mjk0OTY3Mjk2fTtfLkxvbmcucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sb3c9PWEubG93JiZ0aGlzLmhpZ2g9PWEuaGlnaH07Xy5Mb25nLlpFUk89bmV3IF8uTG9uZygwLDApO18uQnVpbGRlcj1mdW5jdGlvbihhKXtpZihhKXZhciB0PWE7ZWxzZSB2YXIgdD0xMDI0O3RoaXMuYmI9Xy5CeXRlQnVmZmVyLmFsbG9jYXRlKHQpLHRoaXMuc3BhY2U9dCx0aGlzLm1pbmFsaWduPTEsdGhpcy52dGFibGU9bnVsbCx0aGlzLnZ0YWJsZV9pbl91c2U9MCx0aGlzLmlzTmVzdGVkPSExLHRoaXMub2JqZWN0X3N0YXJ0PTAsdGhpcy52dGFibGVzPVtdLHRoaXMudmVjdG9yX251bV9lbGVtcz0wLHRoaXMuZm9yY2VfZGVmYXVsdHM9ITF9O18uQnVpbGRlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJiLmNsZWFyKCksdGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCksdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExfTtfLkJ1aWxkZXIucHJvdG90eXBlLmZvcmNlRGVmYXVsdHM9ZnVuY3Rpb24oYSl7dGhpcy5mb3JjZV9kZWZhdWx0cz1hfTtfLkJ1aWxkZXIucHJvdG90eXBlLmRhdGFCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYn07Xy5CdWlsZGVyLnByb3RvdHlwZS5hc1VpbnQ4QXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYi5ieXRlcygpLnN1YmFycmF5KHRoaXMuYmIucG9zaXRpb24oKSx0aGlzLmJiLnBvc2l0aW9uKCkrdGhpcy5vZmZzZXQoKSl9O18uQnVpbGRlci5wcm90b3R5cGUucHJlcD1mdW5jdGlvbihhLHQpe2E+dGhpcy5taW5hbGlnbiYmKHRoaXMubWluYWxpZ249YSk7Zm9yKHZhciBvPX4odGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2UrdCkrMSZhLTE7dGhpcy5zcGFjZTxvK2ErdDspe3ZhciBlPXRoaXMuYmIuY2FwYWNpdHkoKTt0aGlzLmJiPV8uQnVpbGRlci5ncm93Qnl0ZUJ1ZmZlcih0aGlzLmJiKSx0aGlzLnNwYWNlKz10aGlzLmJiLmNhcGFjaXR5KCktZX10aGlzLnBhZChvKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5wYWQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciB0PTA7dDxhO3QrKyl0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsMCl9O18uQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGEpe3RoaXMuYmIud3JpdGVJbnQ4KHRoaXMuc3BhY2UtPTEsYSl9O18uQnVpbGRlci5wcm90b3R5cGUud3JpdGVJbnQxNj1mdW5jdGlvbihhKXt0aGlzLmJiLndyaXRlSW50MTYodGhpcy5zcGFjZS09MixhKX07Xy5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKGEpe3RoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLT00LGEpfTtfLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24oYSl7dGhpcy5iYi53cml0ZUludDY0KHRoaXMuc3BhY2UtPTgsYSl9O18uQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKGEpe3RoaXMuYmIud3JpdGVGbG9hdDMyKHRoaXMuc3BhY2UtPTQsYSl9O18uQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDY0PWZ1bmN0aW9uKGEpe3RoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuc3BhY2UtPTgsYSl9O18uQnVpbGRlci5wcm90b3R5cGUuYWRkSW50OD1mdW5jdGlvbihhKXt0aGlzLnByZXAoMSwwKSx0aGlzLndyaXRlSW50OChhKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQxNj1mdW5jdGlvbihhKXt0aGlzLnByZXAoMiwwKSx0aGlzLndyaXRlSW50MTYoYSl9O18uQnVpbGRlci5wcm90b3R5cGUuYWRkSW50MzI9ZnVuY3Rpb24oYSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUludDMyKGEpfTtfLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDY0PWZ1bmN0aW9uKGEpe3RoaXMucHJlcCg4LDApLHRoaXMud3JpdGVJbnQ2NChhKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5hZGRGbG9hdDMyPWZ1bmN0aW9uKGEpe3RoaXMucHJlcCg0LDApLHRoaXMud3JpdGVGbG9hdDMyKGEpfTtfLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0NjQ9ZnVuY3Rpb24oYSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUZsb2F0NjQoYSl9O18uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQ4PWZ1bmN0aW9uKGEsdCxvKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bykmJih0aGlzLmFkZEludDgodCksdGhpcy5zbG90KGEpKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDE2PWZ1bmN0aW9uKGEsdCxvKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bykmJih0aGlzLmFkZEludDE2KHQpLHRoaXMuc2xvdChhKSl9O18uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQzMj1mdW5jdGlvbihhLHQsbyl7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW8pJiYodGhpcy5hZGRJbnQzMih0KSx0aGlzLnNsb3QoYSkpfTtfLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50NjQ9ZnVuY3Rpb24oYSx0LG8peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHwhdC5lcXVhbHMobykpJiYodGhpcy5hZGRJbnQ2NCh0KSx0aGlzLnNsb3QoYSkpfTtfLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQzMj1mdW5jdGlvbihhLHQsbyl7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW8pJiYodGhpcy5hZGRGbG9hdDMyKHQpLHRoaXMuc2xvdChhKSl9O18uQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRGbG9hdDY0PWZ1bmN0aW9uKGEsdCxvKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bykmJih0aGlzLmFkZEZsb2F0NjQodCksdGhpcy5zbG90KGEpKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZE9mZnNldD1mdW5jdGlvbihhLHQsbyl7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW8pJiYodGhpcy5hZGRPZmZzZXQodCksdGhpcy5zbG90KGEpKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZFN0cnVjdD1mdW5jdGlvbihhLHQsbyl7dCE9byYmKHRoaXMubmVzdGVkKHQpLHRoaXMuc2xvdChhKSl9O18uQnVpbGRlci5wcm90b3R5cGUubmVzdGVkPWZ1bmN0aW9uKGEpe2lmKGEhPXRoaXMub2Zmc2V0KCkpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogc3RydWN0IG11c3QgYmUgc2VyaWFsaXplZCBpbmxpbmUuIil9O18uQnVpbGRlci5wcm90b3R5cGUubm90TmVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05lc3RlZCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBvYmplY3Qgc2VyaWFsaXphdGlvbiBtdXN0IG5vdCBiZSBuZXN0ZWQuIil9O18uQnVpbGRlci5wcm90b3R5cGUuc2xvdD1mdW5jdGlvbihhKXt0aGlzLnZ0YWJsZVthXT10aGlzLm9mZnNldCgpfTtfLkJ1aWxkZXIucHJvdG90eXBlLm9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZX07Xy5CdWlsZGVyLmdyb3dCeXRlQnVmZmVyPWZ1bmN0aW9uKGEpe3ZhciB0PWEuY2FwYWNpdHkoKTtpZih0JjMyMjEyMjU0NzIpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogY2Fubm90IGdyb3cgYnVmZmVyIGJleW9uZCAyIGdpZ2FieXRlcy4iKTt2YXIgbz10PDwxLGU9Xy5CeXRlQnVmZmVyLmFsbG9jYXRlKG8pO3JldHVybiBlLnNldFBvc2l0aW9uKG8tdCksZS5ieXRlcygpLnNldChhLmJ5dGVzKCksby10KSxlfTtfLkJ1aWxkZXIucHJvdG90eXBlLmFkZE9mZnNldD1mdW5jdGlvbihhKXt0aGlzLnByZXAoXy5TSVpFT0ZfSU5ULDApLHRoaXMud3JpdGVJbnQzMih0aGlzLm9mZnNldCgpLWErXy5TSVpFT0ZfSU5UKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5zdGFydE9iamVjdD1mdW5jdGlvbihhKXt0aGlzLm5vdE5lc3RlZCgpLHRoaXMudnRhYmxlPT1udWxsJiYodGhpcy52dGFibGU9W10pLHRoaXMudnRhYmxlX2luX3VzZT1hO2Zvcih2YXIgdD0wO3Q8YTt0KyspdGhpcy52dGFibGVbdF09MDt0aGlzLmlzTmVzdGVkPSEwLHRoaXMub2JqZWN0X3N0YXJ0PXRoaXMub2Zmc2V0KCl9O18uQnVpbGRlci5wcm90b3R5cGUuZW5kT2JqZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy52dGFibGU9PW51bGx8fCF0aGlzLmlzTmVzdGVkKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGVuZE9iamVjdCBjYWxsZWQgd2l0aG91dCBzdGFydE9iamVjdCIpO3RoaXMuYWRkSW50MzIoMCk7Zm9yKHZhciBhPXRoaXMub2Zmc2V0KCksdD10aGlzLnZ0YWJsZV9pbl91c2UtMTt0Pj0wJiZ0aGlzLnZ0YWJsZVt0XT09MDt0LS0pO2Zvcih2YXIgbz10KzE7dD49MDt0LS0pdGhpcy5hZGRJbnQxNih0aGlzLnZ0YWJsZVt0XSE9MD9hLXRoaXMudnRhYmxlW3RdOjApO3ZhciBlPTI7dGhpcy5hZGRJbnQxNihhLXRoaXMub2JqZWN0X3N0YXJ0KTt2YXIgcj0obytlKSpfLlNJWkVPRl9TSE9SVDt0aGlzLmFkZEludDE2KHIpO3ZhciBuPTAscz10aGlzLnNwYWNlO2U6Zm9yKHQ9MDt0PHRoaXMudnRhYmxlcy5sZW5ndGg7dCsrKXt2YXIgaT10aGlzLmJiLmNhcGFjaXR5KCktdGhpcy52dGFibGVzW3RdO2lmKHI9PXRoaXMuYmIucmVhZEludDE2KGkpKXtmb3IodmFyIHU9Xy5TSVpFT0ZfU0hPUlQ7dTxyO3UrPV8uU0laRU9GX1NIT1JUKWlmKHRoaXMuYmIucmVhZEludDE2KHMrdSkhPXRoaXMuYmIucmVhZEludDE2KGkrdSkpY29udGludWUgZTtuPXRoaXMudnRhYmxlc1t0XTticmVha319cmV0dXJuIG4/KHRoaXMuc3BhY2U9dGhpcy5iYi5jYXBhY2l0eSgpLWEsdGhpcy5iYi53cml0ZUludDMyKHRoaXMuc3BhY2Usbi1hKSk6KHRoaXMudnRhYmxlcy5wdXNoKHRoaXMub2Zmc2V0KCkpLHRoaXMuYmIud3JpdGVJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktYSx0aGlzLm9mZnNldCgpLWEpKSx0aGlzLmlzTmVzdGVkPSExLGF9O18uQnVpbGRlci5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGEsdCxvKXt2YXIgZT1vP18uU0laRV9QUkVGSVhfTEVOR1RIOjA7aWYodCl7dmFyIHI9dDtpZih0aGlzLnByZXAodGhpcy5taW5hbGlnbixfLlNJWkVPRl9JTlQrXy5GSUxFX0lERU5USUZJRVJfTEVOR1RIK2UpLHIubGVuZ3RoIT1fLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrXy5GSUxFX0lERU5USUZJRVJfTEVOR1RIKTtmb3IodmFyIG49Xy5GSUxFX0lERU5USUZJRVJfTEVOR1RILTE7bj49MDtuLS0pdGhpcy53cml0ZUludDgoci5jaGFyQ29kZUF0KG4pKX10aGlzLnByZXAodGhpcy5taW5hbGlnbixfLlNJWkVPRl9JTlQrZSksdGhpcy5hZGRPZmZzZXQoYSksZSYmdGhpcy5hZGRJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZSksdGhpcy5iYi5zZXRQb3NpdGlvbih0aGlzLnNwYWNlKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5maW5pc2hTaXplUHJlZml4ZWQ9ZnVuY3Rpb24oYSx0KXt0aGlzLmZpbmlzaChhLHQsITApfTtfLkJ1aWxkZXIucHJvdG90eXBlLnJlcXVpcmVkRmllbGQ9ZnVuY3Rpb24oYSx0KXt2YXIgbz10aGlzLmJiLmNhcGFjaXR5KCktYSxlPW8tdGhpcy5iYi5yZWFkSW50MzIobykscj10aGlzLmJiLnJlYWRJbnQxNihlK3QpIT0wO2lmKCFyKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpZWxkICIrdCsiIG11c3QgYmUgc2V0Iil9O18uQnVpbGRlci5wcm90b3R5cGUuc3RhcnRWZWN0b3I9ZnVuY3Rpb24oYSx0LG8pe3RoaXMubm90TmVzdGVkKCksdGhpcy52ZWN0b3JfbnVtX2VsZW1zPXQsdGhpcy5wcmVwKF8uU0laRU9GX0lOVCxhKnQpLHRoaXMucHJlcChvLGEqdCl9O18uQnVpbGRlci5wcm90b3R5cGUuZW5kVmVjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud3JpdGVJbnQzMih0aGlzLnZlY3Rvcl9udW1fZWxlbXMpLHRoaXMub2Zmc2V0KCl9O18uQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlU3RyaW5nPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXZhciB0PWE7ZWxzZSBmb3IodmFyIHQ9W10sbz0wO288YS5sZW5ndGg7KXt2YXIgZSxyPWEuY2hhckNvZGVBdChvKyspO2lmKHI8NTUyOTZ8fHI+PTU2MzIwKWU9cjtlbHNle3ZhciBuPWEuY2hhckNvZGVBdChvKyspO2U9KHI8PDEwKStuKyg2NTUzNi01NjYyMzEwNC01NjMyMCl9ZTwxMjg/dC5wdXNoKGUpOihlPDIwNDg/dC5wdXNoKGU+PjYmMzF8MTkyKTooZTw2NTUzNj90LnB1c2goZT4+MTImMTV8MjI0KTp0LnB1c2goZT4+MTgmN3wyNDAsZT4+MTImNjN8MTI4KSx0LnB1c2goZT4+NiY2M3wxMjgpKSx0LnB1c2goZSY2M3wxMjgpKX10aGlzLmFkZEludDgoMCksdGhpcy5zdGFydFZlY3RvcigxLHQubGVuZ3RoLDEpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZS09dC5sZW5ndGgpO2Zvcih2YXIgbz0wLHM9dGhpcy5zcGFjZSxpPXRoaXMuYmIuYnl0ZXMoKTtvPHQubGVuZ3RoO28rKylpW3MrK109dFtvXTtyZXR1cm4gdGhpcy5lbmRWZWN0b3IoKX07Xy5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKGEsdCl7cmV0dXJuIF8uTG9uZy5jcmVhdGUoYSx0KX07Xy5CeXRlQnVmZmVyPWZ1bmN0aW9uKGEpe3RoaXMuYnl0ZXNfPWEsdGhpcy5wb3NpdGlvbl89MH07Xy5CeXRlQnVmZmVyLmFsbG9jYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgXy5CeXRlQnVmZmVyKG5ldyBVaW50OEFycmF5KGEpKX07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb25fPTB9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc199O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl99O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5wb3NpdGlvbl89YX07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5jYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzXy5sZW5ndGh9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVhZFVpbnQ4KGEpPDwyND4+MjR9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ5dGVzX1thXX07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVhZFVpbnQxNihhKTw8MTY+PjE2fTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTY9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYnl0ZXNfW2FdfHRoaXMuYnl0ZXNfW2ErMV08PDh9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ5dGVzX1thXXx0aGlzLmJ5dGVzX1thKzFdPDw4fHRoaXMuYnl0ZXNfW2ErMl08PDE2fHRoaXMuYnl0ZXNfW2ErM108PDI0fTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVhZEludDMyKGEpPj4+MH07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBfLkxvbmcodGhpcy5yZWFkSW50MzIoYSksdGhpcy5yZWFkSW50MzIoYSs0KSl9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IF8uTG9uZyh0aGlzLnJlYWRVaW50MzIoYSksdGhpcy5yZWFkVWludDMyKGErNCkpfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdDMyPWZ1bmN0aW9uKGEpe3JldHVybiBfLmludDMyWzBdPXRoaXMucmVhZEludDMyKGEpLF8uZmxvYXQzMlswXX07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQ2ND1mdW5jdGlvbihhKXtyZXR1cm4gXy5pbnQzMltfLmlzTGl0dGxlRW5kaWFuPzA6MV09dGhpcy5yZWFkSW50MzIoYSksXy5pbnQzMltfLmlzTGl0dGxlRW5kaWFuPzE6MF09dGhpcy5yZWFkSW50MzIoYSs0KSxfLmZsb2F0NjRbMF19O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGEsdCl7dGhpcy5ieXRlc19bYV09dH07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ4PWZ1bmN0aW9uKGEsdCl7dGhpcy5ieXRlc19bYV09dH07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKGEsdCl7dGhpcy5ieXRlc19bYV09dCx0aGlzLmJ5dGVzX1thKzFdPXQ+Pjh9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTY9ZnVuY3Rpb24oYSx0KXt0aGlzLmJ5dGVzX1thXT10LHRoaXMuYnl0ZXNfW2ErMV09dD4+OH07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKGEsdCl7dGhpcy5ieXRlc19bYV09dCx0aGlzLmJ5dGVzX1thKzFdPXQ+PjgsdGhpcy5ieXRlc19bYSsyXT10Pj4xNix0aGlzLmJ5dGVzX1thKzNdPXQ+PjI0fTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyPWZ1bmN0aW9uKGEsdCl7dGhpcy5ieXRlc19bYV09dCx0aGlzLmJ5dGVzX1thKzFdPXQ+PjgsdGhpcy5ieXRlc19bYSsyXT10Pj4xNix0aGlzLmJ5dGVzX1thKzNdPXQ+PjI0fTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24oYSx0KXt0aGlzLndyaXRlSW50MzIoYSx0LmxvdyksdGhpcy53cml0ZUludDMyKGErNCx0LmhpZ2gpfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDY0PWZ1bmN0aW9uKGEsdCl7dGhpcy53cml0ZVVpbnQzMihhLHQubG93KSx0aGlzLndyaXRlVWludDMyKGErNCx0LmhpZ2gpfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQzMj1mdW5jdGlvbihhLHQpe18uZmxvYXQzMlswXT10LHRoaXMud3JpdGVJbnQzMihhLF8uaW50MzJbMF0pfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbihhLHQpe18uZmxvYXQ2NFswXT10LHRoaXMud3JpdGVJbnQzMihhLF8uaW50MzJbXy5pc0xpdHRsZUVuZGlhbj8wOjFdKSx0aGlzLndyaXRlSW50MzIoYSs0LF8uaW50MzJbXy5pc0xpdHRsZUVuZGlhbj8xOjBdKX07Xy5CeXRlQnVmZmVyLnByb3RvdHlwZS5nZXRCdWZmZXJJZGVudGlmaWVyPWZ1bmN0aW9uKCl7aWYodGhpcy5ieXRlc18ubGVuZ3RoPHRoaXMucG9zaXRpb25fK18uU0laRU9GX0lOVCtfLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogQnl0ZUJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbiBhbiBpZGVudGlmaWVyLiIpO2Zvcih2YXIgYT0iIix0PTA7dDxfLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7dCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytfLlNJWkVPRl9JTlQrdCkpO3JldHVybiBhfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fb2Zmc2V0PWZ1bmN0aW9uKGEsdCl7dmFyIG89YS10aGlzLnJlYWRJbnQzMihhKTtyZXR1cm4gdDx0aGlzLnJlYWRJbnQxNihvKT90aGlzLnJlYWRJbnQxNihvK3QpOjB9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX191bmlvbj1mdW5jdGlvbihhLHQpe3JldHVybiBhLmJiX3Bvcz10K3RoaXMucmVhZEludDMyKHQpLGEuYmI9dGhpcyxhfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fc3RyaW5nPWZ1bmN0aW9uKGEsdCl7YSs9dGhpcy5yZWFkSW50MzIoYSk7dmFyIG89dGhpcy5yZWFkSW50MzIoYSksZT0iIixyPTA7aWYoYSs9Xy5TSVpFT0ZfSU5ULHQ9PT1fLkVuY29kaW5nLlVURjhfQllURVMpcmV0dXJuIHRoaXMuYnl0ZXNfLnN1YmFycmF5KGEsYStvKTtmb3IoO3I8bzspe3ZhciBuLHM9dGhpcy5yZWFkVWludDgoYStyKyspO2lmKHM8MTkyKW49cztlbHNle3ZhciBpPXRoaXMucmVhZFVpbnQ4KGErcisrKTtpZihzPDIyNCluPShzJjMxKTw8NnxpJjYzO2Vsc2V7dmFyIHU9dGhpcy5yZWFkVWludDgoYStyKyspO2lmKHM8MjQwKW49KHMmMTUpPDwxMnwoaSY2Myk8PDZ8dSY2MztlbHNle3ZhciBsPXRoaXMucmVhZFVpbnQ4KGErcisrKTtuPShzJjcpPDwxOHwoaSY2Myk8PDEyfCh1JjYzKTw8NnxsJjYzfX19bjw2NTUzNj9lKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOihuLT02NTUzNixlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChuPj4xMCkrNTUyOTYsKG4mMTAyNC0xKSs1NjMyMCkpfXJldHVybiBlfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9faW5kaXJlY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGErdGhpcy5yZWFkSW50MzIoYSl9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGErdGhpcy5yZWFkSW50MzIoYSkrXy5TSVpFT0ZfSU5UfTtfLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdmVjdG9yX2xlbj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoYSt0aGlzLnJlYWRJbnQzMihhKSl9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19oYXNfaWRlbnRpZmllcj1mdW5jdGlvbihhKXtpZihhLmxlbmd0aCE9Xy5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpbGUgaWRlbnRpZmllciBtdXN0IGJlIGxlbmd0aCAiK18uRklMRV9JREVOVElGSUVSX0xFTkdUSCk7Zm9yKHZhciB0PTA7dDxfLkZJTEVfSURFTlRJRklFUl9MRU5HVEg7dCsrKWlmKGEuY2hhckNvZGVBdCh0KSE9dGhpcy5yZWFkSW50OCh0aGlzLnBvc2l0aW9uXytfLlNJWkVPRl9JTlQrdCkpcmV0dXJuITE7cmV0dXJuITB9O18uQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY3JlYXRlTG9uZz1mdW5jdGlvbihhLHQpe3JldHVybiBfLkxvbmcuY3JlYXRlKGEsdCl9fSk7dmFyIFYsdG49TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt6bigpOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2xldCByOyhGPT4oRltGLlVOREVGSU5FRD0wXT0iVU5ERUZJTkVEIixGW0YuRkxPQVQ9MV09IkZMT0FUIixGW0YuSU5UPTJdPSJJTlQiLEZbRi5TVFJJTkc9M109IlNUUklORyIsRltGLlRFTlNPUj00XT0iVEVOU09SIixGW0YuR1JBUEg9NV09IkdSQVBIIixGW0YuRkxPQVRTPTZdPSJGTE9BVFMiLEZbRi5JTlRTPTddPSJJTlRTIixGW0YuU1RSSU5HUz04XT0iU1RSSU5HUyIsRltGLlRFTlNPUlM9OV09IlRFTlNPUlMiLEZbRi5HUkFQSFM9MTBdPSJHUkFQSFMiLEZbRi5TUEFSU0VfVEVOU09SPTExXT0iU1BBUlNFX1RFTlNPUiIsRltGLlNQQVJTRV9URU5TT1JTPTEyXT0iU1BBUlNFX1RFTlNPUlMiKSkocj1uLkF0dHJpYnV0ZVR5cGV8fD17fSl9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57bGV0IHI7KGw9PihsW2wuVU5LTk9XTj0wXT0iVU5LTk9XTiIsbFtsLlZBTFVFPTFdPSJWQUxVRSIsbFtsLlBBUkFNPTJdPSJQQVJBTSIpKShyPW4uRGltZW5zaW9uVmFsdWVUeXBlfHw9e30pfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2xldCByOyhZPT4oWVtZLlVOREVGSU5FRD0wXT0iVU5ERUZJTkVEIixZW1kuRkxPQVQ9MV09IkZMT0FUIixZW1kuVUlOVDg9Ml09IlVJTlQ4IixZW1kuSU5UOD0zXT0iSU5UOCIsWVtZLlVJTlQxNj00XT0iVUlOVDE2IixZW1kuSU5UMTY9NV09IklOVDE2IixZW1kuSU5UMzI9Nl09IklOVDMyIixZW1kuSU5UNjQ9N109IklOVDY0IixZW1kuU1RSSU5HPThdPSJTVFJJTkciLFlbWS5CT09MPTldPSJCT09MIixZW1kuRkxPQVQxNj0xMF09IkZMT0FUMTYiLFlbWS5ET1VCTEU9MTFdPSJET1VCTEUiLFlbWS5VSU5UMzI9MTJdPSJVSU5UMzIiLFlbWS5VSU5UNjQ9MTNdPSJVSU5UNjQiLFlbWS5DT01QTEVYNjQ9MTRdPSJDT01QTEVYNjQiLFlbWS5DT01QTEVYMTI4PTE1XT0iQ09NUExFWDEyOCIsWVtZLkJGTE9BVDE2PTE2XT0iQkZMT0FUMTYiLFlbWS5GTE9BVDhFNE0zRk49MTddPSJGTE9BVDhFNE0zRk4iLFlbWS5GTE9BVDhFNE0zRk5VWj0xOF09IkZMT0FUOEU0TTNGTlVaIixZW1kuRkxPQVQ4RTVNMj0xOV09IkZMT0FUOEU1TTIiLFlbWS5GTE9BVDhFNU0yRk5VWj0yMF09IkZMT0FUOEU1TTJGTlVaIikpKHI9bi5UZW5zb3JEYXRhVHlwZXx8PXt9KX0pKG89ZS5mYnN8fD17fSl9KShhPXQuZXhwZXJpbWVudGFsfHw9e30pfSkoVnx8PXt9KTsodD0+e2xldCBhOyhlPT57bGV0IG87KG49PntsZXQgcjsodT0+KHVbdS5QcmltaXRpdmU9MF09IlByaW1pdGl2ZSIsdVt1LkZ1c2VkPTFdPSJGdXNlZCIpKShyPW4uTm9kZVR5cGV8fD17fSl9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57bGV0IHI7KGM9PihjW2MuTk9ORT0wXT0iTk9ORSIsY1tjLnRlbnNvcl90eXBlPTFdPSJ0ZW5zb3JfdHlwZSIsY1tjLnNlcXVlbmNlX3R5cGU9Ml09InNlcXVlbmNlX3R5cGUiLGNbYy5tYXBfdHlwZT0zXT0ibWFwX3R5cGUiKSkocj1uLlR5cGVJbmZvVmFsdWV8fD17fSl9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNTaGFwZShpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTaGFwZShpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9ZGltKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbD8odXx8bmV3IHQuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb24pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQpLHRoaXMuYmIpOm51bGx9ZGltTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfXN0YXRpYyBzdGFydFNoYXBlKGkpe2kuc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZERpbShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBjcmVhdGVEaW1WZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdS5sZW5ndGgsNCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRPZmZzZXQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUsNCl9c3RhdGljIGVuZFNoYXBlKGkpe3JldHVybiBpLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTaGFwZShpLHUpe3JldHVybiByLnN0YXJ0U2hhcGUoaSksci5hZGREaW0oaSx1KSxyLmVuZFNoYXBlKGkpfX1uLlNoYXBlPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNEaW1lbnNpb24oaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX12YWx1ZShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9ZGVub3RhdGlvbihpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvbihpKXtpLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRWYWx1ZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBhZGREZW5vdGF0aW9uKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxLHUsMCl9c3RhdGljIGVuZERpbWVuc2lvbihpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlRGltZW5zaW9uKGksdSxsKXtyZXR1cm4gci5zdGFydERpbWVuc2lvbihpKSxyLmFkZFZhbHVlKGksdSksci5hZGREZW5vdGF0aW9uKGksbCksci5lbmREaW1lbnNpb24oaSl9fW4uRGltZW5zaW9uPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNEaW1lbnNpb25WYWx1ZShpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEaW1lbnNpb25WYWx1ZShpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9ZGltVHlwZSgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/dGhpcy5iYi5yZWFkSW50OCh0aGlzLmJiX3BvcytpKTowfWRpbVZhbHVlKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gaT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytpKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1QYXJhbShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvblZhbHVlKGkpe2kuc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZERpbVR5cGUoaSx1KXtpLmFkZEZpZWxkSW50OCgwLHUsMCl9c3RhdGljIGFkZERpbVZhbHVlKGksdSl7aS5hZGRGaWVsZEludDY0KDEsdSxpLmNyZWF0ZUxvbmcoMCwwKSl9c3RhdGljIGFkZERpbVBhcmFtKGksdSl7aS5hZGRGaWVsZE9mZnNldCgyLHUsMCl9c3RhdGljIGVuZERpbWVuc2lvblZhbHVlKGkpe3JldHVybiBpLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb25WYWx1ZShpLHUsbCxjKXtyZXR1cm4gci5zdGFydERpbWVuc2lvblZhbHVlKGkpLHIuYWRkRGltVHlwZShpLHUpLHIuYWRkRGltVmFsdWUoaSxsKSxyLmFkZERpbVBhcmFtKGksYyksci5lbmREaW1lbnNpb25WYWx1ZShpKX19bi5EaW1lbnNpb25WYWx1ZT1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVGVuc29yVHlwZUFuZFNoYXBlKGksdSl7cmV0dXJuKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvclR5cGVBbmRTaGFwZShpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9ZWxlbVR5cGUoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBpP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK2kpOjB9c2hhcGUoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdT8oaXx8bmV3IHQuZXhwZXJpbWVudGFsLmZicy5TaGFwZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3Bvcyt1KSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydFRlbnNvclR5cGVBbmRTaGFwZShpKXtpLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRFbGVtVHlwZShpLHUpe2kuYWRkRmllbGRJbnQzMigwLHUsMCl9c3RhdGljIGFkZFNoYXBlKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxLHUsMCl9c3RhdGljIGVuZFRlbnNvclR5cGVBbmRTaGFwZShpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yVHlwZUFuZFNoYXBlKGksdSxsKXtyZXR1cm4gci5zdGFydFRlbnNvclR5cGVBbmRTaGFwZShpKSxyLmFkZEVsZW1UeXBlKGksdSksci5hZGRTaGFwZShpLGwpLHIuZW5kVGVuc29yVHlwZUFuZFNoYXBlKGkpfX1uLlRlbnNvclR5cGVBbmRTaGFwZT1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTWFwVHlwZShpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNNYXBUeXBlKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1rZXlUeXBlKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gaT90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcytpKTowfXZhbHVlVHlwZShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0TWFwVHlwZShpKXtpLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGRLZXlUeXBlKGksdSl7aS5hZGRGaWVsZEludDMyKDAsdSwwKX1zdGF0aWMgYWRkVmFsdWVUeXBlKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxLHUsMCl9c3RhdGljIGVuZE1hcFR5cGUoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU1hcFR5cGUoaSx1LGwpe3JldHVybiByLnN0YXJ0TWFwVHlwZShpKSxyLmFkZEtleVR5cGUoaSx1KSxyLmFkZFZhbHVlVHlwZShpLGwpLHIuZW5kTWFwVHlwZShpKX19bi5NYXBUeXBlPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNTZXF1ZW5jZVR5cGUoaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VxdWVuY2VUeXBlKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1lbGVtVHlwZShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U2VxdWVuY2VUeXBlKGkpe2kuc3RhcnRPYmplY3QoMSl9c3RhdGljIGFkZEVsZW1UeXBlKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGVuZFNlcXVlbmNlVHlwZShpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlU2VxdWVuY2VUeXBlKGksdSl7cmV0dXJuIHIuc3RhcnRTZXF1ZW5jZVR5cGUoaSksci5hZGRFbGVtVHlwZShpLHUpLHIuZW5kU2VxdWVuY2VUeXBlKGkpfX1uLlNlcXVlbmNlVHlwZT1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31ub2RlSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zKX1zcmNBcmdJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcys0KX1kc3RBcmdJbmRleCgpe3JldHVybiB0aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3Bvcys4KX1zdGF0aWMgY3JlYXRlRWRnZUVuZChpLHUsbCxjKXtyZXR1cm4gaS5wcmVwKDQsMTIpLGkud3JpdGVJbnQzMihjKSxpLndyaXRlSW50MzIobCksaS53cml0ZUludDMyKHUpLGkub2Zmc2V0KCl9fW4uRWRnZUVuZD1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZUVkZ2UoaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTm9kZUVkZ2UoaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfW5vZGVJbmRleCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/dGhpcy5iYi5yZWFkVWludDMyKHRoaXMuYmJfcG9zK2kpOjB9aW5wdXRFZGdlcyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGw/KHV8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuRWRnZUVuZCkuX19pbml0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSoxMix0aGlzLmJiKTpudWxsfWlucHV0RWRnZXNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9b3V0cHV0RWRnZXMoaSx1KXtsZXQgbD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBsPyh1fHxuZXcgdC5leHBlcmltZW50YWwuZmJzLkVkZ2VFbmQpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2wpK2kqMTIsdGhpcy5iYik6bnVsbH1vdXRwdXRFZGdlc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnROb2RlRWRnZShpKXtpLnN0YXJ0T2JqZWN0KDMpfXN0YXRpYyBhZGROb2RlSW5kZXgoaSx1KXtpLmFkZEZpZWxkSW50MzIoMCx1LDApfXN0YXRpYyBhZGRJbnB1dEVkZ2VzKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxLHUsMCl9c3RhdGljIHN0YXJ0SW5wdXRFZGdlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoMTIsdSw0KX1zdGF0aWMgYWRkT3V0cHV0RWRnZXMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDIsdSwwKX1zdGF0aWMgc3RhcnRPdXRwdXRFZGdlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoMTIsdSw0KX1zdGF0aWMgZW5kTm9kZUVkZ2UoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU5vZGVFZGdlKGksdSxsLGMpe3JldHVybiByLnN0YXJ0Tm9kZUVkZ2UoaSksci5hZGROb2RlSW5kZXgoaSx1KSxyLmFkZElucHV0RWRnZXMoaSxsKSxyLmFkZE91dHB1dEVkZ2VzKGksYyksci5lbmROb2RlRWRnZShpKX19bi5Ob2RlRWRnZT1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZShpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNOb2RlKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1uYW1lKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9ZG9jU3RyaW5nKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9ZG9tYWluKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9c2luY2VWZXJzaW9uKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGk/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MraSk6MH1pbmRleCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBpP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytpKTowfW9wVHlwZShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH10eXBlKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIGk/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MraSk6MH1leGVjdXRpb25Qcm92aWRlclR5cGUoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9aW5wdXRzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIGw/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2wpK2kqNCx1KTpudWxsfWlucHV0c0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9b3V0cHV0cyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBsP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQsdSk6bnVsbH1vdXRwdXRzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1hdHRyaWJ1dGVzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGw/KHV8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfWF0dHJpYnV0ZXNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfWlucHV0QXJnQ291bnRzKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiB1P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdSkraSo0KTowfWlucHV0QXJnQ291bnRzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1pbnB1dEFyZ0NvdW50c0FycmF5KCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGk/bmV3IEludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2kpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpKTpudWxsfWltcGxpY2l0SW5wdXRzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGw/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2wpK2kqNCx1KTpudWxsfWltcGxpY2l0SW5wdXRzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnROb2RlKGkpe2kuc3RhcnRPYmplY3QoMTMpfXN0YXRpYyBhZGROYW1lKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZERvY1N0cmluZyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMSx1LDApfXN0YXRpYyBhZGREb21haW4oaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDIsdSwwKX1zdGF0aWMgYWRkU2luY2VWZXJzaW9uKGksdSl7aS5hZGRGaWVsZEludDMyKDMsdSwwKX1zdGF0aWMgYWRkSW5kZXgoaSx1KXtpLmFkZEZpZWxkSW50MzIoNCx1LDApfXN0YXRpYyBhZGRPcFR5cGUoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDUsdSwwKX1zdGF0aWMgYWRkVHlwZShpLHUpe2kuYWRkRmllbGRJbnQzMig2LHUsMCl9c3RhdGljIGFkZEV4ZWN1dGlvblByb3ZpZGVyVHlwZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoNyx1LDApfXN0YXRpYyBhZGRJbnB1dHMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDgsdSwwKX1zdGF0aWMgY3JlYXRlSW5wdXRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0c1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRPdXRwdXRzKGksdSl7aS5hZGRGaWVsZE9mZnNldCg5LHUsMCl9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdS5sZW5ndGgsNCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRPZmZzZXQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRBdHRyaWJ1dGVzKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxMCx1LDApfXN0YXRpYyBjcmVhdGVBdHRyaWJ1dGVzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEF0dHJpYnV0ZXNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdSw0KX1zdGF0aWMgYWRkSW5wdXRBcmdDb3VudHMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDExLHUsMCl9c3RhdGljIGNyZWF0ZUlucHV0QXJnQ291bnRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkSW50MzIodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW5wdXRBcmdDb3VudHNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdSw0KX1zdGF0aWMgYWRkSW1wbGljaXRJbnB1dHMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEyLHUsMCl9c3RhdGljIGNyZWF0ZUltcGxpY2l0SW5wdXRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEltcGxpY2l0SW5wdXRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUsNCl9c3RhdGljIGVuZE5vZGUoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZU5vZGUoaSx1LGwsYyxwLGQsVCx3LHYsUyxBLEMsRixKKXtyZXR1cm4gci5zdGFydE5vZGUoaSksci5hZGROYW1lKGksdSksci5hZGREb2NTdHJpbmcoaSxsKSxyLmFkZERvbWFpbihpLGMpLHIuYWRkU2luY2VWZXJzaW9uKGkscCksci5hZGRJbmRleChpLGQpLHIuYWRkT3BUeXBlKGksVCksci5hZGRUeXBlKGksdyksci5hZGRFeGVjdXRpb25Qcm92aWRlclR5cGUoaSx2KSxyLmFkZElucHV0cyhpLFMpLHIuYWRkT3V0cHV0cyhpLEEpLHIuYWRkQXR0cmlidXRlcyhpLEMpLHIuYWRkSW5wdXRBcmdDb3VudHMoaSxGKSxyLmFkZEltcGxpY2l0SW5wdXRzKGksSiksci5lbmROb2RlKGkpfX1uLk5vZGU9cn0pKG89ZS5mYnN8fD17fSl9KShhPXQuZXhwZXJpbWVudGFsfHw9e30pfSkoVnx8PXt9KTsodD0+e2xldCBhOyhlPT57bGV0IG87KG49PntjbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsO3RoaXMuYmJfcG9zPTB9X19pbml0KGksdSl7cmV0dXJuIHRoaXMuYmJfcG9zPWksdGhpcy5iYj11LHRoaXN9c3RhdGljIGdldFJvb3RBc1ZhbHVlSW5mbyhpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNWYWx1ZUluZm8oaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfW5hbWUoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1kb2NTdHJpbmcoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH10eXBlKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrdSksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRWYWx1ZUluZm8oaSl7aS5zdGFydE9iamVjdCgzKX1zdGF0aWMgYWRkTmFtZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBhZGREb2NTdHJpbmcoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEsdSwwKX1zdGF0aWMgYWRkVHlwZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMix1LDApfXN0YXRpYyBlbmRWYWx1ZUluZm8oaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVZhbHVlSW5mbyhpLHUsbCxjKXtyZXR1cm4gci5zdGFydFZhbHVlSW5mbyhpKSxyLmFkZE5hbWUoaSx1KSxyLmFkZERvY1N0cmluZyhpLGwpLHIuYWRkVHlwZShpLGMpLHIuZW5kVmFsdWVJbmZvKGkpfX1uLlZhbHVlSW5mbz1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVHlwZUluZm8oaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZUluZm8oaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfWRlbm90YXRpb24oaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH12YWx1ZVR5cGUoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBpP3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zK2kpOjB9dmFsdWUoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdT90aGlzLmJiLl9fdW5pb24oaSx0aGlzLmJiX3Bvcyt1KTpudWxsfXN0YXRpYyBzdGFydFR5cGVJbmZvKGkpe2kuc3RhcnRPYmplY3QoMyl9c3RhdGljIGFkZERlbm90YXRpb24oaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDAsdSwwKX1zdGF0aWMgYWRkVmFsdWVUeXBlKGksdSl7aS5hZGRGaWVsZEludDgoMSx1LDApfXN0YXRpYyBhZGRWYWx1ZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMix1LDApfXN0YXRpYyBlbmRUeXBlSW5mbyhpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVHlwZUluZm8oaSx1LGwsYyl7cmV0dXJuIHIuc3RhcnRUeXBlSW5mbyhpKSxyLmFkZERlbm90YXRpb24oaSx1KSxyLmFkZFZhbHVlVHlwZShpLGwpLHIuYWRkVmFsdWUoaSxjKSxyLmVuZFR5cGVJbmZvKGkpfX1uLlR5cGVJbmZvPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNPcGVyYXRvclNldElkKGksdSl7cmV0dXJuKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09wZXJhdG9yU2V0SWQoaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfWRvbWFpbihpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfXZlcnNpb24oKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBpP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2kpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfXN0YXRpYyBzdGFydE9wZXJhdG9yU2V0SWQoaSl7aS5zdGFydE9iamVjdCgyKX1zdGF0aWMgYWRkRG9tYWluKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZFZlcnNpb24oaSx1KXtpLmFkZEZpZWxkSW50NjQoMSx1LGkuY3JlYXRlTG9uZygwLDApKX1zdGF0aWMgZW5kT3BlcmF0b3JTZXRJZChpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlT3BlcmF0b3JTZXRJZChpLHUsbCl7cmV0dXJuIHIuc3RhcnRPcGVyYXRvclNldElkKGkpLHIuYWRkRG9tYWluKGksdSksci5hZGRWZXJzaW9uKGksbCksci5lbmRPcGVyYXRvclNldElkKGkpfX1uLk9wZXJhdG9yU2V0SWQ9cn0pKG89ZS5mYnN8fD17fSl9KShhPXQuZXhwZXJpbWVudGFsfHw9e30pfSkoVnx8PXt9KTsodD0+e2xldCBhOyhlPT57bGV0IG87KG49PntjbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsO3RoaXMuYmJfcG9zPTB9X19pbml0KGksdSl7cmV0dXJuIHRoaXMuYmJfcG9zPWksdGhpcy5iYj11LHRoaXN9c3RhdGljIGdldFJvb3RBc1RlbnNvcihpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNUZW5zb3IoaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfW5hbWUoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1kb2NTdHJpbmcoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1kaW1zKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt1KStpKjgpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWRpbXNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9ZGF0YVR5cGUoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gaT90aGlzLmJiLnJlYWRJbnQzMih0aGlzLmJiX3BvcytpKTowfXJhd0RhdGEoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHU/dGhpcy5iYi5yZWFkVWludDgodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt1KStpKTowfXJhd0RhdGFMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfXJhd0RhdGFBcnJheSgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBpP25ldyBVaW50OEFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKSk6bnVsbH1zdHJpbmdEYXRhKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGw/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2wpK2kqNCx1KTpudWxsfXN0cmluZ0RhdGFMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfXN0YXRpYyBzdGFydFRlbnNvcihpKXtpLnN0YXJ0T2JqZWN0KDYpfXN0YXRpYyBhZGROYW1lKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZERvY1N0cmluZyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMSx1LDApfXN0YXRpYyBhZGREaW1zKGksdSl7aS5hZGRGaWVsZE9mZnNldCgyLHUsMCl9c3RhdGljIGNyZWF0ZURpbXNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDgsdS5sZW5ndGgsOCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRJbnQ2NCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnREaW1zVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig4LHUsOCl9c3RhdGljIGFkZERhdGFUeXBlKGksdSl7aS5hZGRGaWVsZEludDMyKDMsdSwwKX1zdGF0aWMgYWRkUmF3RGF0YShpLHUpe2kuYWRkRmllbGRPZmZzZXQoNCx1LDApfXN0YXRpYyBjcmVhdGVSYXdEYXRhVmVjdG9yKGksdSl7aS5zdGFydFZlY3RvcigxLHUubGVuZ3RoLDEpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkSW50OCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRSYXdEYXRhVmVjdG9yKGksdSl7aS5zdGFydFZlY3RvcigxLHUsMSl9c3RhdGljIGFkZFN0cmluZ0RhdGEoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDUsdSwwKX1zdGF0aWMgY3JlYXRlU3RyaW5nRGF0YVZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1Lmxlbmd0aCw0KTtmb3IobGV0IGw9dS5sZW5ndGgtMTtsPj0wO2wtLSlpLmFkZE9mZnNldCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTdHJpbmdEYXRhVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUsNCl9c3RhdGljIGVuZFRlbnNvcihpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yKGksdSxsLGMscCxkLFQpe3JldHVybiByLnN0YXJ0VGVuc29yKGkpLHIuYWRkTmFtZShpLHUpLHIuYWRkRG9jU3RyaW5nKGksbCksci5hZGREaW1zKGksYyksci5hZGREYXRhVHlwZShpLHApLHIuYWRkUmF3RGF0YShpLGQpLHIuYWRkU3RyaW5nRGF0YShpLFQpLHIuZW5kVGVuc29yKGkpfX1uLlRlbnNvcj1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3BhcnNlVGVuc29yKGksdSl7cmV0dXJuKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1NwYXJzZVRlbnNvcihpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9dmFsdWVzKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9aW5kaWNlcyhpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3Bvcyt1KSx0aGlzLmJiKTpudWxsfWRpbXMoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3UpK2kqOCk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnRTcGFyc2VUZW5zb3IoaSl7aS5zdGFydE9iamVjdCgzKX1zdGF0aWMgYWRkVmFsdWVzKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZEluZGljZXMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEsdSwwKX1zdGF0aWMgYWRkRGltcyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMix1LDApfXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig4LHUubGVuZ3RoLDgpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkSW50NjQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoOCx1LDgpfXN0YXRpYyBlbmRTcGFyc2VUZW5zb3IoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVNwYXJzZVRlbnNvcihpLHUsbCxjKXtyZXR1cm4gci5zdGFydFNwYXJzZVRlbnNvcihpKSxyLmFkZFZhbHVlcyhpLHUpLHIuYWRkSW5kaWNlcyhpLGwpLHIuYWRkRGltcyhpLGMpLHIuZW5kU3BhcnNlVGVuc29yKGkpfX1uLlNwYXJzZVRlbnNvcj1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzQXR0cmlidXRlKGksdSl7cmV0dXJuKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0F0dHJpYnV0ZShpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9bmFtZShpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfWRvY1N0cmluZyhpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfXR5cGUoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBpP3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK2kpOjB9Zigpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBpP3RoaXMuYmIucmVhZEZsb2F0MzIodGhpcy5iYl9wb3MraSk6MH1pKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGk/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MraSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9cyhpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH10KGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3Bvcyt1KSx0aGlzLmJiKTpudWxsfWcoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrdSksdGhpcy5iYik6bnVsbH1mbG9hdHMoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIHU/dGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3UpK2kqNCk6MH1mbG9hdHNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfWZsb2F0c0FycmF5KCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIGk/bmV3IEZsb2F0MzJBcnJheSh0aGlzLmJiLmJ5dGVzKCkuYnVmZmVyLHRoaXMuYmIuYnl0ZXMoKS5ieXRlT2Zmc2V0K3RoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MraSksdGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSkpOm51bGx9aW50cyhpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIyKTtyZXR1cm4gdT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3UpK2kqOCk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9aW50c0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9c3RyaW5ncyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjQpO3JldHVybiBsP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQsdSk6bnVsbH1zdHJpbmdzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH10ZW5zb3JzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGw/KHV8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfXRlbnNvcnNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfWdyYXBocyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBsPyh1fHxuZXcgdC5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfWdyYXBoc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjgpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9c3RhdGljIHN0YXJ0QXR0cmlidXRlKGkpe2kuc3RhcnRPYmplY3QoMTMpfXN0YXRpYyBhZGROYW1lKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZERvY1N0cmluZyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMSx1LDApfXN0YXRpYyBhZGRUeXBlKGksdSl7aS5hZGRGaWVsZEludDMyKDIsdSwwKX1zdGF0aWMgYWRkRihpLHUpe2kuYWRkRmllbGRGbG9hdDMyKDMsdSwwKX1zdGF0aWMgYWRkSShpLHUpe2kuYWRkRmllbGRJbnQ2NCg0LHUsaS5jcmVhdGVMb25nKDAsMCkpfXN0YXRpYyBhZGRTKGksdSl7aS5hZGRGaWVsZE9mZnNldCg1LHUsMCl9c3RhdGljIGFkZFQoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDYsdSwwKX1zdGF0aWMgYWRkRyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoNyx1LDApfXN0YXRpYyBhZGRGbG9hdHMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDgsdSwwKX1zdGF0aWMgY3JlYXRlRmxvYXRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkRmxvYXQzMih1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRGbG9hdHNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdSw0KX1zdGF0aWMgYWRkSW50cyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoOSx1LDApfXN0YXRpYyBjcmVhdGVJbnRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig4LHUubGVuZ3RoLDgpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkSW50NjQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0SW50c1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoOCx1LDgpfXN0YXRpYyBhZGRTdHJpbmdzKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxMCx1LDApfXN0YXRpYyBjcmVhdGVTdHJpbmdzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ3NWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdSw0KX1zdGF0aWMgYWRkVGVuc29ycyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMTEsdSwwKX1zdGF0aWMgY3JlYXRlVGVuc29yc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1Lmxlbmd0aCw0KTtmb3IobGV0IGw9dS5sZW5ndGgtMTtsPj0wO2wtLSlpLmFkZE9mZnNldCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRUZW5zb3JzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUsNCl9c3RhdGljIGFkZEdyYXBocyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMTIsdSwwKX1zdGF0aWMgY3JlYXRlR3JhcGhzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEdyYXBoc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBlbmRBdHRyaWJ1dGUoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZShpLHUsbCxjLHAsZCxULHcsdixTLEEsQyxGLEope3JldHVybiByLnN0YXJ0QXR0cmlidXRlKGkpLHIuYWRkTmFtZShpLHUpLHIuYWRkRG9jU3RyaW5nKGksbCksci5hZGRUeXBlKGksYyksci5hZGRGKGkscCksci5hZGRJKGksZCksci5hZGRTKGksVCksci5hZGRUKGksdyksci5hZGRHKGksdiksci5hZGRGbG9hdHMoaSxTKSxyLmFkZEludHMoaSxBKSxyLmFkZFN0cmluZ3MoaSxDKSxyLmFkZFRlbnNvcnMoaSxGKSxyLmFkZEdyYXBocyhpLEopLHIuZW5kQXR0cmlidXRlKGkpfX1uLkF0dHJpYnV0ZT1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzR3JhcGgoaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzR3JhcGgoaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfWluaXRpYWxpemVycyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGw/KHV8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfWluaXRpYWxpemVyc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1ub2RlQXJncyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGw/KHV8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuVmFsdWVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfW5vZGVBcmdzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfW5vZGVzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gbD8odXx8bmV3IHQuZXhwZXJpbWVudGFsLmZicy5Ob2RlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfW5vZGVzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gaT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKTowfW1heE5vZGVJbmRleCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiBpP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytpKTowfW5vZGVFZGdlcyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBsPyh1fHxuZXcgdC5leHBlcmltZW50YWwuZmJzLk5vZGVFZGdlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfW5vZGVFZGdlc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9aW5wdXRzKGksdSl7bGV0IGw9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGw/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2wpK2kqNCx1KTpudWxsfWlucHV0c0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9b3V0cHV0cyhpLHUpe2xldCBsPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBsP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQsdSk6bnVsbH1vdXRwdXRzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zcGFyc2VJbml0aWFsaXplcnMoaSx1KXtsZXQgbD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbD8odXx8bmV3IHQuZXhwZXJpbWVudGFsLmZicy5TcGFyc2VUZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQpLHRoaXMuYmIpOm51bGx9c3BhcnNlSW5pdGlhbGl6ZXJzTGVuZ3RoKCl7bGV0IGk9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnRHcmFwaChpKXtpLnN0YXJ0T2JqZWN0KDgpfXN0YXRpYyBhZGRJbml0aWFsaXplcnMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDAsdSwwKX1zdGF0aWMgY3JlYXRlSW5pdGlhbGl6ZXJzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEluaXRpYWxpemVyc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGROb2RlQXJncyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMSx1LDApfXN0YXRpYyBjcmVhdGVOb2RlQXJnc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1Lmxlbmd0aCw0KTtmb3IobGV0IGw9dS5sZW5ndGgtMTtsPj0wO2wtLSlpLmFkZE9mZnNldCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlQXJnc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGROb2RlcyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMix1LDApfXN0YXRpYyBjcmVhdGVOb2Rlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1Lmxlbmd0aCw0KTtmb3IobGV0IGw9dS5sZW5ndGgtMTtsPj0wO2wtLSlpLmFkZE9mZnNldCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2Rlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRNYXhOb2RlSW5kZXgoaSx1KXtpLmFkZEZpZWxkSW50MzIoMyx1LDApfXN0YXRpYyBhZGROb2RlRWRnZXMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDQsdSwwKX1zdGF0aWMgY3JlYXRlTm9kZUVkZ2VzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVFZGdlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRJbnB1dHMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDUsdSwwKX1zdGF0aWMgY3JlYXRlSW5wdXRzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0c1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRPdXRwdXRzKGksdSl7aS5hZGRGaWVsZE9mZnNldCg2LHUsMCl9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdS5sZW5ndGgsNCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRPZmZzZXQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBhZGRTcGFyc2VJbml0aWFsaXplcnMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDcsdSwwKX1zdGF0aWMgY3JlYXRlU3BhcnNlSW5pdGlhbGl6ZXJzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFNwYXJzZUluaXRpYWxpemVyc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBlbmRHcmFwaChpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlR3JhcGgoaSx1LGwsYyxwLGQsVCx3LHYpe3JldHVybiByLnN0YXJ0R3JhcGgoaSksci5hZGRJbml0aWFsaXplcnMoaSx1KSxyLmFkZE5vZGVBcmdzKGksbCksci5hZGROb2RlcyhpLGMpLHIuYWRkTWF4Tm9kZUluZGV4KGkscCksci5hZGROb2RlRWRnZXMoaSxkKSxyLmFkZElucHV0cyhpLFQpLHIuYWRkT3V0cHV0cyhpLHcpLHIuYWRkU3BhcnNlSW5pdGlhbGl6ZXJzKGksdiksci5lbmRHcmFwaChpKX19bi5HcmFwaD1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pOyh0PT57bGV0IGE7KGU9PntsZXQgbzsobj0+e2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGw7dGhpcy5iYl9wb3M9MH1fX2luaXQoaSx1KXtyZXR1cm4gdGhpcy5iYl9wb3M9aSx0aGlzLmJiPXUsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTW9kZWwoaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTW9kZWwoaSx1KXtyZXR1cm4gaS5zZXRQb3NpdGlvbihpLnBvc2l0aW9uKCkrXy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfWlyVmVyc2lvbigpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MraSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9b3BzZXRJbXBvcnQoaSx1KXtsZXQgbD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBsPyh1fHxuZXcgdC5leHBlcmltZW50YWwuZmJzLk9wZXJhdG9yU2V0SWQpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytsKStpKjQpLHRoaXMuYmIpOm51bGx9b3BzZXRJbXBvcnRMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9cHJvZHVjZXJOYW1lKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9cHJvZHVjZXJWZXJzaW9uKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiB1P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdSxpKTpudWxsfWRvbWFpbihpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1tb2RlbFZlcnNpb24oKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gaT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytpKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kb2NTdHJpbmcoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9Z3JhcGgoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrdSksdGhpcy5iYik6bnVsbH1ncmFwaERvY1N0cmluZyhpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1zdGF0aWMgc3RhcnRNb2RlbChpKXtpLnN0YXJ0T2JqZWN0KDkpfXN0YXRpYyBhZGRJclZlcnNpb24oaSx1KXtpLmFkZEZpZWxkSW50NjQoMCx1LGkuY3JlYXRlTG9uZygwLDApKX1zdGF0aWMgYWRkT3BzZXRJbXBvcnQoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEsdSwwKX1zdGF0aWMgY3JlYXRlT3BzZXRJbXBvcnRWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdS5sZW5ndGgsNCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRPZmZzZXQodVtsXSk7cmV0dXJuIGkuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3BzZXRJbXBvcnRWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDQsdSw0KX1zdGF0aWMgYWRkUHJvZHVjZXJOYW1lKGksdSl7aS5hZGRGaWVsZE9mZnNldCgyLHUsMCl9c3RhdGljIGFkZFByb2R1Y2VyVmVyc2lvbihpLHUpe2kuYWRkRmllbGRPZmZzZXQoMyx1LDApfXN0YXRpYyBhZGREb21haW4oaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDQsdSwwKX1zdGF0aWMgYWRkTW9kZWxWZXJzaW9uKGksdSl7aS5hZGRGaWVsZEludDY0KDUsdSxpLmNyZWF0ZUxvbmcoMCwwKSl9c3RhdGljIGFkZERvY1N0cmluZyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoNix1LDApfXN0YXRpYyBhZGRHcmFwaChpLHUpe2kuYWRkRmllbGRPZmZzZXQoNyx1LDApfXN0YXRpYyBhZGRHcmFwaERvY1N0cmluZyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoOCx1LDApfXN0YXRpYyBlbmRNb2RlbChpKXtyZXR1cm4gaS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTW9kZWwoaSx1LGwsYyxwLGQsVCx3LHYsUyl7cmV0dXJuIHIuc3RhcnRNb2RlbChpKSxyLmFkZElyVmVyc2lvbihpLHUpLHIuYWRkT3BzZXRJbXBvcnQoaSxsKSxyLmFkZFByb2R1Y2VyTmFtZShpLGMpLHIuYWRkUHJvZHVjZXJWZXJzaW9uKGkscCksci5hZGREb21haW4oaSxkKSxyLmFkZE1vZGVsVmVyc2lvbihpLFQpLHIuYWRkRG9jU3RyaW5nKGksdyksci5hZGRHcmFwaChpLHYpLHIuYWRkR3JhcGhEb2NTdHJpbmcoaSxTKSxyLmVuZE1vZGVsKGkpfX1uLk1vZGVsPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhpLHUpe3JldHVybih1fHxuZXcgcikuX19pbml0KGkucmVhZEludDMyKGkucG9zaXRpb24oKSkraS5wb3NpdGlvbigpLGkpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNLZXJuZWxDcmVhdGVJbmZvcyhpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9bm9kZUluZGljZXMoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt1KStpKjQpOjB9bm9kZUluZGljZXNMZW5ndGgoKXtsZXQgaT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBpP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2kpOjB9bm9kZUluZGljZXNBcnJheSgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGk/bmV3IFVpbnQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytpKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytpKSk6bnVsbH1rZXJuZWxEZWZIYXNoZXMoaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdT90aGlzLmJiLnJlYWRVaW50NjQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3Bvcyt1KStpKjgpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfWtlcm5lbERlZkhhc2hlc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhpKXtpLnN0YXJ0T2JqZWN0KDIpfXN0YXRpYyBhZGROb2RlSW5kaWNlcyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBjcmVhdGVOb2RlSW5kaWNlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1Lmxlbmd0aCw0KTtmb3IobGV0IGw9dS5sZW5ndGgtMTtsPj0wO2wtLSlpLmFkZEludDMyKHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVJbmRpY2VzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUsNCl9c3RhdGljIGFkZEtlcm5lbERlZkhhc2hlcyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMSx1LDApfXN0YXRpYyBjcmVhdGVLZXJuZWxEZWZIYXNoZXNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDgsdS5sZW5ndGgsOCk7Zm9yKGxldCBsPXUubGVuZ3RoLTE7bD49MDtsLS0paS5hZGRJbnQ2NCh1W2xdKTtyZXR1cm4gaS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRLZXJuZWxEZWZIYXNoZXNWZWN0b3IoaSx1KXtpLnN0YXJ0VmVjdG9yKDgsdSw4KX1zdGF0aWMgZW5kS2VybmVsQ3JlYXRlSW5mb3MoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZUtlcm5lbENyZWF0ZUluZm9zKGksdSxsKXtyZXR1cm4gci5zdGFydEtlcm5lbENyZWF0ZUluZm9zKGkpLHIuYWRkTm9kZUluZGljZXMoaSx1KSxyLmFkZEtlcm5lbERlZkhhc2hlcyhpLGwpLHIuZW5kS2VybmVsQ3JlYXRlSW5mb3MoaSl9fW4uS2VybmVsQ3JlYXRlSW5mb3M9cn0pKG89ZS5mYnN8fD17fSl9KShhPXQuZXhwZXJpbWVudGFsfHw9e30pfSkoVnx8PXt9KTsodD0+e2xldCBhOyhlPT57bGV0IG87KG49PntjbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsO3RoaXMuYmJfcG9zPTB9X19pbml0KGksdSl7cmV0dXJuIHRoaXMuYmJfcG9zPWksdGhpcy5iYj11LHRoaXN9c3RhdGljIGdldFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGksdSl7cmV0dXJuKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1ncmFwaElkKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHU/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt1LGkpOm51bGx9c2Vzc2lvblN0YXRlKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoaSl7aS5zdGFydE9iamVjdCgyKX1zdGF0aWMgYWRkR3JhcGhJZChpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBhZGRTZXNzaW9uU3RhdGUoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEsdSwwKX1zdGF0aWMgZW5kU3ViR3JhcGhTZXNzaW9uU3RhdGUoaSl7bGV0IHU9aS5lbmRPYmplY3QoKTtyZXR1cm4gaS5yZXF1aXJlZEZpZWxkKHUsNCksdX1zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGUoaSx1LGwpe3JldHVybiByLnN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoaSksci5hZGRHcmFwaElkKGksdSksci5hZGRTZXNzaW9uU3RhdGUoaSxsKSxyLmVuZFN1YkdyYXBoU2Vzc2lvblN0YXRlKGkpfX1uLlN1YkdyYXBoU2Vzc2lvblN0YXRlPXJ9KShvPWUuZmJzfHw9e30pfSkoYT10LmV4cGVyaW1lbnRhbHx8PXt9KX0pKFZ8fD17fSk7KHQ9PntsZXQgYTsoZT0+e2xldCBvOyhuPT57Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbDt0aGlzLmJiX3Bvcz0wfV9faW5pdChpLHUpe3JldHVybiB0aGlzLmJiX3Bvcz1pLHRoaXMuYmI9dSx0aGlzfXN0YXRpYyBnZXRSb290QXNTZXNzaW9uU3RhdGUoaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2Vzc2lvblN0YXRlKGksdSl7cmV0dXJuIGkuc2V0UG9zaXRpb24oaS5wb3NpdGlvbigpK18uU0laRV9QUkVGSVhfTEVOR1RIKSwodXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1rZXJuZWxzKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuS2VybmVsQ3JlYXRlSW5mb3MpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrdSksdGhpcy5iYik6bnVsbH1zdWJHcmFwaFNlc3Npb25TdGF0ZXMoaSx1KXtsZXQgbD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBsPyh1fHxuZXcgdC5leHBlcmltZW50YWwuZmJzLlN1YkdyYXBoU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbCkraSo0KSx0aGlzLmJiKTpudWxsfXN1YkdyYXBoU2Vzc2lvblN0YXRlc0xlbmd0aCgpe2xldCBpPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGk/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MraSk6MH1zdGF0aWMgc3RhcnRTZXNzaW9uU3RhdGUoaSl7aS5zdGFydE9iamVjdCgyKX1zdGF0aWMgYWRkS2VybmVscyhpLHUpe2kuYWRkRmllbGRPZmZzZXQoMCx1LDApfXN0YXRpYyBhZGRTdWJHcmFwaFNlc3Npb25TdGF0ZXMoaSx1KXtpLmFkZEZpZWxkT2Zmc2V0KDEsdSwwKX1zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGVzVmVjdG9yKGksdSl7aS5zdGFydFZlY3Rvcig0LHUubGVuZ3RoLDQpO2ZvcihsZXQgbD11Lmxlbmd0aC0xO2w+PTA7bC0tKWkuYWRkT2Zmc2V0KHVbbF0pO3JldHVybiBpLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN1YkdyYXBoU2Vzc2lvblN0YXRlc1ZlY3RvcihpLHUpe2kuc3RhcnRWZWN0b3IoNCx1LDQpfXN0YXRpYyBlbmRTZXNzaW9uU3RhdGUoaSl7cmV0dXJuIGkuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVNlc3Npb25TdGF0ZShpLHUsbCl7cmV0dXJuIHIuc3RhcnRTZXNzaW9uU3RhdGUoaSksci5hZGRLZXJuZWxzKGksdSksci5hZGRTdWJHcmFwaFNlc3Npb25TdGF0ZXMoaSxsKSxyLmVuZFNlc3Npb25TdGF0ZShpKX19bi5TZXNzaW9uU3RhdGU9cn0pKG89ZS5mYnN8fD17fSl9KShhPXQuZXhwZXJpbWVudGFsfHw9e30pfSkoVnx8PXt9KTsodD0+e2xldCBhOyhlPT57bGV0IG87KG49PntjbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsO3RoaXMuYmJfcG9zPTB9X19pbml0KGksdSl7cmV0dXJuIHRoaXMuYmJfcG9zPWksdGhpcy5iYj11LHRoaXN9c3RhdGljIGdldFJvb3RBc0luZmVyZW5jZVNlc3Npb24oaSx1KXtyZXR1cm4odXx8bmV3IHIpLl9faW5pdChpLnJlYWRJbnQzMihpLnBvc2l0aW9uKCkpK2kucG9zaXRpb24oKSxpKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzSW5mZXJlbmNlU2Vzc2lvbihpLHUpe3JldHVybiBpLnNldFBvc2l0aW9uKGkucG9zaXRpb24oKStfLlNJWkVfUFJFRklYX0xFTkdUSCksKHV8fG5ldyByKS5fX2luaXQoaS5yZWFkSW50MzIoaS5wb3NpdGlvbigpKStpLnBvc2l0aW9uKCksaSl9c3RhdGljIGJ1ZmZlckhhc0lkZW50aWZpZXIoaSl7cmV0dXJuIGkuX19oYXNfaWRlbnRpZmllcigiT1JUTSIpfW9ydFZlcnNpb24oaSl7bGV0IHU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdT90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3UsaSk6bnVsbH1tb2RlbChpKXtsZXQgdT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB1PyhpfHxuZXcgdC5leHBlcmltZW50YWwuZmJzLk1vZGVsKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9c2Vzc2lvblN0YXRlKGkpe2xldCB1PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHU/KGl8fG5ldyB0LmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK3UpLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihpKXtpLnN0YXJ0T2JqZWN0KDMpfXN0YXRpYyBhZGRPcnRWZXJzaW9uKGksdSl7aS5hZGRGaWVsZE9mZnNldCgwLHUsMCl9c3RhdGljIGFkZE1vZGVsKGksdSl7aS5hZGRGaWVsZE9mZnNldCgxLHUsMCl9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShpLHUpe2kuYWRkRmllbGRPZmZzZXQoMix1LDApfXN0YXRpYyBlbmRJbmZlcmVuY2VTZXNzaW9uKGkpe3JldHVybiBpLmVuZE9iamVjdCgpfXN0YXRpYyBmaW5pc2hJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKGksdSl7aS5maW5pc2godSwiT1JUTSIpfXN0YXRpYyBmaW5pc2hTaXplUHJlZml4ZWRJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKGksdSl7aS5maW5pc2godSwiT1JUTSIsITApfXN0YXRpYyBjcmVhdGVJbmZlcmVuY2VTZXNzaW9uKGksdSxsLGMpe3JldHVybiByLnN0YXJ0SW5mZXJlbmNlU2Vzc2lvbihpKSxyLmFkZE9ydFZlcnNpb24oaSx1KSxyLmFkZE1vZGVsKGksbCksci5hZGRTZXNzaW9uU3RhdGUoaSxjKSxyLmVuZEluZmVyZW5jZVNlc3Npb24oaSl9fW4uSW5mZXJlbmNlU2Vzc2lvbj1yfSkobz1lLmZic3x8PXt9KX0pKGE9dC5leHBlcmltZW50YWx8fD17fSl9KShWfHw9e30pfSk7dmFyIEJzPW1lKCh2eSxrcyk9PnsidXNlIHN0cmljdCI7a3MuZXhwb3J0cz1CZDtmdW5jdGlvbiBCZChhLHQpe2Zvcih2YXIgbz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxlPTAscj0yLG49ITA7cjxhcmd1bWVudHMubGVuZ3RoOylvW2UrK109YXJndW1lbnRzW3IrK107cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGksdSl7b1tlXT1mdW5jdGlvbihjKXtpZihuKWlmKG49ITEsYyl1KGMpO2Vsc2V7Zm9yKHZhciBwPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLGQ9MDtkPHAubGVuZ3RoOylwW2QrK109YXJndW1lbnRzW2RdO2kuYXBwbHkobnVsbCxwKX19O3RyeXthLmFwcGx5KHR8fG51bGwsbyl9Y2F0Y2gobCl7biYmKG49ITEsdShsKSl9fSl9fSk7dmFyIEdzPW1lKE1zPT57InVzZSBzdHJpY3QiO3ZhciBWbj1NcztWbi5sZW5ndGg9ZnVuY3Rpb24odCl7dmFyIG89dC5sZW5ndGg7aWYoIW8pcmV0dXJuIDA7Zm9yKHZhciBlPTA7LS1vJTQ+MSYmdC5jaGFyQXQobyk9PT0iPSI7KSsrZTtyZXR1cm4gTWF0aC5jZWlsKHQubGVuZ3RoKjMpLzQtZX07dmFyIExyPW5ldyBBcnJheSg2NCksUnM9bmV3IEFycmF5KDEyMyk7Zm9yKEF0PTA7QXQ8NjQ7KVJzW0xyW0F0XT1BdDwyNj9BdCs2NTpBdDw1Mj9BdCs3MTpBdDw2Mj9BdC00OkF0LTU5fDQzXT1BdCsrO3ZhciBBdDtWbi5lbmNvZGU9ZnVuY3Rpb24odCxvLGUpe2Zvcih2YXIgcj1udWxsLG49W10scz0wLGk9MCx1O288ZTspe3ZhciBsPXRbbysrXTtzd2l0Y2goaSl7Y2FzZSAwOm5bcysrXT1McltsPj4yXSx1PShsJjMpPDw0LGk9MTticmVhaztjYXNlIDE6bltzKytdPUxyW3V8bD4+NF0sdT0obCYxNSk8PDIsaT0yO2JyZWFrO2Nhc2UgMjpuW3MrK109THJbdXxsPj42XSxuW3MrK109THJbbCY2M10saT0wO2JyZWFrfXM+ODE5MSYmKChyfHwocj1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsbikpLHM9MCl9cmV0dXJuIGkmJihuW3MrK109THJbdV0sbltzKytdPTYxLGk9PT0xJiYobltzKytdPTYxKSkscj8ocyYmci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG4uc2xpY2UoMCxzKSkpLHIuam9pbigiIikpOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG4uc2xpY2UoMCxzKSl9O3ZhciBOcz0iaW52YWxpZCBlbmNvZGluZyI7Vm4uZGVjb2RlPWZ1bmN0aW9uKHQsbyxlKXtmb3IodmFyIHI9ZSxuPTAscyxpPTA7aTx0Lmxlbmd0aDspe3ZhciB1PXQuY2hhckNvZGVBdChpKyspO2lmKHU9PT02MSYmbj4xKWJyZWFrO2lmKCh1PVJzW3VdKT09PXZvaWQgMCl0aHJvdyBFcnJvcihOcyk7c3dpdGNoKG4pe2Nhc2UgMDpzPXUsbj0xO2JyZWFrO2Nhc2UgMTpvW2UrK109czw8MnwodSY0OCk+PjQscz11LG49MjticmVhaztjYXNlIDI6b1tlKytdPShzJjE1KTw8NHwodSY2MCk+PjIscz11LG49MzticmVhaztjYXNlIDM6b1tlKytdPShzJjMpPDw2fHUsbj0wO2JyZWFrfX1pZihuPT09MSl0aHJvdyBFcnJvcihOcyk7cmV0dXJuIGUtcn07Vm4udGVzdD1mdW5jdGlvbih0KXtyZXR1cm4vXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdCh0KX19KTt2YXIgenM9bWUoKE95LFVzKT0+eyJ1c2Ugc3RyaWN0IjtVcy5leHBvcnRzPVduO2Z1bmN0aW9uIFduKCl7dGhpcy5fbGlzdGVuZXJzPXt9fVduLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LG8sZSl7cmV0dXJuKHRoaXMuX2xpc3RlbmVyc1t0XXx8KHRoaXMuX2xpc3RlbmVyc1t0XT1bXSkpLnB1c2goe2ZuOm8sY3R4OmV8fHRoaXN9KSx0aGlzfTtXbi5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKHQsbyl7aWYodD09PXZvaWQgMCl0aGlzLl9saXN0ZW5lcnM9e307ZWxzZSBpZihvPT09dm9pZCAwKXRoaXMuX2xpc3RlbmVyc1t0XT1bXTtlbHNlIGZvcih2YXIgZT10aGlzLl9saXN0ZW5lcnNbdF0scj0wO3I8ZS5sZW5ndGg7KWVbcl0uZm49PT1vP2Uuc3BsaWNlKHIsMSk6KytyO3JldHVybiB0aGlzfTtXbi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgbz10aGlzLl9saXN0ZW5lcnNbdF07aWYobyl7Zm9yKHZhciBlPVtdLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7KWUucHVzaChhcmd1bWVudHNbcisrXSk7Zm9yKHI9MDtyPG8ubGVuZ3RoOylvW3JdLmZuLmFwcGx5KG9bcisrXS5jdHgsZSl9cmV0dXJuIHRoaXN9fSk7dmFyIFhzPW1lKChJeSxZcyk9PnsidXNlIHN0cmljdCI7WXMuZXhwb3J0cz1WcyhWcyk7ZnVuY3Rpb24gVnMoYSl7cmV0dXJuIHR5cGVvZiBGbG9hdDMyQXJyYXk8InUiP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0MzJBcnJheShbLTBdKSxvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxlPW9bM109PT0xMjg7ZnVuY3Rpb24gcih1LGwsYyl7dFswXT11LGxbY109b1swXSxsW2MrMV09b1sxXSxsW2MrMl09b1syXSxsW2MrM109b1szXX1mdW5jdGlvbiBuKHUsbCxjKXt0WzBdPXUsbFtjXT1vWzNdLGxbYysxXT1vWzJdLGxbYysyXT1vWzFdLGxbYyszXT1vWzBdfWEud3JpdGVGbG9hdExFPWU/cjpuLGEud3JpdGVGbG9hdEJFPWU/bjpyO2Z1bmN0aW9uIHModSxsKXtyZXR1cm4gb1swXT11W2xdLG9bMV09dVtsKzFdLG9bMl09dVtsKzJdLG9bM109dVtsKzNdLHRbMF19ZnVuY3Rpb24gaSh1LGwpe3JldHVybiBvWzNdPXVbbF0sb1syXT11W2wrMV0sb1sxXT11W2wrMl0sb1swXT11W2wrM10sdFswXX1hLnJlYWRGbG9hdExFPWU/czppLGEucmVhZEZsb2F0QkU9ZT9pOnN9KCk6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUscixuLHMpe3ZhciBpPXI8MD8xOjA7aWYoaSYmKHI9LXIpLHI9PT0wKWUoMS9yPjA/MDoyMTQ3NDgzNjQ4LG4scyk7ZWxzZSBpZihpc05hTihyKSllKDIxNDMyODkzNDQsbixzKTtlbHNlIGlmKHI+MzQwMjgyMzQ2NjM4NTI4ODZlMjIpZSgoaTw8MzF8MjEzOTA5NTA0MCk+Pj4wLG4scyk7ZWxzZSBpZihyPDExNzU0OTQzNTA4MjIyODc1ZS01NCllKChpPDwzMXxNYXRoLnJvdW5kKHIvMTQwMTI5ODQ2NDMyNDgxN2UtNjApKT4+PjAsbixzKTtlbHNle3ZhciB1PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjIpLGw9TWF0aC5yb3VuZChyKk1hdGgucG93KDIsLXUpKjgzODg2MDgpJjgzODg2MDc7ZSgoaTw8MzF8dSsxMjc8PDIzfGwpPj4+MCxuLHMpfX1hLndyaXRlRmxvYXRMRT10LmJpbmQobnVsbCxXcyksYS53cml0ZUZsb2F0QkU9dC5iaW5kKG51bGwsSHMpO2Z1bmN0aW9uIG8oZSxyLG4pe3ZhciBzPWUocixuKSxpPShzPj4zMSkqMisxLHU9cz4+PjIzJjI1NSxsPXMmODM4ODYwNztyZXR1cm4gdT09PTI1NT9sP05hTjppKigxLzApOnU9PT0wP2kqMTQwMTI5ODQ2NDMyNDgxN2UtNjAqbDppKk1hdGgucG93KDIsdS0xNTApKihsKzgzODg2MDgpfWEucmVhZEZsb2F0TEU9by5iaW5kKG51bGwscXMpLGEucmVhZEZsb2F0QkU9by5iaW5kKG51bGwsanMpfSgpLHR5cGVvZiBGbG9hdDY0QXJyYXk8InUiP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0NjRBcnJheShbLTBdKSxvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxlPW9bN109PT0xMjg7ZnVuY3Rpb24gcih1LGwsYyl7dFswXT11LGxbY109b1swXSxsW2MrMV09b1sxXSxsW2MrMl09b1syXSxsW2MrM109b1szXSxsW2MrNF09b1s0XSxsW2MrNV09b1s1XSxsW2MrNl09b1s2XSxsW2MrN109b1s3XX1mdW5jdGlvbiBuKHUsbCxjKXt0WzBdPXUsbFtjXT1vWzddLGxbYysxXT1vWzZdLGxbYysyXT1vWzVdLGxbYyszXT1vWzRdLGxbYys0XT1vWzNdLGxbYys1XT1vWzJdLGxbYys2XT1vWzFdLGxbYys3XT1vWzBdfWEud3JpdGVEb3VibGVMRT1lP3I6bixhLndyaXRlRG91YmxlQkU9ZT9uOnI7ZnVuY3Rpb24gcyh1LGwpe3JldHVybiBvWzBdPXVbbF0sb1sxXT11W2wrMV0sb1syXT11W2wrMl0sb1szXT11W2wrM10sb1s0XT11W2wrNF0sb1s1XT11W2wrNV0sb1s2XT11W2wrNl0sb1s3XT11W2wrN10sdFswXX1mdW5jdGlvbiBpKHUsbCl7cmV0dXJuIG9bN109dVtsXSxvWzZdPXVbbCsxXSxvWzVdPXVbbCsyXSxvWzRdPXVbbCszXSxvWzNdPXVbbCs0XSxvWzJdPXVbbCs1XSxvWzFdPXVbbCs2XSxvWzBdPXVbbCs3XSx0WzBdfWEucmVhZERvdWJsZUxFPWU/czppLGEucmVhZERvdWJsZUJFPWU/aTpzfSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsbixzLGksdSl7dmFyIGw9czwwPzE6MDtpZihsJiYocz0tcykscz09PTApZSgwLGksdStyKSxlKDEvcz4wPzA6MjE0NzQ4MzY0OCxpLHUrbik7ZWxzZSBpZihpc05hTihzKSllKDAsaSx1K3IpLGUoMjE0Njk1OTM2MCxpLHUrbik7ZWxzZSBpZihzPjE3OTc2OTMxMzQ4NjIzMTU3ZTI5MillKDAsaSx1K3IpLGUoKGw8PDMxfDIxNDY0MzUwNzIpPj4+MCxpLHUrbik7ZWxzZXt2YXIgYztpZihzPDIyMjUwNzM4NTg1MDcyMDE0ZS0zMjQpYz1zLzVlLTMyNCxlKGM+Pj4wLGksdStyKSxlKChsPDwzMXxjLzQyOTQ5NjcyOTYpPj4+MCxpLHUrbik7ZWxzZXt2YXIgcD1NYXRoLmZsb29yKE1hdGgubG9nKHMpL01hdGguTE4yKTtwPT09MTAyNCYmKHA9MTAyMyksYz1zKk1hdGgucG93KDIsLXApLGUoYyo0NTAzNTk5NjI3MzcwNDk2Pj4+MCxpLHUrciksZSgobDw8MzF8cCsxMDIzPDwyMHxjKjEwNDg1NzYmMTA0ODU3NSk+Pj4wLGksdStuKX19fWEud3JpdGVEb3VibGVMRT10LmJpbmQobnVsbCxXcywwLDQpLGEud3JpdGVEb3VibGVCRT10LmJpbmQobnVsbCxIcyw0LDApO2Z1bmN0aW9uIG8oZSxyLG4scyxpKXt2YXIgdT1lKHMsaStyKSxsPWUocyxpK24pLGM9KGw+PjMxKSoyKzEscD1sPj4+MjAmMjA0NyxkPTQyOTQ5NjcyOTYqKGwmMTA0ODU3NSkrdTtyZXR1cm4gcD09PTIwNDc/ZD9OYU46YyooMS8wKTpwPT09MD9jKjVlLTMyNCpkOmMqTWF0aC5wb3coMixwLTEwNzUpKihkKzQ1MDM1OTk2MjczNzA0OTYpfWEucmVhZERvdWJsZUxFPW8uYmluZChudWxsLHFzLDAsNCksYS5yZWFkRG91YmxlQkU9by5iaW5kKG51bGwsanMsNCwwKX0oKSxhfWZ1bmN0aW9uIFdzKGEsdCxvKXt0W29dPWEmMjU1LHRbbysxXT1hPj4+OCYyNTUsdFtvKzJdPWE+Pj4xNiYyNTUsdFtvKzNdPWE+Pj4yNH1mdW5jdGlvbiBIcyhhLHQsbyl7dFtvXT1hPj4+MjQsdFtvKzFdPWE+Pj4xNiYyNTUsdFtvKzJdPWE+Pj44JjI1NSx0W28rM109YSYyNTV9ZnVuY3Rpb24gcXMoYSx0KXtyZXR1cm4oYVt0XXxhW3QrMV08PDh8YVt0KzJdPDwxNnxhW3QrM108PDI0KT4+PjB9ZnVuY3Rpb24ganMoYSx0KXtyZXR1cm4oYVt0XTw8MjR8YVt0KzFdPDwxNnxhW3QrMl08PDh8YVt0KzNdKT4+PjB9fSk7dmFyIEtzPW1lKChleHBvcnRzLG1vZHVsZSk9PnsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9aW5xdWlyZTtmdW5jdGlvbiBpbnF1aXJlKG1vZHVsZU5hbWUpe3RyeXt2YXIgbW9kPWV2YWwoInF1aXJlIi5yZXBsYWNlKC9eLywicmUiKSkobW9kdWxlTmFtZSk7aWYobW9kJiYobW9kLmxlbmd0aHx8T2JqZWN0LmtleXMobW9kKS5sZW5ndGgpKXJldHVybiBtb2R9Y2F0Y2goYSl7fXJldHVybiBudWxsfX0pO3ZhciBacz1tZShKcz0+eyJ1c2Ugc3RyaWN0Ijt2YXIgUW89SnM7UW8ubGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbz0wLGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZT10LmNoYXJDb2RlQXQociksZTwxMjg/bys9MTplPDIwNDg/bys9MjooZSY2NDUxMik9PT01NTI5NiYmKHQuY2hhckNvZGVBdChyKzEpJjY0NTEyKT09PTU2MzIwPygrK3Isbys9NCk6bys9MztyZXR1cm4gb307UW8ucmVhZD1mdW5jdGlvbih0LG8sZSl7dmFyIHI9ZS1vO2lmKHI8MSlyZXR1cm4iIjtmb3IodmFyIG49bnVsbCxzPVtdLGk9MCx1O288ZTspdT10W28rK10sdTwxMjg/c1tpKytdPXU6dT4xOTEmJnU8MjI0P3NbaSsrXT0odSYzMSk8PDZ8dFtvKytdJjYzOnU+MjM5JiZ1PDM2NT8odT0oKHUmNyk8PDE4fCh0W28rK10mNjMpPDwxMnwodFtvKytdJjYzKTw8Nnx0W28rK10mNjMpLTY1NTM2LHNbaSsrXT01NTI5NisodT4+MTApLHNbaSsrXT01NjMyMCsodSYxMDIzKSk6c1tpKytdPSh1JjE1KTw8MTJ8KHRbbysrXSY2Myk8PDZ8dFtvKytdJjYzLGk+ODE5MSYmKChufHwobj1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscykpLGk9MCk7cmV0dXJuIG4/KGkmJm4ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzLnNsaWNlKDAsaSkpKSxuLmpvaW4oIiIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzLnNsaWNlKDAsaSkpfTtRby53cml0ZT1mdW5jdGlvbih0LG8sZSl7Zm9yKHZhciByPWUsbixzLGk9MDtpPHQubGVuZ3RoOysraSluPXQuY2hhckNvZGVBdChpKSxuPDEyOD9vW2UrK109bjpuPDIwNDg/KG9bZSsrXT1uPj42fDE5MixvW2UrK109biY2M3wxMjgpOihuJjY0NTEyKT09PTU1Mjk2JiYoKHM9dC5jaGFyQ29kZUF0KGkrMSkpJjY0NTEyKT09PTU2MzIwPyhuPTY1NTM2KygobiYxMDIzKTw8MTApKyhzJjEwMjMpLCsraSxvW2UrK109bj4+MTh8MjQwLG9bZSsrXT1uPj4xMiY2M3wxMjgsb1tlKytdPW4+PjYmNjN8MTI4LG9bZSsrXT1uJjYzfDEyOCk6KG9bZSsrXT1uPj4xMnwyMjQsb1tlKytdPW4+PjYmNjN8MTI4LG9bZSsrXT1uJjYzfDEyOCk7cmV0dXJuIGUtcn19KTt2YXIgZXU9bWUoKEF5LFFzKT0+eyJ1c2Ugc3RyaWN0IjtRcy5leHBvcnRzPU5kO2Z1bmN0aW9uIE5kKGEsdCxvKXt2YXIgZT1vfHw4MTkyLHI9ZT4+PjEsbj1udWxsLHM9ZTtyZXR1cm4gZnVuY3Rpb24odSl7aWYodTwxfHx1PnIpcmV0dXJuIGEodSk7cyt1PmUmJihuPWEoZSkscz0wKTt2YXIgbD10LmNhbGwobixzLHMrPXUpO3JldHVybiBzJjcmJihzPShzfDcpKzEpLGx9fX0pO3ZhciBydT1tZSgoUHksdHUpPT57InVzZSBzdHJpY3QiO3R1LmV4cG9ydHM9R2U7dmFyIHJuPUp0KCk7ZnVuY3Rpb24gR2UoYSx0KXt0aGlzLmxvPWE+Pj4wLHRoaXMuaGk9dD4+PjB9dmFyIHByPUdlLnplcm89bmV3IEdlKDAsMCk7cHIudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gMH07cHIuenpFbmNvZGU9cHIuenpEZWNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cHIubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O3ZhciBSZD1HZS56ZXJvSGFzaD0iXDBcMFwwXDBcMFwwXDBcMCI7R2UuZnJvbU51bWJlcj1mdW5jdGlvbih0KXtpZih0PT09MClyZXR1cm4gcHI7dmFyIG89dDwwO28mJih0PS10KTt2YXIgZT10Pj4+MCxyPSh0LWUpLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiBvJiYocj1+cj4+PjAsZT1+ZT4+PjAsKytlPjQyOTQ5NjcyOTUmJihlPTAsKytyPjQyOTQ5NjcyOTUmJihyPTApKSksbmV3IEdlKGUscil9O0dlLmZyb209ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PSJudW1iZXIiKXJldHVybiBHZS5mcm9tTnVtYmVyKHQpO2lmKHJuLmlzU3RyaW5nKHQpKWlmKHJuLkxvbmcpdD1ybi5Mb25nLmZyb21TdHJpbmcodCk7ZWxzZSByZXR1cm4gR2UuZnJvbU51bWJlcihwYXJzZUludCh0LDEwKSk7cmV0dXJuIHQubG93fHx0LmhpZ2g/bmV3IEdlKHQubG93Pj4+MCx0LmhpZ2g+Pj4wKTpwcn07R2UucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKHQpe2lmKCF0JiZ0aGlzLmhpPj4+MzEpe3ZhciBvPX50aGlzLmxvKzE+Pj4wLGU9fnRoaXMuaGk+Pj4wO3JldHVybiBvfHwoZT1lKzE+Pj4wKSwtKG8rZSo0Mjk0OTY3Mjk2KX1yZXR1cm4gdGhpcy5sbyt0aGlzLmhpKjQyOTQ5NjcyOTZ9O0dlLnByb3RvdHlwZS50b0xvbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHJuLkxvbmc/bmV3IHJuLkxvbmcodGhpcy5sb3wwLHRoaXMuaGl8MCwhIXQpOntsb3c6dGhpcy5sb3wwLGhpZ2g6dGhpcy5oaXwwLHVuc2lnbmVkOiEhdH19O3ZhciBLdD1TdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQ7R2UuZnJvbUhhc2g9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1SZD9wcjpuZXcgR2UoKEt0LmNhbGwodCwwKXxLdC5jYWxsKHQsMSk8PDh8S3QuY2FsbCh0LDIpPDwxNnxLdC5jYWxsKHQsMyk8PDI0KT4+PjAsKEt0LmNhbGwodCw0KXxLdC5jYWxsKHQsNSk8PDh8S3QuY2FsbCh0LDYpPDwxNnxLdC5jYWxsKHQsNyk8PDI0KT4+PjApfTtHZS5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5sbyYyNTUsdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LHRoaXMuaGkmMjU1LHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9O0dlLnByb3RvdHlwZS56ekVuY29kZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaGk+PjMxO3JldHVybiB0aGlzLmhpPSgodGhpcy5oaTw8MXx0aGlzLmxvPj4+MzEpXnQpPj4+MCx0aGlzLmxvPSh0aGlzLmxvPDwxXnQpPj4+MCx0aGlzfTtHZS5wcm90b3R5cGUuenpEZWNvZGU9ZnVuY3Rpb24oKXt2YXIgdD0tKHRoaXMubG8mMSk7cmV0dXJuIHRoaXMubG89KCh0aGlzLmxvPj4+MXx0aGlzLmhpPDwzMSledCk+Pj4wLHRoaXMuaGk9KHRoaXMuaGk+Pj4xXnQpPj4+MCx0aGlzfTtHZS5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sbyxvPSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLGU9dGhpcy5oaT4+PjI0O3JldHVybiBlPT09MD9vPT09MD90PDE2Mzg0P3Q8MTI4PzE6Mjp0PDIwOTcxNTI/Mzo0Om88MTYzODQ/bzwxMjg/NTo2Om88MjA5NzE1Mj83Ojg6ZTwxMjg/OToxMH19KTt2YXIgSnQ9bWUoZWk9PnsidXNlIHN0cmljdCI7dmFyIFc9ZWk7Vy5hc1Byb21pc2U9QnMoKTtXLmJhc2U2ND1HcygpO1cuRXZlbnRFbWl0dGVyPXpzKCk7Vy5mbG9hdD1YcygpO1cuaW5xdWlyZT1LcygpO1cudXRmOD1acygpO1cucG9vbD1ldSgpO1cuTG9uZ0JpdHM9cnUoKTtXLmlzTm9kZT0hISh0eXBlb2YgZ2xvYmFsPCJ1IiYmZ2xvYmFsJiZnbG9iYWwucHJvY2VzcyYmZ2xvYmFsLnByb2Nlc3MudmVyc2lvbnMmJmdsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpO1cuZ2xvYmFsPVcuaXNOb2RlJiZnbG9iYWx8fHR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3d8fHR5cGVvZiBzZWxmPCJ1IiYmc2VsZnx8ZWk7Vy5lbXB0eUFycmF5PU9iamVjdC5mcmVlemU/T2JqZWN0LmZyZWV6ZShbXSk6W107Vy5lbXB0eU9iamVjdD1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoe30pOnt9O1cuaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJmlzRmluaXRlKHQpJiZNYXRoLmZsb29yKHQpPT09dH07Vy5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmcifHx0IGluc3RhbmNlb2YgU3RyaW5nfTtXLmlzT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCJ9O1cuaXNzZXQ9Vy5pc1NldD1mdW5jdGlvbih0LG8pe3ZhciBlPXRbb107cmV0dXJuIGUhPW51bGwmJnQuaGFzT3duUHJvcGVydHkobyk/dHlwZW9mIGUhPSJvYmplY3QifHwoQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aDpPYmplY3Qua2V5cyhlKS5sZW5ndGgpPjA6ITF9O1cuQnVmZmVyPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPVcuaW5xdWlyZSgiYnVmZmVyIikuQnVmZmVyO3JldHVybiBhLnByb3RvdHlwZS51dGY4V3JpdGU/YTpudWxsfWNhdGNoe3JldHVybiBudWxsfX0oKTtXLl9CdWZmZXJfZnJvbT1udWxsO1cuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsO1cubmV3QnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/Vy5CdWZmZXI/Vy5fQnVmZmVyX2FsbG9jVW5zYWZlKHQpOm5ldyBXLkFycmF5KHQpOlcuQnVmZmVyP1cuX0J1ZmZlcl9mcm9tKHQpOnR5cGVvZiBVaW50OEFycmF5PiJ1Ij90Om5ldyBVaW50OEFycmF5KHQpfTtXLkFycmF5PXR5cGVvZiBVaW50OEFycmF5PCJ1Ij9VaW50OEFycmF5OkFycmF5O1cuTG9uZz1XLmdsb2JhbC5kY29kZUlPJiZXLmdsb2JhbC5kY29kZUlPLkxvbmd8fFcuZ2xvYmFsLkxvbmd8fFcuaW5xdWlyZSgibG9uZyIpO1cua2V5MlJlPS9edHJ1ZXxmYWxzZXwwfDEkLztXLmtleTMyUmU9L14tPyg/OjB8WzEtOV1bMC05XSopJC87Vy5rZXk2NFJlPS9eKD86W1xceDAwLVxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvO1cubG9uZ1RvSGFzaD1mdW5jdGlvbih0KXtyZXR1cm4gdD9XLkxvbmdCaXRzLmZyb20odCkudG9IYXNoKCk6Vy5Mb25nQml0cy56ZXJvSGFzaH07Vy5sb25nRnJvbUhhc2g9ZnVuY3Rpb24odCxvKXt2YXIgZT1XLkxvbmdCaXRzLmZyb21IYXNoKHQpO3JldHVybiBXLkxvbmc/Vy5Mb25nLmZyb21CaXRzKGUubG8sZS5oaSxvKTplLnRvTnVtYmVyKCEhbyl9O2Z1bmN0aW9uIG51KGEsdCxvKXtmb3IodmFyIGU9T2JqZWN0LmtleXModCkscj0wO3I8ZS5sZW5ndGg7KytyKShhW2Vbcl1dPT09dm9pZCAwfHwhbykmJihhW2Vbcl1dPXRbZVtyXV0pO3JldHVybiBhfVcubWVyZ2U9bnU7Vy5sY0ZpcnN0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK3Quc3Vic3RyaW5nKDEpfTtmdW5jdGlvbiBvdShhKXtmdW5jdGlvbiB0KG8sZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KG8sZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb319KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOm5ldyBFcnJvcigpLnN0YWNrfHwiIn0pLGUmJm51KHRoaXMsZSl9cmV0dXJuIHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0sbmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDp2b2lkIDAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LHRvU3RyaW5nOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9Vy5uZXdFcnJvcj1vdTtXLlByb3RvY29sRXJyb3I9b3UoIlByb3RvY29sRXJyb3IiKTtXLm9uZU9mR2V0dGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbz17fSxlPTA7ZTx0Lmxlbmd0aDsrK2Upb1t0W2VdXT0xO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgcj1PYmplY3Qua2V5cyh0aGlzKSxuPXIubGVuZ3RoLTE7bj4tMTstLW4paWYob1tyW25dXT09PTEmJnRoaXNbcltuXV0hPT12b2lkIDAmJnRoaXNbcltuXV0hPT1udWxsKXJldHVybiByW25dfX07Vy5vbmVPZlNldHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDsrK2UpdFtlXSE9PW8mJmRlbGV0ZSB0aGlzW3RbZV1dfX07Vy50b0pTT05PcHRpb25zPXtsb25nczpTdHJpbmcsZW51bXM6U3RyaW5nLGJ5dGVzOlN0cmluZyxqc29uOiEwfTtXLl9jb25maWd1cmU9ZnVuY3Rpb24oKXt2YXIgYT1XLkJ1ZmZlcjtpZighYSl7Vy5fQnVmZmVyX2Zyb209Vy5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGw7cmV0dXJufVcuX0J1ZmZlcl9mcm9tPWEuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSYmYS5mcm9tfHxmdW5jdGlvbihvLGUpe3JldHVybiBuZXcgYShvLGUpfSxXLl9CdWZmZXJfYWxsb2NVbnNhZmU9YS5hbGxvY1Vuc2FmZXx8ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBhKG8pfX19KTt2YXIgc2k9bWUoKER5LHV1KT0+eyJ1c2Ugc3RyaWN0Ijt1dS5leHBvcnRzPXNlO3ZhciBwdD1KdCgpLHRpLEhuPXB0LkxvbmdCaXRzLGl1PXB0LmJhc2U2NCxhdT1wdC51dGY4O2Z1bmN0aW9uIG5uKGEsdCxvKXt0aGlzLmZuPWEsdGhpcy5sZW49dCx0aGlzLm5leHQ9dm9pZCAwLHRoaXMudmFsPW99ZnVuY3Rpb24gbmkoKXt9ZnVuY3Rpb24gTWQoYSl7dGhpcy5oZWFkPWEuaGVhZCx0aGlzLnRhaWw9YS50YWlsLHRoaXMubGVuPWEubGVuLHRoaXMubmV4dD1hLnN0YXRlc31mdW5jdGlvbiBzZSgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyBubihuaSwwLDApLHRoaXMudGFpbD10aGlzLmhlYWQsdGhpcy5zdGF0ZXM9bnVsbH12YXIgc3U9ZnVuY3Rpb24oKXtyZXR1cm4gcHQuQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuKHNlLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdGl9KSgpfTpmdW5jdGlvbigpe3JldHVybiBuZXcgc2V9fTtzZS5jcmVhdGU9c3UoKTtzZS5hbGxvYz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHB0LkFycmF5KHQpfTtwdC5BcnJheSE9PUFycmF5JiYoc2UuYWxsb2M9cHQucG9vbChzZS5hbGxvYyxwdC5BcnJheS5wcm90b3R5cGUuc3ViYXJyYXkpKTtzZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCxvLGUpe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IG5uKHQsbyxlKSx0aGlzLmxlbis9byx0aGlzfTtmdW5jdGlvbiBvaShhLHQsbyl7dFtvXT1hJjI1NX1mdW5jdGlvbiBHZChhLHQsbyl7Zm9yKDthPjEyNzspdFtvKytdPWEmMTI3fDEyOCxhPj4+PTc7dFtvXT1hfWZ1bmN0aW9uIGlpKGEsdCl7dGhpcy5sZW49YSx0aGlzLm5leHQ9dm9pZCAwLHRoaXMudmFsPXR9aWkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobm4ucHJvdG90eXBlKTtpaS5wcm90b3R5cGUuZm49R2Q7c2UucHJvdG90eXBlLnVpbnQzMj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW4rPSh0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IGlpKCh0PXQ+Pj4wKTwxMjg/MTp0PDE2Mzg0PzI6dDwyMDk3MTUyPzM6dDwyNjg0MzU0NTY/NDo1LHQpKS5sZW4sdGhpc307c2UucHJvdG90eXBlLmludDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/dGhpcy5fcHVzaChhaSwxMCxIbi5mcm9tTnVtYmVyKHQpKTp0aGlzLnVpbnQzMih0KX07c2UucHJvdG90eXBlLnNpbnQzMj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51aW50MzIoKHQ8PDFedD4+MzEpPj4+MCl9O2Z1bmN0aW9uIGFpKGEsdCxvKXtmb3IoO2EuaGk7KXRbbysrXT1hLmxvJjEyN3wxMjgsYS5sbz0oYS5sbz4+Pjd8YS5oaTw8MjUpPj4+MCxhLmhpPj4+PTc7Zm9yKDthLmxvPjEyNzspdFtvKytdPWEubG8mMTI3fDEyOCxhLmxvPWEubG8+Pj43O3RbbysrXT1hLmxvfXNlLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24odCl7dmFyIG89SG4uZnJvbSh0KTtyZXR1cm4gdGhpcy5fcHVzaChhaSxvLmxlbmd0aCgpLG8pfTtzZS5wcm90b3R5cGUuaW50NjQ9c2UucHJvdG90eXBlLnVpbnQ2NDtzZS5wcm90b3R5cGUuc2ludDY0PWZ1bmN0aW9uKHQpe3ZhciBvPUhuLmZyb20odCkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChhaSxvLmxlbmd0aCgpLG8pfTtzZS5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHVzaChvaSwxLHQ/MTowKX07ZnVuY3Rpb24gcmkoYSx0LG8pe3Rbb109YSYyNTUsdFtvKzFdPWE+Pj44JjI1NSx0W28rMl09YT4+PjE2JjI1NSx0W28rM109YT4+PjI0fXNlLnByb3RvdHlwZS5maXhlZDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdXNoKHJpLDQsdD4+PjApfTtzZS5wcm90b3R5cGUuc2ZpeGVkMzI9c2UucHJvdG90eXBlLmZpeGVkMzI7c2UucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24odCl7dmFyIG89SG4uZnJvbSh0KTtyZXR1cm4gdGhpcy5fcHVzaChyaSw0LG8ubG8pLl9wdXNoKHJpLDQsby5oaSl9O3NlLnByb3RvdHlwZS5zZml4ZWQ2ND1zZS5wcm90b3R5cGUuZml4ZWQ2NDtzZS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B1c2gocHQuZmxvYXQud3JpdGVGbG9hdExFLDQsdCl9O3NlLnByb3RvdHlwZS5kb3VibGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B1c2gocHQuZmxvYXQud3JpdGVEb3VibGVMRSw4LHQpfTt2YXIgVWQ9cHQuQXJyYXkucHJvdG90eXBlLnNldD9mdW5jdGlvbih0LG8sZSl7by5zZXQodCxlKX06ZnVuY3Rpb24odCxvLGUpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKW9bZStyXT10W3JdfTtzZS5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24odCl7dmFyIG89dC5sZW5ndGg+Pj4wO2lmKCFvKXJldHVybiB0aGlzLl9wdXNoKG9pLDEsMCk7aWYocHQuaXNTdHJpbmcodCkpe3ZhciBlPXNlLmFsbG9jKG89aXUubGVuZ3RoKHQpKTtpdS5kZWNvZGUodCxlLDApLHQ9ZX1yZXR1cm4gdGhpcy51aW50MzIobykuX3B1c2goVWQsbyx0KX07c2UucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbih0KXt2YXIgbz1hdS5sZW5ndGgodCk7cmV0dXJuIG8/dGhpcy51aW50MzIobykuX3B1c2goYXUud3JpdGUsbyx0KTp0aGlzLl9wdXNoKG9pLDEsMCl9O3NlLnByb3RvdHlwZS5mb3JrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPW5ldyBNZCh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyBubihuaSwwLDApLHRoaXMubGVuPTAsdGhpc307c2UucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IG5uKG5pLDAsMCksdGhpcy5sZW49MCksdGhpc307c2UucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaGVhZCxvPXRoaXMudGFpbCxlPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKGUpLGUmJih0aGlzLnRhaWwubmV4dD10Lm5leHQsdGhpcy50YWlsPW8sdGhpcy5sZW4rPWUpLHRoaXN9O3NlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5oZWFkLm5leHQsbz10aGlzLmNvbnN0cnVjdG9yLmFsbG9jKHRoaXMubGVuKSxlPTA7dDspdC5mbih0LnZhbCxvLGUpLGUrPXQubGVuLHQ9dC5uZXh0O3JldHVybiBvfTtzZS5fY29uZmlndXJlPWZ1bmN0aW9uKGEpe3RpPWEsc2UuY3JlYXRlPXN1KCksdGkuX2NvbmZpZ3VyZSgpfX0pO3ZhciBjdT1tZSgoTHksZnUpPT57InVzZSBzdHJpY3QiO2Z1LmV4cG9ydHM9a3Q7dmFyIGx1PXNpKCk7KGt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGx1LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWt0O3ZhciBadD1KdCgpO2Z1bmN0aW9uIGt0KCl7bHUuY2FsbCh0aGlzKX1rdC5fY29uZmlndXJlPWZ1bmN0aW9uKCl7a3QuYWxsb2M9WnQuX0J1ZmZlcl9hbGxvY1Vuc2FmZSxrdC53cml0ZUJ5dGVzQnVmZmVyPVp0LkJ1ZmZlciYmWnQuQnVmZmVyLnByb3RvdHlwZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJlp0LkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU9PT0ic2V0Ij9mdW5jdGlvbih0LG8sZSl7by5zZXQodCxlKX06ZnVuY3Rpb24odCxvLGUpe2lmKHQuY29weSl0LmNvcHkobyxlLDAsdC5sZW5ndGgpO2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDspb1tlKytdPXRbcisrXX19O2t0LnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbih0KXtadC5pc1N0cmluZyh0KSYmKHQ9WnQuX0J1ZmZlcl9mcm9tKHQsImJhc2U2NCIpKTt2YXIgbz10Lmxlbmd0aD4+PjA7cmV0dXJuIHRoaXMudWludDMyKG8pLG8mJnRoaXMuX3B1c2goa3Qud3JpdGVCeXRlc0J1ZmZlcixvLHQpLHRoaXN9O2Z1bmN0aW9uIHpkKGEsdCxvKXthLmxlbmd0aDw0MD9adC51dGY4LndyaXRlKGEsdCxvKTp0LnV0ZjhXcml0ZT90LnV0ZjhXcml0ZShhLG8pOnQud3JpdGUoYSxvKX1rdC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBvPVp0LkJ1ZmZlci5ieXRlTGVuZ3RoKHQpO3JldHVybiB0aGlzLnVpbnQzMihvKSxvJiZ0aGlzLl9wdXNoKHpkLG8sdCksdGhpc307a3QuX2NvbmZpZ3VyZSgpfSk7dmFyIGZpPW1lKChDeSxidSk9PnsidXNlIHN0cmljdCI7YnUuZXhwb3J0cz1BZTt2YXIgUHQ9SnQoKSxsaSxodT1QdC5Mb25nQml0cyxWZD1QdC51dGY4O2Z1bmN0aW9uIEV0KGEsdCl7cmV0dXJuIFJhbmdlRXJyb3IoImluZGV4IG91dCBvZiByYW5nZTogIithLnBvcysiICsgIisodHx8MSkrIiA+ICIrYS5sZW4pfWZ1bmN0aW9uIEFlKGEpe3RoaXMuYnVmPWEsdGhpcy5wb3M9MCx0aGlzLmxlbj1hLmxlbmd0aH12YXIgcHU9dHlwZW9mIFVpbnQ4QXJyYXk8InUiP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheS5pc0FycmF5KHQpKXJldHVybiBuZXcgQWUodCk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9OmZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIG5ldyBBZSh0KTt0aHJvdyBFcnJvcigiaWxsZWdhbCBidWZmZXIiKX0sbXU9ZnVuY3Rpb24oKXtyZXR1cm4gUHQuQnVmZmVyP2Z1bmN0aW9uKG8pe3JldHVybihBZS5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIFB0LkJ1ZmZlci5pc0J1ZmZlcihyKT9uZXcgbGkocik6cHUocil9KShvKX06cHV9O0FlLmNyZWF0ZT1tdSgpO0FlLnByb3RvdHlwZS5fc2xpY2U9UHQuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5fHxQdC5BcnJheS5wcm90b3R5cGUuc2xpY2U7QWUucHJvdG90eXBlLnVpbnQzMj1mdW5jdGlvbigpe3ZhciB0PTQyOTQ5NjcyOTU7cmV0dXJuIGZ1bmN0aW9uKCl7aWYodD0odGhpcy5idWZbdGhpcy5wb3NdJjEyNyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOHx8KHQ9KHR8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDw3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXx8KHQ9KHR8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDwxNCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCl8fCh0PSh0fCh0aGlzLmJ1Zlt0aGlzLnBvc10mMTI3KTw8MjEpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpfHwodD0odHwodGhpcy5idWZbdGhpcy5wb3NdJjE1KTw8MjgpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpKXJldHVybiB0O2lmKCh0aGlzLnBvcys9NSk+dGhpcy5sZW4pdGhyb3cgdGhpcy5wb3M9dGhpcy5sZW4sRXQodGhpcywxMCk7cmV0dXJuIHR9fSgpO0FlLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVpbnQzMigpfDB9O0FlLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnVpbnQzMigpO3JldHVybiB0Pj4+MV4tKHQmMSl8MH07ZnVuY3Rpb24gdWkoKXt2YXIgYT1uZXcgaHUoMCwwKSx0PTA7aWYodGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDt0PDQ7Kyt0KWlmKGEubG89KGEubG98KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDx0KjcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGE7aWYoYS5sbz0oYS5sb3wodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PDI4KT4+PjAsYS5oaT0oYS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk+PjQpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGE7dD0wfWVsc2V7Zm9yKDt0PDM7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgRXQodGhpcyk7aWYoYS5sbz0oYS5sb3wodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gYX1yZXR1cm4gYS5sbz0oYS5sb3wodGhpcy5idWZbdGhpcy5wb3MrK10mMTI3KTw8dCo3KT4+PjAsYX1pZih0aGlzLmxlbi10aGlzLnBvcz40KXtmb3IoO3Q8NTsrK3QpaWYoYS5oaT0oYS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBhfWVsc2UgZm9yKDt0PDU7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgRXQodGhpcyk7aWYoYS5oaT0oYS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBhfXRocm93IEVycm9yKCJpbnZhbGlkIHZhcmludCBlbmNvZGluZyIpfUFlLnByb3RvdHlwZS5ib29sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWludDMyKCkhPT0wfTtmdW5jdGlvbiBxbihhLHQpe3JldHVybihhW3QtNF18YVt0LTNdPDw4fGFbdC0yXTw8MTZ8YVt0LTFdPDwyNCk+Pj4wfUFlLnByb3RvdHlwZS5maXhlZDMyPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBFdCh0aGlzLDQpO3JldHVybiBxbih0aGlzLmJ1Zix0aGlzLnBvcys9NCl9O0FlLnByb3RvdHlwZS5zZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgRXQodGhpcyw0KTtyZXR1cm4gcW4odGhpcy5idWYsdGhpcy5wb3MrPTQpfDB9O2Z1bmN0aW9uIGR1KCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBFdCh0aGlzLDgpO3JldHVybiBuZXcgaHUocW4odGhpcy5idWYsdGhpcy5wb3MrPTQpLHFuKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9QWUucHJvdG90eXBlLmZsb2F0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBFdCh0aGlzLDQpO3ZhciB0PVB0LmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH07QWUucHJvdG90eXBlLmRvdWJsZT1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgRXQodGhpcyw0KTt2YXIgdD1QdC5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCx0fTtBZS5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnVpbnQzMigpLG89dGhpcy5wb3MsZT10aGlzLnBvcyt0O2lmKGU+dGhpcy5sZW4pdGhyb3cgRXQodGhpcyx0KTtpZih0aGlzLnBvcys9dCxBcnJheS5pc0FycmF5KHRoaXMuYnVmKSlyZXR1cm4gdGhpcy5idWYuc2xpY2UobyxlKTtpZihvPT09ZSl7dmFyIHI9UHQuQnVmZmVyO3JldHVybiByP3IuYWxsb2MoMCk6bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApfXJldHVybiB0aGlzLl9zbGljZS5jYWxsKHRoaXMuYnVmLG8sZSl9O0FlLnByb3RvdHlwZS5zdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ5dGVzKCk7cmV0dXJuIFZkLnJlYWQodCwwLHQubGVuZ3RoKX07QWUucHJvdG90eXBlLnNraXA9ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PSJudW1iZXIiKXtpZih0aGlzLnBvcyt0PnRoaXMubGVuKXRocm93IEV0KHRoaXMsdCk7dGhpcy5wb3MrPXR9ZWxzZSBkbyBpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgRXQodGhpcyk7d2hpbGUodGhpcy5idWZbdGhpcy5wb3MrK10mMTI4KTtyZXR1cm4gdGhpc307QWUucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOyhhPXRoaXMudWludDMyKCkmNykhPT00Oyl0aGlzLnNraXBUeXBlKGEpO2JyZWFrO2Nhc2UgNTp0aGlzLnNraXAoNCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCB3aXJlIHR5cGUgIithKyIgYXQgb2Zmc2V0ICIrdGhpcy5wb3MpfXJldHVybiB0aGlzfTtBZS5fY29uZmlndXJlPWZ1bmN0aW9uKGEpe2xpPWEsQWUuY3JlYXRlPW11KCksbGkuX2NvbmZpZ3VyZSgpO3ZhciB0PVB0Lkxvbmc/InRvTG9uZyI6InRvTnVtYmVyIjtQdC5tZXJnZShBZS5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHVpLmNhbGwodGhpcylbdF0oITEpfSx1aW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWkuY2FsbCh0aGlzKVt0XSghMCl9LHNpbnQ2NDpmdW5jdGlvbigpe3JldHVybiB1aS5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGR1LmNhbGwodGhpcylbdF0oITApfSxzZml4ZWQ2NDpmdW5jdGlvbigpe3JldHVybiBkdS5jYWxsKHRoaXMpW3RdKCExKX19KX19KTt2YXIgeHU9bWUoKEZ5LFR1KT0+eyJ1c2Ugc3RyaWN0IjtUdS5leHBvcnRzPWRyO3ZhciB5dT1maSgpOyhkci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5dS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1kcjt2YXIgZ3U9SnQoKTtmdW5jdGlvbiBkcihhKXt5dS5jYWxsKHRoaXMsYSl9ZHIuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe2d1LkJ1ZmZlciYmKGRyLnByb3RvdHlwZS5fc2xpY2U9Z3UuQnVmZmVyLnByb3RvdHlwZS5zbGljZSl9O2RyLnByb3RvdHlwZS5zdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnVpbnQzMigpO3JldHVybiB0aGlzLmJ1Zi51dGY4U2xpY2U/dGhpcy5idWYudXRmOFNsaWNlKHRoaXMucG9zLHRoaXMucG9zPU1hdGgubWluKHRoaXMucG9zK3QsdGhpcy5sZW4pKTp0aGlzLmJ1Zi50b1N0cmluZygidXRmLTgiLHRoaXMucG9zLHRoaXMucG9zPU1hdGgubWluKHRoaXMucG9zK3QsdGhpcy5sZW4pKX07ZHIuX2NvbmZpZ3VyZSgpfSk7dmFyIHZ1PW1lKCgkeSx3dSk9PnsidXNlIHN0cmljdCI7d3UuZXhwb3J0cz1vbjt2YXIgY2k9SnQoKTsob24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoY2kuRXZlbnRFbWl0dGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW9uO2Z1bmN0aW9uIG9uKGEsdCxvKXtpZih0eXBlb2YgYSE9ImZ1bmN0aW9uIil0aHJvdyBUeXBlRXJyb3IoInJwY0ltcGwgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Y2kuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyksdGhpcy5ycGNJbXBsPWEsdGhpcy5yZXF1ZXN0RGVsaW1pdGVkPSEhdCx0aGlzLnJlc3BvbnNlRGVsaW1pdGVkPSEhb31vbi5wcm90b3R5cGUucnBjQ2FsbD1mdW5jdGlvbiBhKHQsbyxlLHIsbil7aWYoIXIpdGhyb3cgVHlwZUVycm9yKCJyZXF1ZXN0IG11c3QgYmUgc3BlY2lmaWVkIik7dmFyIHM9dGhpcztpZighbilyZXR1cm4gY2kuYXNQcm9taXNlKGEscyx0LG8sZSxyKTtpZighcy5ycGNJbXBsKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bihFcnJvcigiYWxyZWFkeSBlbmRlZCIpKX0sMCk7cmV0dXJufXRyeXtyZXR1cm4gcy5ycGNJbXBsKHQsb1tzLnJlcXVlc3REZWxpbWl0ZWQ/ImVuY29kZURlbGltaXRlZCI6ImVuY29kZSJdKHIpLmZpbmlzaCgpLGZ1bmN0aW9uKHUsbCl7aWYodSlyZXR1cm4gcy5lbWl0KCJlcnJvciIsdSx0KSxuKHUpO2lmKGw9PT1udWxsKXtzLmVuZCghMCk7cmV0dXJufWlmKCEobCBpbnN0YW5jZW9mIGUpKXRyeXtsPWVbcy5yZXNwb25zZURlbGltaXRlZD8iZGVjb2RlRGVsaW1pdGVkIjoiZGVjb2RlIl0obCl9Y2F0Y2goYyl7cmV0dXJuIHMuZW1pdCgiZXJyb3IiLGMsdCksbihjKX1yZXR1cm4gcy5lbWl0KCJkYXRhIixsLHQpLG4obnVsbCxsKX0pfWNhdGNoKGkpe3MuZW1pdCgiZXJyb3IiLGksdCksc2V0VGltZW91dChmdW5jdGlvbigpe24oaSl9LDApO3JldHVybn19O29uLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucnBjSW1wbCYmKHR8fHRoaXMucnBjSW1wbChudWxsLG51bGwsbnVsbCksdGhpcy5ycGNJbXBsPW51bGwsdGhpcy5lbWl0KCJlbmQiKS5vZmYoKSksdGhpc319KTt2YXIgT3U9bWUoX3U9PnsidXNlIHN0cmljdCI7dmFyIFdkPV91O1dkLlNlcnZpY2U9dnUoKX0pO3ZhciBTdT1tZSgoQnksSXUpPT57InVzZSBzdHJpY3QiO0l1LmV4cG9ydHM9e319KTt2YXIgRXU9bWUoUHU9PnsidXNlIHN0cmljdCI7dmFyIG90PVB1O290LmJ1aWxkPSJtaW5pbWFsIjtvdC5Xcml0ZXI9c2koKTtvdC5CdWZmZXJXcml0ZXI9Y3UoKTtvdC5SZWFkZXI9ZmkoKTtvdC5CdWZmZXJSZWFkZXI9eHUoKTtvdC51dGlsPUp0KCk7b3QucnBjPU91KCk7b3Qucm9vdHM9U3UoKTtvdC5jb25maWd1cmU9QXU7ZnVuY3Rpb24gQXUoKXtvdC51dGlsLl9jb25maWd1cmUoKSxvdC5Xcml0ZXIuX2NvbmZpZ3VyZShvdC5CdWZmZXJXcml0ZXIpLG90LlJlYWRlci5fY29uZmlndXJlKG90LkJ1ZmZlclJlYWRlcil9QXUoKX0pO3ZhciBMdT1tZSgoUnksRHUpPT57InVzZSBzdHJpY3QiO0R1LmV4cG9ydHM9RXUoKX0pO3ZhciBDcj1tZSgoTXksQ3UpPT57InVzZSBzdHJpY3QiO3ZhciBnZT1MdSgpLE49Z2UuUmVhZGVyLFBlPWdlLldyaXRlcixnPWdlLnV0aWwsaD1nZS5yb290cy5kZWZhdWx0fHwoZ2Uucm9vdHMuZGVmYXVsdD17fSk7aC5vbm54PWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuVmVyc2lvbj1mdW5jdGlvbigpe3ZhciB0PXt9LG89T2JqZWN0LmNyZWF0ZSh0KTtyZXR1cm4gb1t0WzBdPSJfU1RBUlRfVkVSU0lPTiJdPTAsb1t0WzFdPSJJUl9WRVJTSU9OXzIwMTdfMTBfMTAiXT0xLG9bdFsyXT0iSVJfVkVSU0lPTl8yMDE3XzEwXzMwIl09MixvW3RbM109IklSX1ZFUlNJT05fMjAxN18xMV8zIl09MyxvW3RbNF09IklSX1ZFUlNJT05fMjAxOV8xXzIyIl09NCxvW3RbNV09IklSX1ZFUlNJT05fMjAxOV8zXzE4Il09NSxvW3RbNl09IklSX1ZFUlNJT05fMjAxOV85XzE5Il09NixvW3RbN109IklSX1ZFUlNJT05fMjAyMF81XzgiXT03LG9bdFs4XT0iSVJfVkVSU0lPTl8yMDIxXzdfMzAiXT04LG9bdFs5XT0iSVJfVkVSU0lPTiJdPTksb30oKSxhLkF0dHJpYnV0ZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXtpZih0aGlzLmZsb2F0cz1bXSx0aGlzLmludHM9W10sdGhpcy5zdHJpbmdzPVtdLHRoaXMudGVuc29ycz1bXSx0aGlzLmdyYXBocz1bXSx0aGlzLnNwYXJzZVRlbnNvcnM9W10sdGhpcy50eXBlUHJvdG9zPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUubmFtZT0iIix0LnByb3RvdHlwZS5yZWZBdHRyTmFtZT0iIix0LnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsdC5wcm90b3R5cGUudHlwZT0wLHQucHJvdG90eXBlLmY9MCx0LnByb3RvdHlwZS5pPWcuTG9uZz9nLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLHQucHJvdG90eXBlLnM9Zy5uZXdCdWZmZXIoW10pLHQucHJvdG90eXBlLnQ9bnVsbCx0LnByb3RvdHlwZS5nPW51bGwsdC5wcm90b3R5cGUuc3BhcnNlVGVuc29yPW51bGwsdC5wcm90b3R5cGUudHA9bnVsbCx0LnByb3RvdHlwZS5mbG9hdHM9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmludHM9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLnN0cmluZ3M9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLnRlbnNvcnM9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmdyYXBocz1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUuc3BhcnNlVGVuc29ycz1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUudHlwZVByb3Rvcz1nLmVtcHR5QXJyYXksdC5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUpfSx0LmVuY29kZT1mdW5jdGlvbihlLHIpe2lmKHJ8fChyPVBlLmNyZWF0ZSgpKSxlLm5hbWUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmci51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLGUuZiE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZiIpJiZyLnVpbnQzMigyMSkuZmxvYXQoZS5mKSxlLmkhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImkiKSYmci51aW50MzIoMjQpLmludDY0KGUuaSksZS5zIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzIikmJnIudWludDMyKDM0KS5ieXRlcyhlLnMpLGUudCE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidCIpJiZoLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudCxyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSxlLmchPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImciKSYmaC5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuZyxyLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKSxlLmZsb2F0cyE9bnVsbCYmZS5mbG9hdHMubGVuZ3RoKXtyLnVpbnQzMig1OCkuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5mbG9hdHMubGVuZ3RoOysrbilyLmZsb2F0KGUuZmxvYXRzW25dKTtyLmxkZWxpbSgpfWlmKGUuaW50cyE9bnVsbCYmZS5pbnRzLmxlbmd0aCl7ci51aW50MzIoNjYpLmZvcmsoKTtmb3IodmFyIG49MDtuPGUuaW50cy5sZW5ndGg7KytuKXIuaW50NjQoZS5pbnRzW25dKTtyLmxkZWxpbSgpfWlmKGUuc3RyaW5ncyE9bnVsbCYmZS5zdHJpbmdzLmxlbmd0aClmb3IodmFyIG49MDtuPGUuc3RyaW5ncy5sZW5ndGg7KytuKXIudWludDMyKDc0KS5ieXRlcyhlLnN0cmluZ3Nbbl0pO2lmKGUudGVuc29ycyE9bnVsbCYmZS50ZW5zb3JzLmxlbmd0aClmb3IodmFyIG49MDtuPGUudGVuc29ycy5sZW5ndGg7KytuKWgub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS50ZW5zb3JzW25dLHIudWludDMyKDgyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUuZ3JhcGhzIT1udWxsJiZlLmdyYXBocy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKWgub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmdyYXBoc1tuXSxyLnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtpZihlLmRvY1N0cmluZyE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnIudWludDMyKDEwNikuc3RyaW5nKGUuZG9jU3RyaW5nKSxlLnRwIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0cCIpJiZoLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnRwLHIudWludDMyKDExNCkuZm9yaygpKS5sZGVsaW0oKSxlLnR5cGVQcm90b3MhPW51bGwmJmUudHlwZVByb3Rvcy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnR5cGVQcm90b3MubGVuZ3RoOysrbiloLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnR5cGVQcm90b3Nbbl0sci51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUudHlwZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHlwZSIpJiZyLnVpbnQzMigxNjApLmludDMyKGUudHlwZSksZS5yZWZBdHRyTmFtZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmVmQXR0ck5hbWUiKSYmci51aW50MzIoMTcwKS5zdHJpbmcoZS5yZWZBdHRyTmFtZSksZS5zcGFyc2VUZW5zb3IhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNwYXJzZVRlbnNvciIpJiZoLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlVGVuc29yLHIudWludDMyKDE3OCkuZm9yaygpKS5sZGVsaW0oKSxlLnNwYXJzZVRlbnNvcnMhPW51bGwmJmUuc3BhcnNlVGVuc29ycy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbiloLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlVGVuc29yc1tuXSxyLnVpbnQzMigxODYpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHJ9LHQuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUscil7cmV0dXJuIHRoaXMuZW5jb2RlKGUscikubGRlbGltKCl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUscil7ZSBpbnN0YW5jZW9mIE58fChlPU4uY3JlYXRlKGUpKTtmb3IodmFyIG49cj09PXZvaWQgMD9lLmxlbjplLnBvcytyLHM9bmV3IGgub25ueC5BdHRyaWJ1dGVQcm90bztlLnBvczxuOyl7dmFyIGk9ZS51aW50MzIoKTtzd2l0Y2goaT4+PjMpe2Nhc2UgMTp7cy5uYW1lPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSAyMTp7cy5yZWZBdHRyTmFtZT1lLnN0cmluZygpO2JyZWFrfWNhc2UgMTM6e3MuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSAyMDp7cy50eXBlPWUuaW50MzIoKTticmVha31jYXNlIDI6e3MuZj1lLmZsb2F0KCk7YnJlYWt9Y2FzZSAzOntzLmk9ZS5pbnQ2NCgpO2JyZWFrfWNhc2UgNDp7cy5zPWUuYnl0ZXMoKTticmVha31jYXNlIDU6e3MudD1oLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSA2OntzLmc9aC5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSAyMjp7cy5zcGFyc2VUZW5zb3I9aC5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrfWNhc2UgMTQ6e3MudHA9aC5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVha31jYXNlIDc6e2lmKHMuZmxvYXRzJiZzLmZsb2F0cy5sZW5ndGh8fChzLmZsb2F0cz1bXSksKGkmNyk9PT0yKWZvcih2YXIgdT1lLnVpbnQzMigpK2UucG9zO2UucG9zPHU7KXMuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTtlbHNlIHMuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTticmVha31jYXNlIDg6e2lmKHMuaW50cyYmcy5pbnRzLmxlbmd0aHx8KHMuaW50cz1bXSksKGkmNyk9PT0yKWZvcih2YXIgdT1lLnVpbnQzMigpK2UucG9zO2UucG9zPHU7KXMuaW50cy5wdXNoKGUuaW50NjQoKSk7ZWxzZSBzLmludHMucHVzaChlLmludDY0KCkpO2JyZWFrfWNhc2UgOTp7cy5zdHJpbmdzJiZzLnN0cmluZ3MubGVuZ3RofHwocy5zdHJpbmdzPVtdKSxzLnN0cmluZ3MucHVzaChlLmJ5dGVzKCkpO2JyZWFrfWNhc2UgMTA6e3MudGVuc29ycyYmcy50ZW5zb3JzLmxlbmd0aHx8KHMudGVuc29ycz1bXSkscy50ZW5zb3JzLnB1c2goaC5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31jYXNlIDExOntzLmdyYXBocyYmcy5ncmFwaHMubGVuZ3RofHwocy5ncmFwaHM9W10pLHMuZ3JhcGhzLnB1c2goaC5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWNhc2UgMjM6e3Muc3BhcnNlVGVuc29ycyYmcy5zcGFyc2VUZW5zb3JzLmxlbmd0aHx8KHMuc3BhcnNlVGVuc29ycz1bXSkscy5zcGFyc2VUZW5zb3JzLnB1c2goaC5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31jYXNlIDE1OntzLnR5cGVQcm90b3MmJnMudHlwZVByb3Rvcy5sZW5ndGh8fChzLnR5cGVQcm90b3M9W10pLHMudHlwZVByb3Rvcy5wdXNoKGgub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWRlZmF1bHQ6ZS5za2lwVHlwZShpJjcpO2JyZWFrfX1yZXR1cm4gc30sdC5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOfHwoZT1uZXcgTihlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sdC52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWcuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4ibmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnJlZkF0dHJOYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJyZWZBdHRyTmFtZSIpJiYhZy5pc1N0cmluZyhlLnJlZkF0dHJOYW1lKSlyZXR1cm4icmVmQXR0ck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhZy5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSlzd2l0Y2goZS50eXBlKXtkZWZhdWx0OnJldHVybiJ0eXBlOiBlbnVtIHZhbHVlIGV4cGVjdGVkIjtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpjYXNlIDExOmNhc2UgMTM6Y2FzZSA2OmNhc2UgNzpjYXNlIDg6Y2FzZSA5OmNhc2UgMTA6Y2FzZSAxMjpjYXNlIDE0OmJyZWFrfWlmKGUuZiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiZ0eXBlb2YgZS5mIT0ibnVtYmVyIilyZXR1cm4iZjogbnVtYmVyIGV4cGVjdGVkIjtpZihlLmkhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmIWcuaXNJbnRlZ2VyKGUuaSkmJiEoZS5pJiZnLmlzSW50ZWdlcihlLmkubG93KSYmZy5pc0ludGVnZXIoZS5pLmhpZ2gpKSlyZXR1cm4iaTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihlLnMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmIShlLnMmJnR5cGVvZiBlLnMubGVuZ3RoPT0ibnVtYmVyInx8Zy5pc1N0cmluZyhlLnMpKSlyZXR1cm4iczogYnVmZmVyIGV4cGVjdGVkIjtpZihlLnQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInQiKSl7dmFyIHI9aC5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnQpO2lmKHIpcmV0dXJuInQuIityfWlmKGUuZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZyIpKXt2YXIgcj1oLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5nKTtpZihyKXJldHVybiJnLiIrcn1pZihlLnNwYXJzZVRlbnNvciE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29yIikpe3ZhciByPWgub25ueC5TcGFyc2VUZW5zb3JQcm90by52ZXJpZnkoZS5zcGFyc2VUZW5zb3IpO2lmKHIpcmV0dXJuInNwYXJzZVRlbnNvci4iK3J9aWYoZS50cCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHAiKSl7dmFyIHI9aC5vbm54LlR5cGVQcm90by52ZXJpZnkoZS50cCk7aWYocilyZXR1cm4idHAuIityfWlmKGUuZmxvYXRzIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJmbG9hdHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdHMpKXJldHVybiJmbG9hdHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIG49MDtuPGUuZmxvYXRzLmxlbmd0aDsrK24paWYodHlwZW9mIGUuZmxvYXRzW25dIT0ibnVtYmVyIilyZXR1cm4iZmxvYXRzOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYoZS5pbnRzIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJpbnRzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpcmV0dXJuImludHM6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIG49MDtuPGUuaW50cy5sZW5ndGg7KytuKWlmKCFnLmlzSW50ZWdlcihlLmludHNbbl0pJiYhKGUuaW50c1tuXSYmZy5pc0ludGVnZXIoZS5pbnRzW25dLmxvdykmJmcuaXNJbnRlZ2VyKGUuaW50c1tuXS5oaWdoKSkpcmV0dXJuImludHM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihlLnN0cmluZ3MhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ3MiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSlyZXR1cm4ic3RyaW5nczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgbj0wO248ZS5zdHJpbmdzLmxlbmd0aDsrK24paWYoIShlLnN0cmluZ3Nbbl0mJnR5cGVvZiBlLnN0cmluZ3Nbbl0ubGVuZ3RoPT0ibnVtYmVyInx8Zy5pc1N0cmluZyhlLnN0cmluZ3Nbbl0pKSlyZXR1cm4ic3RyaW5nczogYnVmZmVyW10gZXhwZWN0ZWQifWlmKGUudGVuc29ycyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29ycyIpKXtpZighQXJyYXkuaXNBcnJheShlLnRlbnNvcnMpKXJldHVybiJ0ZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLnRlbnNvcnMubGVuZ3RoOysrbil7dmFyIHI9aC5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnRlbnNvcnNbbl0pO2lmKHIpcmV0dXJuInRlbnNvcnMuIityfX1pZihlLmdyYXBocyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGhzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZ3JhcGhzKSlyZXR1cm4iZ3JhcGhzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKXt2YXIgcj1oLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5ncmFwaHNbbl0pO2lmKHIpcmV0dXJuImdyYXBocy4iK3J9fWlmKGUuc3BhcnNlVGVuc29ycyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29ycyIpKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZVRlbnNvcnMpKXJldHVybiJzcGFyc2VUZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbil7dmFyIHI9aC5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZVRlbnNvcnNbbl0pO2lmKHIpcmV0dXJuInNwYXJzZVRlbnNvcnMuIityfX1pZihlLnR5cGVQcm90b3MhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGVQcm90b3MiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS50eXBlUHJvdG9zKSlyZXR1cm4idHlwZVByb3RvczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgbj0wO248ZS50eXBlUHJvdG9zLmxlbmd0aDsrK24pe3ZhciByPWgub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHlwZVByb3Rvc1tuXSk7aWYocilyZXR1cm4idHlwZVByb3Rvcy4iK3J9fXJldHVybiBudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LkF0dHJpYnV0ZVByb3RvO3N3aXRjaChlLm5hbWUhPW51bGwmJihyLm5hbWU9U3RyaW5nKGUubmFtZSkpLGUucmVmQXR0ck5hbWUhPW51bGwmJihyLnJlZkF0dHJOYW1lPVN0cmluZyhlLnJlZkF0dHJOYW1lKSksZS5kb2NTdHJpbmchPW51bGwmJihyLmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLnR5cGUpe2RlZmF1bHQ6aWYodHlwZW9mIGUudHlwZT09Im51bWJlciIpe3IudHlwZT1lLnR5cGU7YnJlYWt9YnJlYWs7Y2FzZSJVTkRFRklORUQiOmNhc2UgMDpyLnR5cGU9MDticmVhaztjYXNlIkZMT0FUIjpjYXNlIDE6ci50eXBlPTE7YnJlYWs7Y2FzZSJJTlQiOmNhc2UgMjpyLnR5cGU9MjticmVhaztjYXNlIlNUUklORyI6Y2FzZSAzOnIudHlwZT0zO2JyZWFrO2Nhc2UiVEVOU09SIjpjYXNlIDQ6ci50eXBlPTQ7YnJlYWs7Y2FzZSJHUkFQSCI6Y2FzZSA1OnIudHlwZT01O2JyZWFrO2Nhc2UiU1BBUlNFX1RFTlNPUiI6Y2FzZSAxMTpyLnR5cGU9MTE7YnJlYWs7Y2FzZSJUWVBFX1BST1RPIjpjYXNlIDEzOnIudHlwZT0xMzticmVhaztjYXNlIkZMT0FUUyI6Y2FzZSA2OnIudHlwZT02O2JyZWFrO2Nhc2UiSU5UUyI6Y2FzZSA3OnIudHlwZT03O2JyZWFrO2Nhc2UiU1RSSU5HUyI6Y2FzZSA4OnIudHlwZT04O2JyZWFrO2Nhc2UiVEVOU09SUyI6Y2FzZSA5OnIudHlwZT05O2JyZWFrO2Nhc2UiR1JBUEhTIjpjYXNlIDEwOnIudHlwZT0xMDticmVhaztjYXNlIlNQQVJTRV9URU5TT1JTIjpjYXNlIDEyOnIudHlwZT0xMjticmVhaztjYXNlIlRZUEVfUFJPVE9TIjpjYXNlIDE0OnIudHlwZT0xNDticmVha31pZihlLmYhPW51bGwmJihyLmY9TnVtYmVyKGUuZikpLGUuaSE9bnVsbCYmKGcuTG9uZz8oci5pPWcuTG9uZy5mcm9tVmFsdWUoZS5pKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUuaT09InN0cmluZyI/ci5pPXBhcnNlSW50KGUuaSwxMCk6dHlwZW9mIGUuaT09Im51bWJlciI/ci5pPWUuaTp0eXBlb2YgZS5pPT0ib2JqZWN0IiYmKHIuaT1uZXcgZy5Mb25nQml0cyhlLmkubG93Pj4+MCxlLmkuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxlLnMhPW51bGwmJih0eXBlb2YgZS5zPT0ic3RyaW5nIj9nLmJhc2U2NC5kZWNvZGUoZS5zLHIucz1nLm5ld0J1ZmZlcihnLmJhc2U2NC5sZW5ndGgoZS5zKSksMCk6ZS5zLmxlbmd0aD49MCYmKHIucz1lLnMpKSxlLnQhPW51bGwpe2lmKHR5cGVvZiBlLnQhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udDogb2JqZWN0IGV4cGVjdGVkIik7ci50PWgub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudCl9aWYoZS5nIT1udWxsKXtpZih0eXBlb2YgZS5nIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmc6IG9iamVjdCBleHBlY3RlZCIpO3IuZz1oLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZyl9aWYoZS5zcGFyc2VUZW5zb3IhPW51bGwpe2lmKHR5cGVvZiBlLnNwYXJzZVRlbnNvciE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5zcGFyc2VUZW5zb3I6IG9iamVjdCBleHBlY3RlZCIpO3Iuc3BhcnNlVGVuc29yPWgub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yKX1pZihlLnRwIT1udWxsKXtpZih0eXBlb2YgZS50cCE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50cDogb2JqZWN0IGV4cGVjdGVkIik7ci50cD1oLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50cCl9aWYoZS5mbG9hdHMpe2lmKCFBcnJheS5pc0FycmF5KGUuZmxvYXRzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmZsb2F0czogYXJyYXkgZXhwZWN0ZWQiKTtyLmZsb2F0cz1bXTtmb3IodmFyIG49MDtuPGUuZmxvYXRzLmxlbmd0aDsrK24pci5mbG9hdHNbbl09TnVtYmVyKGUuZmxvYXRzW25dKX1pZihlLmludHMpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5pbnRzOiBhcnJheSBleHBlY3RlZCIpO3IuaW50cz1bXTtmb3IodmFyIG49MDtuPGUuaW50cy5sZW5ndGg7KytuKWcuTG9uZz8oci5pbnRzW25dPWcuTG9uZy5mcm9tVmFsdWUoZS5pbnRzW25dKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUuaW50c1tuXT09InN0cmluZyI/ci5pbnRzW25dPXBhcnNlSW50KGUuaW50c1tuXSwxMCk6dHlwZW9mIGUuaW50c1tuXT09Im51bWJlciI/ci5pbnRzW25dPWUuaW50c1tuXTp0eXBlb2YgZS5pbnRzW25dPT0ib2JqZWN0IiYmKHIuaW50c1tuXT1uZXcgZy5Mb25nQml0cyhlLmludHNbbl0ubG93Pj4+MCxlLmludHNbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpfWlmKGUuc3RyaW5ncyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIik7ci5zdHJpbmdzPVtdO2Zvcih2YXIgbj0wO248ZS5zdHJpbmdzLmxlbmd0aDsrK24pdHlwZW9mIGUuc3RyaW5nc1tuXT09InN0cmluZyI/Zy5iYXNlNjQuZGVjb2RlKGUuc3RyaW5nc1tuXSxyLnN0cmluZ3Nbbl09Zy5uZXdCdWZmZXIoZy5iYXNlNjQubGVuZ3RoKGUuc3RyaW5nc1tuXSkpLDApOmUuc3RyaW5nc1tuXS5sZW5ndGg+PTAmJihyLnN0cmluZ3Nbbl09ZS5zdHJpbmdzW25dKX1pZihlLnRlbnNvcnMpe2lmKCFBcnJheS5pc0FycmF5KGUudGVuc29ycykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBhcnJheSBleHBlY3RlZCIpO3IudGVuc29ycz1bXTtmb3IodmFyIG49MDtuPGUudGVuc29ycy5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS50ZW5zb3JzW25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnRlbnNvcnM6IG9iamVjdCBleHBlY3RlZCIpO3IudGVuc29yc1tuXT1oLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnRlbnNvcnNbbl0pfX1pZihlLmdyYXBocyl7aWYoIUFycmF5LmlzQXJyYXkoZS5ncmFwaHMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uZ3JhcGhzOiBhcnJheSBleHBlY3RlZCIpO3IuZ3JhcGhzPVtdO2Zvcih2YXIgbj0wO248ZS5ncmFwaHMubGVuZ3RoOysrbil7aWYodHlwZW9mIGUuZ3JhcGhzW25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmdyYXBoczogb2JqZWN0IGV4cGVjdGVkIik7ci5ncmFwaHNbbl09aC5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmdyYXBoc1tuXSl9fWlmKGUuc3BhcnNlVGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VUZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7ci5zcGFyc2VUZW5zb3JzPVtdO2Zvcih2YXIgbj0wO248ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnNwYXJzZVRlbnNvcnNbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uc3BhcnNlVGVuc29yczogb2JqZWN0IGV4cGVjdGVkIik7ci5zcGFyc2VUZW5zb3JzW25dPWgub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlVGVuc29yc1tuXSl9fWlmKGUudHlwZVByb3Rvcyl7aWYoIUFycmF5LmlzQXJyYXkoZS50eXBlUHJvdG9zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnR5cGVQcm90b3M6IGFycmF5IGV4cGVjdGVkIik7ci50eXBlUHJvdG9zPVtdO2Zvcih2YXIgbj0wO248ZS50eXBlUHJvdG9zLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnR5cGVQcm90b3Nbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udHlwZVByb3Rvczogb2JqZWN0IGV4cGVjdGVkIik7ci50eXBlUHJvdG9zW25dPWgub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLnR5cGVQcm90b3Nbbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5mbG9hdHM9W10sbi5pbnRzPVtdLG4uc3RyaW5ncz1bXSxuLnRlbnNvcnM9W10sbi5ncmFwaHM9W10sbi50eXBlUHJvdG9zPVtdLG4uc3BhcnNlVGVuc29ycz1bXSksci5kZWZhdWx0cyl7aWYobi5uYW1lPSIiLG4uZj0wLGcuTG9uZyl7dmFyIHM9bmV3IGcuTG9uZygwLDAsITEpO24uaT1yLmxvbmdzPT09U3RyaW5nP3MudG9TdHJpbmcoKTpyLmxvbmdzPT09TnVtYmVyP3MudG9OdW1iZXIoKTpzfWVsc2Ugbi5pPXIubG9uZ3M9PT1TdHJpbmc/IjAiOjA7ci5ieXRlcz09PVN0cmluZz9uLnM9IiI6KG4ucz1bXSxyLmJ5dGVzIT09QXJyYXkmJihuLnM9Zy5uZXdCdWZmZXIobi5zKSkpLG4udD1udWxsLG4uZz1udWxsLG4uZG9jU3RyaW5nPSIiLG4udHA9bnVsbCxuLnR5cGU9ci5lbnVtcz09PVN0cmluZz8iVU5ERUZJTkVEIjowLG4ucmVmQXR0ck5hbWU9IiIsbi5zcGFyc2VUZW5zb3I9bnVsbH1pZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuZiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZiIpJiYobi5mPXIuanNvbiYmIWlzRmluaXRlKGUuZik/U3RyaW5nKGUuZik6ZS5mKSxlLmkhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmKHR5cGVvZiBlLmk9PSJudW1iZXIiP24uaT1yLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmkpOmUuaTpuLmk9ci5sb25ncz09PVN0cmluZz9nLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pKTpyLmxvbmdzPT09TnVtYmVyP25ldyBnLkxvbmdCaXRzKGUuaS5sb3c+Pj4wLGUuaS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmkpLGUucyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicyIpJiYobi5zPXIuYnl0ZXM9PT1TdHJpbmc/Zy5iYXNlNjQuZW5jb2RlKGUucywwLGUucy5sZW5ndGgpOnIuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnMpOmUucyksZS50IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ0IikmJihuLnQ9aC5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUudCxyKSksZS5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJnIikmJihuLmc9aC5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5nLHIpKSxlLmZsb2F0cyYmZS5mbG9hdHMubGVuZ3RoKXtuLmZsb2F0cz1bXTtmb3IodmFyIGk9MDtpPGUuZmxvYXRzLmxlbmd0aDsrK2kpbi5mbG9hdHNbaV09ci5qc29uJiYhaXNGaW5pdGUoZS5mbG9hdHNbaV0pP1N0cmluZyhlLmZsb2F0c1tpXSk6ZS5mbG9hdHNbaV19aWYoZS5pbnRzJiZlLmludHMubGVuZ3RoKXtuLmludHM9W107Zm9yKHZhciBpPTA7aTxlLmludHMubGVuZ3RoOysraSl0eXBlb2YgZS5pbnRzW2ldPT0ibnVtYmVyIj9uLmludHNbaV09ci5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnRzW2ldKTplLmludHNbaV06bi5pbnRzW2ldPXIubG9uZ3M9PT1TdHJpbmc/Zy5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50c1tpXSk6ci5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhlLmludHNbaV0ubG93Pj4+MCxlLmludHNbaV0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnRzW2ldfWlmKGUuc3RyaW5ncyYmZS5zdHJpbmdzLmxlbmd0aCl7bi5zdHJpbmdzPVtdO2Zvcih2YXIgaT0wO2k8ZS5zdHJpbmdzLmxlbmd0aDsrK2kpbi5zdHJpbmdzW2ldPXIuYnl0ZXM9PT1TdHJpbmc/Zy5iYXNlNjQuZW5jb2RlKGUuc3RyaW5nc1tpXSwwLGUuc3RyaW5nc1tpXS5sZW5ndGgpOnIuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnN0cmluZ3NbaV0pOmUuc3RyaW5nc1tpXX1pZihlLnRlbnNvcnMmJmUudGVuc29ycy5sZW5ndGgpe24udGVuc29ycz1bXTtmb3IodmFyIGk9MDtpPGUudGVuc29ycy5sZW5ndGg7KytpKW4udGVuc29yc1tpXT1oLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS50ZW5zb3JzW2ldLHIpfWlmKGUuZ3JhcGhzJiZlLmdyYXBocy5sZW5ndGgpe24uZ3JhcGhzPVtdO2Zvcih2YXIgaT0wO2k8ZS5ncmFwaHMubGVuZ3RoOysraSluLmdyYXBoc1tpXT1oLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmdyYXBoc1tpXSxyKX1pZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS50cCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHAiKSYmKG4udHA9aC5vbm54LlR5cGVQcm90by50b09iamVjdChlLnRwLHIpKSxlLnR5cGVQcm90b3MmJmUudHlwZVByb3Rvcy5sZW5ndGgpe24udHlwZVByb3Rvcz1bXTtmb3IodmFyIGk9MDtpPGUudHlwZVByb3Rvcy5sZW5ndGg7KytpKW4udHlwZVByb3Rvc1tpXT1oLm9ubnguVHlwZVByb3RvLnRvT2JqZWN0KGUudHlwZVByb3Rvc1tpXSxyKX1pZihlLnR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSYmKG4udHlwZT1yLmVudW1zPT09U3RyaW5nP2gub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlW2UudHlwZV09PT12b2lkIDA/ZS50eXBlOmgub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlW2UudHlwZV06ZS50eXBlKSxlLnJlZkF0dHJOYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJyZWZBdHRyTmFtZSIpJiYobi5yZWZBdHRyTmFtZT1lLnJlZkF0dHJOYW1lKSxlLnNwYXJzZVRlbnNvciE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29yIikmJihuLnNwYXJzZVRlbnNvcj1oLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udG9PYmplY3QoZS5zcGFyc2VUZW5zb3IscikpLGUuc3BhcnNlVGVuc29ycyYmZS5zcGFyc2VUZW5zb3JzLmxlbmd0aCl7bi5zcGFyc2VUZW5zb3JzPVtdO2Zvcih2YXIgaT0wO2k8ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK2kpbi5zcGFyc2VUZW5zb3JzW2ldPWgub25ueC5TcGFyc2VUZW5zb3JQcm90by50b09iamVjdChlLnNwYXJzZVRlbnNvcnNbaV0scil9cmV0dXJuIG59LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LkF0dHJpYnV0ZVByb3RvIn0sdC5BdHRyaWJ1dGVUeXBlPWZ1bmN0aW9uKCl7dmFyIG89e30sZT1PYmplY3QuY3JlYXRlKG8pO3JldHVybiBlW29bMF09IlVOREVGSU5FRCJdPTAsZVtvWzFdPSJGTE9BVCJdPTEsZVtvWzJdPSJJTlQiXT0yLGVbb1szXT0iU1RSSU5HIl09MyxlW29bNF09IlRFTlNPUiJdPTQsZVtvWzVdPSJHUkFQSCJdPTUsZVtvWzExXT0iU1BBUlNFX1RFTlNPUiJdPTExLGVbb1sxM109IlRZUEVfUFJPVE8iXT0xMyxlW29bNl09IkZMT0FUUyJdPTYsZVtvWzddPSJJTlRTIl09NyxlW29bOF09IlNUUklOR1MiXT04LGVbb1s5XT0iVEVOU09SUyJdPTksZVtvWzEwXT0iR1JBUEhTIl09MTAsZVtvWzEyXT0iU1BBUlNFX1RFTlNPUlMiXT0xMixlW29bMTRdPSJUWVBFX1BST1RPUyJdPTE0LGV9KCksdH0oKSxhLlZhbHVlSW5mb1Byb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXtpZihvKWZvcih2YXIgZT1PYmplY3Qua2V5cyhvKSxyPTA7cjxlLmxlbmd0aDsrK3Ipb1tlW3JdXSE9bnVsbCYmKHRoaXNbZVtyXV09b1tlW3JdXSl9cmV0dXJuIHQucHJvdG90eXBlLm5hbWU9IiIsdC5wcm90b3R5cGUudHlwZT1udWxsLHQucHJvdG90eXBlLmRvY1N0cmluZz0iIix0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fChyPVBlLmNyZWF0ZSgpKSxlLm5hbWUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmci51aW50MzIoMTApLnN0cmluZyhlLm5hbWUpLGUudHlwZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidHlwZSIpJiZoLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnR5cGUsci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksZS5kb2NTdHJpbmchPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZyLnVpbnQzMigyNikuc3RyaW5nKGUuZG9jU3RyaW5nKSxyfSx0LmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHIpe3JldHVybiB0aGlzLmVuY29kZShlLHIpLmxkZWxpbSgpfSx0LmRlY29kZT1mdW5jdGlvbihlLHIpe2UgaW5zdGFuY2VvZiBOfHwoZT1OLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXI9PT12b2lkIDA/ZS5sZW46ZS5wb3MrcixzPW5ldyBoLm9ubnguVmFsdWVJbmZvUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e3MubmFtZT1lLnN0cmluZygpO2JyZWFrfWNhc2UgMjp7cy50eXBlPWgub25ueC5UeXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSAzOntzLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrfWRlZmF1bHQ6ZS5za2lwVHlwZShpJjcpO2JyZWFrfX1yZXR1cm4gc30sdC5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOfHwoZT1uZXcgTihlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sdC52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWcuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4ibmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSl7dmFyIHI9aC5vbm54LlR5cGVQcm90by52ZXJpZnkoZS50eXBlKTtpZihyKXJldHVybiJ0eXBlLiIrcn1yZXR1cm4gZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhZy5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5WYWx1ZUluZm9Qcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LlZhbHVlSW5mb1Byb3RvO2lmKGUubmFtZSE9bnVsbCYmKHIubmFtZT1TdHJpbmcoZS5uYW1lKSksZS50eXBlIT1udWxsKXtpZih0eXBlb2YgZS50eXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlZhbHVlSW5mb1Byb3RvLnR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3IudHlwZT1oLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50eXBlKX1yZXR1cm4gZS5kb2NTdHJpbmchPW51bGwmJihyLmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxyfSx0LnRvT2JqZWN0PWZ1bmN0aW9uKGUscil7cnx8KHI9e30pO3ZhciBuPXt9O3JldHVybiByLmRlZmF1bHRzJiYobi5uYW1lPSIiLG4udHlwZT1udWxsLG4uZG9jU3RyaW5nPSIiKSxlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUudHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpJiYobi50eXBlPWgub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50eXBlLHIpKSxlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbn0sdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxnZS51dGlsLnRvSlNPTk9wdGlvbnMpfSx0LmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVmFsdWVJbmZvUHJvdG8ifSx0fSgpLGEuTm9kZVByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXtpZih0aGlzLmlucHV0PVtdLHRoaXMub3V0cHV0PVtdLHRoaXMuYXR0cmlidXRlPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUuaW5wdXQ9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLm91dHB1dD1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUubmFtZT0iIix0LnByb3RvdHlwZS5vcFR5cGU9IiIsdC5wcm90b3R5cGUuZG9tYWluPSIiLHQucHJvdG90eXBlLmF0dHJpYnV0ZT1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdC5lbmNvZGU9ZnVuY3Rpb24oZSxyKXtpZihyfHwocj1QZS5jcmVhdGUoKSksZS5pbnB1dCE9bnVsbCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pci51aW50MzIoMTApLnN0cmluZyhlLmlucHV0W25dKTtpZihlLm91dHB1dCE9bnVsbCYmZS5vdXRwdXQubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbilyLnVpbnQzMigxOCkuc3RyaW5nKGUub3V0cHV0W25dKTtpZihlLm5hbWUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmci51aW50MzIoMjYpLnN0cmluZyhlLm5hbWUpLGUub3BUeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJvcFR5cGUiKSYmci51aW50MzIoMzQpLnN0cmluZyhlLm9wVHlwZSksZS5hdHRyaWJ1dGUhPW51bGwmJmUuYXR0cmlidXRlLmxlbmd0aClmb3IodmFyIG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24paC5vbm54LkF0dHJpYnV0ZVByb3RvLmVuY29kZShlLmF0dHJpYnV0ZVtuXSxyLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZS5kb2NTdHJpbmchPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZyLnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxlLmRvbWFpbiE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnIudWludDMyKDU4KS5zdHJpbmcoZS5kb21haW4pLHJ9LHQuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUscil7cmV0dXJuIHRoaXMuZW5jb2RlKGUscikubGRlbGltKCl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUscil7ZSBpbnN0YW5jZW9mIE58fChlPU4uY3JlYXRlKGUpKTtmb3IodmFyIG49cj09PXZvaWQgMD9lLmxlbjplLnBvcytyLHM9bmV3IGgub25ueC5Ob2RlUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e3MuaW5wdXQmJnMuaW5wdXQubGVuZ3RofHwocy5pbnB1dD1bXSkscy5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrfWNhc2UgMjp7cy5vdXRwdXQmJnMub3V0cHV0Lmxlbmd0aHx8KHMub3V0cHV0PVtdKSxzLm91dHB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrfWNhc2UgMzp7cy5uYW1lPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSA0OntzLm9wVHlwZT1lLnN0cmluZygpO2JyZWFrfWNhc2UgNzp7cy5kb21haW49ZS5zdHJpbmcoKTticmVha31jYXNlIDU6e3MuYXR0cmlidXRlJiZzLmF0dHJpYnV0ZS5sZW5ndGh8fChzLmF0dHJpYnV0ZT1bXSkscy5hdHRyaWJ1dGUucHVzaChoLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWNhc2UgNjp7cy5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVha31kZWZhdWx0OmUuc2tpcFR5cGUoaSY3KTticmVha319cmV0dXJuIHN9LHQuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnx8KGU9bmV3IE4oZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LHQudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5pbnB1dCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5wdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpcmV0dXJuImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmlucHV0Lmxlbmd0aDsrK3IpaWYoIWcuaXNTdHJpbmcoZS5pbnB1dFtyXSkpcmV0dXJuImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYoZS5vdXRwdXQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5vdXRwdXQubGVuZ3RoOysrcilpZighZy5pc1N0cmluZyhlLm91dHB1dFtyXSkpcmV0dXJuIm91dHB1dDogc3RyaW5nW10gZXhwZWN0ZWQifWlmKGUubmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhZy5pc1N0cmluZyhlLm5hbWUpKXJldHVybiJuYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUub3BUeXBlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJvcFR5cGUiKSYmIWcuaXNTdHJpbmcoZS5vcFR5cGUpKXJldHVybiJvcFR5cGU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhZy5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuImRvbWFpbjogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmF0dHJpYnV0ZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiYXR0cmlidXRlIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlKSlyZXR1cm4iYXR0cmlidXRlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguQXR0cmlidXRlUHJvdG8udmVyaWZ5KGUuYXR0cmlidXRlW3JdKTtpZihuKXJldHVybiJhdHRyaWJ1dGUuIitufX1yZXR1cm4gZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhZy5pc1N0cmluZyhlLmRvY1N0cmluZyk/ImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5Ob2RlUHJvdG8pcmV0dXJuIGU7dmFyIHI9bmV3IGgub25ueC5Ob2RlUHJvdG87aWYoZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7ci5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbilyLmlucHV0W25dPVN0cmluZyhlLmlucHV0W25dKX1pZihlLm91dHB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtyLm91dHB1dD1bXTtmb3IodmFyIG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pci5vdXRwdXRbbl09U3RyaW5nKGUub3V0cHV0W25dKX1pZihlLm5hbWUhPW51bGwmJihyLm5hbWU9U3RyaW5nKGUubmFtZSkpLGUub3BUeXBlIT1udWxsJiYoci5vcFR5cGU9U3RyaW5nKGUub3BUeXBlKSksZS5kb21haW4hPW51bGwmJihyLmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtyLmF0dHJpYnV0ZT1bXTtmb3IodmFyIG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLmF0dHJpYnV0ZVtuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Ob2RlUHJvdG8uYXR0cmlidXRlOiBvYmplY3QgZXhwZWN0ZWQiKTtyLmF0dHJpYnV0ZVtuXT1oLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVtuXSl9fXJldHVybiBlLmRvY1N0cmluZyE9bnVsbCYmKHIuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLHJ9LHQudG9PYmplY3Q9ZnVuY3Rpb24oZSxyKXtyfHwocj17fSk7dmFyIG49e307aWYoKHIuYXJyYXlzfHxyLmRlZmF1bHRzKSYmKG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi5hdHRyaWJ1dGU9W10pLHIuZGVmYXVsdHMmJihuLm5hbWU9IiIsbi5vcFR5cGU9IiIsbi5kb2NTdHJpbmc9IiIsbi5kb21haW49IiIpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcz0wO3M8ZS5pbnB1dC5sZW5ndGg7KytzKW4uaW5wdXRbc109ZS5pbnB1dFtzXX1pZihlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKXtuLm91dHB1dD1bXTtmb3IodmFyIHM9MDtzPGUub3V0cHV0Lmxlbmd0aDsrK3Mpbi5vdXRwdXRbc109ZS5vdXRwdXRbc119aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxlLm9wVHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BUeXBlIikmJihuLm9wVHlwZT1lLm9wVHlwZSksZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aCl7bi5hdHRyaWJ1dGU9W107Zm9yKHZhciBzPTA7czxlLmF0dHJpYnV0ZS5sZW5ndGg7KytzKW4uYXR0cmlidXRlW3NdPWgub25ueC5BdHRyaWJ1dGVQcm90by50b09iamVjdChlLmF0dHJpYnV0ZVtzXSxyKX1yZXR1cm4gZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUuZG9tYWluIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxufSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LHQuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Ob2RlUHJvdG8ifSx0fSgpLGEuVHJhaW5pbmdJbmZvUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe2lmKHRoaXMuaW5pdGlhbGl6YXRpb25CaW5kaW5nPVtdLHRoaXMudXBkYXRlQmluZGluZz1bXSxvKWZvcih2YXIgZT1PYmplY3Qua2V5cyhvKSxyPTA7cjxlLmxlbmd0aDsrK3Ipb1tlW3JdXSE9bnVsbCYmKHRoaXNbZVtyXV09b1tlW3JdXSl9cmV0dXJuIHQucHJvdG90eXBlLmluaXRpYWxpemF0aW9uPW51bGwsdC5wcm90b3R5cGUuYWxnb3JpdGhtPW51bGwsdC5wcm90b3R5cGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS51cGRhdGVCaW5kaW5nPWcuZW1wdHlBcnJheSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7aWYocnx8KHI9UGUuY3JlYXRlKCkpLGUuaW5pdGlhbGl6YXRpb24hPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImluaXRpYWxpemF0aW9uIikmJmgub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uLHIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLGUuYWxnb3JpdGhtIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJhbGdvcml0aG0iKSYmaC5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuYWxnb3JpdGhtLHIudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nIT1udWxsJiZlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKWgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLmluaXRpYWxpemF0aW9uQmluZGluZ1tuXSxyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtpZihlLnVwZGF0ZUJpbmRpbmchPW51bGwmJmUudXBkYXRlQmluZGluZy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrbiloLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5lbmNvZGUoZS51cGRhdGVCaW5kaW5nW25dLHIudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiByfSx0LmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHIpe3JldHVybiB0aGlzLmVuY29kZShlLHIpLmxkZWxpbSgpfSx0LmRlY29kZT1mdW5jdGlvbihlLHIpe2UgaW5zdGFuY2VvZiBOfHwoZT1OLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXI9PT12b2lkIDA/ZS5sZW46ZS5wb3MrcixzPW5ldyBoLm9ubnguVHJhaW5pbmdJbmZvUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e3MuaW5pdGlhbGl6YXRpb249aC5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSAyOntzLmFsZ29yaXRobT1oLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVha31jYXNlIDM6e3MuaW5pdGlhbGl6YXRpb25CaW5kaW5nJiZzLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGh8fChzLmluaXRpYWxpemF0aW9uQmluZGluZz1bXSkscy5pbml0aWFsaXphdGlvbkJpbmRpbmcucHVzaChoLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSA0OntzLnVwZGF0ZUJpbmRpbmcmJnMudXBkYXRlQmluZGluZy5sZW5ndGh8fChzLnVwZGF0ZUJpbmRpbmc9W10pLHMudXBkYXRlQmluZGluZy5wdXNoKGgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31kZWZhdWx0OmUuc2tpcFR5cGUoaSY3KTticmVha319cmV0dXJuIHN9LHQuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnx8KGU9bmV3IE4oZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LHQudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5pbml0aWFsaXphdGlvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb24iKSl7dmFyIHI9aC5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6YXRpb24pO2lmKHIpcmV0dXJuImluaXRpYWxpemF0aW9uLiIrcn1pZihlLmFsZ29yaXRobSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiYWxnb3JpdGhtIikpe3ZhciByPWgub25ueC5HcmFwaFByb3RvLnZlcmlmeShlLmFsZ29yaXRobSk7aWYocilyZXR1cm4iYWxnb3JpdGhtLiIrcn1pZihlLmluaXRpYWxpemF0aW9uQmluZGluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6YXRpb25CaW5kaW5nIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKSlyZXR1cm4iaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKXt2YXIgcj1oLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0pO2lmKHIpcmV0dXJuImluaXRpYWxpemF0aW9uQmluZGluZy4iK3J9fWlmKGUudXBkYXRlQmluZGluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidXBkYXRlQmluZGluZyIpKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXJldHVybiJ1cGRhdGVCaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrbil7dmFyIHI9aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udmVyaWZ5KGUudXBkYXRlQmluZGluZ1tuXSk7aWYocilyZXR1cm4idXBkYXRlQmluZGluZy4iK3J9fXJldHVybiBudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5UcmFpbmluZ0luZm9Qcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LlRyYWluaW5nSW5mb1Byb3RvO2lmKGUuaW5pdGlhbGl6YXRpb24hPW51bGwpe2lmKHR5cGVvZiBlLmluaXRpYWxpemF0aW9uIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmluaXRpYWxpemF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTtyLmluaXRpYWxpemF0aW9uPWgub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXphdGlvbil9aWYoZS5hbGdvcml0aG0hPW51bGwpe2lmKHR5cGVvZiBlLmFsZ29yaXRobSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5hbGdvcml0aG06IG9iamVjdCBleHBlY3RlZCIpO3IuYWxnb3JpdGhtPWgub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5hbGdvcml0aG0pfWlmKGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemF0aW9uQmluZGluZykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbkJpbmRpbmc6IGFycmF5IGV4cGVjdGVkIik7ci5pbml0aWFsaXphdGlvbkJpbmRpbmc9W107Zm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTtyLmluaXRpYWxpemF0aW9uQmluZGluZ1tuXT1oLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dKX19aWYoZS51cGRhdGVCaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udXBkYXRlQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiKTtyLnVwZGF0ZUJpbmRpbmc9W107Zm9yKHZhciBuPTA7bjxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrbil7aWYodHlwZW9mIGUudXBkYXRlQmluZGluZ1tuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by51cGRhdGVCaW5kaW5nOiBvYmplY3QgZXhwZWN0ZWQiKTtyLnVwZGF0ZUJpbmRpbmdbbl09aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLnVwZGF0ZUJpbmRpbmdbbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10sbi51cGRhdGVCaW5kaW5nPVtdKSxyLmRlZmF1bHRzJiYobi5pbml0aWFsaXphdGlvbj1udWxsLG4uYWxnb3JpdGhtPW51bGwpLGUuaW5pdGlhbGl6YXRpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImluaXRpYWxpemF0aW9uIikmJihuLmluaXRpYWxpemF0aW9uPWgub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6YXRpb24scikpLGUuYWxnb3JpdGhtIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJhbGdvcml0aG0iKSYmKG4uYWxnb3JpdGhtPWgub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuYWxnb3JpdGhtLHIpKSxlLmluaXRpYWxpemF0aW9uQmluZGluZyYmZS5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RoKXtuLmluaXRpYWxpemF0aW9uQmluZGluZz1bXTtmb3IodmFyIHM9MDtzPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK3Mpbi5pbml0aWFsaXphdGlvbkJpbmRpbmdbc109aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbc10scil9aWYoZS51cGRhdGVCaW5kaW5nJiZlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoKXtuLnVwZGF0ZUJpbmRpbmc9W107Zm9yKHZhciBzPTA7czxlLnVwZGF0ZUJpbmRpbmcubGVuZ3RoOysrcyluLnVwZGF0ZUJpbmRpbmdbc109aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS51cGRhdGVCaW5kaW5nW3NdLHIpfXJldHVybiBufSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LHQuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UcmFpbmluZ0luZm9Qcm90byJ9LHR9KCksYS5Nb2RlbFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXtpZih0aGlzLm9wc2V0SW1wb3J0PVtdLHRoaXMubWV0YWRhdGFQcm9wcz1bXSx0aGlzLnRyYWluaW5nSW5mbz1bXSx0aGlzLmZ1bmN0aW9ucz1bXSxvKWZvcih2YXIgZT1PYmplY3Qua2V5cyhvKSxyPTA7cjxlLmxlbmd0aDsrK3Ipb1tlW3JdXSE9bnVsbCYmKHRoaXNbZVtyXV09b1tlW3JdXSl9cmV0dXJuIHQucHJvdG90eXBlLmlyVmVyc2lvbj1nLkxvbmc/Zy5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCx0LnByb3RvdHlwZS5vcHNldEltcG9ydD1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUucHJvZHVjZXJOYW1lPSIiLHQucHJvdG90eXBlLnByb2R1Y2VyVmVyc2lvbj0iIix0LnByb3RvdHlwZS5kb21haW49IiIsdC5wcm90b3R5cGUubW9kZWxWZXJzaW9uPWcuTG9uZz9nLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLHQucHJvdG90eXBlLmRvY1N0cmluZz0iIix0LnByb3RvdHlwZS5ncmFwaD1udWxsLHQucHJvdG90eXBlLm1ldGFkYXRhUHJvcHM9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLnRyYWluaW5nSW5mbz1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUuZnVuY3Rpb25zPWcuZW1wdHlBcnJheSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7aWYocnx8KHI9UGUuY3JlYXRlKCkpLGUuaXJWZXJzaW9uIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJpclZlcnNpb24iKSYmci51aW50MzIoOCkuaW50NjQoZS5pclZlcnNpb24pLGUucHJvZHVjZXJOYW1lIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJwcm9kdWNlck5hbWUiKSYmci51aW50MzIoMTgpLnN0cmluZyhlLnByb2R1Y2VyTmFtZSksZS5wcm9kdWNlclZlcnNpb24hPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInByb2R1Y2VyVmVyc2lvbiIpJiZyLnVpbnQzMigyNikuc3RyaW5nKGUucHJvZHVjZXJWZXJzaW9uKSxlLmRvbWFpbiE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnIudWludDMyKDM0KS5zdHJpbmcoZS5kb21haW4pLGUubW9kZWxWZXJzaW9uIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJtb2RlbFZlcnNpb24iKSYmci51aW50MzIoNDApLmludDY0KGUubW9kZWxWZXJzaW9uKSxlLmRvY1N0cmluZyE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnIudWludDMyKDUwKS5zdHJpbmcoZS5kb2NTdHJpbmcpLGUuZ3JhcGghPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImdyYXBoIikmJmgub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmdyYXBoLHIudWludDMyKDU4KS5mb3JrKCkpLmxkZWxpbSgpLGUub3BzZXRJbXBvcnQhPW51bGwmJmUub3BzZXRJbXBvcnQubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKWgub25ueC5PcGVyYXRvclNldElkUHJvdG8uZW5jb2RlKGUub3BzZXRJbXBvcnRbbl0sci51aW50MzIoNjYpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5tZXRhZGF0YVByb3BzIT1udWxsJiZlLm1ldGFkYXRhUHJvcHMubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK24paC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUubWV0YWRhdGFQcm9wc1tuXSxyLnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYoZS50cmFpbmluZ0luZm8hPW51bGwmJmUudHJhaW5pbmdJbmZvLmxlbmd0aClmb3IodmFyIG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24paC5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmVuY29kZShlLnRyYWluaW5nSW5mb1tuXSxyLnVpbnQzMigxNjIpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5mdW5jdGlvbnMhPW51bGwmJmUuZnVuY3Rpb25zLmxlbmd0aClmb3IodmFyIG49MDtuPGUuZnVuY3Rpb25zLmxlbmd0aDsrK24paC5vbm54LkZ1bmN0aW9uUHJvdG8uZW5jb2RlKGUuZnVuY3Rpb25zW25dLHIudWludDMyKDIwMikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gcn0sdC5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdGhpcy5lbmNvZGUoZSxyKS5sZGVsaW0oKX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSxyKXtlIGluc3RhbmNlb2YgTnx8KGU9Ti5jcmVhdGUoZSkpO2Zvcih2YXIgbj1yPT09dm9pZCAwP2UubGVuOmUucG9zK3Iscz1uZXcgaC5vbm54Lk1vZGVsUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e3MuaXJWZXJzaW9uPWUuaW50NjQoKTticmVha31jYXNlIDg6e3Mub3BzZXRJbXBvcnQmJnMub3BzZXRJbXBvcnQubGVuZ3RofHwocy5vcHNldEltcG9ydD1bXSkscy5vcHNldEltcG9ydC5wdXNoKGgub25ueC5PcGVyYXRvclNldElkUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWNhc2UgMjp7cy5wcm9kdWNlck5hbWU9ZS5zdHJpbmcoKTticmVha31jYXNlIDM6e3MucHJvZHVjZXJWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSA0OntzLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrfWNhc2UgNTp7cy5tb2RlbFZlcnNpb249ZS5pbnQ2NCgpO2JyZWFrfWNhc2UgNjp7cy5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVha31jYXNlIDc6e3MuZ3JhcGg9aC5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSAxNDp7cy5tZXRhZGF0YVByb3BzJiZzLm1ldGFkYXRhUHJvcHMubGVuZ3RofHwocy5tZXRhZGF0YVByb3BzPVtdKSxzLm1ldGFkYXRhUHJvcHMucHVzaChoLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAyMDp7cy50cmFpbmluZ0luZm8mJnMudHJhaW5pbmdJbmZvLmxlbmd0aHx8KHMudHJhaW5pbmdJbmZvPVtdKSxzLnRyYWluaW5nSW5mby5wdXNoKGgub25ueC5UcmFpbmluZ0luZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAyNTp7cy5mdW5jdGlvbnMmJnMuZnVuY3Rpb25zLmxlbmd0aHx8KHMuZnVuY3Rpb25zPVtdKSxzLmZ1bmN0aW9ucy5wdXNoKGgub25ueC5GdW5jdGlvblByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31kZWZhdWx0OmUuc2tpcFR5cGUoaSY3KTticmVha319cmV0dXJuIHN9LHQuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnx8KGU9bmV3IE4oZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LHQudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5pclZlcnNpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImlyVmVyc2lvbiIpJiYhZy5pc0ludGVnZXIoZS5pclZlcnNpb24pJiYhKGUuaXJWZXJzaW9uJiZnLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5sb3cpJiZnLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5oaWdoKSkpcmV0dXJuImlyVmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihlLm9wc2V0SW1wb3J0IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJvcHNldEltcG9ydCIpKXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSlyZXR1cm4ib3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrcil7dmFyIG49aC5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by52ZXJpZnkoZS5vcHNldEltcG9ydFtyXSk7aWYobilyZXR1cm4ib3BzZXRJbXBvcnQuIitufX1pZihlLnByb2R1Y2VyTmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJOYW1lIikmJiFnLmlzU3RyaW5nKGUucHJvZHVjZXJOYW1lKSlyZXR1cm4icHJvZHVjZXJOYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUucHJvZHVjZXJWZXJzaW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJwcm9kdWNlclZlcnNpb24iKSYmIWcuaXNTdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKXJldHVybiJwcm9kdWNlclZlcnNpb246IHN0cmluZyBleHBlY3RlZCI7aWYoZS5kb21haW4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhZy5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuImRvbWFpbjogc3RyaW5nIGV4cGVjdGVkIjtpZihlLm1vZGVsVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibW9kZWxWZXJzaW9uIikmJiFnLmlzSW50ZWdlcihlLm1vZGVsVmVyc2lvbikmJiEoZS5tb2RlbFZlcnNpb24mJmcuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmxvdykmJmcuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmhpZ2gpKSlyZXR1cm4ibW9kZWxWZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiO2lmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWcuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5ncmFwaCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSl7dmFyIG49aC5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZ3JhcGgpO2lmKG4pcmV0dXJuImdyYXBoLiIrbn1pZihlLm1ldGFkYXRhUHJvcHMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm1ldGFkYXRhUHJvcHMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSlyZXR1cm4ibWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK3Ipe3ZhciBuPWgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLm1ldGFkYXRhUHJvcHNbcl0pO2lmKG4pcmV0dXJuIm1ldGFkYXRhUHJvcHMuIitufX1pZihlLnRyYWluaW5nSW5mbyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidHJhaW5pbmdJbmZvIikpe2lmKCFBcnJheS5pc0FycmF5KGUudHJhaW5pbmdJbmZvKSlyZXR1cm4idHJhaW5pbmdJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLnRyYWluaW5nSW5mby5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udmVyaWZ5KGUudHJhaW5pbmdJbmZvW3JdKTtpZihuKXJldHVybiJ0cmFpbmluZ0luZm8uIitufX1pZihlLmZ1bmN0aW9ucyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZnVuY3Rpb25zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZnVuY3Rpb25zKSlyZXR1cm4iZnVuY3Rpb25zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguRnVuY3Rpb25Qcm90by52ZXJpZnkoZS5mdW5jdGlvbnNbcl0pO2lmKG4pcmV0dXJuImZ1bmN0aW9ucy4iK259fXJldHVybiBudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5Nb2RlbFByb3RvKXJldHVybiBlO3ZhciByPW5ldyBoLm9ubnguTW9kZWxQcm90bztpZihlLmlyVmVyc2lvbiE9bnVsbCYmKGcuTG9uZz8oci5pclZlcnNpb249Zy5Mb25nLmZyb21WYWx1ZShlLmlyVmVyc2lvbikpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmlyVmVyc2lvbj09InN0cmluZyI/ci5pclZlcnNpb249cGFyc2VJbnQoZS5pclZlcnNpb24sMTApOnR5cGVvZiBlLmlyVmVyc2lvbj09Im51bWJlciI/ci5pclZlcnNpb249ZS5pclZlcnNpb246dHlwZW9mIGUuaXJWZXJzaW9uPT0ib2JqZWN0IiYmKHIuaXJWZXJzaW9uPW5ldyBnLkxvbmdCaXRzKGUuaXJWZXJzaW9uLmxvdz4+PjAsZS5pclZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxlLm9wc2V0SW1wb3J0KXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ub3BzZXRJbXBvcnQ6IGFycmF5IGV4cGVjdGVkIik7ci5vcHNldEltcG9ydD1bXTtmb3IodmFyIG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbil7aWYodHlwZW9mIGUub3BzZXRJbXBvcnRbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5vcHNldEltcG9ydDogb2JqZWN0IGV4cGVjdGVkIik7ci5vcHNldEltcG9ydFtuXT1oLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmZyb21PYmplY3QoZS5vcHNldEltcG9ydFtuXSl9fWlmKGUucHJvZHVjZXJOYW1lIT1udWxsJiYoci5wcm9kdWNlck5hbWU9U3RyaW5nKGUucHJvZHVjZXJOYW1lKSksZS5wcm9kdWNlclZlcnNpb24hPW51bGwmJihyLnByb2R1Y2VyVmVyc2lvbj1TdHJpbmcoZS5wcm9kdWNlclZlcnNpb24pKSxlLmRvbWFpbiE9bnVsbCYmKHIuZG9tYWluPVN0cmluZyhlLmRvbWFpbikpLGUubW9kZWxWZXJzaW9uIT1udWxsJiYoZy5Mb25nPyhyLm1vZGVsVmVyc2lvbj1nLkxvbmcuZnJvbVZhbHVlKGUubW9kZWxWZXJzaW9uKSkudW5zaWduZWQ9ITE6dHlwZW9mIGUubW9kZWxWZXJzaW9uPT0ic3RyaW5nIj9yLm1vZGVsVmVyc2lvbj1wYXJzZUludChlLm1vZGVsVmVyc2lvbiwxMCk6dHlwZW9mIGUubW9kZWxWZXJzaW9uPT0ibnVtYmVyIj9yLm1vZGVsVmVyc2lvbj1lLm1vZGVsVmVyc2lvbjp0eXBlb2YgZS5tb2RlbFZlcnNpb249PSJvYmplY3QiJiYoci5tb2RlbFZlcnNpb249bmV3IGcuTG9uZ0JpdHMoZS5tb2RlbFZlcnNpb24ubG93Pj4+MCxlLm1vZGVsVmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLGUuZG9jU3RyaW5nIT1udWxsJiYoci5kb2NTdHJpbmc9U3RyaW5nKGUuZG9jU3RyaW5nKSksZS5ncmFwaCE9bnVsbCl7aWYodHlwZW9mIGUuZ3JhcGghPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5ncmFwaDogb2JqZWN0IGV4cGVjdGVkIik7ci5ncmFwaD1oLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuZ3JhcGgpfWlmKGUubWV0YWRhdGFQcm9wcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiKTtyLm1ldGFkYXRhUHJvcHM9W107Zm9yKHZhciBuPTA7bjxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrbil7aWYodHlwZW9mIGUubWV0YWRhdGFQcm9wc1tuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm1ldGFkYXRhUHJvcHM6IG9iamVjdCBleHBlY3RlZCIpO3IubWV0YWRhdGFQcm9wc1tuXT1oLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUubWV0YWRhdGFQcm9wc1tuXSl9fWlmKGUudHJhaW5pbmdJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnRyYWluaW5nSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtyLnRyYWluaW5nSW5mbz1bXTtmb3IodmFyIG49MDtuPGUudHJhaW5pbmdJbmZvLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnRyYWluaW5nSW5mb1tuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7ci50cmFpbmluZ0luZm9bbl09aC5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmZyb21PYmplY3QoZS50cmFpbmluZ0luZm9bbl0pfX1pZihlLmZ1bmN0aW9ucyl7aWYoIUFycmF5LmlzQXJyYXkoZS5mdW5jdGlvbnMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IGFycmF5IGV4cGVjdGVkIik7ci5mdW5jdGlvbnM9W107Zm9yKHZhciBuPTA7bjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5mdW5jdGlvbnNbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IG9iamVjdCBleHBlY3RlZCIpO3IuZnVuY3Rpb25zW25dPWgub25ueC5GdW5jdGlvblByb3RvLmZyb21PYmplY3QoZS5mdW5jdGlvbnNbbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5vcHNldEltcG9ydD1bXSxuLm1ldGFkYXRhUHJvcHM9W10sbi50cmFpbmluZ0luZm89W10sbi5mdW5jdGlvbnM9W10pLHIuZGVmYXVsdHMpe2lmKGcuTG9uZyl7dmFyIHM9bmV3IGcuTG9uZygwLDAsITEpO24uaXJWZXJzaW9uPXIubG9uZ3M9PT1TdHJpbmc/cy50b1N0cmluZygpOnIubG9uZ3M9PT1OdW1iZXI/cy50b051bWJlcigpOnN9ZWxzZSBuLmlyVmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nPyIwIjowO2lmKG4ucHJvZHVjZXJOYW1lPSIiLG4ucHJvZHVjZXJWZXJzaW9uPSIiLG4uZG9tYWluPSIiLGcuTG9uZyl7dmFyIHM9bmV3IGcuTG9uZygwLDAsITEpO24ubW9kZWxWZXJzaW9uPXIubG9uZ3M9PT1TdHJpbmc/cy50b1N0cmluZygpOnIubG9uZ3M9PT1OdW1iZXI/cy50b051bWJlcigpOnN9ZWxzZSBuLm1vZGVsVmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nPyIwIjowO24uZG9jU3RyaW5nPSIiLG4uZ3JhcGg9bnVsbH1pZihlLmlyVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJih0eXBlb2YgZS5pclZlcnNpb249PSJudW1iZXIiP24uaXJWZXJzaW9uPXIubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaXJWZXJzaW9uKTplLmlyVmVyc2lvbjpuLmlyVmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nP2cuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmlyVmVyc2lvbik6ci5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhlLmlyVmVyc2lvbi5sb3c+Pj4wLGUuaXJWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaXJWZXJzaW9uKSxlLnByb2R1Y2VyTmFtZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJOYW1lIikmJihuLnByb2R1Y2VyTmFtZT1lLnByb2R1Y2VyTmFtZSksZS5wcm9kdWNlclZlcnNpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYobi5wcm9kdWNlclZlcnNpb249ZS5wcm9kdWNlclZlcnNpb24pLGUuZG9tYWluIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxlLm1vZGVsVmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibW9kZWxWZXJzaW9uIikmJih0eXBlb2YgZS5tb2RlbFZlcnNpb249PSJudW1iZXIiP24ubW9kZWxWZXJzaW9uPXIubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUubW9kZWxWZXJzaW9uKTplLm1vZGVsVmVyc2lvbjpuLm1vZGVsVmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nP2cuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLm1vZGVsVmVyc2lvbik6ci5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhlLm1vZGVsVmVyc2lvbi5sb3c+Pj4wLGUubW9kZWxWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUubW9kZWxWZXJzaW9uKSxlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5ncmFwaCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSYmKG4uZ3JhcGg9aC5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaCxyKSksZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpe24ub3BzZXRJbXBvcnQ9W107Zm9yKHZhciBpPTA7aTxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK2kpbi5vcHNldEltcG9ydFtpXT1oLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnRvT2JqZWN0KGUub3BzZXRJbXBvcnRbaV0scil9aWYoZS5tZXRhZGF0YVByb3BzJiZlLm1ldGFkYXRhUHJvcHMubGVuZ3RoKXtuLm1ldGFkYXRhUHJvcHM9W107Zm9yKHZhciBpPTA7aTxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysraSluLm1ldGFkYXRhUHJvcHNbaV09aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5tZXRhZGF0YVByb3BzW2ldLHIpfWlmKGUudHJhaW5pbmdJbmZvJiZlLnRyYWluaW5nSW5mby5sZW5ndGgpe24udHJhaW5pbmdJbmZvPVtdO2Zvcih2YXIgaT0wO2k8ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysraSluLnRyYWluaW5nSW5mb1tpXT1oLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udG9PYmplY3QoZS50cmFpbmluZ0luZm9baV0scil9aWYoZS5mdW5jdGlvbnMmJmUuZnVuY3Rpb25zLmxlbmd0aCl7bi5mdW5jdGlvbnM9W107Zm9yKHZhciBpPTA7aTxlLmZ1bmN0aW9ucy5sZW5ndGg7KytpKW4uZnVuY3Rpb25zW2ldPWgub25ueC5GdW5jdGlvblByb3RvLnRvT2JqZWN0KGUuZnVuY3Rpb25zW2ldLHIpfXJldHVybiBufSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LHQuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Nb2RlbFByb3RvIn0sdH0oKSxhLlN0cmluZ1N0cmluZ0VudHJ5UHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe2lmKG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUua2V5PSIiLHQucHJvdG90eXBlLnZhbHVlPSIiLHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdC5lbmNvZGU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcnx8KHI9UGUuY3JlYXRlKCkpLGUua2V5IT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJrZXkiKSYmci51aW50MzIoMTApLnN0cmluZyhlLmtleSksZS52YWx1ZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmFsdWUiKSYmci51aW50MzIoMTgpLnN0cmluZyhlLnZhbHVlKSxyfSx0LmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHIpe3JldHVybiB0aGlzLmVuY29kZShlLHIpLmxkZWxpbSgpfSx0LmRlY29kZT1mdW5jdGlvbihlLHIpe2UgaW5zdGFuY2VvZiBOfHwoZT1OLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXI9PT12b2lkIDA/ZS5sZW46ZS5wb3MrcixzPW5ldyBoLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90bztlLnBvczxuOyl7dmFyIGk9ZS51aW50MzIoKTtzd2l0Y2goaT4+PjMpe2Nhc2UgMTp7cy5rZXk9ZS5zdHJpbmcoKTticmVha31jYXNlIDI6e3MudmFsdWU9ZS5zdHJpbmcoKTticmVha31kZWZhdWx0OmUuc2tpcFR5cGUoaSY3KTticmVha319cmV0dXJuIHN9LHQuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnx8KGU9bmV3IE4oZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LHQudmVyaWZ5PWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsPyJvYmplY3QgZXhwZWN0ZWQiOmUua2V5IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmIWcuaXNTdHJpbmcoZS5rZXkpPyJrZXk6IHN0cmluZyBleHBlY3RlZCI6ZS52YWx1ZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSYmIWcuaXNTdHJpbmcoZS52YWx1ZSk/InZhbHVlOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgaC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8pcmV0dXJuIGU7dmFyIHI9bmV3IGgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvO3JldHVybiBlLmtleSE9bnVsbCYmKHIua2V5PVN0cmluZyhlLmtleSkpLGUudmFsdWUhPW51bGwmJihyLnZhbHVlPVN0cmluZyhlLnZhbHVlKSkscn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtyZXR1cm4gci5kZWZhdWx0cyYmKG4ua2V5PSIiLG4udmFsdWU9IiIpLGUua2V5IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJrZXkiKSYmKG4ua2V5PWUua2V5KSxlLnZhbHVlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYobi52YWx1ZT1lLnZhbHVlKSxufSx0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LHQuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvIn0sdH0oKSxhLlRlbnNvckFubm90YXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe2lmKHRoaXMucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSxvKWZvcih2YXIgZT1PYmplY3Qua2V5cyhvKSxyPTA7cjxlLmxlbmd0aDsrK3Ipb1tlW3JdXSE9bnVsbCYmKHRoaXNbZVtyXV09b1tlW3JdXSl9cmV0dXJuIHQucHJvdG90eXBlLnRlbnNvck5hbWU9IiIsdC5wcm90b3R5cGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1nLmVtcHR5QXJyYXksdC5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUpfSx0LmVuY29kZT1mdW5jdGlvbihlLHIpe2lmKHJ8fChyPVBlLmNyZWF0ZSgpKSxlLnRlbnNvck5hbWUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInRlbnNvck5hbWUiKSYmci51aW50MzIoMTApLnN0cmluZyhlLnRlbnNvck5hbWUpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyE9bnVsbCYmZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aClmb3IodmFyIG49MDtuPGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGg7KytuKWgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmVuY29kZShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl0sci51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHJ9LHQuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUscil7cmV0dXJuIHRoaXMuZW5jb2RlKGUscikubGRlbGltKCl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUscil7ZSBpbnN0YW5jZW9mIE58fChlPU4uY3JlYXRlKGUpKTtmb3IodmFyIG49cj09PXZvaWQgMD9lLmxlbjplLnBvcytyLHM9bmV3IGgub25ueC5UZW5zb3JBbm5vdGF0aW9uO2UucG9zPG47KXt2YXIgaT1lLnVpbnQzMigpO3N3aXRjaChpPj4+Myl7Y2FzZSAxOntzLnRlbnNvck5hbWU9ZS5zdHJpbmcoKTticmVha31jYXNlIDI6e3MucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmcy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aHx8KHMucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXSkscy5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLnB1c2goaC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWRlZmF1bHQ6ZS5za2lwVHlwZShpJjcpO2JyZWFrfX1yZXR1cm4gc30sdC5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOfHwoZT1uZXcgTihlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sdC52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLnRlbnNvck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmIWcuaXNTdHJpbmcoZS50ZW5zb3JOYW1lKSlyZXR1cm4idGVuc29yTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKSlyZXR1cm4icXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Ipe3ZhciBuPWgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbcl0pO2lmKG4pcmV0dXJuInF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMuIitufX1yZXR1cm4gbnVsbH0sdC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBoLm9ubnguVGVuc29yQW5ub3RhdGlvbilyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LlRlbnNvckFubm90YXRpb247aWYoZS50ZW5zb3JOYW1lIT1udWxsJiYoci50ZW5zb3JOYW1lPVN0cmluZyhlLnRlbnNvck5hbWUpKSxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JBbm5vdGF0aW9uLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM6IGFycmF5IGV4cGVjdGVkIik7ci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgbj0wO248ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yQW5ub3RhdGlvbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzOiBvYmplY3QgZXhwZWN0ZWQiKTtyLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl09aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSxyLmRlZmF1bHRzJiYobi50ZW5zb3JOYW1lPSIiKSxlLnRlbnNvck5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvck5hbWUiKSYmKG4udGVuc29yTmFtZT1lLnRlbnNvck5hbWUpLGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aCl7bi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdO2Zvcih2YXIgcz0wO3M8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Mpbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3NdPWgub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnRvT2JqZWN0KGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tzXSxyKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxnZS51dGlsLnRvSlNPTk9wdGlvbnMpfSx0LmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yQW5ub3RhdGlvbiJ9LHR9KCksYS5HcmFwaFByb3RvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXtpZih0aGlzLm5vZGU9W10sdGhpcy5pbml0aWFsaXplcj1bXSx0aGlzLnNwYXJzZUluaXRpYWxpemVyPVtdLHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy52YWx1ZUluZm89W10sdGhpcy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUubm9kZT1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUubmFtZT0iIix0LnByb3RvdHlwZS5pbml0aWFsaXplcj1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUuc3BhcnNlSW5pdGlhbGl6ZXI9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmRvY1N0cmluZz0iIix0LnByb3RvdHlwZS5pbnB1dD1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUub3V0cHV0PWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS52YWx1ZUluZm89Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLnF1YW50aXphdGlvbkFubm90YXRpb249Zy5lbXB0eUFycmF5LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdC5lbmNvZGU9ZnVuY3Rpb24oZSxyKXtpZihyfHwocj1QZS5jcmVhdGUoKSksZS5ub2RlIT1udWxsJiZlLm5vZGUubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5ub2RlLmxlbmd0aDsrK24paC5vbm54Lk5vZGVQcm90by5lbmNvZGUoZS5ub2RlW25dLHIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUubmFtZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZyLnVpbnQzMigxOCkuc3RyaW5nKGUubmFtZSksZS5pbml0aWFsaXplciE9bnVsbCYmZS5pbml0aWFsaXplci5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmluaXRpYWxpemVyLmxlbmd0aDsrK24paC5vbm54LlRlbnNvclByb3RvLmVuY29kZShlLmluaXRpYWxpemVyW25dLHIudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUuZG9jU3RyaW5nIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmci51aW50MzIoODIpLnN0cmluZyhlLmRvY1N0cmluZyksZS5pbnB1dCE9bnVsbCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24paC5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLmlucHV0W25dLHIudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUub3V0cHV0IT1udWxsJiZlLm91dHB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKWgub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS5vdXRwdXRbbl0sci51aW50MzIoOTgpLmZvcmsoKSkubGRlbGltKCk7aWYoZS52YWx1ZUluZm8hPW51bGwmJmUudmFsdWVJbmZvLmxlbmd0aClmb3IodmFyIG49MDtuPGUudmFsdWVJbmZvLmxlbmd0aDsrK24paC5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLnZhbHVlSW5mb1tuXSxyLnVpbnQzMigxMDYpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uIT1udWxsJiZlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24paC5vbm54LlRlbnNvckFubm90YXRpb24uZW5jb2RlKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXSxyLnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5zcGFyc2VJbml0aWFsaXplciE9bnVsbCYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK24paC5vbm54LlNwYXJzZVRlbnNvclByb3RvLmVuY29kZShlLnNwYXJzZUluaXRpYWxpemVyW25dLHIudWludDMyKDEyMikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gcn0sdC5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdGhpcy5lbmNvZGUoZSxyKS5sZGVsaW0oKX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSxyKXtlIGluc3RhbmNlb2YgTnx8KGU9Ti5jcmVhdGUoZSkpO2Zvcih2YXIgbj1yPT09dm9pZCAwP2UubGVuOmUucG9zK3Iscz1uZXcgaC5vbm54LkdyYXBoUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e3Mubm9kZSYmcy5ub2RlLmxlbmd0aHx8KHMubm9kZT1bXSkscy5ub2RlLnB1c2goaC5vbm54Lk5vZGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAyOntzLm5hbWU9ZS5zdHJpbmcoKTticmVha31jYXNlIDU6e3MuaW5pdGlhbGl6ZXImJnMuaW5pdGlhbGl6ZXIubGVuZ3RofHwocy5pbml0aWFsaXplcj1bXSkscy5pbml0aWFsaXplci5wdXNoKGgub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAxNTp7cy5zcGFyc2VJbml0aWFsaXplciYmcy5zcGFyc2VJbml0aWFsaXplci5sZW5ndGh8fChzLnNwYXJzZUluaXRpYWxpemVyPVtdKSxzLnNwYXJzZUluaXRpYWxpemVyLnB1c2goaC5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31jYXNlIDEwOntzLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrfWNhc2UgMTE6e3MuaW5wdXQmJnMuaW5wdXQubGVuZ3RofHwocy5pbnB1dD1bXSkscy5pbnB1dC5wdXNoKGgub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAxMjp7cy5vdXRwdXQmJnMub3V0cHV0Lmxlbmd0aHx8KHMub3V0cHV0PVtdKSxzLm91dHB1dC5wdXNoKGgub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAxMzp7cy52YWx1ZUluZm8mJnMudmFsdWVJbmZvLmxlbmd0aHx8KHMudmFsdWVJbmZvPVtdKSxzLnZhbHVlSW5mby5wdXNoKGgub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9Y2FzZSAxNDp7cy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZzLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RofHwocy5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdKSxzLnF1YW50aXphdGlvbkFubm90YXRpb24ucHVzaChoLm9ubnguVGVuc29yQW5ub3RhdGlvbi5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWt9ZGVmYXVsdDplLnNraXBUeXBlKGkmNyk7YnJlYWt9fXJldHVybiBzfSx0LmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE58fChlPW5ldyBOKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSx0LnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUubm9kZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgibm9kZSIpKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXJldHVybiJub2RlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLm5vZGUubGVuZ3RoOysrcil7dmFyIG49aC5vbm54Lk5vZGVQcm90by52ZXJpZnkoZS5ub2RlW3JdKTtpZihuKXJldHVybiJub2RlLiIrbn19aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFnLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5pbml0aWFsaXplciE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdGlhbGl6ZXIiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbml0aWFsaXplcikpcmV0dXJuImluaXRpYWxpemVyOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmluaXRpYWxpemVyLmxlbmd0aDsrK3Ipe3ZhciBuPWgub25ueC5UZW5zb3JQcm90by52ZXJpZnkoZS5pbml0aWFsaXplcltyXSk7aWYobilyZXR1cm4iaW5pdGlhbGl6ZXIuIitufX1pZihlLnNwYXJzZUluaXRpYWxpemVyIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VJbml0aWFsaXplciIpKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZUluaXRpYWxpemVyKSlyZXR1cm4ic3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrcil7dmFyIG49aC5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZUluaXRpYWxpemVyW3JdKTtpZihuKXJldHVybiJzcGFyc2VJbml0aWFsaXplci4iK259fWlmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWcuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5pbnB1dCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5wdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpcmV0dXJuImlucHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmlucHV0Lmxlbmd0aDsrK3Ipe3ZhciBuPWgub25ueC5WYWx1ZUluZm9Qcm90by52ZXJpZnkoZS5pbnB1dFtyXSk7aWYobilyZXR1cm4iaW5wdXQuIitufX1pZihlLm91dHB1dCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4ib3V0cHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLm91dHB1dC5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguVmFsdWVJbmZvUHJvdG8udmVyaWZ5KGUub3V0cHV0W3JdKTtpZihuKXJldHVybiJvdXRwdXQuIitufX1pZihlLnZhbHVlSW5mbyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWVJbmZvIikpe2lmKCFBcnJheS5pc0FycmF5KGUudmFsdWVJbmZvKSlyZXR1cm4idmFsdWVJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLnZhbHVlSW5mby5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguVmFsdWVJbmZvUHJvdG8udmVyaWZ5KGUudmFsdWVJbmZvW3JdKTtpZihuKXJldHVybiJ2YWx1ZUluZm8uIitufX1pZihlLnF1YW50aXphdGlvbkFubm90YXRpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInF1YW50aXphdGlvbkFubm90YXRpb24iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uKSlyZXR1cm4icXVhbnRpemF0aW9uQW5ub3RhdGlvbjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK3Ipe3ZhciBuPWgub25ueC5UZW5zb3JBbm5vdGF0aW9uLnZlcmlmeShlLnF1YW50aXphdGlvbkFubm90YXRpb25bcl0pO2lmKG4pcmV0dXJuInF1YW50aXphdGlvbkFubm90YXRpb24uIitufX1yZXR1cm4gbnVsbH0sdC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBoLm9ubnguR3JhcGhQcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LkdyYXBoUHJvdG87aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO3Iubm9kZT1bXTtmb3IodmFyIG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5ub2RlW25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7ci5ub2RlW25dPWgub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pfX1pZihlLm5hbWUhPW51bGwmJihyLm5hbWU9U3RyaW5nKGUubmFtZSkpLGUuaW5pdGlhbGl6ZXIpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6ZXIpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiKTtyLmluaXRpYWxpemVyPVtdO2Zvcih2YXIgbj0wO248ZS5pbml0aWFsaXplci5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5pbml0aWFsaXplcltuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTtyLmluaXRpYWxpemVyW25dPWgub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuaW5pdGlhbGl6ZXJbbl0pfX1pZihlLnNwYXJzZUluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZUluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uc3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7ci5zcGFyc2VJbml0aWFsaXplcj1bXTtmb3IodmFyIG49MDtuPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrbil7aWYodHlwZW9mIGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5zcGFyc2VJbml0aWFsaXplcjogb2JqZWN0IGV4cGVjdGVkIik7ci5zcGFyc2VJbml0aWFsaXplcltuXT1oLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnNwYXJzZUluaXRpYWxpemVyW25dKX19aWYoZS5kb2NTdHJpbmchPW51bGwmJihyLmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7ci5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil7aWYodHlwZW9mIGUuaW5wdXRbbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbnB1dDogb2JqZWN0IGV4cGVjdGVkIik7ci5pbnB1dFtuXT1oLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLmlucHV0W25dKX19aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO3Iub3V0cHV0PVtdO2Zvcih2YXIgbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil7aWYodHlwZW9mIGUub3V0cHV0W25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBvYmplY3QgZXhwZWN0ZWQiKTtyLm91dHB1dFtuXT1oLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLm91dHB1dFtuXSl9fWlmKGUudmFsdWVJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnZhbHVlSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtyLnZhbHVlSW5mbz1bXTtmb3IodmFyIG49MDtuPGUudmFsdWVJbmZvLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnZhbHVlSW5mb1tuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogb2JqZWN0IGV4cGVjdGVkIik7ci52YWx1ZUluZm9bbl09aC5vbm54LlZhbHVlSW5mb1Byb3RvLmZyb21PYmplY3QoZS52YWx1ZUluZm9bbl0pfX1pZihlLnF1YW50aXphdGlvbkFubm90YXRpb24pe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbikpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnF1YW50aXphdGlvbkFubm90YXRpb246IGFycmF5IGV4cGVjdGVkIik7ci5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdO2Zvcih2YXIgbj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5xdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTtyLnF1YW50aXphdGlvbkFubm90YXRpb25bbl09aC5vbm54LlRlbnNvckFubm90YXRpb24uZnJvbU9iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5ub2RlPVtdLG4uaW5pdGlhbGl6ZXI9W10sbi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLnZhbHVlSW5mbz1bXSxuLnF1YW50aXphdGlvbkFubm90YXRpb249W10sbi5zcGFyc2VJbml0aWFsaXplcj1bXSksci5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLmRvY1N0cmluZz0iIiksZS5ub2RlJiZlLm5vZGUubGVuZ3RoKXtuLm5vZGU9W107Zm9yKHZhciBzPTA7czxlLm5vZGUubGVuZ3RoOysrcyluLm5vZGVbc109aC5vbm54Lk5vZGVQcm90by50b09iamVjdChlLm5vZGVbc10scil9aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxlLmluaXRpYWxpemVyJiZlLmluaXRpYWxpemVyLmxlbmd0aCl7bi5pbml0aWFsaXplcj1bXTtmb3IodmFyIHM9MDtzPGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrcyluLmluaXRpYWxpemVyW3NdPWgub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLmluaXRpYWxpemVyW3NdLHIpfWlmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmlucHV0JiZlLmlucHV0Lmxlbmd0aCl7bi5pbnB1dD1bXTtmb3IodmFyIHM9MDtzPGUuaW5wdXQubGVuZ3RoOysrcyluLmlucHV0W3NdPWgub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLmlucHV0W3NdLHIpfWlmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpe24ub3V0cHV0PVtdO2Zvcih2YXIgcz0wO3M8ZS5vdXRwdXQubGVuZ3RoOysrcyluLm91dHB1dFtzXT1oLm9ubnguVmFsdWVJbmZvUHJvdG8udG9PYmplY3QoZS5vdXRwdXRbc10scil9aWYoZS52YWx1ZUluZm8mJmUudmFsdWVJbmZvLmxlbmd0aCl7bi52YWx1ZUluZm89W107Zm9yKHZhciBzPTA7czxlLnZhbHVlSW5mby5sZW5ndGg7KytzKW4udmFsdWVJbmZvW3NdPWgub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLnZhbHVlSW5mb1tzXSxyKX1pZihlLnF1YW50aXphdGlvbkFubm90YXRpb24mJmUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGgpe24ucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXTtmb3IodmFyIHM9MDtzPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytzKW4ucXVhbnRpemF0aW9uQW5ub3RhdGlvbltzXT1oLm9ubnguVGVuc29yQW5ub3RhdGlvbi50b09iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bc10scil9aWYoZS5zcGFyc2VJbml0aWFsaXplciYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpe24uc3BhcnNlSW5pdGlhbGl6ZXI9W107Zm9yKHZhciBzPTA7czxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK3Mpbi5zcGFyc2VJbml0aWFsaXplcltzXT1oLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udG9PYmplY3QoZS5zcGFyc2VJbml0aWFsaXplcltzXSxyKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxnZS51dGlsLnRvSlNPTk9wdGlvbnMpfSx0LmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguR3JhcGhQcm90byJ9LHR9KCksYS5UZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyl7aWYodGhpcy5kaW1zPVtdLHRoaXMuZmxvYXREYXRhPVtdLHRoaXMuaW50MzJEYXRhPVtdLHRoaXMuc3RyaW5nRGF0YT1bXSx0aGlzLmludDY0RGF0YT1bXSx0aGlzLmV4dGVybmFsRGF0YT1bXSx0aGlzLmRvdWJsZURhdGE9W10sdGhpcy51aW50NjREYXRhPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUuZGltcz1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUuZGF0YVR5cGU9MCx0LnByb3RvdHlwZS5zZWdtZW50PW51bGwsdC5wcm90b3R5cGUuZmxvYXREYXRhPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS5pbnQzMkRhdGE9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLnN0cmluZ0RhdGE9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmludDY0RGF0YT1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUubmFtZT0iIix0LnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsdC5wcm90b3R5cGUucmF3RGF0YT1nLm5ld0J1ZmZlcihbXSksdC5wcm90b3R5cGUuZXh0ZXJuYWxEYXRhPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS5kYXRhTG9jYXRpb249MCx0LnByb3RvdHlwZS5kb3VibGVEYXRhPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS51aW50NjREYXRhPWcuZW1wdHlBcnJheSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7aWYocnx8KHI9UGUuY3JlYXRlKCkpLGUuZGltcyE9bnVsbCYmZS5kaW1zLmxlbmd0aCl7ci51aW50MzIoMTApLmZvcmsoKTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKXIuaW50NjQoZS5kaW1zW25dKTtyLmxkZWxpbSgpfWlmKGUuZGF0YVR5cGUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRhdGFUeXBlIikmJnIudWludDMyKDE2KS5pbnQzMihlLmRhdGFUeXBlKSxlLnNlZ21lbnQhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNlZ21lbnQiKSYmaC5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQuZW5jb2RlKGUuc2VnbWVudCxyLnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKSxlLmZsb2F0RGF0YSE9bnVsbCYmZS5mbG9hdERhdGEubGVuZ3RoKXtyLnVpbnQzMigzNCkuZm9yaygpO2Zvcih2YXIgbj0wO248ZS5mbG9hdERhdGEubGVuZ3RoOysrbilyLmZsb2F0KGUuZmxvYXREYXRhW25dKTtyLmxkZWxpbSgpfWlmKGUuaW50MzJEYXRhIT1udWxsJiZlLmludDMyRGF0YS5sZW5ndGgpe3IudWludDMyKDQyKS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmludDMyRGF0YS5sZW5ndGg7KytuKXIuaW50MzIoZS5pbnQzMkRhdGFbbl0pO3IubGRlbGltKCl9aWYoZS5zdHJpbmdEYXRhIT1udWxsJiZlLnN0cmluZ0RhdGEubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK24pci51aW50MzIoNTApLmJ5dGVzKGUuc3RyaW5nRGF0YVtuXSk7aWYoZS5pbnQ2NERhdGEhPW51bGwmJmUuaW50NjREYXRhLmxlbmd0aCl7ci51aW50MzIoNTgpLmZvcmsoKTtmb3IodmFyIG49MDtuPGUuaW50NjREYXRhLmxlbmd0aDsrK24pci5pbnQ2NChlLmludDY0RGF0YVtuXSk7ci5sZGVsaW0oKX1pZihlLm5hbWUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmci51aW50MzIoNjYpLnN0cmluZyhlLm5hbWUpLGUucmF3RGF0YSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmF3RGF0YSIpJiZyLnVpbnQzMig3NCkuYnl0ZXMoZS5yYXdEYXRhKSxlLmRvdWJsZURhdGEhPW51bGwmJmUuZG91YmxlRGF0YS5sZW5ndGgpe3IudWludDMyKDgyKS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRvdWJsZURhdGEubGVuZ3RoOysrbilyLmRvdWJsZShlLmRvdWJsZURhdGFbbl0pO3IubGRlbGltKCl9aWYoZS51aW50NjREYXRhIT1udWxsJiZlLnVpbnQ2NERhdGEubGVuZ3RoKXtyLnVpbnQzMig5MCkuZm9yaygpO2Zvcih2YXIgbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pci51aW50NjQoZS51aW50NjREYXRhW25dKTtyLmxkZWxpbSgpfWlmKGUuZG9jU3RyaW5nIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmci51aW50MzIoOTgpLnN0cmluZyhlLmRvY1N0cmluZyksZS5leHRlcm5hbERhdGEhPW51bGwmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3IodmFyIG49MDtuPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK24paC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuZXh0ZXJuYWxEYXRhW25dLHIudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZS5kYXRhTG9jYXRpb24hPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRhdGFMb2NhdGlvbiIpJiZyLnVpbnQzMigxMTIpLmludDMyKGUuZGF0YUxvY2F0aW9uKSxyfSx0LmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHIpe3JldHVybiB0aGlzLmVuY29kZShlLHIpLmxkZWxpbSgpfSx0LmRlY29kZT1mdW5jdGlvbihlLHIpe2UgaW5zdGFuY2VvZiBOfHwoZT1OLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXI9PT12b2lkIDA/ZS5sZW46ZS5wb3MrcixzPW5ldyBoLm9ubnguVGVuc29yUHJvdG87ZS5wb3M8bjspe3ZhciBpPWUudWludDMyKCk7c3dpdGNoKGk+Pj4zKXtjYXNlIDE6e2lmKHMuZGltcyYmcy5kaW1zLmxlbmd0aHx8KHMuZGltcz1bXSksKGkmNyk9PT0yKWZvcih2YXIgdT1lLnVpbnQzMigpK2UucG9zO2UucG9zPHU7KXMuZGltcy5wdXNoKGUuaW50NjQoKSk7ZWxzZSBzLmRpbXMucHVzaChlLmludDY0KCkpO2JyZWFrfWNhc2UgMjp7cy5kYXRhVHlwZT1lLmludDMyKCk7YnJlYWt9Y2FzZSAzOntzLnNlZ21lbnQ9aC5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSA0OntpZihzLmZsb2F0RGF0YSYmcy5mbG9hdERhdGEubGVuZ3RofHwocy5mbG9hdERhdGE9W10pLChpJjcpPT09Milmb3IodmFyIHU9ZS51aW50MzIoKStlLnBvcztlLnBvczx1OylzLmZsb2F0RGF0YS5wdXNoKGUuZmxvYXQoKSk7ZWxzZSBzLmZsb2F0RGF0YS5wdXNoKGUuZmxvYXQoKSk7YnJlYWt9Y2FzZSA1OntpZihzLmludDMyRGF0YSYmcy5pbnQzMkRhdGEubGVuZ3RofHwocy5pbnQzMkRhdGE9W10pLChpJjcpPT09Milmb3IodmFyIHU9ZS51aW50MzIoKStlLnBvcztlLnBvczx1OylzLmludDMyRGF0YS5wdXNoKGUuaW50MzIoKSk7ZWxzZSBzLmludDMyRGF0YS5wdXNoKGUuaW50MzIoKSk7YnJlYWt9Y2FzZSA2OntzLnN0cmluZ0RhdGEmJnMuc3RyaW5nRGF0YS5sZW5ndGh8fChzLnN0cmluZ0RhdGE9W10pLHMuc3RyaW5nRGF0YS5wdXNoKGUuYnl0ZXMoKSk7YnJlYWt9Y2FzZSA3OntpZihzLmludDY0RGF0YSYmcy5pbnQ2NERhdGEubGVuZ3RofHwocy5pbnQ2NERhdGE9W10pLChpJjcpPT09Milmb3IodmFyIHU9ZS51aW50MzIoKStlLnBvcztlLnBvczx1OylzLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7ZWxzZSBzLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7YnJlYWt9Y2FzZSA4OntzLm5hbWU9ZS5zdHJpbmcoKTticmVha31jYXNlIDEyOntzLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrfWNhc2UgOTp7cy5yYXdEYXRhPWUuYnl0ZXMoKTticmVha31jYXNlIDEzOntzLmV4dGVybmFsRGF0YSYmcy5leHRlcm5hbERhdGEubGVuZ3RofHwocy5leHRlcm5hbERhdGE9W10pLHMuZXh0ZXJuYWxEYXRhLnB1c2goaC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWNhc2UgMTQ6e3MuZGF0YUxvY2F0aW9uPWUuaW50MzIoKTticmVha31jYXNlIDEwOntpZihzLmRvdWJsZURhdGEmJnMuZG91YmxlRGF0YS5sZW5ndGh8fChzLmRvdWJsZURhdGE9W10pLChpJjcpPT09Milmb3IodmFyIHU9ZS51aW50MzIoKStlLnBvcztlLnBvczx1OylzLmRvdWJsZURhdGEucHVzaChlLmRvdWJsZSgpKTtlbHNlIHMuZG91YmxlRGF0YS5wdXNoKGUuZG91YmxlKCkpO2JyZWFrfWNhc2UgMTE6e2lmKHMudWludDY0RGF0YSYmcy51aW50NjREYXRhLmxlbmd0aHx8KHMudWludDY0RGF0YT1bXSksKGkmNyk9PT0yKWZvcih2YXIgdT1lLnVpbnQzMigpK2UucG9zO2UucG9zPHU7KXMudWludDY0RGF0YS5wdXNoKGUudWludDY0KCkpO2Vsc2Ugcy51aW50NjREYXRhLnB1c2goZS51aW50NjQoKSk7YnJlYWt9ZGVmYXVsdDplLnNraXBUeXBlKGkmNyk7YnJlYWt9fXJldHVybiBzfSx0LmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE58fChlPW5ldyBOKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSx0LnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUuZGltcyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiJkaW1zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmRpbXMubGVuZ3RoOysrcilpZighZy5pc0ludGVnZXIoZS5kaW1zW3JdKSYmIShlLmRpbXNbcl0mJmcuaXNJbnRlZ2VyKGUuZGltc1tyXS5sb3cpJiZnLmlzSW50ZWdlcihlLmRpbXNbcl0uaGlnaCkpKXJldHVybiJkaW1zOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYoZS5kYXRhVHlwZSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YVR5cGUiKSYmIWcuaXNJbnRlZ2VyKGUuZGF0YVR5cGUpKXJldHVybiJkYXRhVHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYoZS5zZWdtZW50IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJzZWdtZW50Iikpe3ZhciBuPWgub25ueC5UZW5zb3JQcm90by5TZWdtZW50LnZlcmlmeShlLnNlZ21lbnQpO2lmKG4pcmV0dXJuInNlZ21lbnQuIitufWlmKGUuZmxvYXREYXRhIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJmbG9hdERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXJldHVybiJmbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUuZmxvYXREYXRhLmxlbmd0aDsrK3IpaWYodHlwZW9mIGUuZmxvYXREYXRhW3JdIT0ibnVtYmVyIilyZXR1cm4iZmxvYXREYXRhOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYoZS5pbnQzMkRhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImludDMyRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpcmV0dXJuImludDMyRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5pbnQzMkRhdGEubGVuZ3RoOysrcilpZighZy5pc0ludGVnZXIoZS5pbnQzMkRhdGFbcl0pKXJldHVybiJpbnQzMkRhdGE6IGludGVnZXJbXSBleHBlY3RlZCJ9aWYoZS5zdHJpbmdEYXRhIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJzdHJpbmdEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5nRGF0YSkpcmV0dXJuInN0cmluZ0RhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytyKWlmKCEoZS5zdHJpbmdEYXRhW3JdJiZ0eXBlb2YgZS5zdHJpbmdEYXRhW3JdLmxlbmd0aD09Im51bWJlciJ8fGcuaXNTdHJpbmcoZS5zdHJpbmdEYXRhW3JdKSkpcmV0dXJuInN0cmluZ0RhdGE6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihlLmludDY0RGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW50NjREYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSlyZXR1cm4iaW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmludDY0RGF0YS5sZW5ndGg7KytyKWlmKCFnLmlzSW50ZWdlcihlLmludDY0RGF0YVtyXSkmJiEoZS5pbnQ2NERhdGFbcl0mJmcuaXNJbnRlZ2VyKGUuaW50NjREYXRhW3JdLmxvdykmJmcuaXNJbnRlZ2VyKGUuaW50NjREYXRhW3JdLmhpZ2gpKSlyZXR1cm4iaW50NjREYXRhOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJiFnLmlzU3RyaW5nKGUubmFtZSkpcmV0dXJuIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYoZS5kb2NTdHJpbmchPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhZy5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihlLnJhd0RhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInJhd0RhdGEiKSYmIShlLnJhd0RhdGEmJnR5cGVvZiBlLnJhd0RhdGEubGVuZ3RoPT0ibnVtYmVyInx8Zy5pc1N0cmluZyhlLnJhd0RhdGEpKSlyZXR1cm4icmF3RGF0YTogYnVmZmVyIGV4cGVjdGVkIjtpZihlLmV4dGVybmFsRGF0YSE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZXh0ZXJuYWxEYXRhIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZXh0ZXJuYWxEYXRhKSlyZXR1cm4iZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLmV4dGVybmFsRGF0YS5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by52ZXJpZnkoZS5leHRlcm5hbERhdGFbcl0pO2lmKG4pcmV0dXJuImV4dGVybmFsRGF0YS4iK259fWlmKGUuZGF0YUxvY2F0aW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSlzd2l0Y2goZS5kYXRhTG9jYXRpb24pe2RlZmF1bHQ6cmV0dXJuImRhdGFMb2NhdGlvbjogZW51bSB2YWx1ZSBleHBlY3RlZCI7Y2FzZSAwOmNhc2UgMTpicmVha31pZihlLmRvdWJsZURhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRvdWJsZURhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSlyZXR1cm4iZG91YmxlRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3IpaWYodHlwZW9mIGUuZG91YmxlRGF0YVtyXSE9Im51bWJlciIpcmV0dXJuImRvdWJsZURhdGE6IG51bWJlcltdIGV4cGVjdGVkIn1pZihlLnVpbnQ2NERhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInVpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSlyZXR1cm4idWludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS51aW50NjREYXRhLmxlbmd0aDsrK3IpaWYoIWcuaXNJbnRlZ2VyKGUudWludDY0RGF0YVtyXSkmJiEoZS51aW50NjREYXRhW3JdJiZnLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbcl0ubG93KSYmZy5pc0ludGVnZXIoZS51aW50NjREYXRhW3JdLmhpZ2gpKSlyZXR1cm4idWludDY0RGF0YTogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifXJldHVybiBudWxsfSx0LmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGgub25ueC5UZW5zb3JQcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54LlRlbnNvclByb3RvO2lmKGUuZGltcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW1zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRpbXM6IGFycmF5IGV4cGVjdGVkIik7ci5kaW1zPVtdO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24pZy5Mb25nPyhyLmRpbXNbbl09Zy5Mb25nLmZyb21WYWx1ZShlLmRpbXNbbl0pKS51bnNpZ25lZD0hMTp0eXBlb2YgZS5kaW1zW25dPT0ic3RyaW5nIj9yLmRpbXNbbl09cGFyc2VJbnQoZS5kaW1zW25dLDEwKTp0eXBlb2YgZS5kaW1zW25dPT0ibnVtYmVyIj9yLmRpbXNbbl09ZS5kaW1zW25dOnR5cGVvZiBlLmRpbXNbbl09PSJvYmplY3QiJiYoci5kaW1zW25dPW5ldyBnLkxvbmdCaXRzKGUuZGltc1tuXS5sb3c+Pj4wLGUuZGltc1tuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSl9aWYoZS5kYXRhVHlwZSE9bnVsbCYmKHIuZGF0YVR5cGU9ZS5kYXRhVHlwZXwwKSxlLnNlZ21lbnQhPW51bGwpe2lmKHR5cGVvZiBlLnNlZ21lbnQhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uc2VnbWVudDogb2JqZWN0IGV4cGVjdGVkIik7ci5zZWdtZW50PWgub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmZyb21PYmplY3QoZS5zZWdtZW50KX1pZihlLmZsb2F0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5mbG9hdERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZmxvYXREYXRhOiBhcnJheSBleHBlY3RlZCIpO3IuZmxvYXREYXRhPVtdO2Zvcih2YXIgbj0wO248ZS5mbG9hdERhdGEubGVuZ3RoOysrbilyLmZsb2F0RGF0YVtuXT1OdW1iZXIoZS5mbG9hdERhdGFbbl0pfWlmKGUuaW50MzJEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIik7ci5pbnQzMkRhdGE9W107Zm9yKHZhciBuPTA7bjxlLmludDMyRGF0YS5sZW5ndGg7KytuKXIuaW50MzJEYXRhW25dPWUuaW50MzJEYXRhW25dfDB9aWYoZS5zdHJpbmdEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uc3RyaW5nRGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtyLnN0cmluZ0RhdGE9W107Zm9yKHZhciBuPTA7bjxlLnN0cmluZ0RhdGEubGVuZ3RoOysrbil0eXBlb2YgZS5zdHJpbmdEYXRhW25dPT0ic3RyaW5nIj9nLmJhc2U2NC5kZWNvZGUoZS5zdHJpbmdEYXRhW25dLHIuc3RyaW5nRGF0YVtuXT1nLm5ld0J1ZmZlcihnLmJhc2U2NC5sZW5ndGgoZS5zdHJpbmdEYXRhW25dKSksMCk6ZS5zdHJpbmdEYXRhW25dLmxlbmd0aD49MCYmKHIuc3RyaW5nRGF0YVtuXT1lLnN0cmluZ0RhdGFbbl0pfWlmKGUuaW50NjREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmludDY0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5pbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7ci5pbnQ2NERhdGE9W107Zm9yKHZhciBuPTA7bjxlLmludDY0RGF0YS5sZW5ndGg7KytuKWcuTG9uZz8oci5pbnQ2NERhdGFbbl09Zy5Mb25nLmZyb21WYWx1ZShlLmludDY0RGF0YVtuXSkpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmludDY0RGF0YVtuXT09InN0cmluZyI/ci5pbnQ2NERhdGFbbl09cGFyc2VJbnQoZS5pbnQ2NERhdGFbbl0sMTApOnR5cGVvZiBlLmludDY0RGF0YVtuXT09Im51bWJlciI/ci5pbnQ2NERhdGFbbl09ZS5pbnQ2NERhdGFbbl06dHlwZW9mIGUuaW50NjREYXRhW25dPT0ib2JqZWN0IiYmKHIuaW50NjREYXRhW25dPW5ldyBnLkxvbmdCaXRzKGUuaW50NjREYXRhW25dLmxvdz4+PjAsZS5pbnQ2NERhdGFbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpfWlmKGUubmFtZSE9bnVsbCYmKHIubmFtZT1TdHJpbmcoZS5uYW1lKSksZS5kb2NTdHJpbmchPW51bGwmJihyLmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLnJhd0RhdGEhPW51bGwmJih0eXBlb2YgZS5yYXdEYXRhPT0ic3RyaW5nIj9nLmJhc2U2NC5kZWNvZGUoZS5yYXdEYXRhLHIucmF3RGF0YT1nLm5ld0J1ZmZlcihnLmJhc2U2NC5sZW5ndGgoZS5yYXdEYXRhKSksMCk6ZS5yYXdEYXRhLmxlbmd0aD49MCYmKHIucmF3RGF0YT1lLnJhd0RhdGEpKSxlLmV4dGVybmFsRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yUHJvdG8uZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCIpO3IuZXh0ZXJuYWxEYXRhPVtdO2Zvcih2YXIgbj0wO248ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrbil7aWYodHlwZW9mIGUuZXh0ZXJuYWxEYXRhW25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmV4dGVybmFsRGF0YTogb2JqZWN0IGV4cGVjdGVkIik7ci5leHRlcm5hbERhdGFbbl09aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZnJvbU9iamVjdChlLmV4dGVybmFsRGF0YVtuXSl9fXN3aXRjaChlLmRhdGFMb2NhdGlvbil7ZGVmYXVsdDppZih0eXBlb2YgZS5kYXRhTG9jYXRpb249PSJudW1iZXIiKXtyLmRhdGFMb2NhdGlvbj1lLmRhdGFMb2NhdGlvbjticmVha31icmVhaztjYXNlIkRFRkFVTFQiOmNhc2UgMDpyLmRhdGFMb2NhdGlvbj0wO2JyZWFrO2Nhc2UiRVhURVJOQUwiOmNhc2UgMTpyLmRhdGFMb2NhdGlvbj0xO2JyZWFrfWlmKGUuZG91YmxlRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIik7ci5kb3VibGVEYXRhPVtdO2Zvcih2YXIgbj0wO248ZS5kb3VibGVEYXRhLmxlbmd0aDsrK24pci5kb3VibGVEYXRhW25dPU51bWJlcihlLmRvdWJsZURhdGFbbl0pfWlmKGUudWludDY0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnVpbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7ci51aW50NjREYXRhPVtdO2Zvcih2YXIgbj0wO248ZS51aW50NjREYXRhLmxlbmd0aDsrK24pZy5Mb25nPyhyLnVpbnQ2NERhdGFbbl09Zy5Mb25nLmZyb21WYWx1ZShlLnVpbnQ2NERhdGFbbl0pKS51bnNpZ25lZD0hMDp0eXBlb2YgZS51aW50NjREYXRhW25dPT0ic3RyaW5nIj9yLnVpbnQ2NERhdGFbbl09cGFyc2VJbnQoZS51aW50NjREYXRhW25dLDEwKTp0eXBlb2YgZS51aW50NjREYXRhW25dPT0ibnVtYmVyIj9yLnVpbnQ2NERhdGFbbl09ZS51aW50NjREYXRhW25dOnR5cGVvZiBlLnVpbnQ2NERhdGFbbl09PSJvYmplY3QiJiYoci51aW50NjREYXRhW25dPW5ldyBnLkxvbmdCaXRzKGUudWludDY0RGF0YVtuXS5sb3c+Pj4wLGUudWludDY0RGF0YVtuXS5oaWdoPj4+MCkudG9OdW1iZXIoITApKX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5kaW1zPVtdLG4uZmxvYXREYXRhPVtdLG4uaW50MzJEYXRhPVtdLG4uc3RyaW5nRGF0YT1bXSxuLmludDY0RGF0YT1bXSxuLmRvdWJsZURhdGE9W10sbi51aW50NjREYXRhPVtdLG4uZXh0ZXJuYWxEYXRhPVtdKSxyLmRlZmF1bHRzJiYobi5kYXRhVHlwZT0wLG4uc2VnbWVudD1udWxsLG4ubmFtZT0iIixyLmJ5dGVzPT09U3RyaW5nP24ucmF3RGF0YT0iIjoobi5yYXdEYXRhPVtdLHIuYnl0ZXMhPT1BcnJheSYmKG4ucmF3RGF0YT1nLm5ld0J1ZmZlcihuLnJhd0RhdGEpKSksbi5kb2NTdHJpbmc9IiIsbi5kYXRhTG9jYXRpb249ci5lbnVtcz09PVN0cmluZz8iREVGQVVMVCI6MCksZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXtuLmRpbXM9W107Zm9yKHZhciBzPTA7czxlLmRpbXMubGVuZ3RoOysrcyl0eXBlb2YgZS5kaW1zW3NdPT0ibnVtYmVyIj9uLmRpbXNbc109ci5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1zW3NdKTplLmRpbXNbc106bi5kaW1zW3NdPXIubG9uZ3M9PT1TdHJpbmc/Zy5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltc1tzXSk6ci5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhlLmRpbXNbc10ubG93Pj4+MCxlLmRpbXNbc10uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1zW3NdfWlmKGUuZGF0YVR5cGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRhdGFUeXBlIikmJihuLmRhdGFUeXBlPWUuZGF0YVR5cGUpLGUuc2VnbWVudCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgic2VnbWVudCIpJiYobi5zZWdtZW50PWgub25ueC5UZW5zb3JQcm90by5TZWdtZW50LnRvT2JqZWN0KGUuc2VnbWVudCxyKSksZS5mbG9hdERhdGEmJmUuZmxvYXREYXRhLmxlbmd0aCl7bi5mbG9hdERhdGE9W107Zm9yKHZhciBzPTA7czxlLmZsb2F0RGF0YS5sZW5ndGg7KytzKW4uZmxvYXREYXRhW3NdPXIuanNvbiYmIWlzRmluaXRlKGUuZmxvYXREYXRhW3NdKT9TdHJpbmcoZS5mbG9hdERhdGFbc10pOmUuZmxvYXREYXRhW3NdfWlmKGUuaW50MzJEYXRhJiZlLmludDMyRGF0YS5sZW5ndGgpe24uaW50MzJEYXRhPVtdO2Zvcih2YXIgcz0wO3M8ZS5pbnQzMkRhdGEubGVuZ3RoOysrcyluLmludDMyRGF0YVtzXT1lLmludDMyRGF0YVtzXX1pZihlLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpe24uc3RyaW5nRGF0YT1bXTtmb3IodmFyIHM9MDtzPGUuc3RyaW5nRGF0YS5sZW5ndGg7KytzKW4uc3RyaW5nRGF0YVtzXT1yLmJ5dGVzPT09U3RyaW5nP2cuYmFzZTY0LmVuY29kZShlLnN0cmluZ0RhdGFbc10sMCxlLnN0cmluZ0RhdGFbc10ubGVuZ3RoKTpyLmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zdHJpbmdEYXRhW3NdKTplLnN0cmluZ0RhdGFbc119aWYoZS5pbnQ2NERhdGEmJmUuaW50NjREYXRhLmxlbmd0aCl7bi5pbnQ2NERhdGE9W107Zm9yKHZhciBzPTA7czxlLmludDY0RGF0YS5sZW5ndGg7KytzKXR5cGVvZiBlLmludDY0RGF0YVtzXT09Im51bWJlciI/bi5pbnQ2NERhdGFbc109ci5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnQ2NERhdGFbc10pOmUuaW50NjREYXRhW3NdOm4uaW50NjREYXRhW3NdPXIubG9uZ3M9PT1TdHJpbmc/Zy5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50NjREYXRhW3NdKTpyLmxvbmdzPT09TnVtYmVyP25ldyBnLkxvbmdCaXRzKGUuaW50NjREYXRhW3NdLmxvdz4+PjAsZS5pbnQ2NERhdGFbc10uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnQ2NERhdGFbc119aWYoZS5uYW1lIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxlLnJhd0RhdGEhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInJhd0RhdGEiKSYmKG4ucmF3RGF0YT1yLmJ5dGVzPT09U3RyaW5nP2cuYmFzZTY0LmVuY29kZShlLnJhd0RhdGEsMCxlLnJhd0RhdGEubGVuZ3RoKTpyLmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5yYXdEYXRhKTplLnJhd0RhdGEpLGUuZG91YmxlRGF0YSYmZS5kb3VibGVEYXRhLmxlbmd0aCl7bi5kb3VibGVEYXRhPVtdO2Zvcih2YXIgcz0wO3M8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3Mpbi5kb3VibGVEYXRhW3NdPXIuanNvbiYmIWlzRmluaXRlKGUuZG91YmxlRGF0YVtzXSk/U3RyaW5nKGUuZG91YmxlRGF0YVtzXSk6ZS5kb3VibGVEYXRhW3NdfWlmKGUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aCl7bi51aW50NjREYXRhPVtdO2Zvcih2YXIgcz0wO3M8ZS51aW50NjREYXRhLmxlbmd0aDsrK3MpdHlwZW9mIGUudWludDY0RGF0YVtzXT09Im51bWJlciI/bi51aW50NjREYXRhW3NdPXIubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUudWludDY0RGF0YVtzXSk6ZS51aW50NjREYXRhW3NdOm4udWludDY0RGF0YVtzXT1yLmxvbmdzPT09U3RyaW5nP2cuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnVpbnQ2NERhdGFbc10pOnIubG9uZ3M9PT1OdW1iZXI/bmV3IGcuTG9uZ0JpdHMoZS51aW50NjREYXRhW3NdLmxvdz4+PjAsZS51aW50NjREYXRhW3NdLmhpZ2g+Pj4wKS50b051bWJlcighMCk6ZS51aW50NjREYXRhW3NdfWlmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLmV4dGVybmFsRGF0YSYmZS5leHRlcm5hbERhdGEubGVuZ3RoKXtuLmV4dGVybmFsRGF0YT1bXTtmb3IodmFyIHM9MDtzPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3Mpbi5leHRlcm5hbERhdGFbc109aC5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5leHRlcm5hbERhdGFbc10scil9cmV0dXJuIGUuZGF0YUxvY2F0aW9uIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSYmKG4uZGF0YUxvY2F0aW9uPXIuZW51bXM9PT1TdHJpbmc/aC5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl09PT12b2lkIDA/ZS5kYXRhTG9jYXRpb246aC5vbm54LlRlbnNvclByb3RvLkRhdGFMb2NhdGlvbltlLmRhdGFMb2NhdGlvbl06ZS5kYXRhTG9jYXRpb24pLG59LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclByb3RvIn0sdC5EYXRhVHlwZT1mdW5jdGlvbigpe3ZhciBvPXt9LGU9T2JqZWN0LmNyZWF0ZShvKTtyZXR1cm4gZVtvWzBdPSJVTkRFRklORUQiXT0wLGVbb1sxXT0iRkxPQVQiXT0xLGVbb1syXT0iVUlOVDgiXT0yLGVbb1szXT0iSU5UOCJdPTMsZVtvWzRdPSJVSU5UMTYiXT00LGVbb1s1XT0iSU5UMTYiXT01LGVbb1s2XT0iSU5UMzIiXT02LGVbb1s3XT0iSU5UNjQiXT03LGVbb1s4XT0iU1RSSU5HIl09OCxlW29bOV09IkJPT0wiXT05LGVbb1sxMF09IkZMT0FUMTYiXT0xMCxlW29bMTFdPSJET1VCTEUiXT0xMSxlW29bMTJdPSJVSU5UMzIiXT0xMixlW29bMTNdPSJVSU5UNjQiXT0xMyxlW29bMTRdPSJDT01QTEVYNjQiXT0xNCxlW29bMTVdPSJDT01QTEVYMTI4Il09MTUsZVtvWzE2XT0iQkZMT0FUMTYiXT0xNixlW29bMTddPSJGTE9BVDhFNE0zRk4iXT0xNyxlW29bMThdPSJGTE9BVDhFNE0zRk5VWiJdPTE4LGVbb1sxOV09IkZMT0FUOEU1TTIiXT0xOSxlW29bMjBdPSJGTE9BVDhFNU0yRk5VWiJdPTIwLGV9KCksdC5TZWdtZW50PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhlKXtpZihlKWZvcih2YXIgcj1PYmplY3Qua2V5cyhlKSxuPTA7bjxyLmxlbmd0aDsrK24pZVtyW25dXSE9bnVsbCYmKHRoaXNbcltuXV09ZVtyW25dXSl9cmV0dXJuIG8ucHJvdG90eXBlLmJlZ2luPWcuTG9uZz9nLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLG8ucHJvdG90eXBlLmVuZD1nLkxvbmc/Zy5Mb25nLmZyb21CaXRzKDAsMCwhMSk6MCxvLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IG8ocil9LG8uZW5jb2RlPWZ1bmN0aW9uKHIsbil7cmV0dXJuIG58fChuPVBlLmNyZWF0ZSgpKSxyLmJlZ2luIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyLCJiZWdpbiIpJiZuLnVpbnQzMig4KS5pbnQ2NChyLmJlZ2luKSxyLmVuZCE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwociwiZW5kIikmJm4udWludDMyKDE2KS5pbnQ2NChyLmVuZCksbn0sby5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4gdGhpcy5lbmNvZGUocixuKS5sZGVsaW0oKX0sby5kZWNvZGU9ZnVuY3Rpb24ocixuKXtyIGluc3RhbmNlb2YgTnx8KHI9Ti5jcmVhdGUocikpO2Zvcih2YXIgcz1uPT09dm9pZCAwP3IubGVuOnIucG9zK24saT1uZXcgaC5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQ7ci5wb3M8czspe3ZhciB1PXIudWludDMyKCk7c3dpdGNoKHU+Pj4zKXtjYXNlIDE6e2kuYmVnaW49ci5pbnQ2NCgpO2JyZWFrfWNhc2UgMjp7aS5lbmQ9ci5pbnQ2NCgpO2JyZWFrfWRlZmF1bHQ6ci5za2lwVHlwZSh1JjcpO2JyZWFrfX1yZXR1cm4gaX0sby5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24ocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBOfHwocj1uZXcgTihyKSksdGhpcy5kZWNvZGUocixyLnVpbnQzMigpKX0sby52ZXJpZnk9ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByIT0ib2JqZWN0Inx8cj09PW51bGw/Im9iamVjdCBleHBlY3RlZCI6ci5iZWdpbiE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmIWcuaXNJbnRlZ2VyKHIuYmVnaW4pJiYhKHIuYmVnaW4mJmcuaXNJbnRlZ2VyKHIuYmVnaW4ubG93KSYmZy5pc0ludGVnZXIoci5iZWdpbi5oaWdoKSk/ImJlZ2luOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOnIuZW5kIT1udWxsJiZyLmhhc093blByb3BlcnR5KCJlbmQiKSYmIWcuaXNJbnRlZ2VyKHIuZW5kKSYmIShyLmVuZCYmZy5pc0ludGVnZXIoci5lbmQubG93KSYmZy5pc0ludGVnZXIoci5lbmQuaGlnaCkpPyJlbmQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI6bnVsbH0sby5mcm9tT2JqZWN0PWZ1bmN0aW9uKHIpe2lmKHIgaW5zdGFuY2VvZiBoLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudClyZXR1cm4gcjt2YXIgbj1uZXcgaC5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQ7cmV0dXJuIHIuYmVnaW4hPW51bGwmJihnLkxvbmc/KG4uYmVnaW49Zy5Mb25nLmZyb21WYWx1ZShyLmJlZ2luKSkudW5zaWduZWQ9ITE6dHlwZW9mIHIuYmVnaW49PSJzdHJpbmciP24uYmVnaW49cGFyc2VJbnQoci5iZWdpbiwxMCk6dHlwZW9mIHIuYmVnaW49PSJudW1iZXIiP24uYmVnaW49ci5iZWdpbjp0eXBlb2Ygci5iZWdpbj09Im9iamVjdCImJihuLmJlZ2luPW5ldyBnLkxvbmdCaXRzKHIuYmVnaW4ubG93Pj4+MCxyLmJlZ2luLmhpZ2g+Pj4wKS50b051bWJlcigpKSksci5lbmQhPW51bGwmJihnLkxvbmc/KG4uZW5kPWcuTG9uZy5mcm9tVmFsdWUoci5lbmQpKS51bnNpZ25lZD0hMTp0eXBlb2Ygci5lbmQ9PSJzdHJpbmciP24uZW5kPXBhcnNlSW50KHIuZW5kLDEwKTp0eXBlb2Ygci5lbmQ9PSJudW1iZXIiP24uZW5kPXIuZW5kOnR5cGVvZiByLmVuZD09Im9iamVjdCImJihuLmVuZD1uZXcgZy5Mb25nQml0cyhyLmVuZC5sb3c+Pj4wLHIuZW5kLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbn0sby50b09iamVjdD1mdW5jdGlvbihyLG4pe258fChuPXt9KTt2YXIgcz17fTtpZihuLmRlZmF1bHRzKXtpZihnLkxvbmcpe3ZhciBpPW5ldyBnLkxvbmcoMCwwLCExKTtzLmJlZ2luPW4ubG9uZ3M9PT1TdHJpbmc/aS50b1N0cmluZygpOm4ubG9uZ3M9PT1OdW1iZXI/aS50b051bWJlcigpOml9ZWxzZSBzLmJlZ2luPW4ubG9uZ3M9PT1TdHJpbmc/IjAiOjA7aWYoZy5Mb25nKXt2YXIgaT1uZXcgZy5Mb25nKDAsMCwhMSk7cy5lbmQ9bi5sb25ncz09PVN0cmluZz9pLnRvU3RyaW5nKCk6bi5sb25ncz09PU51bWJlcj9pLnRvTnVtYmVyKCk6aX1lbHNlIHMuZW5kPW4ubG9uZ3M9PT1TdHJpbmc/IjAiOjB9cmV0dXJuIHIuYmVnaW4hPW51bGwmJnIuaGFzT3duUHJvcGVydHkoImJlZ2luIikmJih0eXBlb2Ygci5iZWdpbj09Im51bWJlciI/cy5iZWdpbj1uLmxvbmdzPT09U3RyaW5nP1N0cmluZyhyLmJlZ2luKTpyLmJlZ2luOnMuYmVnaW49bi5sb25ncz09PVN0cmluZz9nLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoci5iZWdpbik6bi5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhyLmJlZ2luLmxvdz4+PjAsci5iZWdpbi5oaWdoPj4+MCkudG9OdW1iZXIoKTpyLmJlZ2luKSxyLmVuZCE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgiZW5kIikmJih0eXBlb2Ygci5lbmQ9PSJudW1iZXIiP3MuZW5kPW4ubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKHIuZW5kKTpyLmVuZDpzLmVuZD1uLmxvbmdzPT09U3RyaW5nP2cuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyLmVuZCk6bi5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhyLmVuZC5sb3c+Pj4wLHIuZW5kLmhpZ2g+Pj4wKS50b051bWJlcigpOnIuZW5kKSxzfSxvLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LG8uZ2V0VHlwZVVybD1mdW5jdGlvbihyKXtyZXR1cm4gcj09PXZvaWQgMCYmKHI9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxyKyIvb25ueC5UZW5zb3JQcm90by5TZWdtZW50In0sb30oKSx0LkRhdGFMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciBvPXt9LGU9T2JqZWN0LmNyZWF0ZShvKTtyZXR1cm4gZVtvWzBdPSJERUZBVUxUIl09MCxlW29bMV09IkVYVEVSTkFMIl09MSxlfSgpLHR9KCksYS5TcGFyc2VUZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyl7aWYodGhpcy5kaW1zPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUudmFsdWVzPW51bGwsdC5wcm90b3R5cGUuaW5kaWNlcz1udWxsLHQucHJvdG90eXBlLmRpbXM9Zy5lbXB0eUFycmF5LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdC5lbmNvZGU9ZnVuY3Rpb24oZSxyKXtpZihyfHwocj1QZS5jcmVhdGUoKSksZS52YWx1ZXMhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZhbHVlcyIpJiZoLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudmFsdWVzLHIudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLGUuaW5kaWNlcyE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaW5kaWNlcyIpJiZoLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUuaW5kaWNlcyxyLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxlLmRpbXMhPW51bGwmJmUuZGltcy5sZW5ndGgpe3IudWludDMyKDI2KS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilyLmludDY0KGUuZGltc1tuXSk7ci5sZGVsaW0oKX1yZXR1cm4gcn0sdC5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdGhpcy5lbmNvZGUoZSxyKS5sZGVsaW0oKX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSxyKXtlIGluc3RhbmNlb2YgTnx8KGU9Ti5jcmVhdGUoZSkpO2Zvcih2YXIgbj1yPT09dm9pZCAwP2UubGVuOmUucG9zK3Iscz1uZXcgaC5vbm54LlNwYXJzZVRlbnNvclByb3RvO2UucG9zPG47KXt2YXIgaT1lLnVpbnQzMigpO3N3aXRjaChpPj4+Myl7Y2FzZSAxOntzLnZhbHVlcz1oLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWt9Y2FzZSAyOntzLmluZGljZXM9aC5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrfWNhc2UgMzp7aWYocy5kaW1zJiZzLmRpbXMubGVuZ3RofHwocy5kaW1zPVtdKSwoaSY3KT09PTIpZm9yKHZhciB1PWUudWludDMyKCkrZS5wb3M7ZS5wb3M8dTspcy5kaW1zLnB1c2goZS5pbnQ2NCgpKTtlbHNlIHMuZGltcy5wdXNoKGUuaW50NjQoKSk7YnJlYWt9ZGVmYXVsdDplLnNraXBUeXBlKGkmNyk7YnJlYWt9fXJldHVybiBzfSx0LmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE58fChlPW5ldyBOKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSx0LnZlcmlmeT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO2lmKGUudmFsdWVzIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZXMiKSl7dmFyIHI9aC5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLnZhbHVlcyk7aWYocilyZXR1cm4idmFsdWVzLiIrcn1pZihlLmluZGljZXMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSl7dmFyIHI9aC5vbm54LlRlbnNvclByb3RvLnZlcmlmeShlLmluZGljZXMpO2lmKHIpcmV0dXJuImluZGljZXMuIityfWlmKGUuZGltcyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiJkaW1zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilpZighZy5pc0ludGVnZXIoZS5kaW1zW25dKSYmIShlLmRpbXNbbl0mJmcuaXNJbnRlZ2VyKGUuZGltc1tuXS5sb3cpJiZnLmlzSW50ZWdlcihlLmRpbXNbbl0uaGlnaCkpKXJldHVybiJkaW1zOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9cmV0dXJuIG51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgaC5vbm54LlNwYXJzZVRlbnNvclByb3RvKXJldHVybiBlO3ZhciByPW5ldyBoLm9ubnguU3BhcnNlVGVuc29yUHJvdG87aWYoZS52YWx1ZXMhPW51bGwpe2lmKHR5cGVvZiBlLnZhbHVlcyE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by52YWx1ZXM6IG9iamVjdCBleHBlY3RlZCIpO3IudmFsdWVzPWgub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudmFsdWVzKX1pZihlLmluZGljZXMhPW51bGwpe2lmKHR5cGVvZiBlLmluZGljZXMhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uaW5kaWNlczogb2JqZWN0IGV4cGVjdGVkIik7ci5pbmRpY2VzPWgub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuaW5kaWNlcyl9aWYoZS5kaW1zKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGltczogYXJyYXkgZXhwZWN0ZWQiKTtyLmRpbXM9W107Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilnLkxvbmc/KHIuZGltc1tuXT1nLkxvbmcuZnJvbVZhbHVlKGUuZGltc1tuXSkpLnVuc2lnbmVkPSExOnR5cGVvZiBlLmRpbXNbbl09PSJzdHJpbmciP3IuZGltc1tuXT1wYXJzZUludChlLmRpbXNbbl0sMTApOnR5cGVvZiBlLmRpbXNbbl09PSJudW1iZXIiP3IuZGltc1tuXT1lLmRpbXNbbl06dHlwZW9mIGUuZGltc1tuXT09Im9iamVjdCImJihyLmRpbXNbbl09bmV3IGcuTG9uZ0JpdHMoZS5kaW1zW25dLmxvdz4+PjAsZS5kaW1zW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5kaW1zPVtdKSxyLmRlZmF1bHRzJiYobi52YWx1ZXM9bnVsbCxuLmluZGljZXM9bnVsbCksZS52YWx1ZXMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlcyIpJiYobi52YWx1ZXM9aC5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUudmFsdWVzLHIpKSxlLmluZGljZXMhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSYmKG4uaW5kaWNlcz1oLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS5pbmRpY2VzLHIpKSxlLmRpbXMmJmUuZGltcy5sZW5ndGgpe24uZGltcz1bXTtmb3IodmFyIHM9MDtzPGUuZGltcy5sZW5ndGg7KytzKXR5cGVvZiBlLmRpbXNbc109PSJudW1iZXIiP24uZGltc1tzXT1yLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmRpbXNbc10pOmUuZGltc1tzXTpuLmRpbXNbc109ci5sb25ncz09PVN0cmluZz9nLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5kaW1zW3NdKTpyLmxvbmdzPT09TnVtYmVyP25ldyBnLkxvbmdCaXRzKGUuZGltc1tzXS5sb3c+Pj4wLGUuZGltc1tzXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmRpbXNbc119cmV0dXJuIG59LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlNwYXJzZVRlbnNvclByb3RvIn0sdH0oKSxhLlRlbnNvclNoYXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe2lmKHRoaXMuZGltPVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUuZGltPWcuZW1wdHlBcnJheSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7aWYocnx8KHI9UGUuY3JlYXRlKCkpLGUuZGltIT1udWxsJiZlLmRpbS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmRpbS5sZW5ndGg7KytuKWgub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5lbmNvZGUoZS5kaW1bbl0sci51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHJ9LHQuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUscil7cmV0dXJuIHRoaXMuZW5jb2RlKGUscikubGRlbGltKCl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUscil7ZSBpbnN0YW5jZW9mIE58fChlPU4uY3JlYXRlKGUpKTtmb3IodmFyIG49cj09PXZvaWQgMD9lLmxlbjplLnBvcytyLHM9bmV3IGgub25ueC5UZW5zb3JTaGFwZVByb3RvO2UucG9zPG47KXt2YXIgaT1lLnVpbnQzMigpO3N3aXRjaChpPj4+Myl7Y2FzZSAxOntzLmRpbSYmcy5kaW0ubGVuZ3RofHwocy5kaW09W10pLHMuZGltLnB1c2goaC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31kZWZhdWx0OmUuc2tpcFR5cGUoaSY3KTticmVha319cmV0dXJuIHN9LHQuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTnx8KGU9bmV3IE4oZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LHQudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYoZS5kaW0hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImRpbSIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpcmV0dXJuImRpbTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5kaW0ubGVuZ3RoOysrcil7dmFyIG49aC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLnZlcmlmeShlLmRpbVtyXSk7aWYobilyZXR1cm4iZGltLiIrbn19cmV0dXJuIG51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgaC5vbm54LlRlbnNvclNoYXBlUHJvdG8pcmV0dXJuIGU7dmFyIHI9bmV3IGgub25ueC5UZW5zb3JTaGFwZVByb3RvO2lmKGUuZGltKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogYXJyYXkgZXhwZWN0ZWQiKTtyLmRpbT1bXTtmb3IodmFyIG49MDtuPGUuZGltLmxlbmd0aDsrK24pe2lmKHR5cGVvZiBlLmRpbVtuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JTaGFwZVByb3RvLmRpbTogb2JqZWN0IGV4cGVjdGVkIik7ci5kaW1bbl09aC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmZyb21PYmplY3QoZS5kaW1bbl0pfX1yZXR1cm4gcn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5kaW09W10pLGUuZGltJiZlLmRpbS5sZW5ndGgpe24uZGltPVtdO2Zvcih2YXIgcz0wO3M8ZS5kaW0ubGVuZ3RoOysrcyluLmRpbVtzXT1oLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udG9PYmplY3QoZS5kaW1bc10scil9cmV0dXJuIG59LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclNoYXBlUHJvdG8ifSx0LkRpbWVuc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG8ocil7aWYocilmb3IodmFyIG49T2JqZWN0LmtleXMocikscz0wO3M8bi5sZW5ndGg7KytzKXJbbltzXV0hPW51bGwmJih0aGlzW25bc11dPXJbbltzXV0pfW8ucHJvdG90eXBlLmRpbVZhbHVlPW51bGwsby5wcm90b3R5cGUuZGltUGFyYW09bnVsbCxvLnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiO3ZhciBlO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsInZhbHVlIix7Z2V0Omcub25lT2ZHZXR0ZXIoZT1bImRpbVZhbHVlIiwiZGltUGFyYW0iXSksc2V0Omcub25lT2ZTZXR0ZXIoZSl9KSxvLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IG8obil9LG8uZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmRpbVZhbHVlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJkaW1WYWx1ZSIpJiZzLnVpbnQzMig4KS5pbnQ2NChuLmRpbVZhbHVlKSxuLmRpbVBhcmFtIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJkaW1QYXJhbSIpJiZzLnVpbnQzMigxOCkuc3RyaW5nKG4uZGltUGFyYW0pLG4uZGVub3RhdGlvbiE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobiwiZGVub3RhdGlvbiIpJiZzLnVpbnQzMigyNikuc3RyaW5nKG4uZGVub3RhdGlvbiksc30sby5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gdGhpcy5lbmNvZGUobixzKS5sZGVsaW0oKX0sby5kZWNvZGU9ZnVuY3Rpb24obixzKXtuIGluc3RhbmNlb2YgTnx8KG49Ti5jcmVhdGUobikpO2Zvcih2YXIgaT1zPT09dm9pZCAwP24ubGVuOm4ucG9zK3MsdT1uZXcgaC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO24ucG9zPGk7KXt2YXIgbD1uLnVpbnQzMigpO3N3aXRjaChsPj4+Myl7Y2FzZSAxOnt1LmRpbVZhbHVlPW4uaW50NjQoKTticmVha31jYXNlIDI6e3UuZGltUGFyYW09bi5zdHJpbmcoKTticmVha31jYXNlIDM6e3UuZGVub3RhdGlvbj1uLnN0cmluZygpO2JyZWFrfWRlZmF1bHQ6bi5za2lwVHlwZShsJjcpO2JyZWFrfX1yZXR1cm4gdX0sby5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG4gaW5zdGFuY2VvZiBOfHwobj1uZXcgTihuKSksdGhpcy5kZWNvZGUobixuLnVpbnQzMigpKX0sby52ZXJpZnk9ZnVuY3Rpb24obil7aWYodHlwZW9mIG4hPSJvYmplY3QifHxuPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjt2YXIgcz17fTtpZihuLmRpbVZhbHVlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYocy52YWx1ZT0xLCFnLmlzSW50ZWdlcihuLmRpbVZhbHVlKSYmIShuLmRpbVZhbHVlJiZnLmlzSW50ZWdlcihuLmRpbVZhbHVlLmxvdykmJmcuaXNJbnRlZ2VyKG4uZGltVmFsdWUuaGlnaCkpKSlyZXR1cm4iZGltVmFsdWU6IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobi5kaW1QYXJhbSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZGltUGFyYW0iKSl7aWYocy52YWx1ZT09PTEpcmV0dXJuInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO2lmKHMudmFsdWU9MSwhZy5pc1N0cmluZyhuLmRpbVBhcmFtKSlyZXR1cm4iZGltUGFyYW06IHN0cmluZyBleHBlY3RlZCJ9cmV0dXJuIG4uZGVub3RhdGlvbiE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYhZy5pc1N0cmluZyhuLmRlbm90YXRpb24pPyJkZW5vdGF0aW9uOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LG8uZnJvbU9iamVjdD1mdW5jdGlvbihuKXtpZihuIGluc3RhbmNlb2YgaC5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uKXJldHVybiBuO3ZhciBzPW5ldyBoLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb247cmV0dXJuIG4uZGltVmFsdWUhPW51bGwmJihnLkxvbmc/KHMuZGltVmFsdWU9Zy5Mb25nLmZyb21WYWx1ZShuLmRpbVZhbHVlKSkudW5zaWduZWQ9ITE6dHlwZW9mIG4uZGltVmFsdWU9PSJzdHJpbmciP3MuZGltVmFsdWU9cGFyc2VJbnQobi5kaW1WYWx1ZSwxMCk6dHlwZW9mIG4uZGltVmFsdWU9PSJudW1iZXIiP3MuZGltVmFsdWU9bi5kaW1WYWx1ZTp0eXBlb2Ygbi5kaW1WYWx1ZT09Im9iamVjdCImJihzLmRpbVZhbHVlPW5ldyBnLkxvbmdCaXRzKG4uZGltVmFsdWUubG93Pj4+MCxuLmRpbVZhbHVlLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbi5kaW1QYXJhbSE9bnVsbCYmKHMuZGltUGFyYW09U3RyaW5nKG4uZGltUGFyYW0pKSxuLmRlbm90YXRpb24hPW51bGwmJihzLmRlbm90YXRpb249U3RyaW5nKG4uZGVub3RhdGlvbikpLHN9LG8udG9PYmplY3Q9ZnVuY3Rpb24obixzKXtzfHwocz17fSk7dmFyIGk9e307cmV0dXJuIHMuZGVmYXVsdHMmJihpLmRlbm90YXRpb249IiIpLG4uZGltVmFsdWUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoImRpbVZhbHVlIikmJih0eXBlb2Ygbi5kaW1WYWx1ZT09Im51bWJlciI/aS5kaW1WYWx1ZT1zLmxvbmdzPT09U3RyaW5nP1N0cmluZyhuLmRpbVZhbHVlKTpuLmRpbVZhbHVlOmkuZGltVmFsdWU9cy5sb25ncz09PVN0cmluZz9nLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobi5kaW1WYWx1ZSk6cy5sb25ncz09PU51bWJlcj9uZXcgZy5Mb25nQml0cyhuLmRpbVZhbHVlLmxvdz4+PjAsbi5kaW1WYWx1ZS5oaWdoPj4+MCkudG9OdW1iZXIoKTpuLmRpbVZhbHVlLHMub25lb2ZzJiYoaS52YWx1ZT0iZGltVmFsdWUiKSksbi5kaW1QYXJhbSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZGltUGFyYW0iKSYmKGkuZGltUGFyYW09bi5kaW1QYXJhbSxzLm9uZW9mcyYmKGkudmFsdWU9ImRpbVBhcmFtIikpLG4uZGVub3RhdGlvbiE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYoaS5kZW5vdGF0aW9uPW4uZGVub3RhdGlvbiksaX0sby5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxnZS51dGlsLnRvSlNPTk9wdGlvbnMpfSxvLmdldFR5cGVVcmw9ZnVuY3Rpb24obil7cmV0dXJuIG49PT12b2lkIDAmJihuPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksbisiL29ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24ifSxvfSgpLHR9KCksYS5UeXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe2lmKGUpZm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49MDtuPHIubGVuZ3RoOysrbillW3Jbbl1dIT1udWxsJiYodGhpc1tyW25dXT1lW3Jbbl1dKX10LnByb3RvdHlwZS50ZW5zb3JUeXBlPW51bGwsdC5wcm90b3R5cGUuc2VxdWVuY2VUeXBlPW51bGwsdC5wcm90b3R5cGUubWFwVHlwZT1udWxsLHQucHJvdG90eXBlLm9wdGlvbmFsVHlwZT1udWxsLHQucHJvdG90eXBlLnNwYXJzZVRlbnNvclR5cGU9bnVsbCx0LnByb3RvdHlwZS5kZW5vdGF0aW9uPSIiO3ZhciBvO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInZhbHVlIix7Z2V0Omcub25lT2ZHZXR0ZXIobz1bInRlbnNvclR5cGUiLCJzZXF1ZW5jZVR5cGUiLCJtYXBUeXBlIiwib3B0aW9uYWxUeXBlIiwic3BhcnNlVGVuc29yVHlwZSJdKSxzZXQ6Zy5vbmVPZlNldHRlcihvKX0pLHQuY3JlYXRlPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcgdChyKX0sdC5lbmNvZGU9ZnVuY3Rpb24ocixuKXtyZXR1cm4gbnx8KG49UGUuY3JlYXRlKCkpLHIudGVuc29yVHlwZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwociwidGVuc29yVHlwZSIpJiZoLm9ubnguVHlwZVByb3RvLlRlbnNvci5lbmNvZGUoci50ZW5zb3JUeXBlLG4udWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLHIuc2VxdWVuY2VUeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyLCJzZXF1ZW5jZVR5cGUiKSYmaC5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5lbmNvZGUoci5zZXF1ZW5jZVR5cGUsbi51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCksci5tYXBUeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyLCJtYXBUeXBlIikmJmgub25ueC5UeXBlUHJvdG8uTWFwLmVuY29kZShyLm1hcFR5cGUsbi51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCksci5kZW5vdGF0aW9uIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyLCJkZW5vdGF0aW9uIikmJm4udWludDMyKDUwKS5zdHJpbmcoci5kZW5vdGF0aW9uKSxyLnNwYXJzZVRlbnNvclR5cGUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsInNwYXJzZVRlbnNvclR5cGUiKSYmaC5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZW5jb2RlKHIuc3BhcnNlVGVuc29yVHlwZSxuLnVpbnQzMig2NikuZm9yaygpKS5sZGVsaW0oKSxyLm9wdGlvbmFsVHlwZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwociwib3B0aW9uYWxUeXBlIikmJmgub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZW5jb2RlKHIub3B0aW9uYWxUeXBlLG4udWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpLG59LHQuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKHIsbil7cmV0dXJuIHRoaXMuZW5jb2RlKHIsbikubGRlbGltKCl9LHQuZGVjb2RlPWZ1bmN0aW9uKHIsbil7ciBpbnN0YW5jZW9mIE58fChyPU4uY3JlYXRlKHIpKTtmb3IodmFyIHM9bj09PXZvaWQgMD9yLmxlbjpyLnBvcytuLGk9bmV3IGgub25ueC5UeXBlUHJvdG87ci5wb3M8czspe3ZhciB1PXIudWludDMyKCk7c3dpdGNoKHU+Pj4zKXtjYXNlIDE6e2kudGVuc29yVHlwZT1oLm9ubnguVHlwZVByb3RvLlRlbnNvci5kZWNvZGUocixyLnVpbnQzMigpKTticmVha31jYXNlIDQ6e2kuc2VxdWVuY2VUeXBlPWgub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZGVjb2RlKHIsci51aW50MzIoKSk7YnJlYWt9Y2FzZSA1OntpLm1hcFR5cGU9aC5vbm54LlR5cGVQcm90by5NYXAuZGVjb2RlKHIsci51aW50MzIoKSk7YnJlYWt9Y2FzZSA5OntpLm9wdGlvbmFsVHlwZT1oLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmRlY29kZShyLHIudWludDMyKCkpO2JyZWFrfWNhc2UgODp7aS5zcGFyc2VUZW5zb3JUeXBlPWgub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLmRlY29kZShyLHIudWludDMyKCkpO2JyZWFrfWNhc2UgNjp7aS5kZW5vdGF0aW9uPXIuc3RyaW5nKCk7YnJlYWt9ZGVmYXVsdDpyLnNraXBUeXBlKHUmNyk7YnJlYWt9fXJldHVybiBpfSx0LmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihyKXtyZXR1cm4gciBpbnN0YW5jZW9mIE58fChyPW5ldyBOKHIpKSx0aGlzLmRlY29kZShyLHIudWludDMyKCkpfSx0LnZlcmlmeT1mdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im9iamVjdCJ8fHI9PT1udWxsKXJldHVybiJvYmplY3QgZXhwZWN0ZWQiO3ZhciBuPXt9O2lmKHIudGVuc29yVHlwZSE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpKXtuLnZhbHVlPTE7e3ZhciBzPWgub25ueC5UeXBlUHJvdG8uVGVuc29yLnZlcmlmeShyLnRlbnNvclR5cGUpO2lmKHMpcmV0dXJuInRlbnNvclR5cGUuIitzfX1pZihyLnNlcXVlbmNlVHlwZSE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgic2VxdWVuY2VUeXBlIikpe2lmKG4udmFsdWU9PT0xKXJldHVybiJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtuLnZhbHVlPTE7e3ZhciBzPWgub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UudmVyaWZ5KHIuc2VxdWVuY2VUeXBlKTtpZihzKXJldHVybiJzZXF1ZW5jZVR5cGUuIitzfX1pZihyLm1hcFR5cGUhPW51bGwmJnIuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSl7aWYobi52YWx1ZT09PTEpcmV0dXJuInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO24udmFsdWU9MTt7dmFyIHM9aC5vbm54LlR5cGVQcm90by5NYXAudmVyaWZ5KHIubWFwVHlwZSk7aWYocylyZXR1cm4ibWFwVHlwZS4iK3N9fWlmKHIub3B0aW9uYWxUeXBlIT1udWxsJiZyLmhhc093blByb3BlcnR5KCJvcHRpb25hbFR5cGUiKSl7aWYobi52YWx1ZT09PTEpcmV0dXJuInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO24udmFsdWU9MTt7dmFyIHM9aC5vbm54LlR5cGVQcm90by5PcHRpb25hbC52ZXJpZnkoci5vcHRpb25hbFR5cGUpO2lmKHMpcmV0dXJuIm9wdGlvbmFsVHlwZS4iK3N9fWlmKHIuc3BhcnNlVGVuc29yVHlwZSE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29yVHlwZSIpKXtpZihuLnZhbHVlPT09MSlyZXR1cm4idmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7bi52YWx1ZT0xO3t2YXIgcz1oLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci52ZXJpZnkoci5zcGFyc2VUZW5zb3JUeXBlKTtpZihzKXJldHVybiJzcGFyc2VUZW5zb3JUeXBlLiIrc319cmV0dXJuIHIuZGVub3RhdGlvbiE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYhZy5pc1N0cmluZyhyLmRlbm90YXRpb24pPyJkZW5vdGF0aW9uOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihyKXtpZihyIGluc3RhbmNlb2YgaC5vbm54LlR5cGVQcm90bylyZXR1cm4gcjt2YXIgbj1uZXcgaC5vbm54LlR5cGVQcm90bztpZihyLnRlbnNvclR5cGUhPW51bGwpe2lmKHR5cGVvZiByLnRlbnNvclR5cGUhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnRlbnNvclR5cGU6IG9iamVjdCBleHBlY3RlZCIpO24udGVuc29yVHlwZT1oLm9ubnguVHlwZVByb3RvLlRlbnNvci5mcm9tT2JqZWN0KHIudGVuc29yVHlwZSl9aWYoci5zZXF1ZW5jZVR5cGUhPW51bGwpe2lmKHR5cGVvZiByLnNlcXVlbmNlVHlwZSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uc2VxdWVuY2VUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTtuLnNlcXVlbmNlVHlwZT1oLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmZyb21PYmplY3Qoci5zZXF1ZW5jZVR5cGUpfWlmKHIubWFwVHlwZSE9bnVsbCl7aWYodHlwZW9mIHIubWFwVHlwZSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8ubWFwVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7bi5tYXBUeXBlPWgub25ueC5UeXBlUHJvdG8uTWFwLmZyb21PYmplY3Qoci5tYXBUeXBlKX1pZihyLm9wdGlvbmFsVHlwZSE9bnVsbCl7aWYodHlwZW9mIHIub3B0aW9uYWxUeXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5vcHRpb25hbFR5cGU6IG9iamVjdCBleHBlY3RlZCIpO24ub3B0aW9uYWxUeXBlPWgub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZnJvbU9iamVjdChyLm9wdGlvbmFsVHlwZSl9aWYoci5zcGFyc2VUZW5zb3JUeXBlIT1udWxsKXtpZih0eXBlb2Ygci5zcGFyc2VUZW5zb3JUeXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5zcGFyc2VUZW5zb3JUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTtuLnNwYXJzZVRlbnNvclR5cGU9aC5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZnJvbU9iamVjdChyLnNwYXJzZVRlbnNvclR5cGUpfXJldHVybiByLmRlbm90YXRpb24hPW51bGwmJihuLmRlbm90YXRpb249U3RyaW5nKHIuZGVub3RhdGlvbikpLG59LHQudG9PYmplY3Q9ZnVuY3Rpb24ocixuKXtufHwobj17fSk7dmFyIHM9e307cmV0dXJuIG4uZGVmYXVsdHMmJihzLmRlbm90YXRpb249IiIpLHIudGVuc29yVHlwZSE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgidGVuc29yVHlwZSIpJiYocy50ZW5zb3JUeXBlPWgub25ueC5UeXBlUHJvdG8uVGVuc29yLnRvT2JqZWN0KHIudGVuc29yVHlwZSxuKSxuLm9uZW9mcyYmKHMudmFsdWU9InRlbnNvclR5cGUiKSksci5zZXF1ZW5jZVR5cGUhPW51bGwmJnIuaGFzT3duUHJvcGVydHkoInNlcXVlbmNlVHlwZSIpJiYocy5zZXF1ZW5jZVR5cGU9aC5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS50b09iamVjdChyLnNlcXVlbmNlVHlwZSxuKSxuLm9uZW9mcyYmKHMudmFsdWU9InNlcXVlbmNlVHlwZSIpKSxyLm1hcFR5cGUhPW51bGwmJnIuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSYmKHMubWFwVHlwZT1oLm9ubnguVHlwZVByb3RvLk1hcC50b09iamVjdChyLm1hcFR5cGUsbiksbi5vbmVvZnMmJihzLnZhbHVlPSJtYXBUeXBlIikpLHIuZGVub3RhdGlvbiE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYocy5kZW5vdGF0aW9uPXIuZGVub3RhdGlvbiksci5zcGFyc2VUZW5zb3JUeXBlIT1udWxsJiZyLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3JUeXBlIikmJihzLnNwYXJzZVRlbnNvclR5cGU9aC5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IudG9PYmplY3Qoci5zcGFyc2VUZW5zb3JUeXBlLG4pLG4ub25lb2ZzJiYocy52YWx1ZT0ic3BhcnNlVGVuc29yVHlwZSIpKSxyLm9wdGlvbmFsVHlwZSE9bnVsbCYmci5oYXNPd25Qcm9wZXJ0eSgib3B0aW9uYWxUeXBlIikmJihzLm9wdGlvbmFsVHlwZT1oLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLnRvT2JqZWN0KHIub3B0aW9uYWxUeXBlLG4pLG4ub25lb2ZzJiYocy52YWx1ZT0ib3B0aW9uYWxUeXBlIikpLHN9LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKHIpe3JldHVybiByPT09dm9pZCAwJiYocj0idHlwZS5nb29nbGVhcGlzLmNvbSIpLHIrIi9vbm54LlR5cGVQcm90byJ9LHQuVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyKXtpZihyKWZvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPTA7czxuLmxlbmd0aDsrK3MpcltuW3NdXSE9bnVsbCYmKHRoaXNbbltzXV09cltuW3NdXSl9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPTAsZS5wcm90b3R5cGUuc2hhcGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGUobil9LGUuZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmVsZW1UeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJlbGVtVHlwZSIpJiZzLnVpbnQzMig4KS5pbnQzMihuLmVsZW1UeXBlKSxuLnNoYXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJzaGFwZSIpJiZoLm9ubnguVGVuc29yU2hhcGVQcm90by5lbmNvZGUobi5zaGFwZSxzLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxzfSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihuLHMpe3JldHVybiB0aGlzLmVuY29kZShuLHMpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihuLHMpe24gaW5zdGFuY2VvZiBOfHwobj1OLmNyZWF0ZShuKSk7Zm9yKHZhciBpPXM9PT12b2lkIDA/bi5sZW46bi5wb3Mrcyx1PW5ldyBoLm9ubnguVHlwZVByb3RvLlRlbnNvcjtuLnBvczxpOyl7dmFyIGw9bi51aW50MzIoKTtzd2l0Y2gobD4+PjMpe2Nhc2UgMTp7dS5lbGVtVHlwZT1uLmludDMyKCk7YnJlYWt9Y2FzZSAyOnt1LnNoYXBlPWgub25ueC5UZW5zb3JTaGFwZVByb3RvLmRlY29kZShuLG4udWludDMyKCkpO2JyZWFrfWRlZmF1bHQ6bi5za2lwVHlwZShsJjcpO2JyZWFrfX1yZXR1cm4gdX0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG4gaW5zdGFuY2VvZiBOfHwobj1uZXcgTihuKSksdGhpcy5kZWNvZGUobixuLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24obil7aWYodHlwZW9mIG4hPSJvYmplY3QifHxuPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihuLmVsZW1UeXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYhZy5pc0ludGVnZXIobi5lbGVtVHlwZSkpcmV0dXJuImVsZW1UeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihuLnNoYXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJzaGFwZSIpKXt2YXIgcz1oLm9ubnguVGVuc29yU2hhcGVQcm90by52ZXJpZnkobi5zaGFwZSk7aWYocylyZXR1cm4ic2hhcGUuIitzfXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24obil7aWYobiBpbnN0YW5jZW9mIGgub25ueC5UeXBlUHJvdG8uVGVuc29yKXJldHVybiBuO3ZhciBzPW5ldyBoLm9ubnguVHlwZVByb3RvLlRlbnNvcjtpZihuLmVsZW1UeXBlIT1udWxsJiYocy5lbGVtVHlwZT1uLmVsZW1UeXBlfDApLG4uc2hhcGUhPW51bGwpe2lmKHR5cGVvZiBuLnNoYXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5UZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Muc2hhcGU9aC5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChuLnNoYXBlKX1yZXR1cm4gc30sZS50b09iamVjdD1mdW5jdGlvbihuLHMpe3N8fChzPXt9KTt2YXIgaT17fTtyZXR1cm4gcy5kZWZhdWx0cyYmKGkuZWxlbVR5cGU9MCxpLnNoYXBlPW51bGwpLG4uZWxlbVR5cGUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihpLmVsZW1UeXBlPW4uZWxlbVR5cGUpLG4uc2hhcGUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoInNoYXBlIikmJihpLnNoYXBlPWgub25ueC5UZW5zb3JTaGFwZVByb3RvLnRvT2JqZWN0KG4uc2hhcGUscykpLGl9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKG4pe3JldHVybiBuPT09dm9pZCAwJiYobj0idHlwZS5nb29nbGVhcGlzLmNvbSIpLG4rIi9vbm54LlR5cGVQcm90by5UZW5zb3IifSxlfSgpLHQuU2VxdWVuY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHIpe2lmKHIpZm9yKHZhciBuPU9iamVjdC5rZXlzKHIpLHM9MDtzPG4ubGVuZ3RoOysrcylyW25bc11dIT1udWxsJiYodGhpc1tuW3NdXT1yW25bc11dKX1yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGUobil9LGUuZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmVsZW1UeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJlbGVtVHlwZSIpJiZoLm9ubnguVHlwZVByb3RvLmVuY29kZShuLmVsZW1UeXBlLHMudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLHN9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5jb2RlKG4scykubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKG4scyl7biBpbnN0YW5jZW9mIE58fChuPU4uY3JlYXRlKG4pKTtmb3IodmFyIGk9cz09PXZvaWQgMD9uLmxlbjpuLnBvcytzLHU9bmV3IGgub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7bi5wb3M8aTspe3ZhciBsPW4udWludDMyKCk7c3dpdGNoKGw+Pj4zKXtjYXNlIDE6e3UuZWxlbVR5cGU9aC5vbm54LlR5cGVQcm90by5kZWNvZGUobixuLnVpbnQzMigpKTticmVha31kZWZhdWx0Om4uc2tpcFR5cGUobCY3KTticmVha319cmV0dXJuIHV9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4pe3JldHVybiBuIGluc3RhbmNlb2YgTnx8KG49bmV3IE4obikpLHRoaXMuZGVjb2RlKG4sbi51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuIT0ib2JqZWN0Inx8bj09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYobi5lbGVtVHlwZSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSl7dmFyIHM9aC5vbm54LlR5cGVQcm90by52ZXJpZnkobi5lbGVtVHlwZSk7aWYocylyZXR1cm4iZWxlbVR5cGUuIitzfXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24obil7aWYobiBpbnN0YW5jZW9mIGgub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UpcmV0dXJuIG47dmFyIHM9bmV3IGgub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7aWYobi5lbGVtVHlwZSE9bnVsbCl7aWYodHlwZW9mIG4uZWxlbVR5cGUhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTtzLmVsZW1UeXBlPWgub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChuLmVsZW1UeXBlKX1yZXR1cm4gc30sZS50b09iamVjdD1mdW5jdGlvbihuLHMpe3N8fChzPXt9KTt2YXIgaT17fTtyZXR1cm4gcy5kZWZhdWx0cyYmKGkuZWxlbVR5cGU9bnVsbCksbi5lbGVtVHlwZSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKGkuZWxlbVR5cGU9aC5vbm54LlR5cGVQcm90by50b09iamVjdChuLmVsZW1UeXBlLHMpKSxpfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxuKyIvb25ueC5UeXBlUHJvdG8uU2VxdWVuY2UifSxlfSgpLHQuTWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyKXtpZihyKWZvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPTA7czxuLmxlbmd0aDsrK3MpcltuW3NdXSE9bnVsbCYmKHRoaXNbbltzXV09cltuW3NdXSl9cmV0dXJuIGUucHJvdG90eXBlLmtleVR5cGU9MCxlLnByb3RvdHlwZS52YWx1ZVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGUobil9LGUuZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmtleVR5cGUhPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sImtleVR5cGUiKSYmcy51aW50MzIoOCkuaW50MzIobi5rZXlUeXBlKSxuLnZhbHVlVHlwZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobiwidmFsdWVUeXBlIikmJmgub25ueC5UeXBlUHJvdG8uZW5jb2RlKG4udmFsdWVUeXBlLHMudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLHN9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5jb2RlKG4scykubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKG4scyl7biBpbnN0YW5jZW9mIE58fChuPU4uY3JlYXRlKG4pKTtmb3IodmFyIGk9cz09PXZvaWQgMD9uLmxlbjpuLnBvcytzLHU9bmV3IGgub25ueC5UeXBlUHJvdG8uTWFwO24ucG9zPGk7KXt2YXIgbD1uLnVpbnQzMigpO3N3aXRjaChsPj4+Myl7Y2FzZSAxOnt1LmtleVR5cGU9bi5pbnQzMigpO2JyZWFrfWNhc2UgMjp7dS52YWx1ZVR5cGU9aC5vbm54LlR5cGVQcm90by5kZWNvZGUobixuLnVpbnQzMigpKTticmVha31kZWZhdWx0Om4uc2tpcFR5cGUobCY3KTticmVha319cmV0dXJuIHV9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4pe3JldHVybiBuIGluc3RhbmNlb2YgTnx8KG49bmV3IE4obikpLHRoaXMuZGVjb2RlKG4sbi51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuIT0ib2JqZWN0Inx8bj09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYobi5rZXlUeXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJrZXlUeXBlIikmJiFnLmlzSW50ZWdlcihuLmtleVR5cGUpKXJldHVybiJrZXlUeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihuLnZhbHVlVHlwZSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgidmFsdWVUeXBlIikpe3ZhciBzPWgub25ueC5UeXBlUHJvdG8udmVyaWZ5KG4udmFsdWVUeXBlKTtpZihzKXJldHVybiJ2YWx1ZVR5cGUuIitzfXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24obil7aWYobiBpbnN0YW5jZW9mIGgub25ueC5UeXBlUHJvdG8uTWFwKXJldHVybiBuO3ZhciBzPW5ldyBoLm9ubnguVHlwZVByb3RvLk1hcDtpZihuLmtleVR5cGUhPW51bGwmJihzLmtleVR5cGU9bi5rZXlUeXBlfDApLG4udmFsdWVUeXBlIT1udWxsKXtpZih0eXBlb2Ygbi52YWx1ZVR5cGUhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLk1hcC52YWx1ZVR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3MudmFsdWVUeXBlPWgub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChuLnZhbHVlVHlwZSl9cmV0dXJuIHN9LGUudG9PYmplY3Q9ZnVuY3Rpb24obixzKXtzfHwocz17fSk7dmFyIGk9e307cmV0dXJuIHMuZGVmYXVsdHMmJihpLmtleVR5cGU9MCxpLnZhbHVlVHlwZT1udWxsKSxuLmtleVR5cGUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoImtleVR5cGUiKSYmKGkua2V5VHlwZT1uLmtleVR5cGUpLG4udmFsdWVUeXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJ2YWx1ZVR5cGUiKSYmKGkudmFsdWVUeXBlPWgub25ueC5UeXBlUHJvdG8udG9PYmplY3Qobi52YWx1ZVR5cGUscykpLGl9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKG4pe3JldHVybiBuPT09dm9pZCAwJiYobj0idHlwZS5nb29nbGVhcGlzLmNvbSIpLG4rIi9vbm54LlR5cGVQcm90by5NYXAifSxlfSgpLHQuT3B0aW9uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHIpe2lmKHIpZm9yKHZhciBuPU9iamVjdC5rZXlzKHIpLHM9MDtzPG4ubGVuZ3RoOysrcylyW25bc11dIT1udWxsJiYodGhpc1tuW3NdXT1yW25bc11dKX1yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGUobil9LGUuZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmVsZW1UeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJlbGVtVHlwZSIpJiZoLm9ubnguVHlwZVByb3RvLmVuY29kZShuLmVsZW1UeXBlLHMudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLHN9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5jb2RlKG4scykubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKG4scyl7biBpbnN0YW5jZW9mIE58fChuPU4uY3JlYXRlKG4pKTtmb3IodmFyIGk9cz09PXZvaWQgMD9uLmxlbjpuLnBvcytzLHU9bmV3IGgub25ueC5UeXBlUHJvdG8uT3B0aW9uYWw7bi5wb3M8aTspe3ZhciBsPW4udWludDMyKCk7c3dpdGNoKGw+Pj4zKXtjYXNlIDE6e3UuZWxlbVR5cGU9aC5vbm54LlR5cGVQcm90by5kZWNvZGUobixuLnVpbnQzMigpKTticmVha31kZWZhdWx0Om4uc2tpcFR5cGUobCY3KTticmVha319cmV0dXJuIHV9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKG4pe3JldHVybiBuIGluc3RhbmNlb2YgTnx8KG49bmV3IE4obikpLHRoaXMuZGVjb2RlKG4sbi51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKG4pe2lmKHR5cGVvZiBuIT0ib2JqZWN0Inx8bj09PW51bGwpcmV0dXJuIm9iamVjdCBleHBlY3RlZCI7aWYobi5lbGVtVHlwZSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSl7dmFyIHM9aC5vbm54LlR5cGVQcm90by52ZXJpZnkobi5lbGVtVHlwZSk7aWYocylyZXR1cm4iZWxlbVR5cGUuIitzfXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24obil7aWYobiBpbnN0YW5jZW9mIGgub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwpcmV0dXJuIG47dmFyIHM9bmV3IGgub25ueC5UeXBlUHJvdG8uT3B0aW9uYWw7aWYobi5lbGVtVHlwZSE9bnVsbCl7aWYodHlwZW9mIG4uZWxlbVR5cGUhPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTtzLmVsZW1UeXBlPWgub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChuLmVsZW1UeXBlKX1yZXR1cm4gc30sZS50b09iamVjdD1mdW5jdGlvbihuLHMpe3N8fChzPXt9KTt2YXIgaT17fTtyZXR1cm4gcy5kZWZhdWx0cyYmKGkuZWxlbVR5cGU9bnVsbCksbi5lbGVtVHlwZSE9bnVsbCYmbi5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKGkuZWxlbVR5cGU9aC5vbm54LlR5cGVQcm90by50b09iamVjdChuLmVsZW1UeXBlLHMpKSxpfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLGdlLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxuKyIvb25ueC5UeXBlUHJvdG8uT3B0aW9uYWwifSxlfSgpLHQuU3BhcnNlVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyKXtpZihyKWZvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPTA7czxuLmxlbmd0aDsrK3MpcltuW3NdXSE9bnVsbCYmKHRoaXNbbltzXV09cltuW3NdXSl9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPTAsZS5wcm90b3R5cGUuc2hhcGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbmV3IGUobil9LGUuZW5jb2RlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHN8fChzPVBlLmNyZWF0ZSgpKSxuLmVsZW1UeXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJlbGVtVHlwZSIpJiZzLnVpbnQzMig4KS5pbnQzMihuLmVsZW1UeXBlKSxuLnNoYXBlIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCJzaGFwZSIpJiZoLm9ubnguVGVuc29yU2hhcGVQcm90by5lbmNvZGUobi5zaGFwZSxzLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxzfSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihuLHMpe3JldHVybiB0aGlzLmVuY29kZShuLHMpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihuLHMpe24gaW5zdGFuY2VvZiBOfHwobj1OLmNyZWF0ZShuKSk7Zm9yKHZhciBpPXM9PT12b2lkIDA/bi5sZW46bi5wb3Mrcyx1PW5ldyBoLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtuLnBvczxpOyl7dmFyIGw9bi51aW50MzIoKTtzd2l0Y2gobD4+PjMpe2Nhc2UgMTp7dS5lbGVtVHlwZT1uLmludDMyKCk7YnJlYWt9Y2FzZSAyOnt1LnNoYXBlPWgub25ueC5UZW5zb3JTaGFwZVByb3RvLmRlY29kZShuLG4udWludDMyKCkpO2JyZWFrfWRlZmF1bHQ6bi5za2lwVHlwZShsJjcpO2JyZWFrfX1yZXR1cm4gdX0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24obil7cmV0dXJuIG4gaW5zdGFuY2VvZiBOfHwobj1uZXcgTihuKSksdGhpcy5kZWNvZGUobixuLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24obil7aWYodHlwZW9mIG4hPSJvYmplY3QifHxuPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihuLmVsZW1UeXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYhZy5pc0ludGVnZXIobi5lbGVtVHlwZSkpcmV0dXJuImVsZW1UeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihuLnNoYXBlIT1udWxsJiZuLmhhc093blByb3BlcnR5KCJzaGFwZSIpKXt2YXIgcz1oLm9ubnguVGVuc29yU2hhcGVQcm90by52ZXJpZnkobi5zaGFwZSk7aWYocylyZXR1cm4ic2hhcGUuIitzfXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24obil7aWYobiBpbnN0YW5jZW9mIGgub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yKXJldHVybiBuO3ZhciBzPW5ldyBoLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtpZihuLmVsZW1UeXBlIT1udWxsJiYocy5lbGVtVHlwZT1uLmVsZW1UeXBlfDApLG4uc2hhcGUhPW51bGwpe2lmKHR5cGVvZiBuLnNoYXBlIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Muc2hhcGU9aC5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChuLnNoYXBlKX1yZXR1cm4gc30sZS50b09iamVjdD1mdW5jdGlvbihuLHMpe3N8fChzPXt9KTt2YXIgaT17fTtyZXR1cm4gcy5kZWZhdWx0cyYmKGkuZWxlbVR5cGU9MCxpLnNoYXBlPW51bGwpLG4uZWxlbVR5cGUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihpLmVsZW1UeXBlPW4uZWxlbVR5cGUpLG4uc2hhcGUhPW51bGwmJm4uaGFzT3duUHJvcGVydHkoInNoYXBlIikmJihpLnNoYXBlPWgub25ueC5UZW5zb3JTaGFwZVByb3RvLnRvT2JqZWN0KG4uc2hhcGUscykpLGl9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKG4pe3JldHVybiBuPT09dm9pZCAwJiYobj0idHlwZS5nb29nbGVhcGlzLmNvbSIpLG4rIi9vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IifSxlfSgpLHR9KCksYS5PcGVyYXRvclNldElkUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG8pe2lmKG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUuZG9tYWluPSIiLHQucHJvdG90eXBlLnZlcnNpb249Zy5Mb25nP2cuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsdC5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUpfSx0LmVuY29kZT1mdW5jdGlvbihlLHIpe3JldHVybiByfHwocj1QZS5jcmVhdGUoKSksZS5kb21haW4hPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZyLnVpbnQzMigxMCkuc3RyaW5nKGUuZG9tYWluKSxlLnZlcnNpb24hPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZlcnNpb24iKSYmci51aW50MzIoMTYpLmludDY0KGUudmVyc2lvbikscn0sdC5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdGhpcy5lbmNvZGUoZSxyKS5sZGVsaW0oKX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSxyKXtlIGluc3RhbmNlb2YgTnx8KGU9Ti5jcmVhdGUoZSkpO2Zvcih2YXIgbj1yPT09dm9pZCAwP2UubGVuOmUucG9zK3Iscz1uZXcgaC5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztlLnBvczxuOyl7dmFyIGk9ZS51aW50MzIoKTtzd2l0Y2goaT4+PjMpe2Nhc2UgMTp7cy5kb21haW49ZS5zdHJpbmcoKTticmVha31jYXNlIDI6e3MudmVyc2lvbj1lLmludDY0KCk7YnJlYWt9ZGVmYXVsdDplLnNraXBUeXBlKGkmNyk7YnJlYWt9fXJldHVybiBzfSx0LmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE58fChlPW5ldyBOKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSx0LnZlcmlmeT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbD8ib2JqZWN0IGV4cGVjdGVkIjplLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFnLmlzU3RyaW5nKGUuZG9tYWluKT8iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiOmUudmVyc2lvbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgidmVyc2lvbiIpJiYhZy5pc0ludGVnZXIoZS52ZXJzaW9uKSYmIShlLnZlcnNpb24mJmcuaXNJbnRlZ2VyKGUudmVyc2lvbi5sb3cpJiZnLmlzSW50ZWdlcihlLnZlcnNpb24uaGlnaCkpPyJ2ZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgaC5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bylyZXR1cm4gZTt2YXIgcj1uZXcgaC5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztyZXR1cm4gZS5kb21haW4hPW51bGwmJihyLmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxlLnZlcnNpb24hPW51bGwmJihnLkxvbmc/KHIudmVyc2lvbj1nLkxvbmcuZnJvbVZhbHVlKGUudmVyc2lvbikpLnVuc2lnbmVkPSExOnR5cGVvZiBlLnZlcnNpb249PSJzdHJpbmciP3IudmVyc2lvbj1wYXJzZUludChlLnZlcnNpb24sMTApOnR5cGVvZiBlLnZlcnNpb249PSJudW1iZXIiP3IudmVyc2lvbj1lLnZlcnNpb246dHlwZW9mIGUudmVyc2lvbj09Im9iamVjdCImJihyLnZlcnNpb249bmV3IGcuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSkscn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZihyLmRlZmF1bHRzKWlmKG4uZG9tYWluPSIiLGcuTG9uZyl7dmFyIHM9bmV3IGcuTG9uZygwLDAsITEpO24udmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nP3MudG9TdHJpbmcoKTpyLmxvbmdzPT09TnVtYmVyP3MudG9OdW1iZXIoKTpzfWVsc2Ugbi52ZXJzaW9uPXIubG9uZ3M9PT1TdHJpbmc/IjAiOjA7cmV0dXJuIGUuZG9tYWluIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxlLnZlcnNpb24hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoInZlcnNpb24iKSYmKHR5cGVvZiBlLnZlcnNpb249PSJudW1iZXIiP24udmVyc2lvbj1yLmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLnZlcnNpb24pOmUudmVyc2lvbjpuLnZlcnNpb249ci5sb25ncz09PVN0cmluZz9nLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS52ZXJzaW9uKTpyLmxvbmdzPT09TnVtYmVyP25ldyBnLkxvbmdCaXRzKGUudmVyc2lvbi5sb3c+Pj4wLGUudmVyc2lvbi5oaWdoPj4+MCkudG9OdW1iZXIoKTplLnZlcnNpb24pLG59LHQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsZ2UudXRpbC50b0pTT05PcHRpb25zKX0sdC5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54Lk9wZXJhdG9yU2V0SWRQcm90byJ9LHR9KCksYS5PcGVyYXRvclN0YXR1cz1mdW5jdGlvbigpe3ZhciB0PXt9LG89T2JqZWN0LmNyZWF0ZSh0KTtyZXR1cm4gb1t0WzBdPSJFWFBFUklNRU5UQUwiXT0wLG9bdFsxXT0iU1RBQkxFIl09MSxvfSgpLGEuRnVuY3Rpb25Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyl7aWYodGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLmF0dHJpYnV0ZT1bXSx0aGlzLmF0dHJpYnV0ZVByb3RvPVtdLHRoaXMubm9kZT1bXSx0aGlzLm9wc2V0SW1wb3J0PVtdLG8pZm9yKHZhciBlPU9iamVjdC5rZXlzKG8pLHI9MDtyPGUubGVuZ3RoOysrcilvW2Vbcl1dIT1udWxsJiYodGhpc1tlW3JdXT1vW2Vbcl1dKX1yZXR1cm4gdC5wcm90b3R5cGUubmFtZT0iIix0LnByb3RvdHlwZS5pbnB1dD1nLmVtcHR5QXJyYXksdC5wcm90b3R5cGUub3V0cHV0PWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS5hdHRyaWJ1dGU9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmF0dHJpYnV0ZVByb3RvPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS5ub2RlPWcuZW1wdHlBcnJheSx0LnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsdC5wcm90b3R5cGUub3BzZXRJbXBvcnQ9Zy5lbXB0eUFycmF5LHQucHJvdG90eXBlLmRvbWFpbj0iIix0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQuZW5jb2RlPWZ1bmN0aW9uKGUscil7aWYocnx8KHI9UGUuY3JlYXRlKCkpLGUubmFtZSE9bnVsbCYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZyLnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksZS5pbnB1dCE9bnVsbCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pci51aW50MzIoMzQpLnN0cmluZyhlLmlucHV0W25dKTtpZihlLm91dHB1dCE9bnVsbCYmZS5vdXRwdXQubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbilyLnVpbnQzMig0Mikuc3RyaW5nKGUub3V0cHV0W25dKTtpZihlLmF0dHJpYnV0ZSE9bnVsbCYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcih2YXIgbj0wO248ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbilyLnVpbnQzMig1MCkuc3RyaW5nKGUuYXR0cmlidXRlW25dKTtpZihlLm5vZGUhPW51bGwmJmUubm9kZS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm5vZGUubGVuZ3RoOysrbiloLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbbl0sci51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5kb2NTdHJpbmchPW51bGwmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZyLnVpbnQzMig2Nikuc3RyaW5nKGUuZG9jU3RyaW5nKSxlLm9wc2V0SW1wb3J0IT1udWxsJiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3IodmFyIG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbiloLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W25dLHIudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKGUuZG9tYWluIT1udWxsJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb21haW4iKSYmci51aW50MzIoODIpLnN0cmluZyhlLmRvbWFpbiksZS5hdHRyaWJ1dGVQcm90byE9bnVsbCYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK24paC5vbm54LkF0dHJpYnV0ZVByb3RvLmVuY29kZShlLmF0dHJpYnV0ZVByb3RvW25dLHIudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiByfSx0LmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHIpe3JldHVybiB0aGlzLmVuY29kZShlLHIpLmxkZWxpbSgpfSx0LmRlY29kZT1mdW5jdGlvbihlLHIpe2UgaW5zdGFuY2VvZiBOfHwoZT1OLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXI9PT12b2lkIDA/ZS5sZW46ZS5wb3MrcixzPW5ldyBoLm9ubnguRnVuY3Rpb25Qcm90bztlLnBvczxuOyl7dmFyIGk9ZS51aW50MzIoKTtzd2l0Y2goaT4+PjMpe2Nhc2UgMTp7cy5uYW1lPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSA0OntzLmlucHV0JiZzLmlucHV0Lmxlbmd0aHx8KHMuaW5wdXQ9W10pLHMuaW5wdXQucHVzaChlLnN0cmluZygpKTticmVha31jYXNlIDU6e3Mub3V0cHV0JiZzLm91dHB1dC5sZW5ndGh8fChzLm91dHB1dD1bXSkscy5vdXRwdXQucHVzaChlLnN0cmluZygpKTticmVha31jYXNlIDY6e3MuYXR0cmlidXRlJiZzLmF0dHJpYnV0ZS5sZW5ndGh8fChzLmF0dHJpYnV0ZT1bXSkscy5hdHRyaWJ1dGUucHVzaChlLnN0cmluZygpKTticmVha31jYXNlIDExOntzLmF0dHJpYnV0ZVByb3RvJiZzLmF0dHJpYnV0ZVByb3RvLmxlbmd0aHx8KHMuYXR0cmlidXRlUHJvdG89W10pLHMuYXR0cmlidXRlUHJvdG8ucHVzaChoLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrfWNhc2UgNzp7cy5ub2RlJiZzLm5vZGUubGVuZ3RofHwocy5ub2RlPVtdKSxzLm5vZGUucHVzaChoLm9ubnguTm9kZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31jYXNlIDg6e3MuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWt9Y2FzZSA5OntzLm9wc2V0SW1wb3J0JiZzLm9wc2V0SW1wb3J0Lmxlbmd0aHx8KHMub3BzZXRJbXBvcnQ9W10pLHMub3BzZXRJbXBvcnQucHVzaChoLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVha31jYXNlIDEwOntzLmRvbWFpbj1lLnN0cmluZygpO2JyZWFrfWRlZmF1bHQ6ZS5za2lwVHlwZShpJjcpO2JyZWFrfX1yZXR1cm4gc30sdC5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOfHwoZT1uZXcgTihlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sdC52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4ib2JqZWN0IGV4cGVjdGVkIjtpZihlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWcuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4ibmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihlLmlucHV0IT1udWxsJiZlLmhhc093blByb3BlcnR5KCJpbnB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSlyZXR1cm4iaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrcilpZighZy5pc1N0cmluZyhlLmlucHV0W3JdKSlyZXR1cm4iaW5wdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihlLm91dHB1dCE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4ib3V0cHV0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciByPTA7cjxlLm91dHB1dC5sZW5ndGg7KytyKWlmKCFnLmlzU3RyaW5nKGUub3V0cHV0W3JdKSlyZXR1cm4ib3V0cHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYoZS5hdHRyaWJ1dGUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZSIpKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpcmV0dXJuImF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrcilpZighZy5pc1N0cmluZyhlLmF0dHJpYnV0ZVtyXSkpcmV0dXJuImF0dHJpYnV0ZTogc3RyaW5nW10gZXhwZWN0ZWQifWlmKGUuYXR0cmlidXRlUHJvdG8hPW51bGwmJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZVByb3RvIikpe2lmKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlUHJvdG8pKXJldHVybiJhdHRyaWJ1dGVQcm90bzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguQXR0cmlidXRlUHJvdG8udmVyaWZ5KGUuYXR0cmlidXRlUHJvdG9bcl0pO2lmKG4pcmV0dXJuImF0dHJpYnV0ZVByb3RvLiIrbn19aWYoZS5ub2RlIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJub2RlIikpe2lmKCFBcnJheS5pc0FycmF5KGUubm9kZSkpcmV0dXJuIm5vZGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHI9MDtyPGUubm9kZS5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguTm9kZVByb3RvLnZlcmlmeShlLm5vZGVbcl0pO2lmKG4pcmV0dXJuIm5vZGUuIitufX1pZihlLmRvY1N0cmluZyE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFnLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKGUub3BzZXRJbXBvcnQhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm9wc2V0SW1wb3J0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXJldHVybiJvcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgcj0wO3I8ZS5vcHNldEltcG9ydC5sZW5ndGg7KytyKXt2YXIgbj1oLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnZlcmlmeShlLm9wc2V0SW1wb3J0W3JdKTtpZihuKXJldHVybiJvcHNldEltcG9ydC4iK259fXJldHVybiBlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJiFnLmlzU3RyaW5nKGUuZG9tYWluKT8iZG9tYWluOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LHQuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgaC5vbm54LkZ1bmN0aW9uUHJvdG8pcmV0dXJuIGU7dmFyIHI9bmV3IGgub25ueC5GdW5jdGlvblByb3RvO2lmKGUubmFtZSE9bnVsbCYmKHIubmFtZT1TdHJpbmcoZS5uYW1lKSksZS5pbnB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmlucHV0OiBhcnJheSBleHBlY3RlZCIpO3IuaW5wdXQ9W107Zm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pci5pbnB1dFtuXT1TdHJpbmcoZS5pbnB1dFtuXSl9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO3Iub3V0cHV0PVtdO2Zvcih2YXIgbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbilyLm91dHB1dFtuXT1TdHJpbmcoZS5vdXRwdXRbbl0pfWlmKGUuYXR0cmlidXRlKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtyLmF0dHJpYnV0ZT1bXTtmb3IodmFyIG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pci5hdHRyaWJ1dGVbbl09U3RyaW5nKGUuYXR0cmlidXRlW25dKX1pZihlLmF0dHJpYnV0ZVByb3RvKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZVByb3RvKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8uYXR0cmlidXRlUHJvdG86IGFycmF5IGV4cGVjdGVkIik7ci5hdHRyaWJ1dGVQcm90bz1bXTtmb3IodmFyIG49MDtuPGUuYXR0cmlidXRlUHJvdG8ubGVuZ3RoOysrbil7aWYodHlwZW9mIGUuYXR0cmlidXRlUHJvdG9bbl0hPSJvYmplY3QiKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5hdHRyaWJ1dGVQcm90bzogb2JqZWN0IGV4cGVjdGVkIik7ci5hdHRyaWJ1dGVQcm90b1tuXT1oLm9ubnguQXR0cmlidXRlUHJvdG8uZnJvbU9iamVjdChlLmF0dHJpYnV0ZVByb3RvW25dKX19aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO3Iubm9kZT1bXTtmb3IodmFyIG49MDtuPGUubm9kZS5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5ub2RlW25dIT0ib2JqZWN0Iil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ubm9kZTogb2JqZWN0IGV4cGVjdGVkIik7ci5ub2RlW25dPWgub25ueC5Ob2RlUHJvdG8uZnJvbU9iamVjdChlLm5vZGVbbl0pfX1pZihlLmRvY1N0cmluZyE9bnVsbCYmKHIuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUub3BzZXRJbXBvcnQpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5vcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiKTtyLm9wc2V0SW1wb3J0PVtdO2Zvcih2YXIgbj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKXtpZih0eXBlb2YgZS5vcHNldEltcG9ydFtuXSE9Im9iamVjdCIpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLm9wc2V0SW1wb3J0OiBvYmplY3QgZXhwZWN0ZWQiKTtyLm9wc2V0SW1wb3J0W25dPWgub25ueC5PcGVyYXRvclNldElkUHJvdG8uZnJvbU9iamVjdChlLm9wc2V0SW1wb3J0W25dKX19cmV0dXJuIGUuZG9tYWluIT1udWxsJiYoci5kb21haW49U3RyaW5nKGUuZG9tYWluKSkscn0sdC50b09iamVjdD1mdW5jdGlvbihlLHIpe3J8fChyPXt9KTt2YXIgbj17fTtpZigoci5hcnJheXN8fHIuZGVmYXVsdHMpJiYobi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLmF0dHJpYnV0ZT1bXSxuLm5vZGU9W10sbi5vcHNldEltcG9ydD1bXSxuLmF0dHJpYnV0ZVByb3RvPVtdKSxyLmRlZmF1bHRzJiYobi5uYW1lPSIiLG4uZG9jU3RyaW5nPSIiLG4uZG9tYWluPSIiKSxlLm5hbWUhPW51bGwmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcz0wO3M8ZS5pbnB1dC5sZW5ndGg7KytzKW4uaW5wdXRbc109ZS5pbnB1dFtzXX1pZihlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKXtuLm91dHB1dD1bXTtmb3IodmFyIHM9MDtzPGUub3V0cHV0Lmxlbmd0aDsrK3Mpbi5vdXRwdXRbc109ZS5vdXRwdXRbc119aWYoZS5hdHRyaWJ1dGUmJmUuYXR0cmlidXRlLmxlbmd0aCl7bi5hdHRyaWJ1dGU9W107Zm9yKHZhciBzPTA7czxlLmF0dHJpYnV0ZS5sZW5ndGg7KytzKW4uYXR0cmlidXRlW3NdPWUuYXR0cmlidXRlW3NdfWlmKGUubm9kZSYmZS5ub2RlLmxlbmd0aCl7bi5ub2RlPVtdO2Zvcih2YXIgcz0wO3M8ZS5ub2RlLmxlbmd0aDsrK3Mpbi5ub2RlW3NdPWgub25ueC5Ob2RlUHJvdG8udG9PYmplY3QoZS5ub2RlW3NdLHIpfWlmKGUuZG9jU3RyaW5nIT1udWxsJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmKG4uZG9jU3RyaW5nPWUuZG9jU3RyaW5nKSxlLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aCl7bi5vcHNldEltcG9ydD1bXTtmb3IodmFyIHM9MDtzPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrcyluLm9wc2V0SW1wb3J0W3NdPWgub25ueC5PcGVyYXRvclNldElkUHJvdG8udG9PYmplY3QoZS5vcHNldEltcG9ydFtzXSxyKX1pZihlLmRvbWFpbiE9bnVsbCYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksZS5hdHRyaWJ1dGVQcm90byYmZS5hdHRyaWJ1dGVQcm90by5sZW5ndGgpe24uYXR0cmlidXRlUHJvdG89W107Zm9yKHZhciBzPTA7czxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK3Mpbi5hdHRyaWJ1dGVQcm90b1tzXT1oLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVQcm90b1tzXSxyKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxnZS51dGlsLnRvSlNPTk9wdGlvbnMpfSx0LmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguRnVuY3Rpb25Qcm90byJ9LHR9KCksYX0oKTtDdS5leHBvcnRzPWh9KTtmdW5jdGlvbiBGcihhLHQpe2lmKCFhKXRocm93IG5ldyBFcnJvcih0eXBlb2YgdD09InN0cmluZyI/dDp0KCkpfWZ1bmN0aW9uIHNuKGEpe3JldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYSl9dmFyIHllLGhyLHBpLFplLGpuLFdlLGl0LFUsYW4sbXIsYnIsZ3IsZmU9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt6bigpO1pvKCk7eWU9QXIoQ3IoKSk7eXIoKTtocj1jbGFzc3tzdGF0aWMgYXJyYXlzRXF1YWwodCxvKXtpZih0Lmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0hPT1vW2VdKXJldHVybiExO3JldHVybiEwfX0scGk9Y2xhc3N7c3RhdGljIHByZXByb2Nlc3NJbnB1dFNoYXBlcyh0LG8pe2xldCBlPXQubGVuZ3RoPT09MT9bMSx0WzBdXTp0LHI9by5sZW5ndGg9PT0xP1tvWzBdLDFdOm87cmV0dXJuW2Uscl19c3RhdGljIHBvc3Rwcm9jZXNzT3V0cHV0U2hhcGUodCxvLGUpe289PT0xJiZ0LnNwbGljZSh0Lmxlbmd0aC0yLDEpLGU9PT0xJiZ0LnBvcCgpfXN0YXRpYyBjYWxjTWF0TXVsU2hhcGUodCxvKXtyZXR1cm4gdFsxXSE9PW9bMF0/dm9pZCAwOlt0WzBdLG9bMV1dfX0sWmU9Y2xhc3MgYXtzdGF0aWMgY2FsY1NoYXBlKHQsbyxlPSExKXtsZXQgcj10Lmxlbmd0aCxuPW8ubGVuZ3RoO2lmKHI9PT0wKXJldHVybiBvO2lmKG49PT0wKXJldHVybiB0O2xldCBzPU1hdGgubWF4KHQubGVuZ3RoLG8ubGVuZ3RoKSxpPW5ldyBBcnJheShzKTtpZihlKXtpZihyPDJ8fG48MilyZXR1cm47bGV0IHU9cGkuY2FsY01hdE11bFNoYXBlKFt0W3ItMl0sdFtyLTFdXSxbb1tuLTJdLG9bbi0xXV0pO2lmKHU9PT12b2lkIDApcmV0dXJuO1tpW3MtMl0saVtzLTFdXT11fWZvcihsZXQgdT1lPzM6MTt1PD1zO3UrKyl7bGV0IGw9ci11PDA/MTp0W3ItdV0sYz1uLXU8MD8xOm9bbi11XTtpZihsIT09YyYmbD4xJiZjPjEpcmV0dXJuO2lbcy11XT1NYXRoLm1heChsLGMpfXJldHVybiBpfXN0YXRpYyBpbmRleCh0LG8pe2xldCBlPW5ldyBBcnJheShvLmxlbmd0aCk7cmV0dXJuIGEuZmlsbEluZGV4KHQsbyxlKSxlfXN0YXRpYyBmaWxsSW5kZXgodCxvLGUpe2xldCByPXQubGVuZ3RoLW8ubGVuZ3RoO2ZvcihsZXQgbj0wO248by5sZW5ndGg7bisrKWVbbl09dFtyK25dJW9bbl19c3RhdGljIGNhbGModCxvLGUscixuKXtsZXQgcz1hLmNhbGNTaGFwZSh0LmRpbXMsby5kaW1zKTtpZihzKXtpZihyJiYhVS5hcmVFcXVhbChzLHQuZGltcykpcmV0dXJuO2xldCBpPVUuc2l6ZShzKSx1PXI/dDpuZXcgJGUocyxufHx0LnR5cGUpO2lmKHMubGVuZ3RoPT09MCl1LnNldChbXSxlKHQuZ2V0KFtdKSxvLmdldChbXSkpKTtlbHNle2xldCBsPW5ldyBBcnJheShzLmxlbmd0aCksYz1uZXcgQXJyYXkodC5kaW1zLmxlbmd0aCkscD1uZXcgQXJyYXkoby5kaW1zLmxlbmd0aCksZD0wLFQ9MCx3PSExLHY9ITE7dC5kaW1zLmxlbmd0aD09PTAmJihkPXQuZ2V0KFtdKSx3PSEwKSxvLmRpbXMubGVuZ3RoPT09MCYmKFQ9by5nZXQoW10pLHY9ITApO2xldCBTO2ZvcihsZXQgQT0wO0E8aTtBKyspe1M9QTtmb3IobGV0IEM9cy5sZW5ndGgtMTtDPj0wO0MtLSlsW0NdPVMlc1tDXSxTPU1hdGguZmxvb3IoUy9zW0NdKTt3fHwoYS5maWxsSW5kZXgobCx0LmRpbXMsYyksZD10LmdldChjKSksdnx8KGEuZmlsbEluZGV4KGwsby5kaW1zLHApLFQ9by5nZXQocCkpLHUuc2V0KGwsZShkLFQpKX19cmV0dXJuIHV9fXN0YXRpYyBpc1ZhbGlkQnJvYWRjYXN0KHQsbyl7bGV0IGU9dC5sZW5ndGgscj1vLmxlbmd0aDtpZihlPnIpcmV0dXJuITE7Zm9yKGxldCBuPTE7bjw9ZTtuKyspaWYodFtlLW5dIT09MSYmdFtlLW5dIT09b1tyLW5dKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBnZXRCcm9hZGNhc3REaW1zKHQsbyl7bGV0IGU9dC5sZW5ndGgscj1bXTtmb3IobGV0IG49MDtuPGU7bisrKXtsZXQgcz1lLTEtbixpPXRbc118fDE7KG9bby5sZW5ndGgtMS1uXXx8MSk+MSYmaT09PTEmJnIudW5zaGlmdChzKX1yZXR1cm4gcn19LGpuPWNsYXNze3N0YXRpYyBnZXRTaGFwZU9mR2VtbVJlc3VsdCh0LG8sZSxyLG4pe2lmKHQubGVuZ3RoIT09Mnx8ZS5sZW5ndGghPT0yKXRocm93IG5ldyBFcnJvcigic2hhcGUgbmVlZCB0byBiZSBvZiBzaXplIDIiKTtsZXQgcyxpLHU7bz8ocz10WzFdLGk9dFswXSk6KHM9dFswXSxpPXRbMV0pO2xldCBsPS0xO2lmKHI/KHU9ZVswXSxsPTEpOih1PWVbMV0sbD0wKSxlW2xdIT09aSl0aHJvdyBuZXcgRXJyb3IoImRpbWVuc2lvbiBtaXNtYXRjaCIpO2lmKHM8PTB8fHU8PTB8fGk8PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNoYXBlIHNwZWNpZmllZCIpO2lmKG4mJiFaZS5pc1ZhbGlkQnJvYWRjYXN0KG4sW3MsdV0pKXRocm93IG5ldyBFcnJvcigiZ2VtbTogaW52YWxpZCBiaWFzIHNoYXBlIGZvciBicm9hZGNhc3QiKTtyZXR1cm5bcyx1LGldfX0sV2U9Y2xhc3MgYXtzdGF0aWMgdGVuc29yRGF0YVR5cGVGcm9tUHJvdG8odCl7c3dpdGNoKHQpe2Nhc2UgeWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiJpbnQ4IjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6cmV0dXJuInVpbnQ4IjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpyZXR1cm4iYm9vbCI7Y2FzZSB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiJpbnQxNiI7Y2FzZSB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4idWludDE2IjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6cmV0dXJuImludDMyIjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOnJldHVybiJ1aW50MzIiO2Nhc2UgeWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4iZmxvYXQzMiI7Y2FzZSB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpyZXR1cm4iZmxvYXQ2NCI7Y2FzZSB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlNUUklORzpyZXR1cm4ic3RyaW5nIjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuImludDMyIjtjYXNlIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiJ1aW50MzIiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7eWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVt0XX1gKX19c3RhdGljIHRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtKHQpe3N3aXRjaCh0KXtjYXNlImludDgiOnJldHVybiB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg7Y2FzZSJ1aW50OCI6cmV0dXJuIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg7Y2FzZSJib29sIjpyZXR1cm4geWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MO2Nhc2UiaW50MTYiOnJldHVybiB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2O2Nhc2UidWludDE2IjpyZXR1cm4geWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY7Y2FzZSJpbnQzMiI6cmV0dXJuIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI7Y2FzZSJ1aW50MzIiOnJldHVybiB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjtjYXNlImZsb2F0MzIiOnJldHVybiB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFO2Nhc2Uic3RyaW5nIjpyZXR1cm4geWUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5TVFJJTkc7Y2FzZSJpbnQ2NCI6cmV0dXJuIHllLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ7Y2FzZSJ1aW50NjQiOnJldHVybiB5ZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke3R9YCl9fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbVByb3RvKHQpe3JldHVybiB0Lm1hcChvPT5WdC5pc0xvbmcobyk/by50b051bWJlcigpOm8pfXN0YXRpYyB0ZW5zb3JWYWx1ZVR5cGVGcm9tUHJvdG8odCl7cmV0dXJue3RlbnNvclR5cGU6YS50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byh0LmVsZW1UeXBlKSxzaGFwZTp7ZGltczphLnRlbnNvckRpbXNGcm9tUHJvdG8odC5zaGFwZS5kaW0ubWFwKG89Pm8uZGltVmFsdWUpKX19fXN0YXRpYyB0ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdCh0KXtsZXQgbz1bXTtmb3IobGV0IGU9MDtlPHQuZGltc0xlbmd0aCgpO2UrKylvLnB1c2goaXQubG9uZ1RvTnVtYmVyKHQuZGltcyhlKSkpO3JldHVybiBvfXN0YXRpYyB0ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdCh0KXtsZXQgbz1bXTtmb3IobGV0IGU9MDtlPHQuYXR0cmlidXRlc0xlbmd0aCgpO2UrKylvLnB1c2godC5hdHRyaWJ1dGVzKGUpKTtyZXR1cm4gb319LGl0PWNsYXNze3N0YXRpYyBsb25nVG9OdW1iZXIodCxvKXtyZXR1cm4gVnQuaXNMb25nKHQpP3QudG9OdW1iZXIoKTp0IGluc3RhbmNlb2YgXy5Mb25nP1Z0LmZyb21WYWx1ZSh7bG93OnQubG93LGhpZ2g6dC5oaWdoLHVuc2lnbmVkOm8/PyExfSkudG9OdW1iZXIoKTp0fXN0YXRpYyBpc0xvbmcodCl7cmV0dXJuIFZ0LmlzTG9uZyh0KXx8dCBpbnN0YW5jZW9mIF8uTG9uZ319LFU9Y2xhc3MgYXtzdGF0aWMgc2l6ZSh0KXtyZXR1cm4gYS5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKHQsMCx0Lmxlbmd0aCl9c3RhdGljIHNpemVGcm9tRGltZW5zaW9uKHQsbyl7aWYobzwwfHxvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHtvfSBmb3Igc2l6ZUZyb21EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke3QubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBhLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UodCxvLHQubGVuZ3RoKX1zdGF0aWMgc2l6ZVRvRGltZW5zaW9uKHQsbyl7aWYobzwwfHxvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkaW1lbnNpb24gb2YgJHtvfSBmb3Igc2l6ZVRvRGltZW5zaW9uIGFzIFRlbnNvciBoYXMgJHt0Lmxlbmd0aH0gZGltZW5zaW9ucy5gKTtyZXR1cm4gYS5nZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKHQsMCxvKX1zdGF0aWMgZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZSh0LG8sZSl7bGV0IHI9MTtmb3IobGV0IG49bztuPGU7bisrKXtpZih0W25dPD0wKXRocm93IG5ldyBFcnJvcigiY2Fubm90IGdldCB2YWxpZCBzaXplIGZyb20gc3BlY2lmaWVkIGRpbWVuc2lvbiByYW5nZS4gTW9zdCBsaWtlbHkgdGhlIHJhbmdlIGNvbnRhaW5zIDAgb3IgbmVnYXRpdmUgdmFsdWVzIGluIHRoZW0uIik7cio9dFtuXX1yZXR1cm4gcn1zdGF0aWMgY29tcHV0ZVN0cmlkZXModCl7bGV0IG89dC5sZW5ndGg7aWYobz09PTApcmV0dXJuW107aWYobz09PTEpcmV0dXJuWzFdO2xldCBlPW5ldyBBcnJheShvKTtlW28tMV09MSxlW28tMl09dFtvLTFdO2ZvcihsZXQgcj1vLTM7cj49MDstLXIpZVtyXT1lW3IrMV0qdFtyKzFdO3JldHVybiBlfXN0YXRpYyB0cmFuc3Bvc2UodCl7cmV0dXJuIHQuc2xpY2UoKS5yZXZlcnNlKCl9c3RhdGljIGluZGljZXNUb09mZnNldCh0LG8sZSl7ZT09PXZvaWQgMCYmKGU9dC5sZW5ndGgpO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlOysrbilyKz1vW25dKnRbbl07cmV0dXJuIHJ9c3RhdGljIG9mZnNldFRvSW5kaWNlcyh0LG8pe2xldCBlPW8ubGVuZ3RoO2lmKGU9PT0wKXJldHVybltdO2lmKGU9PT0xKXJldHVyblt0Km9bMF1dO2xldCByPW5ldyBBcnJheShvLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aC0xOysrbilyW25dPU1hdGguZmxvb3IodC9vW25dKSx0LT1yW25dKm9bbl07cmV0dXJuIHJbci5sZW5ndGgtMV09dCxyfXN0YXRpYyBub3JtYWxpemVBeGlzKHQsbyl7aWYodDwtbyYmdD49byl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGF4aXMgZm9yIHRoaXMgb3BlcmF0aW9uLiIpO3JldHVybiB0PDA/dCtvOnR9c3RhdGljIG5vcm1hbGl6ZUF4ZXModCxvKXtyZXR1cm4gdC5tYXAoZT0+dGhpcy5ub3JtYWxpemVBeGlzKGUsbykpfXN0YXRpYyBpbmNyZW1lbnRJbmRleCh0LG8sZSl7aWYoby5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJJbmRleCBpbmNyZW1lbnRpbmcgdW5zdXBwb3J0ZWQgZm9yIHNjYWxhciBUZW5zb3IiKTtpZihlPT09dm9pZCAwKWU9by5sZW5ndGg7ZWxzZSBpZihlPD0wfHxlPm8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5jb3JyZWN0IGF4aXMgdG8gaW5jcmVtZW50IG9uIik7Zm9yKGxldCByPWUtMTtyPj0wJiYodFtyXSsrLCEodFtyXTxvW3JdKSk7LS1yKXRbcl09MH1zdGF0aWMgY2FsY3VsYXRlUmVzaGFwZWREaW1zKHQsbyl7aWYoby5sZW5ndGg9PT0wKXtpZih0Lmxlbmd0aD09PTB8fGEuc2l6ZSh0KT09PTEpcmV0dXJuW107dGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgcmVzaGFwZSB0byBhIHNjYWxhciBUZW5zb3IiKX1sZXQgZT1vLmxlbmd0aCxyPW5ldyBBcnJheShlKSxuPS0xLHM9MTtmb3IobGV0IHU9MDt1PGU7dSsrKXtpZihvW3VdPC0xKXRocm93IG5ldyBFcnJvcigiYSBkaW1lbnNpb24gaW4gc2hhcGUgaGludHMgY2Fubm90IGJlIGxlc3MgdGhhbiAtMSIpO2lmKG9bdV09PT0tMSl7aWYobiE9PS0xKXRocm93IG5ldyBFcnJvcigiYXQgbW9zdCBvbmUgZGltZW5zaW9uIGluIHNoYXBlIGhpbnRzIGNhbiBiZSAtMSIpO249dX1lbHNle2lmKG9bdV09PT0wKXtpZih1Pj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBkaW1lbnNpb24gd2l0aCB2YWx1ZSB6ZXJvIGV4Y2VlZHMgdGhlIGRpbWVuc2lvbiBzaXplIG9mIHRoZSBpbnB1dCB0ZW5zb3IiKTtyW3VdPXRbdV19ZWxzZSByW3VdPW9bdV07cyo9clt1XX19bGV0IGk9YS5zaXplKHQpO2lmKG4hPT0tMSl7aWYoaSVzIT09MCl0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnB1dCB0ZW5zb3IgY2Fubm90IGJlIHJlc2hhcGVkIHRvIHRoZSByZXF1ZXN0ZWQgc2hhcGUuIElucHV0IHNoYXBlOiBbJHt0fV0gT3V0cHV0IHNoYXBlOiBbJHtvfV1gKTtyW25dPWkvc31lbHNlIGlmKHMhPT1pKXRocm93IG5ldyBFcnJvcigicmVzaGFwZWREaW1zIGFuZCBvcmlnaW5hbERpbXMgZG9uJ3QgaGF2ZSBtYXRjaGluZyBzaXplcyIpO3JldHVybiByfXN0YXRpYyBzb3J0QmFzZWRPblBlcm0odCxvKXtyZXR1cm4gbz9vLm1hcChlPT50W2VdKTp0LnNsaWNlKCkucmV2ZXJzZSgpfXN0YXRpYyBwYWRTaGFwZSh0LG8pe2xldCBlPXQubGVuZ3RoO3JldHVybiB0Lm1hcCgocixuKT0+citvW25dK29bbitlXSl9c3RhdGljIGFyZUVxdWFsKHQsbyl7cmV0dXJuIHQubGVuZ3RoIT09by5sZW5ndGg/ITE6dC5ldmVyeSgoZSxyKT0+ZT09PW9bcl0pfXN0YXRpYyB2YWxpZGF0ZURpbXNBbmRDYWxjU2l6ZSh0KXtpZih0Lmxlbmd0aD42KXRocm93IG5ldyBUeXBlRXJyb3IoIk9ubHkgcmFuayAwIHRvIDYgaXMgc3VwcG9ydGVkIGZvciB0ZW5zb3Igc2hhcGUuIik7bGV0IG89MTtmb3IobGV0IGUgb2YgdCl7aWYoIU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBzaGFwZTogJHtlfSBpcyBub3QgYW4gaW50ZWdlcmApO2lmKGU8MHx8ZT4yMTQ3NDgzNjQ3KXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6IGxlbmd0aCAke2V9IGlzIG5vdCBhbGxvd2VkYCk7byo9ZX1yZXR1cm4gb31zdGF0aWMgZmxhdHRlblNoYXBlKHQsbyl7bzwwJiYobys9dC5sZW5ndGgpO2xldCBlPXQucmVkdWNlKChzLGkpPT5zKmksMSkscj10LnNsaWNlKG8pLnJlZHVjZSgocyxpKT0+cyppLDEpO3JldHVybltlL3Iscl19c3RhdGljIHNxdWVlemVTaGFwZSh0LG8pe2xldCBlPW5ldyBBcnJheTtvPWEubm9ybWFsaXplQXhlcyhvLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7bGV0IG49by5pbmRleE9mKHIpPj0wO2lmKG4mJnRbcl0hPT0xKXRocm93IG5ldyBFcnJvcigic3F1ZWV6ZSBhbiBheGlzIG9mIHNpemUgZGlmZmVyZW50IHRoYW4gMSIpOyhvLmxlbmd0aD09PTAmJnRbcl0+MXx8by5sZW5ndGg+MCYmIW4pJiZlLnB1c2godFtyXSl9cmV0dXJuIGV9c3RhdGljIHVuc3F1ZWV6ZVNoYXBlKHQsbyl7bGV0IGU9bmV3IEFycmF5KHQubGVuZ3RoK28ubGVuZ3RoKTtlLmZpbGwoMCk7Zm9yKGxldCBuPTA7bjxvLmxlbmd0aDtuKyspe2xldCBzPWEubm9ybWFsaXplQXhpcyhvW25dLGUubGVuZ3RoKTtpZihzPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYW4gb3V0IG9mIHJhbmdlIGF4aXMiKTtpZihlW3NdIT09MCl0aHJvdyBuZXcgRXJyb3IoIidheGVzJyBoYXMgYSBkdXBsaWNhdGUgYXhpcyIpO2Vbc109MX1sZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl09PT0wJiYoZVtuXT10W3IrK10pO2lmKHIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSB1bnNxdWVlemVkIGRpbWVuc2lvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQiKTtyZXR1cm4gZX19LGFuPWNsYXNzIGF7c3RhdGljIHNwbGl0U2hhcGUodCxvLGUscil7aWYoZS5sZW5ndGg9PT0wKXtpZighcil0aHJvdyBuZXcgRXJyb3IoIm5lZWQgdG8ga25vdyBudW1iZXIgb2Ygb3V0cHV0cyB3aGVuIHRoZSAnc3BsaXQnIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIik7YS5kZXRlcm1pbmVTcGxpdCh0W29dLHIsZSl9bGV0IG49W10scz1bMF07Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDsrK2kpe2khPT0wJiZzLnB1c2goc1tpLTFdK2VbaS0xXSk7bGV0IHU9dC5zbGljZSgpO3Vbb109ZVtpXSxuLnB1c2godSl9cmV0dXJuW24sc119c3RhdGljIGRldGVybWluZVNwbGl0KHQsbyxlKXtpZih0JW8hPT0wKXRocm93IG5ldyBFcnJvcigiY2Fubm90IHNwbGl0IHRlbnNvciB0byBlcXVhbCBzaXplZCBwYXJ0cyIpO2ZvcihsZXQgcj0wO3I8bzsrK3IpZS5wdXNoKHQvbyl9fSxtcj1jbGFzcyBhe3N0YXRpYyBhZGp1c3RQb29sQXR0cmlidXRlcyh0LG8sZSxyLG4scyl7aWYoIXQmJmUubGVuZ3RoIT09by5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzcGVjaWZpZWQga2VybmVsIHNoYXBlcyBzaG91bGQgYmUgMiBsZXNzIHRoYW4gbGVuZ3RoIG9mIGlucHV0IGRpbWVuc2lvbnMiKTtpZih0KWZvcihsZXQgaT0wO2k8by5sZW5ndGgtMjtpKyspaT49ZS5sZW5ndGg/ZS5wdXNoKG9baSsyXSk6ZVtpXT1vW2krMl07Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspaWYoaTxyLmxlbmd0aCl7aWYocltpXTwwKXRocm93IG5ldyBFcnJvcigic3RyaWRlcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKX1lbHNlIHIucHVzaCgxKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylpZihpPG4ubGVuZ3RoKXtpZihuW2ldPDApdGhyb3cgbmV3IEVycm9yKCJkaWxhdGlvbnMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBuLnB1c2goMSk7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aCoyO2krKylpZihpPHMubGVuZ3RoKXtpZihzW2ldPDApdGhyb3cgbmV3IEVycm9yKCJwYWQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBzLnB1c2goMCk7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2lmKGVbaV08PTApdGhyb3cgbmV3IEVycm9yKCJrZXJuZWwgc2hhcGVzIG5lZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAiKTtpZihzW2ldPj1lW2ldfHxzW2krZS5sZW5ndGhdPj1lW2ldKXRocm93IG5ldyBFcnJvcigicGFkcyBzaG91bGQgYmUgc21hbGxlciB0aGFuIGtlcm5lbCIpfX1zdGF0aWMgYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKHQsbyxlLHIsbixzKXtpZihzKXtpZihuLmxlbmd0aCE9PTIqKHQubGVuZ3RoLTIpKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHBhZHMgc2hvdWxkIGJlIHR3aWNlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYoby5sZW5ndGghPT10Lmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHN0cmlkZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYoci5sZW5ndGghPT10Lmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aC0yO2krKylhLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKHRbaSsyXSxvW2ldLGVbaV0scltpXSxuLGksaSt0Lmxlbmd0aC0yLHMpfX1zdGF0aWMgY29tcHV0ZVBvb2xPdXRwdXRTaGFwZSh0LG8sZSxyLG4scyxpKXtpZihvLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHNoYXBlIG11c3QgYmUgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gMCIpO2xldCB1PVtvWzBdLG9bMV1dO3JldHVybiBhLmNvbXB1dGVTaGFwZUhlbHBlcih0LG8sdSxlLHIsbixzLGkpLHV9c3RhdGljIGNvbXB1dGVDb252T3V0cHV0U2hhcGUodCxvLGUscixuLHMsaSl7aWYodC5sZW5ndGg8PTB8fG8ubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgZGltcyBvciBpbnZhbGlkIGZpbHRlciB0ZW5zb3IgZGltcyIpO2xldCB1PVt0WzBdLG9bMF1dO3JldHVybiBhLmNvbXB1dGVTaGFwZUhlbHBlcighMSx0LHUsZSxyLG4scyxpKSx1fXN0YXRpYyBjb21wdXRlU2hhcGVIZWxwZXIodCxvLGUscixuLHMsaSx1KXtpZih0KWZvcihsZXQgbD0wO2w8by5sZW5ndGgtMjtsKyspZS5wdXNoKDEpO2Vsc2UgZm9yKGxldCBsPTA7bDxvLmxlbmd0aC0yO2wrKyllLnB1c2goYS5hZGp1c3RQYWRBbmRSZXR1cm5TaGFwZShvW2wrMl0scltsXSxuW2xdLHNbbF0saSxsLGwrby5sZW5ndGgtMix1KSl9c3RhdGljIGFkanVzdFBhZEFuZFJldHVyblNoYXBlKHQsbyxlLHIsbixzLGksdSl7bGV0IGw9ZSooci0xKSsxO2lmKHUmJnUhPT0iTk9UU0VUIilzd2l0Y2godSl7Y2FzZSJWQUxJRCI6cmV0dXJuIG5bc109MCxuW2ldPTAsTWF0aC5mbG9vcigodC1sKS9vKzEpO2Nhc2UiU0FNRV9MT1dFUiI6Y2FzZSJTQU1FX1VQUEVSIjppZihlIT09MSl0aHJvdyBuZXcgRXJyb3IoIkRpbGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIFNBTUVfVVBQRVIgb3IgU0FNRV9MT1dFUiIpO3tsZXQgcD0oKHQrby0xKS9vLTEpKm8rci10O3JldHVybiBuW3NdPU1hdGguZmxvb3IodT09PSJTQU1FX0xPV0VSIj8ocCsxKS8yOnAvMiksbltpXT1wLW5bc10sTWF0aC5mbG9vcigodCtwLXIpL28rMSl9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIEF1dG9QYWQgdHlwZSIpfWVsc2UgcmV0dXJuIE1hdGguZmxvb3IoKHQrbltzXStuW2ldLWwpL28rMSl9fSxicj0tMzQwMjgyMzQ2NjM4NTI4ODZlMjIsZ3I9MzQwMjgyMzQ2NjM4NTI4ODZlMjJ9KTtmdW5jdGlvbiBIZChhKXtzd2l0Y2goYSl7Y2FzZSJib29sIjpjYXNlImludDgiOmNhc2UidWludDgiOnJldHVybiAxO2Nhc2UiaW50MTYiOmNhc2UidWludDE2IjpyZXR1cm4gMjtjYXNlImludDMyIjpjYXNlInVpbnQzMiI6Y2FzZSJmbG9hdDMyIjpyZXR1cm4gNDtjYXNlImZsb2F0NjQiOnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHthfWApfX1mdW5jdGlvbiBGdShhKXtzd2l0Y2goYSl7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiAxO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiAyO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4gNDtjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHtuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2FdfWApfX1mdW5jdGlvbiBxZChhLHQpe3JldHVybiBuZXcoQnUodCkpKGEpfWZ1bmN0aW9uIEJ1KGEpe3N3aXRjaChhKXtjYXNlImJvb2wiOmNhc2UidWludDgiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlImludDE2IjpyZXR1cm4gSW50MTZBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5zcGVjaWZpZWQgZXJyb3IiKX19ZnVuY3Rpb24gaGkoYSx0KXtpZih0PT09bmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NHx8dD09PWRpLlRlbnNvckRhdGFUeXBlLklOVDY0KXtpZihhLmdyZWF0ZXJUaGFuT3JFcXVhbCgyMTQ3NDgzNjQ4KXx8YS5sZXNzVGhhbigtMjE0NzQ4MzY0OCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW50NjQgaXMgbm90IHN1cHBvcnRlZCIpfWVsc2UgaWYodD09PW5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyfHx0PT09ZGkuVGVuc29yRGF0YVR5cGUuVUlOVDMyfHx0PT09bmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjR8fHQ9PT1kaS5UZW5zb3JEYXRhVHlwZS5VSU5UNjQpe2lmKGEuZ3JlYXRlclRoYW5PckVxdWFsKDQyOTQ5NjcyOTYpfHxhLmxlc3NUaGFuKDApKXRocm93IG5ldyBUeXBlRXJyb3IoInVpbnQ2NCBpcyBub3Qgc3VwcG9ydGVkIil9ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBub3QgYSBMT05HIHR5cGU6ICR7bmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZVt0XX1gKTtyZXR1cm4gYS50b051bWJlcigpfWZ1bmN0aW9uICR1KGEsdCxvKXtzd2l0Y2godCl7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OnJldHVybiBhLmdldFVpbnQ4KG8pO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiBhLmdldEludDgobyk7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQxNjpyZXR1cm4gYS5nZXRVaW50MTYobywhMCk7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiBhLmdldEludDE2KG8sITApO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4gYS5nZXRGbG9hdDMyKG8sITApO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gYS5nZXRJbnQzMihvLCEwKTtjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOnJldHVybiBhLmdldFVpbnQzMihvLCEwKTtjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuIGhpKFZ0LmZyb21CaXRzKGEuZ2V0VWludDMyKG8sITApLGEuZ2V0VWludDMyKG8rNCwhMCksITEpLHQpO2Nhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6cmV0dXJuIGEuZ2V0RmxvYXQ2NChvLCEwKTtjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiBoaShWdC5mcm9tQml0cyhhLmdldFVpbnQzMihvLCEwKSxhLmdldFVpbnQzMihvKzQsITApLCEwKSx0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlYWQgZnJvbSBEYXRhVmlldyBmb3IgdHlwZSAke25lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbdF19YCl9fXZhciBrdSxuZSxkaSwkZSx5cj1MKCgpPT57InVzZSBzdHJpY3QiO2t1PUFyKE9zKCkpO1pvKCk7dG4oKTtuZT1BcihDcigpKTtmZSgpO2RpPVYuZXhwZXJpbWVudGFsLmZicywkZT1jbGFzcyBhe2NvbnN0cnVjdG9yKHQsbyxlLHIsbixzPWt1Lkd1aWQuY3JlYXRlKCkpe3RoaXMuZGltcz10O3RoaXMudHlwZT1vO3RoaXMuZGF0YVByb3ZpZGVyPWU7dGhpcy5hc3luY0RhdGFQcm92aWRlcj1yO3RoaXMuY2FjaGU9bjt0aGlzLmRhdGFJZD1zO3RoaXMuc2l6ZT1VLnZhbGlkYXRlRGltc0FuZENhbGNTaXplKHQpO2xldCBpPXRoaXMuc2l6ZSx1PWU9PT12b2lkIDAmJnI9PT12b2lkIDAmJm49PT12b2lkIDA7aWYobiE9PXZvaWQgMCYmbi5sZW5ndGghPT1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBkaW1zIGRvZXNuJ3QgbWF0Y2ggZGF0YSBsZW5ndGguIik7aWYobz09PSJzdHJpbmciKXtpZihuIT09dm9pZCAwJiYoIUFycmF5LmlzQXJyYXkobil8fCFuLmV2ZXJ5KGw9PnR5cGVvZiBsPT0ic3RyaW5nIikpKXRocm93IG5ldyBUeXBlRXJyb3IoImNhY2hlIHNob3VsZCBiZSBhIHN0cmluZyBhcnJheSIpO3UmJih0aGlzLmNhY2hlPW5ldyBBcnJheShpKSl9ZWxzZXtpZihuIT09dm9pZCAwKXtsZXQgbD1CdShvKTtpZighKG4gaW5zdGFuY2VvZiBsKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBjYWNoZSBzaG91bGQgYmUgdHlwZSAke2wubmFtZX1gKX1pZih1KXtsZXQgbD1uZXcgQXJyYXlCdWZmZXIoaSpIZChvKSk7dGhpcy5jYWNoZT1xZChsLG8pfX19Z2V0IGRhdGEoKXtpZih0aGlzLmNhY2hlPT09dm9pZCAwKXtsZXQgdD10aGlzLmRhdGFQcm92aWRlcih0aGlzLmRhdGFJZCk7aWYodC5sZW5ndGghPT10aGlzLnNpemUpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggb2YgZGF0YSBwcm92aWRlZCBieSB0aGUgRGF0YSBQcm92aWRlciBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgZGltcyBvZiB0aGlzIFRlbnNvci4iKTt0aGlzLmNhY2hlPXR9cmV0dXJuIHRoaXMuY2FjaGV9Z2V0IHN0cmluZ0RhdGEoKXtpZih0aGlzLnR5cGUhPT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IHN0cmluZyIpO3JldHVybiB0aGlzLmRhdGF9Z2V0IGludGVnZXJEYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJ1aW50OCI6Y2FzZSJpbnQ4IjpjYXNlInVpbnQxNiI6Y2FzZSJpbnQxNiI6Y2FzZSJpbnQzMiI6Y2FzZSJ1aW50MzIiOmNhc2UiYm9vbCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgaW50ZWdlciAodWludDgsIGludDgsIHVpbnQxNiwgaW50MTYsIGludDMyLCB1aW50MzIsIGJvb2wpIil9fWdldCBmbG9hdERhdGEoKXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImZsb2F0MzIiOmNhc2UiZmxvYXQ2NCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgZmxvYXQgKGZsb2F0MzIsIGZsb2F0NjQpIil9fWdldCBudW1iZXJEYXRhKCl7aWYodGhpcy50eXBlIT09InN0cmluZyIpcmV0dXJuIHRoaXMuZGF0YTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlIGNhbm5vdCBiZSBub24tbnVtYmVyIChzdHJpbmcpIil9Z2V0KHQpe3JldHVybiB0aGlzLmRhdGFbVS5pbmRpY2VzVG9PZmZzZXQodCx0aGlzLnN0cmlkZXMpXX1zZXQodCxvKXt0aGlzLmRhdGFbVS5pbmRpY2VzVG9PZmZzZXQodCx0aGlzLnN0cmlkZXMpXT1vfWFzeW5jIGdldERhdGEoKXtyZXR1cm4gdGhpcy5jYWNoZT09PXZvaWQgMCYmKHRoaXMuY2FjaGU9YXdhaXQgdGhpcy5hc3luY0RhdGFQcm92aWRlcih0aGlzLmRhdGFJZCkpLHRoaXMuY2FjaGV9Z2V0IHN0cmlkZXMoKXtyZXR1cm4gdGhpcy5fc3RyaWRlc3x8KHRoaXMuX3N0cmlkZXM9VS5jb21wdXRlU3RyaWRlcyh0aGlzLmRpbXMpKSx0aGlzLl9zdHJpZGVzfXN0YXRpYyBmcm9tUHJvdG8odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7bGV0IG89V2UudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8odC5kYXRhVHlwZSksZT1XZS50ZW5zb3JEaW1zRnJvbVByb3RvKHQuZGltcykscj1uZXcgYShlLG8pO2lmKG89PT0ic3RyaW5nIil0LnN0cmluZ0RhdGEuZm9yRWFjaCgobixzKT0+e3IuZGF0YVtzXT1zbihuKX0pO2Vsc2UgaWYodC5yYXdEYXRhJiZ0eXBlb2YgdC5yYXdEYXRhLmJ5dGVMZW5ndGg9PSJudW1iZXIiJiZ0LnJhd0RhdGEuYnl0ZUxlbmd0aD4wKXtsZXQgbj1yLmRhdGEscz1uZXcgRGF0YVZpZXcodC5yYXdEYXRhLmJ1ZmZlcix0LnJhd0RhdGEuYnl0ZU9mZnNldCx0LnJhd0RhdGEuYnl0ZUxlbmd0aCksaT1GdSh0LmRhdGFUeXBlKSx1PXQucmF3RGF0YS5ieXRlTGVuZ3RoL2k7aWYodC5yYXdEYXRhLmJ5dGVMZW5ndGglaSE9PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJ1ZmZlciBsZW5ndGgiKTtpZihuLmxlbmd0aCE9PXUpdGhyb3cgbmV3IEVycm9yKCJidWZmZXIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKGxldCBsPTA7bDx1O2wrKyl7bGV0IGM9JHUocyx0LmRhdGFUeXBlLGwqaSk7bltsXT1jfX1lbHNle2xldCBuO3N3aXRjaCh0LmRhdGFUeXBlKXtjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRkxPQVQ6bj10LmZsb2F0RGF0YTticmVhaztjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OmNhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ4OmNhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOm49dC5pbnQzMkRhdGE7YnJlYWs7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0Om49dC5pbnQ2NERhdGE7YnJlYWs7Y2FzZSBuZS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpuPXQuZG91YmxlRGF0YTticmVhaztjYXNlIG5lLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDMyOmNhc2UgbmUub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6bj10LnVpbnQ2NERhdGE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVuc3BlY2lmaWMgZXJyb3IiKX1pZihuPT1udWxsKXRocm93IG5ldyBFcnJvcigiZmFpbGVkIHRvIHBvcHVsYXRlIGRhdGEgZnJvbSBhIHRlbnNvcnByb3RvIHZhbHVlIik7bGV0IHM9ci5kYXRhO2lmKHMubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhcnJheSBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IHU9bltpXTtWdC5pc0xvbmcodSk/c1tpXT1oaSh1LHQuZGF0YVR5cGUpOnNbaV09dX19cmV0dXJuIHJ9c3RhdGljIGZyb21EYXRhKHQsbyxlKXtyZXR1cm4gbmV3IGEobyxlLHZvaWQgMCx2b2lkIDAsdCl9c3RhdGljIGZyb21PcnRUZW5zb3IodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7bGV0IG89V2UudGVuc29yRGltc0Zyb21PUlRGb3JtYXQodCksZT1XZS50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byh0LmRhdGFUeXBlKCkpLHI9bmV3IGEobyxlKTtpZihlPT09InN0cmluZyIpZm9yKGxldCBuPTA7bjx0LnN0cmluZ0RhdGFMZW5ndGgoKTtuKyspci5kYXRhW25dPXQuc3RyaW5nRGF0YShuKTtlbHNlIGlmKHQucmF3RGF0YUFycmF5KCkmJnR5cGVvZiB0LnJhd0RhdGFMZW5ndGgoKT09Im51bWJlciImJnQucmF3RGF0YUxlbmd0aCgpPjApe2xldCBuPXIuZGF0YSxzPW5ldyBEYXRhVmlldyh0LnJhd0RhdGFBcnJheSgpLmJ1ZmZlcix0LnJhd0RhdGFBcnJheSgpLmJ5dGVPZmZzZXQsdC5yYXdEYXRhTGVuZ3RoKCkpLGk9RnUodC5kYXRhVHlwZSgpKSx1PXQucmF3RGF0YUxlbmd0aCgpL2k7aWYodC5yYXdEYXRhTGVuZ3RoKCklaSE9PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJ1ZmZlciBsZW5ndGgiKTtpZihuLmxlbmd0aCE9PXUpdGhyb3cgbmV3IEVycm9yKCJidWZmZXIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKGxldCBsPTA7bDx1O2wrKyl7bGV0IGM9JHUocyx0LmRhdGFUeXBlKCksbCppKTtuW2xdPWN9fXJldHVybiByfX19KTtmdW5jdGlvbiBIKGEpe3JldHVybiBhPT09MT9qZDpZZH1mdW5jdGlvbiBOdShhKXtsZXQgdD1IKGEpO3JldHVybmAke3QudmVyc2lvbn0KICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAke3QuYXR0cmlidXRlfSB2ZWMzIHBvc2l0aW9uOwogICAgICAke3QuYXR0cmlidXRlfSB2ZWMyIHRleHR1cmVDb29yZDsKCiAgICAgICR7dC52YXJ5aW5nVmVydGV4fSB2ZWMyIFRleENvb3JkczsKCiAgICAgIHZvaWQgbWFpbigpCiAgICAgIHsKICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMS4wKTsKICAgICAgICAgIFRleENvb3JkcyA9IHRleHR1cmVDb29yZDsKICAgICAgfWB9ZnVuY3Rpb24gUnUoYSl7bGV0IHQ9SChhKTtyZXR1cm5gJHt0LnZlcnNpb259CiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICBwcmVjaXNpb24gaGlnaHAgaW50OwogICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDsKICAgICR7dC52YXJ5aW5nRnJhZ30gdmVjMiBUZXhDb29yZHM7CiAgICAke3Qub3V0cHV0RGVjbGFyYXRpb259CiAgICBjb25zdCB2ZWMyIGhhbGZDUiA9IHZlYzIoMC41LCAwLjUpOwoKICAgIC8vIEN1c3RvbSB2ZWN0b3IgdHlwZXMgdG8gaGFuZGxlIGhpZ2hlciBkaW1lbmFsaXRpZXMuCiAgICBzdHJ1Y3QgaXZlYzUKICAgIHsKICAgICAgaW50IHg7CiAgICAgIGludCB5OwogICAgICBpbnQgejsKICAgICAgaW50IHc7CiAgICAgIGludCB1OwogICAgfTsKCiAgICBzdHJ1Y3QgaXZlYzYKICAgIHsKICAgICAgaW50IHg7CiAgICAgIGludCB5OwogICAgICBpbnQgejsKICAgICAgaW50IHc7CiAgICAgIGludCB1OwogICAgICBpbnQgdjsKICAgIH07CgogICAgaW50IGltb2QoaW50IHgsIGludCB5KSB7CiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7CiAgICB9CgogICAgYH1mdW5jdGlvbiBNdShhLHQpe2xldCBvPUgoYSk7cmV0dXJuYAogIHZvaWQgbWFpbigpIHsKICAgIGludCBpbmRpY2VzWyR7dH1dOwogICAgdG9WZWMoVGV4Q29vcmRzLCBpbmRpY2VzKTsKICAgIHZlYzQgcmVzdWx0ID0gdmVjNChwcm9jZXNzKGluZGljZXMpKTsKICAgICR7by5vdXRwdXR9ID0gcmVzdWx0OwogIH0KICBgfXZhciBqZCxZZCx3ZT1MKCgpPT57InVzZSBzdHJpY3QiO2pkPXt2ZXJzaW9uOiIiLGF0dHJpYnV0ZToiYXR0cmlidXRlIix2YXJ5aW5nVmVydGV4OiJ2YXJ5aW5nIix2YXJ5aW5nRnJhZzoidmFyeWluZyIsdGV4dHVyZTJEOiJ0ZXh0dXJlMkQiLG91dHB1dDoiZ2xfRnJhZ0NvbG9yIixvdXRwdXREZWNsYXJhdGlvbjoiIn0sWWQ9e3ZlcnNpb246IiN2ZXJzaW9uIDMwMCBlcyIsYXR0cmlidXRlOiJpbiIsdmFyeWluZ1ZlcnRleDoib3V0Iix2YXJ5aW5nRnJhZzoiaW4iLHRleHR1cmUyRDoidGV4dHVyZSIsb3V0cHV0OiJvdXRwdXRDb2xvciIsb3V0cHV0RGVjbGFyYXRpb246Im91dCB2ZWM0IG91dHB1dENvbG9yOyJ9fSk7dmFyIGFlPUwoKCk9PnsidXNlIHN0cmljdCJ9KTthc3luYyBmdW5jdGlvbiBtaShhLHQ9ZT0+MCxvKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscik9PntsZXQgbj0wLHM9KCk9PntpZihhKCkpe2UoKTtyZXR1cm59bisrO2xldCBpPXQobik7aWYobyE9bnVsbCYmbj49byl7cigpO3JldHVybn1zZXRUaW1lb3V0KHMsaSl9O3MoKX0pfWZ1bmN0aW9uIFluKGEpe3JldHVybiBGcih0eXBlb2YgYTwidSImJmEubGVuZ3RoIT09MCwoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIiksImdldCIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpfWZ1bmN0aW9uIEd1KGEpe3JldHVybiBGcih0eXBlb2YgYTwidSImJmEubGVuZ3RoIT09MCwoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIiksImdldCIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnNsaWNlKDEpKyJBdE91dENvb3JkcyJ9ZnVuY3Rpb24gJHIoYSx0KXtsZXQgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEpKTtyZXR1cm4gbz10LG99ZnVuY3Rpb24ga3IoYSx0KXtyZXR1cm4gdC5tYXAobz0+YVtvXSkuam9pbigiLCAiKX1mdW5jdGlvbiBRZShhKXtpZihhPD0xKXJldHVybiJpbnQiO2lmKGE9PT0yKXJldHVybiJpdmVjMiI7aWYoYT09PTMpcmV0dXJuIml2ZWMzIjtpZihhPT09NClyZXR1cm4iaXZlYzQiO2lmKGE9PT01KXJldHVybiJpdmVjNSI7aWYoYT09PTYpcmV0dXJuIml2ZWM2Ijt0aHJvdyBFcnJvcihgR1BVIGZvciByYW5rICR7YX0gaXMgbm90IHlldCBzdXBwb3J0ZWRgKX1mdW5jdGlvbiBEdChhPTYpe3JldHVyblsieCIsInkiLCJ6IiwidyIsInUiLCJ2Il0uc2xpY2UoMCxhKX12YXIgQnQ9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtmZSgpfSk7ZnVuY3Rpb24gWGQoYSx0KXtyZXR1cm4gRHQodCkubWFwKG89PmAke2F9LiR7b31gKX1mdW5jdGlvbiBCcihhLHQpe3JldHVybiB0PT09MT9bYV06WGQoYSx0KX1mdW5jdGlvbiBOdCgpe3JldHVybmAKICAgIGZsb2F0IGdldENoYW5uZWwodmVjNCBmcmFnLCBpbnQgZGltKSB7CiAgICAgIGludCBtb2RDb29yZCA9IGltb2QoZGltLCAyKTsKICAgICAgcmV0dXJuIG1vZENvb3JkID09IDAgPyBmcmFnLnIgOiBmcmFnLmc7CiAgICB9CgogICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIHZlYzIgaW5uZXJEaW1zKSB7CiAgICAgIHZlYzIgbW9kQ29vcmQgPSBtb2QoaW5uZXJEaW1zLCAyLik7CiAgICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID8KICAgICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuciA6IGZyYWcuZykgOgogICAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5iIDogZnJhZy5hKTsKICAgIH0KICBgfXZhciBUcj1MKCgpPT57InVzZSBzdHJpY3QiO0J0KCl9KTtmdW5jdGlvbiBKZChhLHQsbyl7aWYoYT09PTApcmV0dXJuImZhbHNlIjtpZihhPT09MSlyZXR1cm5gcmMgPiAke3RbMF19YDtsZXQgZT0iIjtmb3IobGV0IHI9YS0yO3I8YTtyKyspZSs9YCR7b1tyXX0gPj0gJHt0W3ItYSsyXX1gLHI8YS0xJiYoZSs9Inx8Iik7cmV0dXJuIGV9ZnVuY3Rpb24gWmQoYSx0KXtsZXQgbz1hLmxlbmd0aDtpZihvPT09MClyZXR1cm4iZ2V0QSgpLCAwLCAwLCAwIjtpZihvPT09MSlyZXR1cm5gZ2V0QShyYyksCiAgICAgICAgICAgIHJjICsgMSA+PSAke2FbMF19ID8gMC4gOiBnZXRBKHJjICsgMSksCiAgICAgICAgICAgIDAsIDBgO2xldCBlPSJyLCBjIixyPSJyLCBjcDEiLG49InJwMSwgYyIscz0icnAxLCBjcDEiLGk9IiI7aWYobz4yKWZvcihsZXQgdT0wO3U8by0yOysrdSlpPWkrYCR7dFt1XX0sYDtyZXR1cm5gZ2V0QSgke2l9JHtlfSksCiAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke2l9JHtufSksCiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke2l9JHtyfSksCiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke2l9JHtzfSlgfWZ1bmN0aW9uIFFkKGEsdCxvLGUpe3JldHVybiBhPT09MHx8YT09PTE/IiI6YAogICAgaW50IHIgPSAke3RbYS0yXX07CiAgICBpbnQgYyA9ICR7dFthLTFdfTsKICAgIGludCBycDEgPSAke3RbYS0yXX0gKyAxOwogICAgaW50IGNwMSA9ICR7dFthLTFdfSArIDE7CiAgICBib29sIHJFZGdlID0gcnAxID49ICR7ZX07CiAgICBib29sIGNFZGdlID0gY3AxID49ICR7b307CiAgICBgfXZhciBVdSxLZCx6dSxWdT1MKCgpPT57InVzZSBzdHJpY3QiO3dlKCk7YWUoKTtCdCgpO1RyKCk7VXU9e25hbWU6InBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbMV19LEtkPShhLHQpPT57bGV0IG89SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZT10LmRpbXMscj1lLmxlbmd0aCxuPXQuZGltcy5sZW5ndGgscz1RZShuKSxpPUJyKCJyYyIsbiksdT1RZChuLGksZVtlLmxlbmd0aC0yXSxlW2UubGVuZ3RoLTFdKSxsO3I9PT0wP2w9WzEsMV06cj09PTE/bD1bZVswXSwxXTpsPVtlW24tMV0sZVtuLTJdXTtsZXQgYz1KZChuLGwsaSkscD1aZChlLGkpLGQ9YAogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICR7c30gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTsKCiAgICAgICAgICBpZigke2N9KSB7CiAgICAgICAgICAgICR7by5vdXRwdXR9ID0gdmVjNCgwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR7dX0KCiAgICAgICAgICAgICR7by5vdXRwdXR9ID0gdmVjNCgke3B9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIGA7cmV0dXJuey4uLlV1LGhhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZToyfSxzaGFkZXJTb3VyY2U6ZH19LHp1PShhLHQpPT4oey4uLlV1LGdldDooKT0+S2QoYSx0KX0pfSk7ZnVuY3Rpb24gYmkoYSl7aWYoYS5sZW5ndGg9PT0wKXJldHVyblsxLDEsMV07bGV0IHQ9MTtmb3IobGV0IG89MDtvPGEubGVuZ3RoLTI7KytvKXQqPWFbb107cmV0dXJuW3QsYS5sZW5ndGg+MT9hW2EubGVuZ3RoLTJdOjEsYVthLmxlbmd0aC0xXV19ZnVuY3Rpb24gSHUoYSx0KXtsZXQgbz0hMTtyZXR1cm4gYS5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTA/bz0hMDphLmxlbmd0aDwyfHx0Lmxlbmd0aDwyP289YVthLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV06bz1hW2EubGVuZ3RoLTFdPT09dFt0Lmxlbmd0aC0xXSYmYVthLmxlbmd0aC0yXT09PXRbdC5sZW5ndGgtMl0sb31mdW5jdGlvbiByaChhKXtsZXQgdD1VLmNvbXB1dGVTdHJpZGVzKGEpLG89WyJiIiwiciIsImMiXSxlPSJpbmRleCI7cmV0dXJuYAogICAgaXZlYzMgaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoaW50IGluZGV4KSB7CiAgICAgICR7dC5tYXAoKG4scyk9PntsZXQgaT1gaW50ICR7b1tzXX0gPSAke2V9IC8gJHtufWAsdT1zPT09dC5sZW5ndGgtMT9gaW50ICR7b1tzKzFdfSA9ICR7ZX0gLSAke29bc119ICogJHtufWA6YGluZGV4IC09ICR7b1tzXX0gKiAke259YDtyZXR1cm5gJHtpfTsgJHt1fTtgfSkuam9pbigiIil9CiAgICAgIHJldHVybiBpdmVjMyhiLCByLCBjKTsKICAgIH0KICBgfWZ1bmN0aW9uIG5oKGEpe2xldCB0PVUuY29tcHV0ZVN0cmlkZXMoYSk7cmV0dXJuYAogIGludCBnZXRGbGF0dGVuZWRJbmRleChpdmVjMyBjb29yZHMpIHsKICAgIC8vIHJldmVyc2UgeSwgeiBvcmRlcgogICAgcmV0dXJuIGNvb3Jkcy54ICogJHt0WzBdfSArIGNvb3Jkcy56ICogJHt0WzFdfSArIGNvb3Jkcy55OwogIH0KYH12YXIgZWgsdGgsV3UscXU9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtmZSgpO3dlKCk7YWUoKTtUcigpO2VoPWE9Pih7bmFtZToiUmVzaGFwZSAocGFja2VkKSIsaW5wdXRUeXBlczpbMl0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6YCR7YX1gfSksdGg9KGEsdCxvLGUpPT57bGV0IHI9dC5kaW1zLG49ZSxzPSIiO2ZvcihsZXQgbD0wO2w8NDtsKyspe2xldCBjPSIiO3N3aXRjaChsKXtjYXNlIDA6Yz0ib3V0cHV0Q29vcmRzID0gcmM7IjticmVhaztjYXNlIDE6Yz0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSsxLCByYy56KTsiO2JyZWFrO2Nhc2UgMjpjPSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55LCByYy56KzEpOyI7YnJlYWs7Y2FzZSAzOmM9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueisxKTsiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yfXMrPWAKICAgICAgICAke2N9CiAgICAgICAgJHtsPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9CiAgICAgICAgICBpbnQgZmxhdHRlbmVkSW5kZXggPSBnZXRGbGF0dGVuZWRJbmRleChvdXRwdXRDb29yZHMpOwoKICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7CiAgICAgICAgICB2ZWMyIGlubmVyRGltcyA9IHZlYzIoZmxvYXQoaW5wdXRSQy55KSxmbG9hdChpbnB1dFJDLnopKTsKCiAgICAgICAgICByZXN1bHRbJHtsfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7CgogICAgICAgICR7bD4wPyJ9IjoiIn0KICAgICAgYH1sZXQgaT1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx1PWAKICAgICAgJHtyaChyKX0KICAgICAgJHtuaChuKX0KICAgICAgJHtOdCgpfQoKICAgICAgdm9pZCBtYWluKCkgewogICAgICAgIGl2ZWMzIHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7CgogICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApOwoKICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7CiAgICAgICAgaW50IHJvd3MgPSAke25bMl19OwogICAgICAgIGludCBjb2xzID0gJHtuWzFdfTsKCiAgICAgICAgJHtzfQogICAgICAgICR7aS5vdXRwdXR9ID0gcmVzdWx0OwogICAgICB9CiAgICBgO3JldHVybnsuLi5vLG91dHB1dDp7ZGltczpuLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOjJ9LHNoYWRlclNvdXJjZTp1LGhhc01haW46ITB9fSxXdT0oYSx0LG8pPT57bGV0IGU9ZWgobyk7cmV0dXJuey4uLmUsZ2V0OigpPT50aChhLHQsZSxvKX19fSk7dmFyIGdpLGp1PUwoKCk9PnsidXNlIHN0cmljdCI7d2UoKTthZSgpO2dpPShhLHQpPT57bGV0IG89dC5zaGFwZSxlPUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLHI9YAogICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODsKICAgIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4OwoKICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7CiAgICAgIHJldHVybiAodmFsIDwgMS4wIHx8IDAuMCA8IHZhbCB8fCB2YWwgPT0gMC4wKSA/IGZhbHNlIDogdHJ1ZTsKICAgIH0KCiAgICBoaWdocCB2ZWM0IGVuY29kZUFzVWludDgoaGlnaHAgZmxvYXQgdikgewogICAgICBpZiAoaXNOYU4odikpIHsKICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpOwogICAgICB9CgogICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTsKCiAgICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7CiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTsKICAgICAgfSBlbHNlIGlmKHYgPiBGTE9BVF9NQVgpIHsKICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wOwogICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHsKICAgICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgIDEyOC4wLCAyNTUuMCkgLyAyNTUuMDsKICAgICAgfQoKICAgICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTsKCiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7CiAgICAgIGhpZ2hwIGZsb2F0IG0gPSBleHAyKGZyYWN0KGxvZzIoYXYpKSkgLSAxLjA7CgogICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTsKICAgICAgbSAtPSBjWzJdIC8gMTI4LjA7CiAgICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7CiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7CiAgICAgIGNbMF0gPSBmbG9vcig4Mzg4NjA4LjAgKiBtKTsKCiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wOwogICAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApOwogICAgICBlYmlhcyAtPSBjWzNdICogMi4wOwogICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wOwoKICAgICAgY1szXSArPSAxMjguMCAqIHN0ZXAoMC4wLCAtdik7CgogICAgICByZXR1cm4gYyAvIDI1NS4wOwogICAgfQoKICAgIHZvaWQgbWFpbigpIHsKICAgICAgZmxvYXQgdmFsdWUgPSAke2UudGV4dHVyZTJEfShYLFRleENvb3JkcykucjsKICAgICAgJHtlLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTsKICAgIH1gLG49e25hbWU6IlVpbnQ4RW5jb2RlIixpbnB1dFR5cGVzOlswXSxpbnB1dE5hbWVzOlsiWCJdLG91dHB1dDp7ZGltczpvLHR5cGU6dC50ZW5zb3IudHlwZSx0ZXh0dXJlVHlwZTozfSxzaGFkZXJTb3VyY2U6cixoYXNNYWluOiEwfTtyZXR1cm4gYS5leGVjdXRlUHJvZ3JhbShuLFt0LnRlbnNvcl0pfX0pO2Z1bmN0aW9uIGloKGEsdCl7aWYoYT09PTEpcmV0dXJuInJjIjtsZXQgbz0iIjtmb3IobGV0IGU9MDtlPGE7ZSsrKW8rPXRbZV0sZTxhLTEmJihvKz0iLCIpO3JldHVybiBvfXZhciBZdSxvaCxYdSxLdT1MKCgpPT57InVzZSBzdHJpY3QiO3dlKCk7YWUoKTtCdCgpO1RyKCk7WXU9e25hbWU6InVucGFjayIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOlsyXX0sb2g9KGEsdCk9PntsZXQgbz10LmRpbXMubGVuZ3RoLGU9QnIoInJjIixvKSxyPWUuc2xpY2UoLTIpLG49UWUobykscz1OdCgpLHU9dC5kaW1zLmxlbmd0aD09PTA/IiI6aWgobyxlKSxsPW88PTE/InJjIjpgdmVjMigke3Iuam9pbigiLCIpfSlgLGM9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscD1gCiAgICAke3N9CiAgICB2b2lkIG1haW4oKSB7CiAgICAgICR7bn0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTsKCiAgICAgICAvLyBTYW1wbGUgdGhlIHRleHR1cmUgd2l0aCB0aGUgY29vcmRzIHRvIGdldCB0aGUgcmdiYSBjaGFubmVsIHZhbHVlLgogICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHt1fSk7CgogICAgICAgJHtjLm91dHB1dH0gPSB2ZWM0KGdldENoYW5uZWwocGFja2VkSW5wdXQsICR7bH0pLCAwLCAwLCAwKTsKICAgICB9CiAgIGA7cmV0dXJuey4uLll1LGhhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTowfSxzaGFkZXJTb3VyY2U6cH19LFh1PShhLHQpPT4oey4uLll1LGdldDooKT0+b2goYSx0KX0pfSk7dmFyIFhuLHVuLEtuLGxuPUwoKCk9PnsidXNlIHN0cmljdCI7bHQoKTtYbj1jbGFzc3tjb25zdHJ1Y3Rvcih0LG89MSl7aWYobz09PTEpdGhpcy5pbnRlcm5hbEZvcm1hdD10LlIzMkYsdGhpcy5mb3JtYXQ9dC5SRUQsdGhpcy50ZXh0dXJlVHlwZT10LkZMT0FULHRoaXMuY2hhbm5lbFNpemU9bztlbHNlIGlmKG89PT00KXRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5SR0JBMzJGLHRoaXMuZm9ybWF0PXQuUkdCQSx0aGlzLnRleHR1cmVUeXBlPXQuRkxPQVQsdGhpcy5jaGFubmVsU2l6ZT1vO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsczogJHtvfWApfWVuY29kZSh0LG8pe2xldCBlLHI7cmV0dXJuIHQuY29uc3RydWN0b3IhPT1GbG9hdDMyQXJyYXkmJihjZS53YXJuaW5nKCJFbmNvZGVyIiwiZGF0YSB3YXMgbm90IG9mIHR5cGUgRmxvYXQzMjsgY3JlYXRpbmcgbmV3IEZsb2F0MzJBcnJheSIpLHI9bmV3IEZsb2F0MzJBcnJheSh0KSksbyp0aGlzLmNoYW5uZWxTaXplPnQubGVuZ3RoPyhjZS53YXJuaW5nKCJFbmNvZGVyIiwiU291cmNlIGRhdGEgdG9vIHNtYWxsLiBBbGxvY2F0aW5nIGxhcmdlciBhcnJheSIpLHI9dCxlPXRoaXMuYWxsb2NhdGUobyp0aGlzLmNoYW5uZWxTaXplKSxyLmZvckVhY2goKG4scyk9PmVbc109bikpOihyPXQsZT1yKSxlfWFsbG9jYXRlKHQpe3JldHVybiBuZXcgRmxvYXQzMkFycmF5KHQqNCl9ZGVjb2RlKHQsbyl7cmV0dXJuIHRoaXMuY2hhbm5lbFNpemU9PT0xP3QuZmlsdGVyKChyLG4pPT5uJTQ9PT0wKS5zdWJhcnJheSgwLG8pOnQuc3ViYXJyYXkoMCxvKX19LHVuPWNsYXNze2NvbnN0cnVjdG9yKHQsbz0xLGUpe2lmKG8hPT0xJiZvIT09NCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAke299YCk7dGhpcy5pbnRlcm5hbEZvcm1hdD10LlJHQkEsdGhpcy5mb3JtYXQ9dC5SR0JBLHRoaXMuY2hhbm5lbFNpemU9byx0aGlzLnRleHR1cmVUeXBlPWV8fHQuRkxPQVR9ZW5jb2RlKHQsbyl7bGV0IGU9dDtyZXR1cm4gdGhpcy5jaGFubmVsU2l6ZT09PTEmJihjZS52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxlPXRoaXMuYWxsb2NhdGUobyksdC5mb3JFYWNoKChyLG4pPT5lW24qNF09cikpLGV9YWxsb2NhdGUodCl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkodCo0KX1kZWNvZGUodCxvKXtyZXR1cm4gdGhpcy5jaGFubmVsU2l6ZT09PTE/dC5maWx0ZXIoKHIsbik9Pm4lND09PTApLnN1YmFycmF5KDAsbyk6dC5zdWJhcnJheSgwLG8pfX0sS249Y2xhc3N7Y29uc3RydWN0b3IodCxvPTEpe3RoaXMuY2hhbm5lbFNpemU9NDtpZihvPT09MSl0aGlzLmludGVybmFsRm9ybWF0PXQuQUxQSEEsdGhpcy5mb3JtYXQ9dC5BTFBIQSx0aGlzLnRleHR1cmVUeXBlPXQuVU5TSUdORURfQllURSx0aGlzLmNoYW5uZWxTaXplPW87ZWxzZSBpZihvPT09NCl0aGlzLmludGVybmFsRm9ybWF0PXQuUkdCQSx0aGlzLmZvcm1hdD10LlJHQkEsdGhpcy50ZXh0dXJlVHlwZT10LlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT1vO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsczogJHtvfWApfWVuY29kZSh0LG8pe3JldHVybiBuZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX1hbGxvY2F0ZSh0KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodCp0aGlzLmNoYW5uZWxTaXplKX1kZWNvZGUodCxvKXtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gdC5zdWJhcnJheSgwLG8pO3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSB0eXBlOiAke3QuY29uc3RydWN0b3J9YCl9fX0pO3ZhciBmbixKdSx5aSxadT1MKCgpPT57InVzZSBzdHJpY3QiO2ZlKCk7YWUoKTtmbj0oYSx0LG8pPT57bGV0IGU9bz09PTB8fG89PT0xPzE6NCxyPW89PT0yLG49bz09PTF8fG89PT0yLHM9bz09PTQ/dC5sZW5ndGgtMTp2b2lkIDAsaT1vPT09ND90Lm1hcCgodSxsKT0+bD09PXQubGVuZ3RoLTE/dSo0OnUpOnZvaWQgMDtyZXR1cm4geWkoYSx0LGUsaSx7aXNQYWNrZWQ6cixyZXZlcnNlV0g6bixicmVha0F4aXM6c30pfSxKdT0oYSx0LG8pPT57bGV0IGU9Zm4oYSx0LG8pO3JldHVybltlLndpZHRoLGUuaGVpZ2h0XX0seWk9KGEsdCxvPTEsZSxyKT0+e2xldCBuPSEhKHImJnIuaXNQYWNrZWQpLFtzLGldPWEuY29tcHV0ZVRleHR1cmVXSChuJiZlfHx0LHIpLHU9dC5sZW5ndGgsbD10LnNsaWNlKDApO2lmKHU9PT0wJiYobD1bMV0pLG89PT0xKWU9dDtlbHNlIGlmKG4pe2lmKG8hPT00KXRocm93IG5ldyBFcnJvcigiYSBwYWNrZWQgdGV4dHVyZSBtdXN0IGJlIDQtY2hhbm5lbCIpO2U9dCx1PjAmJihsW3UtMV09TWF0aC5jZWlsKGxbdS0xXS8yKSksdT4xJiYobFt1LTJdPU1hdGguY2VpbChsW3UtMl0vMikpfWVsc2UgaWYoIWUpdGhyb3cgbmV3IEVycm9yKCJVbnBhY2tlZCBzaGFwZSBpcyBuZWVkZWQgd2hlbiB1c2luZyBjaGFubmVscyA+IDEiKTtyZXR1cm57d2lkdGg6cyxoZWlnaHQ6aSxjaGFubmVsczpvLGlzUGFja2VkOm4sc2hhcGU6bCxzdHJpZGVzOlUuY29tcHV0ZVN0cmlkZXMobCksdW5wYWNrZWRTaGFwZTplLHJldmVyc2VkV0g6ciYmci5yZXZlcnNlV0h9fX0pO3ZhciBzaCxKbixlbD1MKCgpPT57InVzZSBzdHJpY3QiO2x0KCk7eXIoKTtmZSgpO1Z1KCk7cXUoKTtqdSgpO0t1KCk7bG4oKTtadSgpO2FlKCk7c2g9KGEsdCk9PntsZXQgbz10Lm1hcChyPT5gJHtyLnVucGFja2VkU2hhcGUuam9pbigiLCIpfTske3Iud2lkdGh9eCR7ci5oZWlnaHR9YCkuam9pbigiXyIpLGU9YS5uYW1lO3JldHVybiBhLmNhY2hlSGludCYmKGUrPSJbIithLmNhY2hlSGludCsiXSIpLGUrPSI6IitvLGV9LEpuPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuc2Vzc2lvbj10O3RoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwLHRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXB9Y2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHQsbyl7cmV0dXJuIEp1KHRoaXMuc2Vzc2lvbi5sYXlvdXRTdHJhdGVneSx0LG8pfWV4ZWN1dGVQcm9ncmFtKHQsbyl7aWYoby5sZW5ndGg8dC5pbnB1dE5hbWVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNpemUgbXVzdG4ndCBiZSBsZXNzIHRoYW4gJHt0LmlucHV0TmFtZXMubGVuZ3RofS5gKTtpZih0LmlucHV0TmFtZXMubGVuZ3RoIT09dC5pbnB1dFR5cGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IG5hbWVzIHNpemUgZG9lcyBub3QgbWF0Y2ggaW5wdXQgdHlwZXMiKTtsZXQgZT1bXTtmb3IobGV0IGw9MDtsPHQuaW5wdXROYW1lcy5sZW5ndGg7KytsKWVbbF09dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKG9bbF0sdC5pbnB1dFR5cGVzW2xdKTtsZXQgcj1zaCh0LGUpLG49dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KHIpLHM9bj9uLnByb2dyYW1JbmZvOnR5cGVvZiB0LmdldD09ImZ1bmN0aW9uIj90LmdldCgpOnQsaT1mbih0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3kscy5vdXRwdXQuZGltcyxzLm91dHB1dC50ZXh0dXJlVHlwZSksdT10aGlzLmNyZWF0ZVRleHR1cmVEYXRhKGkscy5vdXRwdXQudHlwZSk7cmV0dXJuIG58fChuPXRoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5idWlsZChzLGUsdSksdGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnNldEFydGlmYWN0KHIsbikpLHRoaXMucnVuUHJvZ3JhbShuLGUsdSksdX1ydW4odCxvKXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbSh0LG8pLnRlbnNvcn1ydW5Qcm9ncmFtKHQsbyxlKXtmb3IobGV0IHI9MDtyPG8ubGVuZ3RoOysrcilpZighIW9bcl0uaXNQYWNrZWQhPSh0LnByb2dyYW1JbmZvLmlucHV0VHlwZXNbcl09PT0yKSl0aHJvdyBuZXcgRXJyb3IoYGlucHV0WyR7cn1dIHByb3BlcnR5IHBhY2tlZCBpbmNvbnNpc3RlbnRgKTtpZighIWUuaXNQYWNrZWQhPSh0LnByb2dyYW1JbmZvLm91dHB1dC50ZXh0dXJlVHlwZT09PTIpKXRocm93IG5ldyBFcnJvcigib3V0cHV0IHByb3BlcnR5IHBhY2tlZCBpbmNvbnNpc3RlbnQiKTt0aGlzLnNlc3Npb24ucHJvZ3JhbU1hbmFnZXIucnVuKHQsbyxlKX1nZXRPckNyZWF0ZVRleHR1cmVEYXRhKHQsbyl7bGV0IGU9dGhpcy5nZXRUZXh0dXJlRGF0YSh0LmRhdGFJZCxvPT09Mik7aWYoIWUmJihlPXRoaXMuZ2V0VGV4dHVyZURhdGEodC5kYXRhSWQsbyE9PTIpLGUpKXJldHVybiBvPT09Mj90aGlzLnBhY2soZSk6dGhpcy51bnBhY2soZSk7aWYoIWUpe2xldCByPWZuKHRoaXMuc2Vzc2lvbi5sYXlvdXRTdHJhdGVneSx0LmRpbXMsbyk7aWYobz09PTQpe2xldCBpPXQuZGltcztpZihpLmxlbmd0aD09PTQpe2xldCB1PVtpWzBdLE1hdGguY2VpbChpWzFdKmlbMl0qaVszXS80KV0sbD1mbih0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksdSxvKSxjPXQubnVtYmVyRGF0YTtpZihpWzFdKmlbMl0qaVszXSU0IT09MCl7bGV0IHA9aVswXSxkPWlbMV0qaVsyXSppWzNdLFQ9TWF0aC5jZWlsKGQqMS80KSo0LHc9cCpUO2M9bmV3IEZsb2F0MzJBcnJheSh3KTtmb3IobGV0IHY9MDt2PHA7Kyt2KXtsZXQgUz12KmQsQT12KlQrdiUxKmQ7Yy5zZXQodC5udW1iZXJEYXRhLnN1YmFycmF5KFMsUytkKSxBKX19cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGEobCx0LnR5cGUsYyx0LDEpfX1pZihvPT09Mil7bGV0IG49eWkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LHQuZGltcywxLFtdLHtyZXZlcnNlV0g6ITB9KSxzPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEobix0LnR5cGUsdC5udW1iZXJEYXRhLHQsMSk7ZT10aGlzLnBhY2socyl9ZWxzZSBlPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEocix0LnR5cGUsdC5udW1iZXJEYXRhLHQsMSl9cmV0dXJuIGV9Y3JlYXRlVGV4dHVyZURhdGFGcm9tTGF5b3V0QmluZFRlbnNvcih0LG8sZSxyKXtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YSh0LG8sZSxyLDEpfWNyZWF0ZVRleHR1cmVEYXRhKHQsbyxlLHIsbil7Y2UudmVyYm9zZSgiSW5mZXJlbmNlSGFuZGxlciIsYENyZWF0aW5nIFRleHR1cmVEYXRhOiBsYXlvdXQ6WyR7SlNPTi5zdHJpbmdpZnkodCl9XWApO2xldCBzPXRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5jcmVhdGVUZXh0dXJlRnJvbUxheW91dChvLHQsZSxuKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHQsbyxzLHIpfXJlc2hhcGVVbnBhY2tlZCh0LG8pe2xldCBlPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0LDApLHI9e2NoYW5uZWxzOmUuY2hhbm5lbHMsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsc2hhcGU6by5sZW5ndGghPT0wP286WzFdLHN0cmlkZXM6VS5jb21wdXRlU3RyaWRlcyhvKSx1bnBhY2tlZFNoYXBlOm99O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUocix0LnR5cGUsZS50ZXh0dXJlKS50ZW5zb3J9cmVzaGFwZVBhY2tlZCh0LG8pe2xldCBlPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0LDIpO2lmKEh1KHQuZGltcyxvKSl7bGV0IGw9e2NoYW5uZWxzOmUuY2hhbm5lbHMsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsc2hhcGU6by5sZW5ndGghPT0wP286WzFdLHN0cmlkZXM6VS5jb21wdXRlU3RyaWRlcyhvKSx1bnBhY2tlZFNoYXBlOm8saXNQYWNrZWQ6ITB9O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUobCx0LnR5cGUsZS50ZXh0dXJlKS50ZW5zb3J9bGV0IHI9YmkodC5kaW1zKSxuPWJpKG8pLHM9dGhpcy5yZXNoYXBlUGFja2VkKHQsciksaT10aGlzLnJ1bihXdSh0aGlzLHMsbiksW3NdKTtyZXR1cm4gdGhpcy5yZXNoYXBlUGFja2VkKGksbyl9Y2FzdCh0LG8pe2xldCBlPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0LDApO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSxvLGUudGV4dHVyZSkudGVuc29yfWNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUodCxvLGUscixuKXtsZXQgcz17Li4udCx0ZW5zb3I6cnx8bmV3ICRlKHQudW5wYWNrZWRTaGFwZSxvLGk9PnRoaXMucmVhZFRleHR1cmUocyksYXN5bmMgaT0+dGhpcy5yZWFkVGV4dHVyZUFzeW5jKHMpLHZvaWQgMCxuKSx0ZXh0dXJlOmV9O3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKHMudGVuc29yLmRhdGFJZCxzLHQuaXNQYWNrZWQpLHN9Z2V0VGV4dHVyZURhdGEodCxvPSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodCk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKHQsbyk6bz90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldCh0KX1zZXRUZXh0dXJlRGF0YSh0LG8sZT0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodCk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKHQsbyxlKTooZT90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldCh0LG8pfWlzVGV4dHVyZUxheW91dENhY2hlZCh0LG89ITEpe3JldHVybiEhdGhpcy5nZXRUZXh0dXJlRGF0YSh0LmRhdGFJZCxvKX1kaXNwb3NlKCl7dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLmNsZWFyQWN0aXZlVGV4dHVyZXMoKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZm9yRWFjaCh0PT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUodCkpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwLHRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2godD0+dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKHQpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwfXJlYWRUZXh0dXJlKHQpe3JldHVybiB0LmlzUGFja2VkP3RoaXMucmVhZFRleHR1cmUodGhpcy51bnBhY2sodCkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUodCx0LnRlbnNvci50eXBlLHQuY2hhbm5lbHMpOnRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5yZWFkVWludDhUZXh0dXJlQXNGbG9hdChnaSh0aGlzLHQpKX1hc3luYyByZWFkVGV4dHVyZUFzeW5jKHQpe3JldHVybiB0LmlzUGFja2VkP3RoaXMucmVhZFRleHR1cmVBc3luYyh0aGlzLnVucGFjayh0KSk6dGhpcy5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LmlzRmxvYXQzMkRvd25sb2FkU3VwcG9ydGVkP3RoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5yZWFkVGV4dHVyZUFzeW5jKHQsdC50ZW5zb3IudHlwZSx0LmNoYW5uZWxzKTp0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFVpbnQ4VGV4dHVyZUFzRmxvYXQoZ2kodGhpcyx0KSl9cGFjayh0KXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbSh6dSh0aGlzLHQudGVuc29yKSxbdC50ZW5zb3JdKX11bnBhY2sodCl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oWHUodGhpcyx0LnRlbnNvciksW3QudGVuc29yXSl9fX0pO3ZhciBUaSxRLFVlPUwoKCk9PnsidXNlIHN0cmljdCI7VGk9Y2xhc3N7Y29uc3RydWN0b3IodCl7T2JqZWN0LmFzc2lnbih0aGlzLHQpfWdldCBjYWNoZUtleSgpe3JldHVybiB0aGlzLmtleXx8KHRoaXMua2V5PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpLnNvcnQoKS5tYXAodD0+YCR7dGhpc1t0XX1gKS5qb2luKCI7IikpLHRoaXMua2V5fX0sUT1hPT5uZXcgVGkoYSl9KTt2YXIgdGwscmwsbmwsdWgsbGgsb2w9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVZSgpO3dlKCk7YWUoKTt0bD17bmFtZToiQmF0Y2hOb3JtYWxpemF0aW9uIixpbnB1dE5hbWVzOlsiQSIsIlNjYWxlIiwiQiIsIk1lYW4iLCJWYXJpYW5jZSJdLGlucHV0VHlwZXM6WzAsMCwwLDAsMF19LHJsPShhLHQsbyk9PihsaCh0KSxbYS5ydW4oey4uLnRsLGNhY2hlSGludDpvLmNhY2hlS2V5LGdldDooKT0+dWgoYSx0LG8pfSx0KV0pLG5sPWE9PntsZXQgdD1hLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImVwc2lsb24iLDFlLTUpLG89YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtb21lbnR1bSIsLjkpLGU9YS5hdHRyaWJ1dGVzLmdldEludCgic3BhdGlhbCIsMSk7cmV0dXJuIFEoe2Vwc2lsb246dCxtb21lbnR1bTpvLHNwYXRpYWw6ZX0pfSx1aD0oYSx0LG8pPT57bGV0IGU9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscj10WzBdLmRpbXMubGVuZ3RoLFtuLHNdPWEuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMV0uZGltcywwKSxpPWAKICBmbG9hdCBwcm9jZXNzKGludFske3J9XSBpbmRpY2VzKSB7CiAgICB2ZWMyIHBvc2l0aW9uID0gb2Zmc2V0VG9Db29yZHMoaW5kaWNlc1sxXSwgJHtufSwgJHtzfSk7CiAgICBmbG9hdCBzY2FsZSA9IGdldENvbG9yQXNGbG9hdCgke2UudGV4dHVyZTJEfShTY2FsZSwgcG9zaXRpb24pKTsKICAgIGZsb2F0IG1lYW4gPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oTWVhbiwgcG9zaXRpb24pKTsKICAgIGZsb2F0IHZhcmlhbmNlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KFZhcmlhbmNlLCBwb3NpdGlvbikpOwogICAgZmxvYXQgYiA9IGdldENvbG9yQXNGbG9hdCgke2UudGV4dHVyZTJEfShCLCBwb3NpdGlvbikpOwoKICAgIHJldHVybiBzY2FsZSAqICggKF9BKGluZGljZXMpIC0gbWVhbikgLyBzcXJ0KHZhcmlhbmNlICsgZmxvYXQoJHtvLmVwc2lsb259KSkgKSArIGI7CiAgfWA7cmV0dXJuey4uLnRsLG91dHB1dDp7ZGltczp0WzBdLmRpbXMsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOml9fSxsaD1hPT57aWYoIWF8fGEubGVuZ3RoIT09NSl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoTm9ybWFsaXphdGlvbiByZXF1aXJlcyA1IGlucHV0cy4iKTtsZXQgdD1hWzBdLG89YVsxXSxlPWFbMl0scj1hWzNdLG49YVs0XTtpZih0LmRpbXMubGVuZ3RoPDN8fG8uZGltcy5sZW5ndGghPT0xfHxlLmRpbXMubGVuZ3RoIT09MXx8ci5kaW1zLmxlbmd0aCE9PTF8fG4uZGltcy5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihvLmRpbXNbMF0hPT10LmRpbXNbMV18fGUuZGltc1swXSE9PXQuZGltc1sxXXx8ci5kaW1zWzBdIT09dC5kaW1zWzFdfHxuLmRpbXNbMF0hPT10LmRpbXNbMV0pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKHQudHlwZSE9PSJmbG9hdDMyIiYmdC50eXBlIT09ImZsb2F0NjQifHxvLnR5cGUhPT0iZmxvYXQzMiImJm8udHlwZSE9PSJmbG9hdDY0Inx8ZS50eXBlIT09ImZsb2F0MzIiJiZlLnR5cGUhPT0iZmxvYXQ2NCJ8fHIudHlwZSE9PSJmbG9hdDMyIiYmci50eXBlIT09ImZsb2F0NjQifHxuLnR5cGUhPT0iZmxvYXQzMiImJm4udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfX0pO3ZhciBabixkdCxSLGNuLFFuLFd0PUwoKCk9PnsidXNlIHN0cmljdCI7Wm49Y2xhc3N7Y29uc3RydWN0b3IodCxvLGUscil7dGhpcy5nbENvbnRleHQ9dDt0aGlzLnByb2dyYW1JbmZvPW87dGhpcy5pbnB1dFRleHR1cmVMYXlvdXRzPWU7dGhpcy5vdXRwdXRUZXh0dXJlTGF5b3V0PXJ9fSxkdD1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbnRleHQ9dH19LFI9Y2xhc3N7Y29uc3RydWN0b3IodCxvKXt0aGlzLnJvdXRpbmVCb2R5PXQ7dGhpcy5kZXBlbmRlbmNpZXM9b319LGNuPWNsYXNze2NvbnN0cnVjdG9yKHQsbyxlKXt0aGlzLm5hbWU9dDtlP3RoaXMuZGVwZW5kZW5jaWVzPWU6dGhpcy5kZXBlbmRlbmNpZXM9W10sbyYmKHRoaXMucm91dGluZUJvZHk9byl9YWRkRGVwZW5kZW5jeSh0KXt0JiZ0aGlzLmRlcGVuZGVuY2llcy5wdXNoKHQpfX0sUW49Y2xhc3N7c3RhdGljIHJldHVybk9yZGVyZWROb2Rlcyh0KXtpZighdHx8dC5sZW5ndGg9PT0wKXJldHVybltdO2lmKHQubGVuZ3RoPT09MSlyZXR1cm4gdDtsZXQgbz1uZXcgU2V0LGU9bmV3IFNldCxyPW5ldyBBcnJheTtyZXR1cm4gdGhpcy5jcmVhdGVPcmRlcmVkTm9kZXModCxvLGUscikscn1zdGF0aWMgY3JlYXRlT3JkZXJlZE5vZGVzKHQsbyxlLHIpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKXRoaXMuZGZzVHJhdmVyc2UodFtuXSxvLGUscil9c3RhdGljIGRmc1RyYXZlcnNlKHQsbyxlLHIpe2lmKCF0fHxlLmhhcyh0Lm5hbWUpKXJldHVybjtpZihvLmhhcyh0Lm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTtvLmFkZCh0Lm5hbWUpO2xldCBuPXQuZGVwZW5kZW5jaWVzO2lmKG4mJm4ubGVuZ3RoPjApZm9yKGxldCBzPTA7czxuLmxlbmd0aDsrK3MpdGhpcy5kZnNUcmF2ZXJzZShuW3NdLG8sZSxyKTtyLnB1c2godCksZS5hZGQodC5uYW1lKSxvLmRlbGV0ZSh0Lm5hbWUpfX19KTtmdW5jdGlvbiBjaCgpe2xldCBhPSJhZGRfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSArIGI7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgKyB2MjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBwaCgpe2xldCBhPSJkaXZfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSAvIGI7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgLyB2MjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBkaCgpe2xldCBhPSJtdWxfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSAqIGI7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgKiB2MjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBoaCgpe2xldCBhPSJzdWJfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSAtIGI7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdjEgLSB2MjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBtaCgpe2xldCBhPSJlcXVhbF8iO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdChhID09IGIpOwogIH0KICB2ZWM0ICR7YX0odmVjNCB2MSwgdmVjNCB2MikgewogICAgcmV0dXJuIHZlYzQoZXF1YWwodjEsIHYyKSk7CiAgfQogIGAsbmFtZTphLHR5cGU6MH19ZnVuY3Rpb24gYmgoKXtsZXQgYT0iZ3JlYXRlcl8iO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdChhID4gYik7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdmVjNCggdjEuciA+IHYyLnIgLAogICAgICB2MS5nID4gdjIuZywKICAgICAgdjEuYiA+IHYyLmIsCiAgICAgIHYxLmEgPiB2Mi5hICk7CiAgfQogIGAsbmFtZTphLHR5cGU6MH19ZnVuY3Rpb24gZ2goKXtsZXQgYT0ibGVzc18iO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdChhIDwgYik7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gdmVjNCggdjEuciA8IHYyLnIgLAogICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsCiAgICAgICAgICAgICAgICB2MS5iIDwgdjIuYiwKICAgICAgICAgICAgICAgIHYxLmEgPCB2Mi5hICk7CiAgfQogIGAsbmFtZTphLHR5cGU6MH19ZnVuY3Rpb24geWgoKXtsZXQgYT0iYW5kXyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7YX0oZmxvYXQgYSwgZmxvYXQgYikgewogICAgcmV0dXJuIGZsb2F0KCBib29sKGEpICYmIGJvb2woYikgKTsKICB9CiAgdmVjNCAke2F9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIGJ2ZWM0IGIxID0gYnZlYzQodjEpOwogICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7CiAgICByZXR1cm4gdmVjNCggYjEuciAmJiBiMi5yICwKICAgICAgICAgICAgICAgIGIxLmcgJiYgYjIuZywKICAgICAgICAgICAgICAgIGIxLmIgJiYgYjIuYiwKICAgICAgICAgICAgICAgIGIxLmEgJiYgYjIuYSApOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fWZ1bmN0aW9uIFRoKCl7bGV0IGE9Im9yXyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7YX0oZmxvYXQgYSwgZmxvYXQgYikgewogICAgcmV0dXJuIGZsb2F0KCBib29sKGEpIHx8IGJvb2woYikgKTsKICB9CiAgdmVjNCAke2F9KHZlYzQgdjEsIHZlYzQgdjIpIHsKICAgIGJ2ZWM0IGIxID0gYnZlYzQodjEpOwogICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7CiAgICByZXR1cm4gdmVjNCggYjEuciB8fCBiMi5yICwKICAgICAgICAgICAgICAgIGIxLmcgfHwgYjIuZywKICAgICAgICAgICAgICAgIGIxLmIgfHwgYjIuYiwKICAgICAgICAgICAgICAgIGIxLmEgfHwgYjIuYSApOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fWZ1bmN0aW9uIHhoKCl7bGV0IGE9Inhvcl8iO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7CiAgfQogIHZlYzQgJHthfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTsKICAgIGJ2ZWM0IGIyID0gYnZlYzQodjIpOwogICAgcmV0dXJuIHZlYzQoIGIxLnIgXl4gYjIuciAsCiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsCiAgICAgICAgICAgICAgICBiMS5iIF5eIGIyLmIsCiAgICAgICAgICAgICAgICBiMS5hIF5eIGIyLmEgKTsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiB3aCgpe3JldHVybiBfaCgicG93Iil9ZnVuY3Rpb24gdmgoKXtsZXQgYT0icHJlbHVfIjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfShmbG9hdCBhLCBmbG9hdCBiKSB7CiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhOwogIH0KICB2ZWM0ICR7YX0odmVjNCB2MSwgdmVjNCB2MikgewogICAgcmV0dXJuIHZlYzQoCiAgICAgIHYxLnIgPCAwLjAgPyB2MS5yICogdjIucjogdjEuciwKICAgICAgdjEuZyA8IDAuMCA/IHYxLmcgKiB2Mi5nOiB2MS5nLAogICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsCiAgICAgIHYxLmEgPCAwLjAgPyB2MS5hICogdjIuYTogdjEuYQogICAgICApOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fWZ1bmN0aW9uIF9oKGEpe2xldCB0PWAke2F9X2A7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7dH0oZmxvYXQgYSwgZmxvYXQgYikgewogICAgcmV0dXJuICR7YX0oYSwgYik7CiAgfQogIHZlYzQgJHt0fSh2ZWM0IHYxLCB2ZWM0IHYyKSB7CiAgICByZXR1cm4gJHthfSh2MSwgdjIpOwogIH0KICBgLG5hbWU6dCx0eXBlOjB9fXZhciBodCxPaCxpbCxhbCxzbCx1bCxsbCxmbCxjbCxwbCxkbCxobCxtbCxibCxnbD1MKCgpPT57InVzZSBzdHJpY3QiO2ZlKCk7V3QoKTt3ZSgpO2FlKCk7aHQ9KGEsdCxvLGU9dFswXS50eXBlLHIpPT57bGV0IG49YS5zZXNzaW9uLnBhY2s/MjowO3JldHVybntuYW1lOm8ubmFtZSxpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOltuLG5dLGNhY2hlSGludDpyLGdldDooKT0+T2goYSx0LG8sZSl9fSxPaD0oYSx0LG8sZT10WzBdLnR5cGUpPT57bGV0IHI9YS5zZXNzaW9uLnBhY2s/MjowLG49IVUuYXJlRXF1YWwodFswXS5kaW1zLHRbMV0uZGltcykscz10WzBdLmRpbXMsaT1hLnNlc3Npb24ucGFjaztpZihuKXtsZXQgYz1aZS5jYWxjU2hhcGUodFswXS5kaW1zLHRbMV0uZGltcywhMSk7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBwZXJmb3JtIGJpbmFyeSBvcCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO3M9YztsZXQgcD1zLmxlbmd0aCxkPXRbMF0uZGltcy5sZW5ndGghPT0wP3RbMF0uZGltcy5sZW5ndGg6MSxUPXRbMV0uZGltcy5sZW5ndGghPT0wP3RbMV0uZGltcy5sZW5ndGg6MSx3PXRbMF0uZGltcy5sZW5ndGghPT0wPyJiY2FzdEluZGljZXNfQShpbmRpY2VzLCBhaW5kaWNlcyk7IjoiYWluZGljZXNbMF0gPSAwOyIsdj10WzFdLmRpbXMubGVuZ3RoIT09MD8iYmNhc3RJbmRpY2VzX0IoaW5kaWNlcywgYmluZGljZXMpOyI6ImJpbmRpY2VzWzBdID0gMDsiLFM9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksQT1pP2AKICAgICAgJHtvLmJvZHl9CiAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICB2ZWM0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTsKICAgICAgICB2ZWM0IGIgPSBnZXRCQXRPdXRDb29yZHMoKTsKICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7by5uYW1lfShhLCBiKTsKICAgICAgICAke1Mub3V0cHV0fSA9IHJlc3VsdDsKICAgICAgfWA6YAogICAgICAke28uYm9keX0KICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3B9XSkgewogICAgICAgIGludCBhaW5kaWNlc1ske2R9XTsKICAgICAgICBpbnQgYmluZGljZXNbJHtUfV07CiAgICAgICAgJHt3fQogICAgICAgICR7dn0KICAgICAgICByZXR1cm4gJHtvLm5hbWV9KF9BKGFpbmRpY2VzKSwgX0IoYmluZGljZXMpKTsKICAgICAgfWA7cmV0dXJue25hbWU6by5uYW1lLGlucHV0TmFtZXM6WyJBIiwiQiJdLGlucHV0VHlwZXM6W3Iscl0sb3V0cHV0OntkaW1zOnMsdHlwZTplLHRleHR1cmVUeXBlOnJ9LHNoYWRlclNvdXJjZTpBLGhhc01haW46aX19bGV0IHU9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksbD1gCiAgICAke28uYm9keX0KICAgIHZvaWQgbWFpbigpIHsKICAgICAgdmVjNCB2MSA9ICR7dS50ZXh0dXJlMkR9KEEsIFRleENvb3Jkcyk7CiAgICAgIHZlYzQgdjIgPSAke3UudGV4dHVyZTJEfShCLCBUZXhDb29yZHMpOwogICAgICB2ZWM0IHJlc3VsdCA9ICR7by5uYW1lfSh2MSwgdjIpOwogICAgICAke3Uub3V0cHV0fSA9IHJlc3VsdDsKICAgIH0KICAgIGA7cmV0dXJue25hbWU6by5uYW1lLGlucHV0TmFtZXM6WyJBIiwiQiJdLGlucHV0VHlwZXM6W3Iscl0sb3V0cHV0OntkaW1zOnRbMF0uZGltcyx0eXBlOmUsdGV4dHVyZVR5cGU6cn0sc2hhZGVyU291cmNlOmwsaGFzTWFpbjohMH19LGlsPShhLHQpPT5bYS5ydW4oaHQoYSx0LGNoKCkpLHQpXSxhbD0oYSx0KT0+W2EucnVuKGh0KGEsdCx5aCgpLCJib29sIiksdCldLHNsPShhLHQpPT5bYS5ydW4oaHQoYSx0LHBoKCkpLHQpXSx1bD0oYSx0KT0+W2EucnVuKGh0KGEsdCxtaCgpLCJib29sIiksdCldLGxsPShhLHQpPT5bYS5ydW4oaHQoYSx0LGJoKCksImJvb2wiKSx0KV0sZmw9KGEsdCk9PlthLnJ1bihodChhLHQsZ2goKSwiYm9vbCIpLHQpXSxjbD0oYSx0KT0+W2EucnVuKGh0KGEsdCxkaCgpKSx0KV0scGw9KGEsdCk9PlthLnJ1bihodChhLHQsVGgoKSwiYm9vbCIpLHQpXSxkbD0oYSx0KT0+W2EucnVuKGh0KGEsdCx3aCgpKSx0KV0saGw9KGEsdCk9PlthLnJ1bihodChhLHQsdmgoKSksdCldLG1sPShhLHQpPT5bYS5ydW4oaHQoYSx0LGhoKCkpLHQpXSxibD0oYSx0KT0+W2EucnVuKGh0KGEsdCx4aCgpLCJib29sIiksdCldfSk7dmFyIHlsLFRsLFNoLHhsPUwoKCk9PnsidXNlIHN0cmljdCI7ZmUoKTt5bD0oYSx0LG8pPT4oU2godCksW2EuY2FzdCh0WzBdLG8pXSksVGw9YT0+V2UudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oYS5hdHRyaWJ1dGVzLmdldEludCgidG8iKSksU2g9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJDYXN0IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoYVswXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9fSk7dmFyIEFoLFBoLHdsLGVvLHZsPUwoKCk9PnsidXNlIHN0cmljdCI7d2UoKTthZSgpO0J0KCk7VHIoKTtBaD0oYSx0KT0+KHtuYW1lOiJDb25jYXQgKHBhY2tlZCkiLGlucHV0TmFtZXM6QXJyYXkuZnJvbSh7bGVuZ3RoOmF9LChvLGUpPT5gWCR7ZX1gKSxpbnB1dFR5cGVzOkFycmF5KGEpLmZpbGwoMiksY2FjaGVIaW50OnR9KSxQaD0oYSx0LG8sZSk9PntsZXQgcj1vWzBdLmRpbXMuc2xpY2UoKTtpZihlPj1yLmxlbmd0aHx8ZTwtMSpyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO2U8MCYmKGU9ci5sZW5ndGgrZSk7bGV0IG49ci5zbGljZSgwKTtmb3IobGV0IGo9MTtqPG8ubGVuZ3RoO2orKyl7bGV0IGllPW9bal0uZGltcy5zbGljZSgpO2ZvcihsZXQgRz0wO0c8ci5sZW5ndGg7RysrKWlmKEc9PT1lKW5bZV0rPWllW0ddO2Vsc2UgaWYocltHXSE9PWllW0ddKXRocm93IG5ldyBFcnJvcigibm9uIGNvbmNhdCBkaW1lbnNpb25zIG11c3QgbWF0Y2giKX1sZXQgcz1uLmxlbmd0aCxpPUJyKCJjb29yZHMiLHMpLHU9UWUocyksbD1OdCgpLGM9by5tYXAoaj0+ai5kaW1zKSxwPUR0KHMpLGQ9bmV3IEFycmF5KGMubGVuZ3RoLTEpO2RbMF09Y1swXVtlXTtmb3IobGV0IGo9MTtqPGQubGVuZ3RoO2orKylkW2pdPWRbai0xXStjW2pdW2VdO2xldCBUPXBbZV0sdz1wLnNsaWNlKC0yKSx2PXAuam9pbigpLFM9YGlmICgke1R9IDwgJHtkWzBdfSkgewogICAgICAgIHJldHVybiBnZXRDaGFubmVsKAogICAgICAgICAgICBnZXRYMCgke3Z9KSwgdmVjMigke3cuam9pbigpfSkpOwogICAgICAgIH1gO2ZvcihsZXQgaj0xO2o8ZC5sZW5ndGg7aisrKXtsZXQgaWU9ZFtqLTFdO1MrPWAKICAgICAgICAgICAgaWYgKCR7VH0gPCAke2Rbal19ICAmJiAke1R9ID49ICR7ZFtqLTFdfSkgewogICAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKAogICAgICAgICAgICAgICAgZ2V0WCR7an0oJHtlbyhwLFQsaWUpfSksCiAgICAgICAgICAgICAgICB2ZWMyKCR7ZW8odyxULGllKX0pKTsKICAgICAgICAgICAgfWB9bGV0IEE9ZC5sZW5ndGgsQz1kW2QubGVuZ3RoLTFdO1MrPWAKICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoCiAgICAgICAgICAgICAgZ2V0WCR7QX0oJHtlbyhwLFQsQyl9KSwKICAgICAgICAgICAgICB2ZWMyKCR7ZW8odyxULEMpfSkpO2A7bGV0IEY9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksSj1gCiAgICAgICAgICAke2x9CiAgICAgICAgICBmbG9hdCBnZXRWYWx1ZSgke3AubWFwKGo9PiJpbnQgIitqKX0pIHsKICAgICAgICAgICAgJHtTfQogICAgICAgICAgfQoKICAgICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgJHt1fSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAgICAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHtwW3MtMV19OwogICAgICAgICAgICBjb29yZHMuJHtwW3MtMV19ID0gY29vcmRzLiR7cFtzLTJdfTsKICAgICAgICAgICAgY29vcmRzLiR7cFtzLTJdfSA9IGxhc3REaW07CgogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtpfSksIDAuLCAwLiwgMC4pOwoKICAgICAgICAgICAgJHtpW3MtMV19ID0gJHtpW3MtMV19ICsgMTsKICAgICAgICAgICAgaWYgKCR7aVtzLTFdfSA8ICR7bltzLTFdfSkgewogICAgICAgICAgICAgIHJlc3VsdC5nID0gZ2V0VmFsdWUoJHtpfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR7aVtzLTJdfSA9ICR7aVtzLTJdfSArIDE7CiAgICAgICAgICAgIGlmICgke2lbcy0yXX0gPCAke25bcy0yXX0pIHsKICAgICAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7aX0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAke2lbcy0xXX0gPSAke2lbcy0xXX0gLSAxOwogICAgICAgICAgICBpZiAoJHtpW3MtMl19IDwgJHtuW3MtMl19ICYmCiAgICAgICAgICAgICAgICAke2lbcy0xXX0gPCAke25bcy0xXX0pIHsKICAgICAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7aX0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR7Ri5vdXRwdXR9ID0gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuey4uLnQsb3V0cHV0OntkaW1zOm4sdHlwZTpvWzBdLnR5cGUsdGV4dHVyZVR5cGU6Mn0sc2hhZGVyU291cmNlOkosaGFzTWFpbjohMH19LHdsPShhLHQsbyk9PntsZXQgZT1BaCh0Lmxlbmd0aCxvLmNhY2hlS2V5KTtyZXR1cm57Li4uZSxnZXQ6KCk9PlBoKGEsZSx0LG8uYXhpcyl9fSxlbz0oYSx0LG8pPT57bGV0IGU9YS5pbmRleE9mKHQpO3JldHVybiBhLm1hcCgobixzKT0+cz09PWU/YCR7bn0gLSAke299YDpuKS5qb2luKCl9fSk7dmFyIF9sLEVoLERoLExoLE9sLENoLEZoLCRoLElsLGtoLFNsPUwoKCk9PnsidXNlIHN0cmljdCI7VWUoKTthZSgpO3ZsKCk7X2w9KGEsdCxvKT0+KGtoKHQpLGEuc2Vzc2lvbi5wYWNrJiZ0WzBdLmRpbXMubGVuZ3RoPjE/W2EucnVuKHdsKGEsdCxvKSx0KV06W2EucnVuKExoKGEsdCxvKSx0KV0pLEVoPShhLHQpPT4oe25hbWU6IkNvbmNhdCIsaW5wdXROYW1lczpBcnJheS5mcm9tKHtsZW5ndGg6YX0sKG8sZSk9PmBYJHtlfWApLGlucHV0VHlwZXM6QXJyYXkoYSkuZmlsbCgwKSxjYWNoZUhpbnQ6dH0pLERoPShhLHQsbyxlKT0+e2xldCByPW9bMF0uZGltcy5zbGljZSgpO2lmKGU+PXIubGVuZ3RofHxlPC0xKnIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYXhpcyBzcGVjaWZpZWQgZm9yIGNvbmNhdCBkb2Vzbid0IG1hdGNoIGlucHV0IGRpbWVuc2lvbmFsaXR5Iik7ZTwwJiYoZT1yLmxlbmd0aCtlKTtsZXQgbj1yLnNsaWNlKDApO2ZvcihsZXQgVD0xO1Q8by5sZW5ndGg7VCsrKXtsZXQgdz1vW1RdLmRpbXMuc2xpY2UoKTtmb3IobGV0IHY9MDt2PHIubGVuZ3RoO3YrKylpZih2PT09ZSluW2VdKz13W3ZdO2Vsc2UgaWYoclt2XSE9PXdbdl0pdGhyb3cgbmV3IEVycm9yKCJub24gY29uY2F0IGRpbWVuc2lvbnMgbXVzdCBtYXRjaCIpfWxldCBzPW4ubGVuZ3RoLGk9bmV3IEFycmF5KG8ubGVuZ3RoKSx1PTA7Zm9yKGxldCBUPTA7VDxpLmxlbmd0aDsrK1QpdSs9b1tUXS5kaW1zW2VdLGlbVF09dTtsZXQgbD0iIjtvLmxlbmd0aDw1P2w9T2woaSk6bD1DaChpKTtsZXQgYz1GaChvLmxlbmd0aCxzKSxwPSRoKGkpLGQ9YAogICAgICAgICR7Y30KICAgICAgICAke3B9CiAgICAgICAgJHtsfQogICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtzfV0pIHsKICAgICAgICAgIGludCB0ZXh0dXJlSW5kZXggPSBnZXRUZXh0dXJlV2hlcmVEYXRhUmVzaWRlcyAoaW5kaWNlc1ske2V9XSk7CgogICAgICAgICAgaWYodGV4dHVyZUluZGV4ICE9IDApIHsKICAgICAgICAgICAgaW5kaWNlc1ske2V9XSA9IGluZGljZXNbJHtlfV0gLSBpbnQoZ2V0U2l6ZUluQ29uY2F0QXhpc1ZhbHVlRnJvbUluZGV4KHRleHR1cmVJbmRleC1pbnQoMSkpKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZmV0Y2hEYXRhRnJvbUNvcnJlY3RUZXh0dXJlKHRleHR1cmVJbmRleCwgaW5kaWNlcyk7CiAgICAgICAgfWA7cmV0dXJuey4uLnQsb3V0cHV0OntkaW1zOm4sdHlwZTpvWzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOmR9fSxMaD0oYSx0LG8pPT57bGV0IGU9RWgodC5sZW5ndGgsby5jYWNoZUtleSk7cmV0dXJuey4uLmUsZ2V0OigpPT5EaChhLGUsdCxvLmF4aXMpfX0sT2w9YT0+YGludCBnZXRUZXh0dXJlV2hlcmVEYXRhUmVzaWRlcyhpbnQgaW5kZXgpIHsKICAgICAgJHthLm1hcCgobyxlKT0+YGlmKGluZGV4PCR7b30pIHtyZXR1cm4gJHtlfTt9CmApLmpvaW4oIiIpfQogICAgfWAsQ2g9YT0+T2woYSksRmg9KGEsdCk9PntsZXQgbz1bYGZsb2F0IGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZShpbnQgdGV4dHVyZUluZGV4LCBpbnQgaW5kaWNlc1ske3R9XSkge2BdO2ZvcihsZXQgZT0wO2U8YTsrK2UpZT09PTA/by5wdXNoKGAJaWYgKHRleHR1cmVJbmRleCA9PSAke2V9KSB7IHJldHVybiBfWCR7ZX0oaW5kaWNlcyk7IH1gKTplPT09YS0xP28ucHVzaChgCWVsc2UgeyByZXR1cm4gX1gke2V9KGluZGljZXMpOyB9YCk6by5wdXNoKGAJZWxzZSBpZiAodGV4dHVyZUluZGV4ID09ICR7ZX0pIHsgcmV0dXJuIF9YJHtlfShpbmRpY2VzKTsgfWApO3JldHVybiBvLnB1c2goIgl9Iiksby5qb2luKGAKYCl9LCRoPWE9PntsZXQgdD1bImludCBnZXRTaXplSW5Db25jYXRBeGlzVmFsdWVGcm9tSW5kZXgoaW50IGluZGV4KSB7Il07Zm9yKGxldCBvPTA7bzxhLmxlbmd0aDsrK28pbz09PTA/dC5wdXNoKGAJaWYgKGluZGV4ID09ICR7b30pIHsgcmV0dXJuICR7YVtvXX07IH1gKTpvPT09YS5sZW5ndGgtMT90LnB1c2goYAllbHNlIHsgcmV0dXJuICR7YVtvXX07IH1gKTp0LnB1c2goYAllbHNlIGlmIChpbmRleCA9PSAke299KSB7IHJldHVybiAke2Fbb119OyB9YCk7cmV0dXJuIHQucHVzaCgiCX0iKSx0LmpvaW4oYApgKX0sSWw9YT0+USh7YXhpczphLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIil9KSxraD1hPT57aWYoIWF8fGEubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJ0b28gZmV3IGlucHV0cyIpO2xldCB0PWFbMF0udHlwZSxvPWFbMF0uZGltcy5sZW5ndGg7aWYodD09PSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigic3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2ZvcihsZXQgZSBvZiBhKXtpZihlLnR5cGUhPT10KXRocm93IG5ldyBFcnJvcigiaW5wdXQgdGVuc29ycyBzaG91bGQgYmUgb25lIHR5cGUiKTtpZihlLmRpbXMubGVuZ3RoIT09byl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2hhcGUiKX19fSk7ZnVuY3Rpb24gQmgoKXtyZXR1cm4gbXQoImFicyIpfWZ1bmN0aW9uIE5oKCl7cmV0dXJuIG10KCJhY29zIil9ZnVuY3Rpb24gUmgoKXtyZXR1cm4gbXQoImFzaW4iKX1mdW5jdGlvbiBNaCgpe3JldHVybiBtdCgiYXRhbiIpfWZ1bmN0aW9uIEdoKCl7cmV0dXJuIG10KCJjZWlsIil9ZnVuY3Rpb24gVWgoKXtyZXR1cm4gbXQoImNvcyIpfWZ1bmN0aW9uIHpoKGEpe2xldCB0PSJlbHUiO3JldHVybntib2R5OmAKICBjb25zdCBmbG9hdCBhbHBoYSA9IGZsb2F0KCR7YX0pOwoKICBmbG9hdCAke3R9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gYSA+PSAwLjAgPyBhOiAoZXhwKGEpIC0gMS4wKSAqIGFscGhhOwogIH0KICB2ZWM0ICR7dH1fKHZlYzQgdikgewogICAgcmV0dXJuIHZlYzQoJHt0fV8odi54KSwgJHt0fV8odi55KSwgJHt0fV8odi56KSwgJHt0fV8odi53KSk7CiAgfQogIGAsbmFtZTp0LHR5cGU6MH19ZnVuY3Rpb24gVmgoKXtyZXR1cm4gbXQoImV4cCIpfWZ1bmN0aW9uIFdoKCl7cmV0dXJuIG10KCJmbG9vciIpfWZ1bmN0aW9uIHhpKGEsdCl7bGV0IG89ImNsaXAiO3JldHVybntib2R5OmAKICBjb25zdCBmbG9hdCBtaW4gPSBmbG9hdCgke2F9KTsKICBjb25zdCBmbG9hdCBtYXggPSBmbG9hdCgke3R9KTsKCiAgZmxvYXQgJHtvfV8oZmxvYXQgYSkgewogICAgcmV0dXJuIGNsYW1wKGEsIG1pbiwgbWF4KTsKICB9CiAgdmVjNCAke299Xyh2ZWM0IHYpIHsKICAgIHJldHVybiBjbGFtcCh2LCBtaW4sIG1heCk7CiAgfQogIGAsbmFtZTpvLHR5cGU6MH19ZnVuY3Rpb24gSGgoKXtsZXQgYT0iaW5kZW50aXR5IjtyZXR1cm57Ym9keTpgCiAgZmxvYXQgJHthfV8oZmxvYXQgYSkgewogICAgcmV0dXJuIGE7CiAgfQogIHZlYzQgJHthfV8odmVjNCB2KSB7CiAgICByZXR1cm4gdjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBxaChhKXtsZXQgdD0ibGVha3lSZWx1IjtyZXR1cm57Ym9keTpgCiAgY29uc3QgZmxvYXQgYWxwaGEgPSBmbG9hdCgke2F9KTsKCiAgZmxvYXQgJHt0fV8oZmxvYXQgYSkgewogICAgcmV0dXJuIGEgPCAwLjAgPyBhICogYWxwaGEgOiBhOwogIH0KICB2ZWM0ICR7dH1fKHZlYzQgdikgewogICAgcmV0dXJuIHZlYzQoJHt0fV8odi54KSwgJHt0fV8odi55KSwgJHt0fV8odi56KSwgJHt0fV8odi53KSk7CiAgfQogIGAsbmFtZTp0LHR5cGU6MH19ZnVuY3Rpb24gamgoKXtyZXR1cm4gbXQoImxvZyIpfWZ1bmN0aW9uIFloKCl7bGV0IGE9Im5lZyI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7YX1fKGZsb2F0IGEpIHsKICAgIHJldHVybiAtYTsKICB9CiAgdmVjNCAke2F9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiAtdjsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBYaCgpe2xldCBhPSJub3QiO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gZmxvYXQoICEgYm9vbChhKSApOwogIH0KICBib29sICR7YX1fKGJvb2wgYSkgewogICAgcmV0dXJuICFhOwogIH0KICB2ZWM0ICR7YX1fKHZlYzQgdikgewogICAgcmV0dXJuIHZlYzQoIWJvb2wodi54KSwgIWJvb2wodi55KSwgIWJvb2wodi56KSwgIWJvb2wodi53KSk7CiAgfQogIGJ2ZWM0ICR7YX1fKGJ2ZWM0IHYpIHsKICAgIHJldHVybiBidmVjNCghdi54LCAhdi55LCAhdi56LCAhdi53KTsKICB9CiAgYCxuYW1lOmEsdHlwZTowfX1mdW5jdGlvbiBLaCgpe3JldHVybiBtdCgic2luIil9ZnVuY3Rpb24gd2koKXtsZXQgYT0icmVsdSI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7YX1fKGZsb2F0IGEpIHsKICAgIHJldHVybiBtYXgoIGEsIDAuMCApOwogIH0KICB2ZWM0ICR7YX1fKHZlYzQgdikgewogICAgcmV0dXJuIG1heCggdiwgMC4wICk7CiAgfQogIGAsbmFtZTphLHR5cGU6MH19ZnVuY3Rpb24gdmkoKXtsZXQgYT0ic2lnbW9pZCI7cmV0dXJue2JvZHk6YAogIGZsb2F0ICR7YX1fKGZsb2F0IGEpIHsKICAgIHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC1hKSk7CiAgfQogIHZlYzQgJHthfV8odmVjNCB2KSB7CiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtdikpOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fWZ1bmN0aW9uIEpoKCl7cmV0dXJuIG10KCJzcXJ0Iil9ZnVuY3Rpb24gWmgoKXtyZXR1cm4gbXQoInRhbiIpfWZ1bmN0aW9uIFFoKCl7bGV0IGE9InRhbmgiO3JldHVybntib2R5OmAKICBmbG9hdCAke2F9XyhmbG9hdCBhKSB7CiAgICBhID0gY2xhbXAoYSwgLTEwLiwgMTAuKTsKICAgIGEgPSBleHAoMi4qYSk7CiAgICByZXR1cm4gKGEgLSAxLikgLyAoYSArIDEuKTsKICB9CiAgdmVjNCAke2F9Xyh2ZWM0IHYpIHsKICAgIHYgPSBjbGFtcCh2LCAtMTAuLCAxMC4pOwogICAgdiA9IGV4cCgyLip2KTsKICAgIHJldHVybiAodiAtIDEuKSAvICh2ICsgMS4pOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fWZ1bmN0aW9uIG10KGEpe3JldHVybntib2R5OmAKICBmbG9hdCAke2F9XyhmbG9hdCBhKSB7CiAgICByZXR1cm4gJHthfShhKTsKICB9CiAgdmVjNCAke2F9Xyh2ZWM0IHYpIHsKICAgIHJldHVybiAke2F9KHYpOwogIH0KICBgLG5hbWU6YSx0eXBlOjB9fXZhciBlbSxFZSxBbCxQbCxFbCxEbCxfaSxMbCxDbCx0bSxGbCwkbCxrbCxCbCxObCxSbCxPaSxNbCxHbCxVbCx6bCxWbCxXbCxIbCxxbCxqbCxZbCxYbCxJaT1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7ZmUoKTtXdCgpO3dlKCk7YWUoKTtlbT0oYSx0LG8sZSk9PntsZXQgcj1hLnNlc3Npb24ucGFjaz8yOjAsbj1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm57Li4udCxvdXRwdXQ6e2RpbXM6by5kaW1zLHR5cGU6by50eXBlLHRleHR1cmVUeXBlOnJ9LHNoYWRlclNvdXJjZTpgCiAgICAgJHtlLmJvZHl9CiAgICAgdm9pZCBtYWluKCkgewogICAgICAgdmVjNCB2ID0gJHtuLnRleHR1cmUyRH0oQSwgVGV4Q29vcmRzKTsKICAgICAgIHYgPSAke2UubmFtZX1fKHYpOwogICAgICAgJHtuLm91dHB1dH0gPSB2OwogICAgIH0KICAgICBgLGhhc01haW46ITB9fSxFZT0oYSx0LG8sZSk9PntsZXQgcj1hLnNlc3Npb24ucGFjaz8yOjAsbj17bmFtZTpvLm5hbWUsaW5wdXRUeXBlczpbcl0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6ZX07cmV0dXJuey4uLm4sZ2V0OigpPT5lbShhLG4sdCxvKX19LEFsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLEJoKCkpLHQpXSxQbD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxOaCgpKSx0KV0sRWw9KGEsdCk9PlthLnJ1bihFZShhLHRbMF0sUmgoKSksdCldLERsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLE1oKCkpLHQpXSxfaT0oYSx0LG8pPT5bYS5ydW4oRWUoYSx0WzBdLHhpKG8ubWluLG8ubWF4KSxvLmNhY2hlS2V5KSx0KV0sTGw9YT0+USh7bWluOmEuYXR0cmlidXRlcy5nZXRGbG9hdCgibWluIixiciksbWF4OmEuYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4Iixncil9KSxDbD0oYSx0KT0+e2xldCBvPXRtKGEsdCk7cmV0dXJuIF9pKGEsW3RbMF1dLG8pfSx0bT0oYSx0KT0+e2lmKHQubGVuZ3RoPj0zJiYoIWEuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWEuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtsZXQgbz10Lmxlbmd0aD49Mz90WzFdLm51bWJlckRhdGFbMF06YnIsZT10Lmxlbmd0aD49Mz90WzJdLm51bWJlckRhdGFbMF06Z3I7cmV0dXJuIFEoe21pbjpvLG1heDplfSl9LEZsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLEdoKCkpLHQpXSwkbD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxVaCgpKSx0KV0sa2w9KGEsdCxvKT0+W2EucnVuKEVlKGEsdFswXSx6aChvLmFscGhhKSxvLmNhY2hlS2V5KSx0KV0sQmw9YT0+USh7YWxwaGE6YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMSl9KSxObD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxWaCgpKSx0KV0sUmw9KGEsdCk9PlthLnJ1bihFZShhLHRbMF0sV2goKSksdCldLE9pPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLEhoKCkpLHQpXSxNbD0oYSx0LG8pPT5bYS5ydW4oRWUoYSx0WzBdLHFoKG8uYWxwaGEpLG8uY2FjaGVLZXkpLHQpXSxHbD1hPT5RKHthbHBoYTphLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwuMDEpfSksVWw9KGEsdCk9PlthLnJ1bihFZShhLHRbMF0samgoKSksdCldLHpsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLFloKCkpLHQpXSxWbD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxYaCgpKSx0KV0sV2w9KGEsdCk9PlthLnJ1bihFZShhLHRbMF0sd2koKSksdCldLEhsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLHZpKCkpLHQpXSxxbD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxLaCgpKSx0KV0samw9KGEsdCk9PlthLnJ1bihFZShhLHRbMF0sSmgoKSksdCldLFlsPShhLHQpPT5bYS5ydW4oRWUoYSx0WzBdLFpoKCkpLHQpXSxYbD0oYSx0KT0+W2EucnVuKEVlKGEsdFswXSxRaCgpKSx0KV19KTtmdW5jdGlvbiBSdChhKXtsZXQgdDtzd2l0Y2goYS5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOnQ9d2koKTticmVhaztjYXNlIlNpZ21vaWQiOnQ9dmkoKTticmVhaztjYXNlIkNsaXAiOnQ9eGkoYS5jbGlwTWluLGEuY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm57YWN0aXZhdGlvbkZ1bmN0aW9uOiIiLGFwcGx5QWN0aXZhdGlvbjoiIn19bGV0IG89dC5uYW1lLGU9dC5ib2R5LHI9YHZhbHVlID0gJHtvfV8odmFsdWUpO2A7cmV0dXJue2FjdGl2YXRpb25GdW5jdGlvbjplLGFwcGx5QWN0aXZhdGlvbjpyfX12YXIgTnIseHI9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtmZSgpO0lpKCk7TnI9YT0+e2xldCB0PWEuZ2V0U3RyaW5nKCJhY3RpdmF0aW9uIiwiIik7aWYodD09PSJDbGlwIil7bGV0W28sZV09YS5nZXRGbG9hdHMoImFjdGl2YXRpb25fcGFyYW1zIixbYnIsZ3JdKTtyZXR1cm57YWN0aXZhdGlvbjp0LGNsaXBNYXg6ZSxjbGlwTWluOm8sYWN0aXZhdGlvbkNhY2hlS2V5OmAke3R9OiR7b30sJHtlfWB9fXJldHVybnthY3RpdmF0aW9uOnQsYWN0aXZhdGlvbkNhY2hlS2V5OnR9fX0pO3ZhciBubSxvbSxLbCxKbD1MKCgpPT57InVzZSBzdHJpY3QiO2x0KCk7d2UoKTthZSgpO3RvKCk7eHIoKTtubT0oYSx0KT0+KHtuYW1lOiJHcm91cGVkQ29udiIsaW5wdXROYW1lczphP1siWCIsIlciLCJCaWFzIl06WyJYIiwiVyJdLGlucHV0VHlwZXM6YT9bMCwwLDBdOlswLDBdLGNhY2hlSGludDp0fSksb209KGEsdCxvLGUpPT57bGV0IG49dC5sZW5ndGg+Mj8idmFsdWUgKz0gZ2V0QmlhcyhvdXRwdXRfY2hhbm5lbCk7IjoiIixzPXRbMF0uZGltcy5zbGljZSgpLGk9dFsxXS5kaW1zLnNsaWNlKCksdT1pWzBdL2UuZ3JvdXA7Y2UudmVyYm9zZSgiR3JvdXBlZENvbnYiLGBhdXRwUGFkOiR7ZS5hdXRvUGFkfSwgZGlsYXRpb25zOiR7ZS5kaWxhdGlvbnN9LCBncm91cDoke2UuZ3JvdXB9LCBrZXJuZWxTaGFwZToke2Uua2VybmVsU2hhcGV9LCBwYWRzOiR7ZS5wYWRzfSwgc3RyaWRlczoke2Uuc3RyaWRlc31gKTtsZXQgbD1ScihzLGksZS5kaWxhdGlvbnMsZS5wYWRzLGUuc3RyaWRlcyksYz1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOnAsYXBwbHlBY3RpdmF0aW9uOmR9PVJ0KGUpLFQ9YAogIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke2Uuc3RyaWRlc1swXX0sICR7ZS5zdHJpZGVzWzFdfSk7CiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7ZS5wYWRzWzBdfSwgJHtlLnBhZHNbMV19KTsKICAke3B9CiAgdm9pZCBtYWluKCkgewogICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDsKICAgIGludCBvdXRwdXRfY2hhbm5lbCA9IGNvb3Jkcy55OwogICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnp3ICogc3RyaWRlcyAtIHBhZHM7CiAgICBpbnQgZ3JvdXBfaWQgPSBvdXRwdXRfY2hhbm5lbCAvICR7dX07CgogICAgZmxvYXQgdmFsdWUgPSAwLjA7CiAgICBmb3IgKGludCB3SW5DaGFubmVsID0gMDsgd0luQ2hhbm5lbCA8ICR7aVsxXX07IHdJbkNoYW5uZWwrKykgewogICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtpWzFdfSArIHdJbkNoYW5uZWw7CiAgICAgIGZvciAoaW50IHdIZWlnaHQgPSAwOyB3SGVpZ2h0IDwgJHtpWzJdfTsgd0hlaWdodCsrKSB7CiAgICAgICAgaW50IHhIZWlnaHQgPSB4UkNDb3JuZXIueCArIHdIZWlnaHQgKiAke2UuZGlsYXRpb25zWzBdfTsKCiAgICAgICAgaWYgKHhIZWlnaHQgPCAwIHx8IHhIZWlnaHQgPj0gJHtzWzJdfSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCB3V2lkdGggPSAwOyB3V2lkdGggPCAke2lbM119OyB3V2lkdGgrKykgewogICAgICAgICAgaW50IHhXaWR0aCA9IHhSQ0Nvcm5lci55ICsgd1dpZHRoICogJHtlLmRpbGF0aW9uc1sxXX07CiAgICAgICAgICBpZiAoeFdpZHRoIDwgMCB8fCB4V2lkdGggPj0gJHtzWzNdfSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaW5wdXRfY2hhbm5lbCwgeFdpZHRoLCB4SGVpZ2h0KTsKICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKG91dHB1dF9jaGFubmVsLCB3SW5DaGFubmVsLCB3V2lkdGgsIHdIZWlnaHQpOwogICAgICAgICAgdmFsdWUgKz0geFZhbCp3VmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgJHtufQogICAgJHtkfQogICAgJHtjLm91dHB1dH0gPSB2ZWM0KHZhbHVlLCAuMCwgLjAsIC4wKTsKICB9CmA7cmV0dXJuey4uLm8sb3V0cHV0OntkaW1zOmwsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOlQsaGFzTWFpbjohMH19LEtsPShhLHQsbyk9PntsZXQgZT1ubSh0Lmxlbmd0aD4yLG8uY2FjaGVLZXkpO3JldHVybnsuLi5lLGdldDooKT0+b20oYSx0LGUsbyl9fX0pO3ZhciBpbSxhbSxabCxRbD1MKCgpPT57InVzZSBzdHJpY3QiO3dlKCk7YWUoKTtUcigpO2ltPWE9Pih7bmFtZToiSW0yQ29sIChwYWNrZWQpIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6WzJdLGNhY2hlSGludDphfSksYW09KGEsdCxvLGUscixuKT0+e2xldCBzPW8uZGltcyxpPWUuZGltcyx1PTIsbD0zLGM9ci5sZW5ndGgscD1baVsxXSppWzJdKmlbM10sclsyXSpyWzNdXSxkPWlbMl0qaVszXSxUPU50KCksdz1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx2PSIiO2ZvcihsZXQgQT0wO0E8PTE7QSsrKWZvcihsZXQgQz0wO0M8PTE7QysrKXYrPWAKICAgICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnggKyAke0N9OwogICAgICAgICAgICBwb3MgPSByYy55ICsgJHtBfTsKCiAgICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke3BbMV19ICYmIHBvcyA8ICR7cFswXX0pIHsKICAgICAgICAgICAgICBvZmZzZXRZID0gaW50KGJsb2NrSW5kZXggLyAoJHtyW2MtMV19KSkgKiAke24uc3RyaWRlc1swXX0gLQogICAgICAgICAgICAgICAgJHtuLnBhZHNbMF19OwogICAgICAgICAgICAgIGQwID0gb2Zmc2V0WSArICR7bi5kaWxhdGlvbnNbMF19ICogKGltb2QocG9zLCAke2R9KSAvICR7aVsyXX0pOwoKICAgICAgICAgICAgICBpZihkMCA8ICR7c1t1XX0gJiYgZDAgPj0gMCkgewogICAgICAgICAgICAgICAgb2Zmc2V0WCA9IGltb2QoYmxvY2tJbmRleCwgJHtyW2MtMV19KSAqICR7bi5zdHJpZGVzWzFdfSAtCiAgICAgICAgICAgICAgICAgICR7bi5wYWRzWzFdfTsKICAgICAgICAgICAgICAgIGQxID0gb2Zmc2V0WCArICR7bi5kaWxhdGlvbnNbMV19ICogaW1vZChpbW9kKHBvcywgJHtkfSksICR7aVsyXX0pOwoKICAgICAgICAgICAgICAgIGlmKGQxIDwgJHtzW2xdfSAmJiBkMSA+PSAwKSB7CgogICAgICAgICAgICAgICAgICBjaCA9IGludChmbG9hdChwb3MpLyAke2R9Lik7CiAgICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMCwgZDEpOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdFske0EqMitDfV0gPSBnZXRDaGFubmVsKAogICAgICAgICAgICAgICAgICAgICAgZ2V0QSgwLCBjaCwgaW50KGlubmVyRGltcy54KSwKICAgICAgICAgICAgICAgICAgICAgIGludChpbm5lckRpbXMueSkpLCBpbm5lckRpbXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGA7bGV0IFM9YAogICAgICAke1R9CgogICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApOwogICAgICAgICAgaW50IGJsb2NrSW5kZXgsIHBvcywgb2Zmc2V0WSwgZDAsIG9mZnNldFgsIGQxLCBjaDsKICAgICAgICAgIHZlYzIgaW5uZXJEaW1zOwogICAgICAgICAgJHt2fQogICAgICAgICAgJHt3Lm91dHB1dH0gPSByZXN1bHQ7CiAgICAgIH0KICAgICAgICAgICAgYDtyZXR1cm57Li4udCxvdXRwdXQ6e2RpbXM6cCx0eXBlOm8udHlwZSx0ZXh0dXJlVHlwZToyfSxzaGFkZXJTb3VyY2U6UyxoYXNNYWluOiEwfX0sWmw9KGEsdCxvLGUscik9PntsZXQgbj1pbShyLmNhY2hlS2V5KTtyZXR1cm57Li4ubixnZXQ6KCk9PmFtKGEsbix0LG8sZSxyKX19fSk7ZnVuY3Rpb24gdW0oYSx0LG8pe2xldCBlPXRbMF0uZGltcyxyPXRbMV0uZGltcyxuPVplLmNhbGNTaGFwZShlLHIsITApO2lmKCFuKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2xldCBzPVFlKG4ubGVuZ3RoKSxpPUR0KCkse2FjdGl2YXRpb25GdW5jdGlvbjp1LGFwcGx5QWN0aXZhdGlvbjpsfT1SdChvKSxjPXQubGVuZ3RoPjIscD1jPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixkPWM/YCR7QWkocyxpLHRbMl0uZGltcyxuLCExKX1gOiIiLFQ9bi5sZW5ndGgsdz1lLmxlbmd0aCx2PXIubGVuZ3RoLFM9ZVtlLmxlbmd0aC0xXSxBPWAKICAgICR7dX0KICAgICR7ZH0KICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtUfV0pIHsKICAgICAgICBpbnQgYVske3d9XTsKICAgICAgICBpbnQgYlske3Z9XTsKICAgICAgICBiY2FzdE1hdG11bEluZGljZXNfQShpbmRpY2VzLCBhKTsKICAgICAgICBiY2FzdE1hdG11bEluZGljZXNfQihpbmRpY2VzLCBiKTsKCiAgICAgICAgZmxvYXQgdmFsdWU7CiAgICAgICAgZm9yIChpbnQgaz0wOyBrPCR7U307ICsraykgewogICAgICAgICAgICBhWyR7dy0xfV0gPSBrOwogICAgICAgICAgICBiWyR7di0yfV0gPSBrOwogICAgICAgICAgICB2YWx1ZSArPSBfQShhKSAqIF9CKGIpOwogICAgICAgIH0KICAgICAgICAke3B9CiAgICAgICAgJHtsfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH1gO3JldHVybnsuLi5hLG91dHB1dDp7ZGltczpuLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTpBfX1mdW5jdGlvbiBTaShhLHQpe2xldCBvPXNtKGEubGVuZ3RoPjIsdC5hY3RpdmF0aW9uQ2FjaGVLZXkpO3JldHVybnsuLi5vLGdldDooKT0+dW0obyxhLHQpfX1mdW5jdGlvbiBBaShhLHQsbyxlLHIpe2xldCBuPSIiLHM9by5sZW5ndGgsaT1lLmxlbmd0aCx1PWktcztpPDImJnM+MD9uPSJjb29yZHMiOm49by5tYXAoKHYsUyk9PmBjb29yZHMuJHt0W1MrdV19YCkuam9pbigiLCAiKTtsZXQgYz1aZS5nZXRCcm9hZGNhc3REaW1zKG8sZSkubWFwKHY9PmBjb29yZHMuJHt0W3YrdV19ID0gMDtgKS5qb2luKGAKYCksZD1VLnNpemUobyk9PT0xLFQ9InZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnl5KSI7cmV0dXJuIGQmJihUPSJ2ZWM0KG91dHB1dFZhbHVlLngpIikscj9gCnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHsKICAke2F9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpOwogICR7Y30KICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke259KTsKICByZXR1cm4gJHtUfTsKfWA6YApmbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkgewogICR7YX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgJHtjfQogIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTsKfWB9dmFyIGVmLHRmLHNtLGxtLHJvPUwoKCk9PnsidXNlIHN0cmljdCI7ZmUoKTthZSgpO0J0KCk7eHIoKTtQaSgpO2VmPShhLHQsbyk9PihsbSh0KSxhLnNlc3Npb24ucGFjaz9bYS5ydW4obm8oYSx0LG8pLHQpXTpbYS5ydW4oU2kodCxvKSx0KV0pLHRmPWE9Pk5yKGEuYXR0cmlidXRlcyksc209KGEsdCk9Pih7bmFtZToiTWF0TXVsIixpbnB1dE5hbWVzOmE/WyJBIiwiQiIsIkJpYXMiXTpbIkEiLCJCIl0saW5wdXRUeXBlczphP1swLDAsMF06WzAsMF0sY2FjaGVIaW50OnR9KTtsbT1hPT57aWYoIWF8fGEubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihhWzBdLmRpbXNbYVswXS5kaW1zLmxlbmd0aC0xXSE9PWFbMV0uZGltc1thWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDY0Inx8YVsxXS50eXBlIT09ImZsb2F0MzIiJiZhWzFdLnR5cGUhPT0iZmxvYXQ2NCIpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihhWzBdLnR5cGUhPT1hWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9fSk7ZnVuY3Rpb24gcG0oYSx0LG8sZSl7bGV0IHI9W10sbj1bXSxzPW9bMF0uZGltcyxpPW9bMV0uZGltcyx1PXMubGVuZ3RoLGw9aS5sZW5ndGgsYz1lLmxlbmd0aCxwPWMtdSxkPWMtbDtyPXMubWFwKChGLEopPT5gY29vcmRzLiR7dFtKK3BdfWApLHJbdS0xXT0iaSoyIixyLmpvaW4oIiwgIiksbj1pLm1hcCgoRixKKT0+YGNvb3Jkcy4ke3RbSitkXX1gKSxuW2wtMl09ImkqMiIsbi5qb2luKCIsICIpO2xldCBUPVplLmdldEJyb2FkY2FzdERpbXMocyxlKSx3PVplLmdldEJyb2FkY2FzdERpbXMoaSxlKSx2PVQubWFwKEY9PmBjb29yZHMuJHt0W0YrcF19ID0gMDtgKS5qb2luKGAKYCksUz13Lm1hcChGPT5gY29vcmRzLiR7dFtGK2RdfSA9IDA7YCkuam9pbihgCmApLEE9YGludCBsYXN0RGltID0gY29vcmRzLiR7dFtjLTFdfTsKICBjb29yZHMuJHt0W2MtMV19ID0gY29vcmRzLiR7dFtjLTJdfTsKICBjb29yZHMuJHt0W2MtMl19ID0gbGFzdERpbTtgO3JldHVybmAKdmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHsKICAke2F9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpOwogICR7QX0KICAke3Z9CiAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldEEoJHtyfSk7CiAgcmV0dXJuIG91dHB1dFZhbHVlOwp9Cgp2ZWM0IGdldEJBdE91dENvb3Jkc01hdG11bChpbnQgaSkgewogICR7YX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgJHtBfQogICR7U30KICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qigke259KTsKICByZXR1cm4gb3V0cHV0VmFsdWU7Cn1gfWZ1bmN0aW9uIGRtKGEsdCl7bGV0IG89IiI7Zm9yKGxldCBlPTA7ZTx0LTI7ZSsrKW8rPWByYy4ke2FbZV19LCBgO3JldHVybiBvKz1gcmMuJHthW3QtMl19LCBpKjJgLG99ZnVuY3Rpb24gaG0oYSx0KXtsZXQgbz0iIjtmb3IobGV0IGU9MDtlPHQtMjtlKyspbys9YHJjLiR7YVtlXX0sIGA7cmV0dXJuIG8rPWBpKjIsIHJjLiR7YVt0LTFdfWAsb312YXIgZm0sY20sbm8sUGk9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtmZSgpO3dlKCk7YWUoKTtCdCgpO3hyKCk7cm8oKTtmbT0oYSx0KT0+KHtuYW1lOiJNYXRNdWwgKHBhY2tlZCkiLGlucHV0TmFtZXM6YT9bIkEiLCJCIiwiQmlhcyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmE/WzIsMiwyXTpbMiwyXSxjYWNoZUhpbnQ6dH0pLGNtPShhLHQsbyxlKT0+e2xldCByPW8ubGVuZ3RoPjIsbj1yPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixzPW9bMF0uZGltcyxpPW9bMV0uZGltcyx1PVplLmNhbGNTaGFwZShzLGksITApLGw9IVUuYXJlRXF1YWwob1swXS5kaW1zLG9bMV0uZGltcyk7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgbWF0bXVsIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7bGV0IGM9c1tzLmxlbmd0aC0xXSxwPU1hdGguY2VpbChjLzIpLGQ9cy5sZW5ndGgsVD1pLmxlbmd0aCx3PUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLHY9UWUodS5sZW5ndGgpLFM9dS5sZW5ndGgsQT1EdCgpLHthY3RpdmF0aW9uRnVuY3Rpb246QyxhcHBseUFjdGl2YXRpb246Rn09UnQoZSksSj1yP2Ake0FpKHYsQSxvWzJdLmRpbXMsdSwhMCl9YDoiIixqPWw/YCR7cG0odixBLG8sdSl9YDoiIixpZT1sPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZG0oQSxkKX0pYCxHPWw/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtobShBLFQpfSlgLFRlPWw/IiI6YCR7dn0gcmMgPQogICAgICAgICAgZ2V0T3V0cHV0Q29vcmRzKCk7IGludCBsYXN0RGltID0gcmMuJHtBW1MtMV19OyByYy4ke0FbUy0xXX0gPQogICAgICAgICAgcmMuJHtBW1MtMl19OyByYy4ke0FbUy0yXX0gPSBsYXN0RGltOwogICAgICBgLEhlPWAKICAgICAgICAgICAgJHtqfQogICAgICAgICAgICAke0p9CiAgICAgICAgICAgICR7Q30KICAgICAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICAgICR7VGV9CgogICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApOwogICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtwfTsgaSsrKSB7CiAgICAgICAgICAgICAgICB2ZWM0IGEgPSAke2llfTsKICAgICAgICAgICAgICAgIHZlYzQgYiA9ICR7R307CgogICAgICAgICAgICAgICAgdmFsdWUgKz0gKGEucnJiYiAqIGIucmdyZyk7CiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoYS5nZ2FhICogYi5iYWJhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJHtufQogICAgICAgICAgICAgICR7Rn0KICAgICAgICAgICAgICAke3cub3V0cHV0fSA9IHZhbHVlOwogICAgICAgICAgICB9YDtyZXR1cm57Li4udCxvdXRwdXQ6e2RpbXM6dSx0eXBlOm9bMF0udHlwZSx0ZXh0dXJlVHlwZToyfSxzaGFkZXJTb3VyY2U6SGUsaGFzTWFpbjohMH19LG5vPShhLHQsbyk9PntsZXQgZT1mbSh0Lmxlbmd0aD4yLG8uYWN0aXZhdGlvbkNhY2hlS2V5KTtyZXR1cm57Li4uZSxnZXQ6KCk9PmNtKGEsZSx0LG8pfX19KTt2YXIgcmYsbmY9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt0bygpO1FsKCk7UGkoKTtyZj0oYSx0LG8pPT57bGV0IGU9dFswXS5kaW1zLHI9dFsxXS5kaW1zLG49UnIoZSxyLG8uZGlsYXRpb25zLG8ucGFkcyxvLnN0cmlkZXMpLHM9YS5ydW4oWmwoYSx0WzBdLHRbMV0sbixvKSxbdFswXV0pLGk9YS5yZXNoYXBlUGFja2VkKHRbMV0sW3JbMF0sclsxXSpyWzJdKnJbM11dKSx1PXQubGVuZ3RoPT09Mz9baSxzLHRbMl1dOltpLHNdLGw9YS5ydW4obm8oYSx1LG8pLHUpO3JldHVybiBhLnJlc2hhcGVQYWNrZWQobCxuKX19KTt2YXIgbW0sYm0sb2YsRWksRGk9TCgoKT0+eyJ1c2Ugc3RyaWN0IjthZSgpO21tPWE9Pih7bmFtZToiSW0yQ29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6WzBdLGNhY2hlSGludDphfSksYm09KGEsdCxvLGUscixuKT0+e2xldCBzPW8uZGltcyxpPWUuZGltcyx1PXIubGVuZ3RoLGw9RWkocyxpLHIsNCksYz1gCiAgICAgICAgY29uc3QgaW50IFhDID0gJHtzWzFdfTsKICAgICAgICBjb25zdCBpbnQgWEggPSAke3NbMl19OwogICAgICAgIGNvbnN0IGludCBYVyA9ICR7c1szXX07CiAgICAgICAgY29uc3QgaW50IEtIID0gJHtuLmtlcm5lbFNoYXBlWzBdfTsKICAgICAgICBjb25zdCBpbnQgS1cgPSAke24ua2VybmVsU2hhcGVbMV19OwogICAgICAgIGNvbnN0IGludCBkaWxhdGlvbkggPSAke24uZGlsYXRpb25zWzBdfTsKICAgICAgICBjb25zdCBpbnQgZGlsYXRpb25XID0gJHtuLmRpbGF0aW9uc1sxXX07CiAgICAgICAgY29uc3QgaW50IHN0cmlkZUggPSAke24uc3RyaWRlc1swXX07CiAgICAgICAgY29uc3QgaW50IHN0cmlkZVcgPSAke24uc3RyaWRlc1sxXX07CiAgICAgICAgY29uc3QgaW50IHBhZEggPSAke24ucGFkc1swXX07CiAgICAgICAgY29uc3QgaW50IHBhZFcgPSAke24ucGFkc1sxXX07CiAgICAgICAgY29uc3QgaW50IEtIS1cgPSBLSCpLVzsKICAgICAgICBjb25zdCBpbnQgWENLSEtXID0gWEMgKiBLSEtXOwogICAgICAgIGNvbnN0IGludCBvdXRwdXRDaGFubmVscyA9IDQ7CiAgICAgICAgdmVjNCBwcm9jZXNzKGludCBpbmRpY2VzWyR7dX1dKSB7CiAgICAgICAgICBpbnQgYiAgPSBpbmRpY2VzWzBdOyAvLyBiYXRjaCBzaXplCiAgICAgICAgICBpbnQgb2ggPSBpbmRpY2VzWzFdICogc3RyaWRlSCAtIHBhZEg7IC8vb3V0cHV0IGhlaWdodAogICAgICAgICAgaW50IG93ID0gaW5kaWNlc1syXSAqIHN0cmlkZVcgLSBwYWRXOyAvL291dHB1dCB3aWR0aAogICAgICAgICAgaW50IHAgPSBpbmRpY2VzWzNdICogb3V0cHV0Q2hhbm5lbHM7IC8vcGF0Y2gKICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDAuMCk7CiAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IG91dHB1dENoYW5uZWxzOyArK2kpIHsKICAgICAgICAgICAgaWYocCA8IFhDS0hLVykgewogICAgICAgICAgICAgIGludCBwYXRjaEMgPSBwIC8gS0hLVzsKICAgICAgICAgICAgICBpbnQgcGF0Y2hIID0gKHAgLSBwYXRjaEMqS0hLVykgLyBLVzsKICAgICAgICAgICAgICBpbnQgcGF0Y2hXID0gKHAgLSBwYXRjaEMqS0hLVykgLSBwYXRjaEggKiBLVzsKICAgICAgICAgICAgICBpbnQgeGgyID0gb2ggKyBwYXRjaEggKiBkaWxhdGlvbkg7CiAgICAgICAgICAgICAgaW50IHh3MiA9IG93ICsgcGF0Y2hXICogZGlsYXRpb25XOwogICAgICAgICAgICAgIGludCB4WyR7cy5sZW5ndGh9XTsKICAgICAgICAgICAgICB4WzBdID0gYjsKICAgICAgICAgICAgICB4WzFdID0gcGF0Y2hDOwogICAgICAgICAgICAgIHhbMl0gPSB4aDI7CiAgICAgICAgICAgICAgeFszXSA9IHh3MjsKICAgICAgICAgICAgICBpZih4aDIgPj0gMCAmJgogICAgICAgICAgICAgICAgICB4aDIgPCBYSCAmJgogICAgICAgICAgICAgICAgICB4dzIgPj0gMCAmJgogICAgICAgICAgICAgICAgICB4dzIgPCBYVykgewogICAgICAgICAgICAgICAgdmFsdWVbaV0gPSBfWCh4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytwOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBgO3JldHVybnsuLi50LG91dHB1dDp7ZGltczpsLHR5cGU6by50eXBlLHRleHR1cmVUeXBlOjR9LHNoYWRlclNvdXJjZTpjfX0sb2Y9KGEsdCxvLGUscik9PntsZXQgbj1tbShyLmNhY2hlS2V5KTtyZXR1cm57Li4ubixnZXQ6KCk9PmJtKGEsbix0LG8sZSxyKX19LEVpPShhLHQsbyxlPTQpPT5bb1swXSxvWzJdLG9bM10sTWF0aC5jZWlsKGFbMV0qdFsyXSp0WzNdL2UpXX0pO3ZhciBnbSx5bSxhZixzZj1MKCgpPT57InVzZSBzdHJpY3QiO2ZlKCk7d2UoKTthZSgpO3hyKCk7RGkoKTtnbT0oYSx0KT0+KHtuYW1lOiJDb252RG90UHJvZHVjdCIsaW5wdXROYW1lczphP1siSW0yQ29sIiwiSyIsIkIiXTpbIkltMkNvbCIsIksiXSxpbnB1dFR5cGVzOmE/WzAsNCwwXTpbMCw0XSxjYWNoZUtleTp0LmFjdGl2YXRpb25DYWNoZUtleX0pLHltPShhLHQsbyxlLHIpPT57bGV0IG49b1swXS5kaW1zLHM9b1sxXS5kaW1zLGk9W3NbMF0sTWF0aC5jZWlsKG5bMV0qc1syXSpzWzNdLzQpXSx1PUVpKG4scyxlKSxbbCxjXT1hLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChpLDQpLHA9VS5jb21wdXRlU3RyaWRlcyh1KSxbZCxUXT1hLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh1LDQpLHc9ZS5sZW5ndGgsdj1vLmxlbmd0aDwzPyIwLjAiOiJfQihiKSIsUz1NYXRoLmNlaWwoblsxXSpzWzJdKnNbM10vNCkse2FjdGl2YXRpb25GdW5jdGlvbjpBLGFwcGx5QWN0aXZhdGlvbjpDfT1SdChyKSxGPUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLEo9YAoke0F9CmZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt3fV0pIHsKICBpbnQgYlsxXTsKICBiWzBdID0gaW5kaWNlc1sxXTsKICBpbnQgaW0yY29sWzRdOwogIGltMmNvbFswXSA9IGluZGljZXNbMF07CiAgaW0yY29sWzFdID0gaW5kaWNlc1syXTsKICBpbTJjb2xbMl0gPSBpbmRpY2VzWzNdOwogIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke3BbMF19ICsgaW0yY29sWzFdICogJHtwWzFdfSArIGltMmNvbFsyXSAqICR7cFsyXX07CiAgaW50IGtlcm5lbE9mZnNldCA9IGluZGljZXNbMV0gKiAke2lbMV19OwogIGZsb2F0IHZhbHVlID0gJHt2fTsKICBmb3IgKGludCBpID0gMDsgaSA8ICR7U307ICsraSkgewogICAgdmVjMiBpbTJjb2xDb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbTJjb2xPZmZzZXQsICR7ZH0sICR7VH0pOwogICAgdmVjMiBrZXJuZWxDb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhrZXJuZWxPZmZzZXQsICR7bH0sICR7Y30pOwogICAgdmFsdWUgKz0gZG90KCR7Ri50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtGLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7CiAgICArK2ltMmNvbE9mZnNldDsKICAgICsra2VybmVsT2Zmc2V0OwogIH0KICAke0N9CiAgcmV0dXJuIHZhbHVlOwp9YDtyZXR1cm57Li4udCxvdXRwdXQ6e2RpbXM6ZSx0eXBlOm9bMF0udHlwZSx0ZXh0dXJlVHlwZTowfSxzaGFkZXJTb3VyY2U6Sn19LGFmPShhLHQsbyxlKT0+e2xldCByPWdtKHQubGVuZ3RoPjIsZSk7cmV0dXJuey4uLnIsZ2V0OigpPT55bShhLHIsdCxvLGUpfX19KTt2YXIgUnIsTGksVG0seG0sd20sdm0sQ2ksX20sdG89TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVZSgpO2ZlKCk7SmwoKTtuZigpO3NmKCk7eHIoKTtEaSgpO3JvKCk7UnI9KGEsdCxvLGUscik9PntsZXQgbj1hWzBdLHM9YS5zbGljZSgyKSxpPXMubGVuZ3RoLHU9dFswXSxjPXQuc2xpY2UoMikubWFwKCh3LHYpPT53Kyh3LTEpKihvW3ZdLTEpKSxkPXMubWFwKCh3LHYpPT53K2Vbdl0rZVt2K2ldKS5tYXAoKHcsdik9Pk1hdGguZmxvb3IoKHctY1t2XStyW3ZdKS9yW3ZdKSk7cmV0dXJuW24sdV0uY29uY2F0KC4uLmQpfSxMaT0oYSx0LG8pPT4oX20odCxvKSxUbShhLHQsbykpLFRtPShhLHQsbyk9PntsZXQgZT12bShvLHQpLHI9YS5zZXNzaW9uLnBhY2ssbj1lLmtlcm5lbFNoYXBlWzBdPT09MSYmZS5rZXJuZWxTaGFwZVsxXT09PTE7cmV0dXJuIGUuZ3JvdXA+MT9bYS5ydW4oS2woYSx0LGUpLHQpXTpuJiZyP1t4bShhLHQsZSldOnImJnRbMF0uZGltcy5sZW5ndGg9PT00JiZ0WzBdLmRpbXNbMF09PT0xJiYhbj9bcmYoYSx0LGUpXTpbd20oYSx0LGUpXX0seG09KGEsdCxvKT0+e2xldCBlPXRbMF0uZGltcyxyPXRbMV0uZGltcyxuPVJyKGUscixvLmRpbGF0aW9ucyxvLnBhZHMsby5zdHJpZGVzKSxzPWEucmVzaGFwZVVucGFja2VkKHRbMF0sW2VbMV0sZVsyXSplWzNdXSksaT1hLnJlc2hhcGVVbnBhY2tlZCh0WzFdLFtyWzBdLHJbMV1dKSx1PXQubGVuZ3RoPjI/W2kscyx0WzJdXTpbaSxzXSxsPWEucnVuKFNpKHUsbyksdSk7cmV0dXJuIGEucmVzaGFwZVVucGFja2VkKGwsbil9LHdtPShhLHQsbyk9PntsZXQgZT10WzBdLmRpbXMscj10WzFdLmRpbXMsbj1ScihlLHIsby5kaWxhdGlvbnMsby5wYWRzLG8uc3RyaWRlcykscz1hLnJ1bihvZihhLHRbMF0sdFsxXSxuLG8pLFt0WzBdXSksaT10Lmxlbmd0aD09PTM/W3MsdFsxXSx0WzJdXTpbcyx0WzFdXTtyZXR1cm4gYS5ydW4oYWYoYSx0LG4sbyksaSl9LHZtPShhLHQpPT57bGV0IG89YS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKGEua2VybmVsU2hhcGUubGVuZ3RoPT09MClmb3IobGV0IG49MjtuPHRbMV0uZGltcy5sZW5ndGg7KytuKW8ucHVzaCh0WzFdLmRpbXNbbl0pO2xldCBlPWEucGFkcy5zbGljZSgpO21yLmFkanVzdFBhZHNCYXNlZE9uQXV0b1BhZCh0WzBdLmRpbXMsYS5zdHJpZGVzLGEuZGlsYXRpb25zLG8sZSxhLmF1dG9QYWQpO2xldCByPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuIE9iamVjdC5hc3NpZ24ocix7a2VybmVsU2hhcGU6byxwYWRzOmUsY2FjaGVLZXk6YS5jYWNoZUtleX0pLHJ9LENpPWE9PntsZXQgdD1hLmF0dHJpYnV0ZXMsbz1Ocih0KSxlPXQuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLHI9dC5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxuPXQuZ2V0SW50KCJncm91cCIsMSkscz10LmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLGk9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLHU9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuIFEoe2F1dG9QYWQ6ZSxkaWxhdGlvbnM6cixncm91cDpuLGtlcm5lbFNoYXBlOnMscGFkczppLHN0cmlkZXM6dSwuLi5vfSl9LF9tPShhLHQpPT57aWYoIWF8fGEubGVuZ3RoIT09MiYmYS5sZW5ndGghPT0zKXRocm93IG5ldyBFcnJvcigiQ29udiByZXF1aXJlcyAyIG9yIDMgaW5wdXRzIik7aWYoYVswXS5kaW1zLmxlbmd0aCE9PTR8fGFbMV0uZGltcy5sZW5ndGghPT00KXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG9ubHkgc3VwcG9ydCAyLWRpbWVuc2lvbmFsIGNvbnYiKTtsZXQgbz1hWzBdLmRpbXNbMV0sZT1hWzFdLmRpbXNbMV0qdC5ncm91cDtpZihvIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkZJTFRFUl9JTl9DSEFOTkVMIHNob3VsZCBiZSBlcXVhbCB0byBEQVRBX0NIQU5ORUwiKTtpZihhLmxlbmd0aD09PTMmJihhWzJdLmRpbXMubGVuZ3RoIT09MXx8YVsxXS5kaW1zWzBdIT09YVsyXS5kaW1zWzBdKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYmlhcyIpO2xldCByPWFbMF0uZGltcy5sZW5ndGgtMjtpZih0LmRpbGF0aW9ucy5sZW5ndGghPT1yKXRocm93IG5ldyBFcnJvcihgZGlsYXRpb25zIHNob3VsZCBiZSAke3J9RGApO2lmKHQuc3RyaWRlcy5sZW5ndGghPT1yKXRocm93IG5ldyBFcnJvcihgc3RyaWRlcyBzaG91bGQgYmUgJHtyfURgKTtpZih0LnBhZHMubGVuZ3RoIT09cioyKXRocm93IG5ldyBFcnJvcihgcGFkcyBzaG91bGQgYmUgJHtyKjJ9RGApO2lmKHQua2VybmVsU2hhcGUubGVuZ3RoIT09MCYmdC5rZXJuZWxTaGFwZS5sZW5ndGghPT1hWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKGFbMF0udHlwZSE9PSJmbG9hdDMyInx8YVsxXS50eXBlIT09ImZsb2F0MzIiKXRocm93IG5ldyBFcnJvcigiQ29udiBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZihhLmxlbmd0aD09PTMmJmFbMl0udHlwZSE9PSJmbG9hdDMyIil0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfX0pO3ZhciBPbSxJbSxTbSx1ZixBbSxQbSxFbSxEbSxMbSxDbSxsZixGbSxmZj1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7d2UoKTthZSgpO3hyKCk7T209KGEsdCxvLGUscixuKT0+KGEtMSkqdCtvKyhlLTEpKnIrMS1uLEltPShhLHQsbyxlLHIpPT57bGV0IG49TWF0aC5mbG9vcihhLzIpO3Q9PT0iU0FNRV9VUFBFUiI/KG9bZV09bixvW3JdPWEtbik6dD09PSJTQU1FX0xPV0VSIiYmKG9bZV09YS1uLG9bcl09bil9LFNtPShhLHQsbyxlLHIsbixzLGkpPT57bGV0IHU9YS5sZW5ndGgtMixsPWkubGVuZ3RoPT09MDtmb3IobGV0IGM9MDtjPHU7KytjKXtsZXQgcD1sP2FbYysyXSpuW2NdOmlbY10sZD1PbShhW2MrMl0sbltjXSxyW2NdLHRbY10sb1tjXSxwKTtJbShkLGUscixjLGMrdSksbCYmaS5wdXNoKG5bY10qKGFbYysyXS0xKStzW2NdKyh0W2NdLTEpKm9bY10rMS1yW2NdLXJbYyt1XSl9fSx1Zj0oYSx0LG8pPT4oRm0odCxvKSxBbShhLHQsbykpLEFtPShhLHQsbyk9PntsZXQgZT1DbShvLHQpO3JldHVybltMbShhLHQsZSldfSxQbT0oYSx0KT0+KHtuYW1lOiJDb252VHJhbnNwb3NlIixpbnB1dE5hbWVzOmE/WyJYIiwiVyIsIkIiXTpbIlgiLCJXIl0saW5wdXRUeXBlczphP1swLDAsMF06WzAsMF0sY2FjaGVIaW50OnR9KSxFbT0oYSx0LG8sZSk9PntsZXQgbj10Lmxlbmd0aD4yPyJnZXRCKG91dHB1dF9jaGFubmVsKSI6IjAuMCIscz10WzBdLmRpbXMsaT10WzFdLmRpbXMsdT1pWzFdLGw9aVswXS9lLmdyb3VwLGM9W3RbMF0uZGltc1swXSx0WzFdLmRpbXNbMV0qZS5ncm91cCwuLi5lLm91dHB1dFNoYXBlXSxwPUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLHthY3RpdmF0aW9uRnVuY3Rpb246ZCxhcHBseUFjdGl2YXRpb246VH09UnQoZSksdz1gCiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7ZS5zdHJpZGVzWzBdfSwgJHtlLnN0cmlkZXNbMV19KTsKICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtlLnBhZHNbMF19LCAke2UucGFkc1sxXX0pOwogICR7ZH0KICB2b2lkIG1haW4oKSB7CiAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTsKICAgIGludCBiYXRjaCA9IGNvb3Jkcy54OwogICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7CgogICAgaXZlYzIgbG9jID0gY29vcmRzLnp3ICsgcGFkczsKCiAgICBpbnQgZ3JvdXBfaWQgPSBvdXRwdXRfY2hhbm5lbCAvICR7dX07CiAgICBpbnQgd091dENoYW5uZWwgPSBvdXRwdXRfY2hhbm5lbCAtIGdyb3VwX2lkICogJHt1fTsKCiAgICBmbG9hdCB2YWx1ZSA9ICR7bn07CiAgICBmb3IgKGludCBpbkNoYW5uZWxPZmZzZXQgPSAwOyBpbkNoYW5uZWxPZmZzZXQgPCAke2x9OyBpbkNoYW5uZWxPZmZzZXQrKykgewogICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtsfSArIGluQ2hhbm5lbE9mZnNldDsKICAgICAgZm9yIChpbnQgd1dPZmYgPSAwOyB3V09mZiA8ICR7aVsyXX07IHdXT2ZmKyspIHsKICAgICAgICBmb3IgKGludCB3SE9mZiA9IDA7IHdIT2ZmIDwgJHtpWzNdfTsgd0hPZmYrKykgewogICAgICAgICAgaXZlYzIgd09mZiA9IGl2ZWMyKHdXT2ZmICogJHtlLmRpbGF0aW9uc1swXX0sIHdIT2ZmICogJHtlLmRpbGF0aW9uc1sxXX0pOwogICAgICAgICAgaXZlYzIgd0xvYyA9IGxvYyAtIHdPZmY7CiAgICAgICAgICBpdmVjMiB3TG9jSW4gPSB3TG9jIC8gc3RyaWRlczsKICAgICAgICAgIGlmICgKICAgICAgICAgICAgd0xvY0luICogc3RyaWRlcyA9PSB3TG9jICYmCiAgICAgICAgICAgIHdMb2NJbi54ID49IDAgJiYgd0xvY0luLnggPCAke3NbMl19ICYmCiAgICAgICAgICAgIHdMb2NJbi55ID49IDAgJiYgd0xvY0luLnkgPCAke3NbM119CiAgICAgICAgICApIHsKICAgICAgICAgICAgZmxvYXQgeFZhbCA9IGdldFgoYmF0Y2gsIGlucHV0X2NoYW5uZWwsIHdMb2NJbi55LCB3TG9jSW4ueCk7CiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKGlucHV0X2NoYW5uZWwsIHdPdXRDaGFubmVsLCB3SE9mZiwgd1dPZmYpOwogICAgICAgICAgICB2YWx1ZSArPSB4VmFsICogd1ZhbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgICR7VH0KICAgICR7cC5vdXRwdXR9ID0gdmVjNCh2YWx1ZSwgLjAsIC4wLCAuMCk7CiAgfQpgO3JldHVybnsuLi5vLG91dHB1dDp7ZGltczpjLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTp3LGhhc01haW46ITB9fSxEbT0oYSx0LG8pPT57bGV0IGU9UG0odC5sZW5ndGg+MixvLmNhY2hlS2V5KTtyZXR1cm57Li4uZSxnZXQ6KCk9PkVtKGEsdCxlLG8pfX0sTG09KGEsdCxvKT0+YS5ydW4oRG0oYSx0LG8pLHQpLENtPShhLHQpPT57bGV0IG89YS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKGEua2VybmVsU2hhcGUubGVuZ3RoPT09MClmb3IobGV0IGk9MjtpPHRbMV0uZGltcy5sZW5ndGg7KytpKW8ucHVzaCh0WzFdLmRpbXNbaV0pO2xldCBlPWEucGFkcy5zbGljZSgpLHI9YS5vdXRwdXRTaGFwZS5zbGljZSgpLG49dFswXS5kaW1zO1NtKG4sbyxhLmRpbGF0aW9ucyxhLmF1dG9QYWQsZSxhLnN0cmlkZXMsYS5vdXRwdXRQYWRkaW5nLHIpO2xldCBzPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuIE9iamVjdC5hc3NpZ24ocyx7a2VybmVsU2hhcGU6byxwYWRzOmUsb3V0cHV0U2hhcGU6cixjYWNoZUtleTphLmNhY2hlS2V5fSksc30sbGY9YT0+e2xldCB0PWEuYXR0cmlidXRlcyxvPU5yKHQpLGU9dC5nZXRTdHJpbmcoImF1dG9fcGFkIiwiTk9UU0VUIikscj10LmdldEludHMoImRpbGF0aW9ucyIsWzEsMV0pLG49dC5nZXRJbnQoImdyb3VwIiwxKSxzPXQuZ2V0SW50cygia2VybmVsX3NoYXBlIixbXSksaT10LmdldEludHMoIm91dHB1dF9wYWRkaW5nIixbMCwwXSksdT10LmdldEludHMoIm91dHB1dF9zaGFwZSIsW10pLGw9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLGM9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuIFEoe2F1dG9QYWQ6ZSxkaWxhdGlvbnM6cixncm91cDpuLGtlcm5lbFNoYXBlOnMsb3V0cHV0UGFkZGluZzppLG91dHB1dFNoYXBlOnUscGFkczpsLHN0cmlkZXM6YywuLi5vfSl9LEZtPShhLHQpPT57aWYoIWF8fGEubGVuZ3RoIT09MiYmYS5sZW5ndGghPT0zKXRocm93IG5ldyBFcnJvcigiQ29udiByZXF1aXJlcyAyIG9yIDMgaW5wdXRzIik7aWYoYVswXS5kaW1zLmxlbmd0aCE9PTR8fGFbMV0uZGltcy5sZW5ndGghPT00KXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG9ubHkgc3VwcG9ydCAyLWRpbWVuc2lvbmFsIGNvbnYiKTtsZXQgbz1hWzBdLmRpbXNbMV0sZT1hWzFdLmRpbXNbMF07aWYobyE9PWUpdGhyb3cgbmV3IEVycm9yKCJGSUxURVJfSU5fQ0hBTk5FTCBzaG91bGQgYmUgZXF1YWwgdG8gREFUQV9DSEFOTkVMIik7bGV0IHI9YVsxXS5kaW1zWzFdKnQuZ3JvdXA7aWYoYS5sZW5ndGg9PT0zJiYoYVsyXS5kaW1zLmxlbmd0aCE9PTF8fGFbMl0uZGltc1swXSE9PXIpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7bGV0IG49YVswXS5kaW1zLmxlbmd0aC0yO2lmKHQuZGlsYXRpb25zLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKGBkaWxhdGlvbnMgc2hvdWxkIGJlICR7bn1EYCk7aWYodC5zdHJpZGVzLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKGBzdHJpZGVzIHNob3VsZCBiZSAke259RGApO2lmKHQucGFkcy5sZW5ndGghPT1uKjIpdGhyb3cgbmV3IEVycm9yKGBwYWRzIHNob3VsZCBiZSAke24qMn1EYCk7aWYodC5vdXRwdXRQYWRkaW5nLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKGBvdXRwdXRfcGFkZGluZyBzaG91bGQgYmUgJHtufURgKTtpZih0Lmtlcm5lbFNoYXBlLmxlbmd0aCE9PTAmJnQua2VybmVsU2hhcGUubGVuZ3RoIT09YVsxXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBrZXJuZWwgc2hhcGUiKTtpZih0Lm91dHB1dFNoYXBlLmxlbmd0aCE9PTAmJnQub3V0cHV0U2hhcGUubGVuZ3RoIT09YVswXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvdXRwdXQgc2hhcGUiKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiJ8fGFbMV0udHlwZSE9PSJmbG9hdDMyIil0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoWCxXKSBzaG91bGQgYmUgZmxvYXQgdGVuc29yIik7aWYoYS5sZW5ndGg9PT0zJiZhWzJdLnR5cGUhPT0iZmxvYXQzMiIpdGhyb3cgbmV3IEVycm9yKCJDb252VHJhbnNwb3NlIGlucHV0KGJpYXMpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKX19KTt2YXIgY2Ysd3IscGYsJG0sZGYsa20sQm0sTm0sb289TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVZSgpO2ZlKCk7YWUoKTtjZj17bmFtZToiVHJhbnNwb3NlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6WzBdfSx3cj0oYSx0LG8pPT4oTm0odCksW2EucnVuKHsuLi5jZixjYWNoZUhpbnQ6by5jYWNoZUtleSxnZXQ6KCk9PiRtKGEsdFswXSxvLnBlcm0pfSx0KV0pLHBmPWE9PlEoe3Blcm06YS5hdHRyaWJ1dGVzLmdldEludHMoInBlcm0iLFtdKX0pLCRtPShhLHQsbyk9PntsZXQgZT10LmRpbXM7bz1kZihlLG8pO2xldCByPWttKGUsbyksbj1lLmxlbmd0aCxzPWAKICAgICAgJHtCbSgicGVybSIsbyxuKX0KICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske259XSkgewogICAgICAgIGludCBhWyR7bn1dOwogICAgICAgIHBlcm0oYSwgaW5kaWNlcyk7CiAgICAgICAgcmV0dXJuIF9BKGEpOwogICAgICB9YDtyZXR1cm57Li4uY2Ysb3V0cHV0OntkaW1zOnIsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOnN9fSxkZj0oYSx0KT0+KHQmJnQubGVuZ3RoIT09YS5sZW5ndGgmJih0PVsuLi5hLmtleXMoKV0ucmV2ZXJzZSgpKSx0KSxrbT0oYSx0KT0+KHQ9ZGYoYSx0KSxVLnNvcnRCYXNlZE9uUGVybShhLHQpKSxCbT0oYSx0LG8pPT57bGV0IGU9W107ZS5wdXNoKGB2b2lkICR7YX0ob3V0IGludCBhWyR7b31dLCBpbnQgc3JjWyR7b31dKSB7YCk7Zm9yKGxldCByPTA7cjxvOysrcillLnB1c2goYAlhWyR7dFtyXX1dPXNyY1ske3J9XTtgKTtyZXR1cm4gZS5wdXNoKCIJfSIpLGUuam9pbihgCmApfSxObT1hPT57aWYoIWF8fGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlRyYW5zcG9zZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKGFbMF0udHlwZSE9PSJmbG9hdDMyIiYmYVswXS50eXBlIT09ImZsb2F0NjQiKXRocm93IG5ldyBFcnJvcigiaW5wdXQgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfX0pO3ZhciBoZixtZixSbSxiZj1MKCgpPT57InVzZSBzdHJpY3QiO29vKCk7aGY9KGEsdCxvKT0+e1JtKHQpO2xldCBlPW8uYmxvY2tzaXplLHI9ZSplLG49by5tb2RlPT09IkRDUiI/WzAsMyw0LDEsNSwyXTpbMCwxLDQsMiw1LDNdLHM9by5tb2RlPT09IkRDUiI/W3RbMF0uZGltc1swXSxlLGUsdFswXS5kaW1zWzFdL3IsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV06W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcixlLGUsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV0saT1hLnJlc2hhcGVVbnBhY2tlZCh0WzBdLHMpLHU9e3Blcm06bixjYWNoZUtleTpgJHtufWB9LFtsXT13cihhLFtpXSx1KSxjPVt0WzBdLmRpbXNbMF0sdFswXS5kaW1zWzFdL3IsdFswXS5kaW1zWzJdKmUsdFswXS5kaW1zWzNdKmVdO3JldHVyblthLnJlc2hhcGVVbnBhY2tlZChsLGMpXX0sbWY9YT0+e2xldCB0PWEuYXR0cmlidXRlcy5nZXRJbnQoImJsb2Nrc2l6ZSIpO2lmKHQ8MSl0aHJvdyBuZXcgRXJyb3IoYGJsb2Nrc2l6ZSBtdXN0IGJlID49IDEsIGJ1dCBnb3QgOiAke3R9IGZvciBEZXB0aFRvU3BhY2VgKTtsZXQgbz1hLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJtb2RlIiwiRENSIik7aWYobyE9PSJEQ1IiJiZvIT09IkNSRCIpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtvfSBmb3IgRGVwdGhUb1NwYWNlYCk7cmV0dXJue21vZGU6byxibG9ja3NpemU6dH19LFJtPWE9PntpZihhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKGBEZXB0aFRvU3BhY2UgZXhwZWN0IDEgaW5wdXRzLCBidXQgZ290ICR7YS5sZW5ndGh9YCk7aWYoYVswXS50eXBlPT09InN0cmluZyJ8fGFbMF0uZGltcy5sZW5ndGghPT00KXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcHRoVG9TcGFjZSBpbnB1dCBzaG91bGQgYmUgYSA0LUQgbnVtZXJpYyB0ZW5zb3IiKX19KTt2YXIgZ2YseWYsTW0sVGY9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtmZSgpO2dmPShhLHQsbyk9PntNbSh0LG8pO2xldCBlPVUuZmxhdHRlblNoYXBlKHRbMF0uZGltcyxvKTtyZXR1cm5bYS5yZXNoYXBlVW5wYWNrZWQodFswXSxlKV19LHlmPWE9PmEuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpLE1tPShhLHQpPT57aWYoIWF8fGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkZsYXR0ZW4gcmVxdWlyZXMgMSBpbnB1dC4iKTtsZXQgbz1hWzBdLmRpbXMubGVuZ3RoO2lmKG89PT0wKXRocm93IG5ldyBFcnJvcigic2NhbGFyIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkLiIpO2lmKHQ8LW98fHQ+byl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcyIpO2lmKGFbMF0udHlwZT09PSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigic3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkLiIpfX0pO3ZhciBRdCxwbj1MKCgpPT57InVzZSBzdHJpY3QiO1F0PVsiZmxvYXQzMiIsImZsb2F0NjQiLCJpbnQzMiIsImludDE2IiwiaW50OCIsInVpbnQxNiIsInVpbnQzMiIsInVpbnQ4Il19KTt2YXIgeGYsd2YsR20sVW0sem0sVm0sdmY9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVZSgpO3BuKCk7ZmUoKTthZSgpO3hmPShhLHQsbyk9PihWbSh0LG8uYXhpcyksW2EucnVuKHptKGEsdCxvKSx0KV0pLHdmPWE9PlEoe2F4aXM6YS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMCl9KSxHbT17bmFtZToiR2F0aGVyIixpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOlswLDBdfSxVbT0oYSx0LG8sZSk9PntsZXQgcj1vWzBdLmRpbXMuc2xpY2UoKSxuPW9bMV0uZGltcy5zbGljZSgpLHM9bmV3IEFycmF5KHIubGVuZ3RoK24ubGVuZ3RoLTEpO2U9VS5ub3JtYWxpemVBeGlzKGUsci5sZW5ndGgpO2xldCBpPVtdO2ZvcihsZXQgZD0wO2Q8cy5sZW5ndGg7ZCsrKWQ8ZT8oc1tkXT1yW2RdLGkucHVzaChgaW5wdXRJZHhbJHtkfV0gPSBvdXRwdXRJZHhbJHtkfV07YCkpOmQ8ZStuLmxlbmd0aD8oc1tkXT1uW2QtZV0saS5wdXNoKGBpbmRleERhdGFJZHhbJHtkLWV9XSA9IG91dHB1dElkeFske2R9XTtgKSk6KHNbZF09cltkLW4ubGVuZ3RoKzFdLGkucHVzaChgaW5wdXRJZHhbJHtkLW4ubGVuZ3RoKzF9XSA9IG91dHB1dElkeFske2R9XTtgKSk7bGV0IHU9cy5sZW5ndGh8fDEsbD1yLmxlbmd0aCxjPW4ubGVuZ3RofHwxLHA9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt1fV0pIHsKICAgICAgICBpbnQgaW5wdXRJZHhbJHtsfV07CiAgICAgICAgaW50IGluZGV4RGF0YUlkeFske2N9XTsKICAgICAgICBpbmRleERhdGFJZHhbMF0gPSAwOwogICAgICAgICR7aS5qb2luKGAKICAgICAgICBgKX0KICAgICAgICBpbnQgaWR4ID0gaW50KF9CKGluZGV4RGF0YUlkeCkpOwogICAgICAgIGlucHV0SWR4WyR7ZX1dID0gaWR4IDwgMCA/IGlkeCArICR7cltlXX0gOiBpZHg7CiAgICAgICAgcmV0dXJuIF9BKGlucHV0SWR4KTsKICAgICAgfWA7cmV0dXJuey4uLnQsb3V0cHV0OntkaW1zOnMsdHlwZTpvWzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOnB9fSx6bT0oYSx0LG8pPT57bGV0IGU9ey4uLkdtLGNhY2hlSGludDpvLmNhY2hlS2V5fTtyZXR1cm57Li4uZSxnZXQ6KCk9PlVtKGEsZSx0LG8uYXhpcyl9fSxWbT0oYSx0KT0+e2lmKCFhfHxhLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKCJHYXRoZXIgcmVxdWlyZXMgMiBpbnB1dHMuIik7bGV0IG89YVswXS5kaW1zLmxlbmd0aDtpZihvPDEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKHQ8LW98fHQ+by0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBheGlzLiIpO2lmKFF0LmluZGV4T2YoYVswXS50eXBlKT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHR5cGUuIik7aWYoYVsxXS50eXBlIT09ImludDMyIiYmYVsxXS50eXBlIT09ImludDE2Iil0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpfX0pO3ZhciBGaSxfZixPZixJZixXbSxIbSxxbSxTZj1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7ZmUoKTthZSgpO0ZpPShhLHQsbyk9PihxbSh0LG8pLFthLnJ1bihXbSh0LG8pLHQpXSksX2Y9KGEsdCk9PntsZXQgbz1hLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApIT09MCxlPWEuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCkhPT0wLHI9YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMSksbj1hLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLDEpO3JldHVybiBRKHt0cmFuc0E6byx0cmFuc0I6ZSxhbHBoYTpyLGJldGE6bixpc09wdGlvbmFsQzp0fSl9LE9mPWE9Pl9mKGEsITEpLElmPWE9Pl9mKGEsITApLFdtPShhLHQpPT57bGV0IG89e25hbWU6IkdlbW0iLGlucHV0TmFtZXM6YS5sZW5ndGg9PT0zP1siQSIsIkIiLCJDIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6YS5sZW5ndGg9PT0zP1swLDAsMF06WzAsMF0sa2V5OnQuY2FjaGVLZXl9O3JldHVybnsuLi5vLGdldDooKT0+SG0obyxhLHQpfX0sSG09KGEsdCxvKT0+e2xldCBlPXRbMF0uZGltcy5zbGljZSgpLHI9dFsxXS5kaW1zLnNsaWNlKCksW24sc109am4uZ2V0U2hhcGVPZkdlbW1SZXN1bHQoZSxvLnRyYW5zQSxyLG8udHJhbnNCLHQubGVuZ3RoPT09Mz90WzJdLmRpbXM6dm9pZCAwKSxpPVtuLHNdO2lmKCFpKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIGdlbW0gb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtsZXQgdT1lW2UubGVuZ3RoLTFdLGw9IiI7by50cmFuc0EmJih1PWVbMF0pLG8udHJhbnNBJiZvLnRyYW5zQj9sPSJ2YWx1ZSArPSBfQV9UKGEpICogX0JfVChiKTsiOm8udHJhbnNBJiYhby50cmFuc0I/bD0idmFsdWUgKz0gX0FfVChhKSAqIF9CKGIpOyI6IW8udHJhbnNBJiZvLnRyYW5zQj9sPSJ2YWx1ZSArPSBfQShhKSAqIF9CX1QoYik7Ijohby50cmFuc0EmJiFvLnRyYW5zQiYmKGw9InZhbHVlICs9IF9BKGEpICogX0IoYik7Iik7bGV0IGM9aS5sZW5ndGgscD10Lmxlbmd0aD09PTM/YGludCBjWyR7dFsyXS5kaW1zLmxlbmd0aH1dO2A6IiIsZD10Lmxlbmd0aD09PTM/ImJjYXN0SW5kaWNlc19DKGluZGljZXMsIGMpOyI6IiIsVD10Lmxlbmd0aD09PTM/InZhbHVlICs9IGJldGEgKiBfQyhjKTsiOiIiLHc9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7Y31dKSB7CiAgICAgICAgICBpbnQgYVske2N9XTsKICAgICAgICAgIGludCBiWyR7Y31dOwogICAgICAgICAgJHtwfQoKICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYSk7CiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIGIpOwogICAgICAgICAgJHtkfQoKICAgICAgICAgIGZsb2F0IHZhbHVlID0gMC4wOwogICAgICAgICAgZm9yIChpbnQgaz0wOyBrPCR7dX07ICsraykgewogICAgICAgICAgICAgIGFbJHtjLTF9XSA9IGs7CiAgICAgICAgICAgICAgYlske2MtMn1dID0gazsKICAgICAgICAgICAgICAke2x9CiAgICAgICAgICB9CgogICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIGFscGhhOwogICAgICAgICAgJHtUfQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9YDtyZXR1cm57Li4uYSxvdXRwdXQ6e2RpbXM6aSx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTowfSx2YXJpYWJsZXM6W3tuYW1lOiJhbHBoYSIsdHlwZToiZmxvYXQiLGRhdGE6by5hbHBoYX0se25hbWU6ImJldGEiLHR5cGU6ImZsb2F0IixkYXRhOm8uYmV0YX1dLHNoYWRlclNvdXJjZTp3fX0scW09KGEsdCk9PntpZighYSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGlzIG1pc3NpbmciKTtpZih0LmlzT3B0aW9uYWxDJiYoYS5sZW5ndGg8Mnx8YS5sZW5ndGg+MykpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgc2hhcGUuIik7aWYoIXQuaXNPcHRpb25hbEMmJmEubGVuZ3RoIT09Myl0aHJvdyBuZXcgRXJyb3IoIkdlbW0gcmVxdWlyZXMgMyBpbnB1dHMiKTtpZihhLmxlbmd0aD09PTMmJmFbMl0uZGltcy5sZW5ndGghPT0xJiZhWzJdLmRpbXMubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUgb2YgQyIpO2lmKGFbMF0udHlwZSE9PSJmbG9hdDMyIiYmYVswXS50eXBlIT09ImZsb2F0NjQifHxhWzFdLnR5cGUhPT0iZmxvYXQzMiImJmFbMV0udHlwZSE9PSJmbG9hdDY0Inx8YS5sZW5ndGg9PT0zJiZhWzJdLnR5cGUhPT0iZmxvYXQzMiImJmFbMl0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZihhWzBdLnR5cGUhPT1hWzFdLnR5cGV8fGEubGVuZ3RoPT09MyYmYVswXS50eXBlIT09YVsyXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW5wdXQgdHlwZXMgYXJlIG1pc21hdGNoZWQiKX19KTt2YXIgQWYsUGYsam0sWW0sWG0sS20sSm0sRWY9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVZSgpO2FlKCk7QWY9KGEsdCxvKT0+KEptKHQpLFthLnJ1bihYbShhLHQsbyksdCldKSxQZj1hPT57bGV0IHQ9YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJzY2FsZSIpLG89YS5hdHRyaWJ1dGVzLmdldEZsb2F0cygiYmlhcyIpO3JldHVybiBRKHtzY2FsZTp0LGJpYXM6b30pfSxqbT17bmFtZToiSW1hZ2VTY2FsZXIiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbMF19LFltPShhLHQsbyxlKT0+e2xldCByPW9bMF0uZGltcy5zbGljZSgpLG49ci5sZW5ndGgsaT1gCiAgICAgICR7S20oZS5iaWFzLmxlbmd0aCl9CiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtufV0pIHsKICAgICAgICByZXR1cm4gX1goaW5kaWNlcykgKiBzY2FsZSArIGdldEJpYXMoYmlhcywgaW5kaWNlc1sxXSk7CiAgICAgIH1gO3JldHVybnsuLi50LG91dHB1dDp7ZGltczpyLHR5cGU6b1swXS50eXBlLHRleHR1cmVUeXBlOjB9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDplLmJpYXMubGVuZ3RoLGRhdGE6ZS5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOmUuc2NhbGV9XSxzaGFkZXJTb3VyY2U6aX19LFhtPShhLHQsbyk9PntsZXQgZT17Li4uam0sY2FjaGVIaW50Om8uY2FjaGVLZXl9O3JldHVybnsuLi5lLGdldDooKT0+WW0oYSxlLHQsbyl9fSxLbT1hPT57bGV0IHQ9W2BmbG9hdCBnZXRCaWFzKGZsb2F0IGJpYXNbJHthfV0sIGludCBjaGFubmVsKSB7YF07Zm9yKGxldCBvPTA7bzxhOysrbylvPT09MD90LnB1c2goYAlpZiAoY2hhbm5lbCA9PSAke299KSB7IHJldHVybiBiaWFzWyR7b31dOyB9YCk6bz09PWEtMT90LnB1c2goYAllbHNlIHsgcmV0dXJuIGJpYXNbJHtvfV07IH1gKTp0LnB1c2goYAllbHNlIGlmIChjaGFubmVsID09ICR7b30pIHsgcmV0dXJuIGJpYXNbJHtvfV07IH1gKTtyZXR1cm4gdC5wdXNoKCIJfSIpLHQuam9pbihgCmApfSxKbT1hPT57aWYoIWF8fGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkltYWdlU2NhbGVyIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoYVswXS5kaW1zLmxlbmd0aCE9PTQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKGFbMF0udHlwZSE9PSJmbG9hdDMyIiYmYVswXS50eXBlIT09ImZsb2F0NjQiKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfX0pO3ZhciBMZixDZixEZixabSxRbSxlYix0YixyYixuYixGZj1MKCgpPT57InVzZSBzdHJpY3QiO3dlKCk7YWUoKTtMZj0oYSx0LG8pPT57bmIodCk7bGV0IGU9YS5ydW4oUW0odFswXSksdCk7cmV0dXJuW2EucnVuKHJiKGEsdFswXSxvLGUuZGltcyksW3RbMF0sZSx0WzFdLHRbMl1dKV19LENmPWE9PmEuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXBzaWxvbiIsMWUtNSksRGY9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9NZWFuQW5kVmFyaWFuY2UiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbMF19LFptPShhLHQpPT57bGV0IG89dC5kaW1zLnNsaWNlKCksZT1vWzFdLHI9b1syXSpvWzNdLG49W29bMF0sZV0scz1gCiAgICAgIHZlYzQgcHJvY2VzcyhpbnRbMl0gaW5kaWNlcykgewogICAgICAgIHZlYzQgdiA9IHZlYzQoMC4wKTsKICAgICAgICBpbnQgYVs0XTsKICAgICAgICBhWzBdID0gaW5kaWNlc1swXTsKICAgICAgICBhWzFdID0gaW5kaWNlc1sxXTsKICAgICAgICBmbG9hdCB0ZW1wID0gMC4wOwogICAgICAgIGZvcihpbnQgYTI9MDsgYTI8JHtvWzJdfTsgYTIrKykgewogICAgICAgICAgYVsyXSA9IGEyOwogICAgICAgICAgZm9yKGludCBhMz0wOyBhMzwke29bM119OyBhMysrKSB7CiAgICAgICAgICAgIGFbM10gPSBhMzsKICAgICAgICAgICAgZmxvYXQgeCA9IF9YKGEpOwogICAgICAgICAgICB0ZW1wICs9IHg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZsb2F0IG1lYW4gPSB0ZW1wIC8gZmxvYXQoJHtyfSk7CiAgICAgICAgdGVtcCA9IDAuMDsKICAgICAgICBmb3IoaW50IGEyPTA7IGEyPCR7b1syXX07IGEyKyspIHsKICAgICAgICAgIGFbMl0gPSBhMjsKICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtvWzNdfTsgYTMrKykgewogICAgICAgICAgICBhWzNdID0gYTM7CiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTsKICAgICAgICAgICAgdGVtcCArPSAoeCAtIG1lYW4pICogKHggLSBtZWFuKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdi5yID0gbWVhbjsKICAgICAgICB2LmcgPSB0ZW1wIC8gZmxvYXQoJHtyfSk7CgogICAgICAgIHJldHVybiB2OwogICAgICB9YDtyZXR1cm57Li4uYSxvdXRwdXQ6e2RpbXM6bix0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTo0fSxzaGFkZXJTb3VyY2U6c319LFFtPWE9Pih7Li4uRGYsZ2V0OigpPT5abShEZixhKX0pLGViPXtuYW1lOiJJbnN0YW5jZU5vcm1hbGl6YXRpb25fQ29tcHV0ZU91dHB1dCIsaW5wdXROYW1lczpbIlgiLCJNZWFuQW5kVmFyaWFuY2UiLCJTY2FsZSIsIkIiXSxpbnB1dFR5cGVzOlswLDQsMCwwXX0sdGI9KGEsdCxvLGUscik9PntsZXQgbj1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxbcyxpXT1hLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChyLDQpLFt1LGxdPVtzLzQsaV0sYz1gCiAgICAgIHZlYzQgZ2V0X01lYW5BbmRWYXJpYW5jZShpbnRbMl0gbXYpIHsKICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7dX0sICR7bH0pOwogICAgICAgIHJldHVybiAke24udGV4dHVyZTJEfShNZWFuQW5kVmFyaWFuY2UsIGNvb3Jkcyk7CiAgICAgIH0KCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WzRdIGluZGljZXMpIHsKICAgICAgICBpbnQgbXZbMl07CiAgICAgICAgbXZbMF0gPSBpbmRpY2VzWzBdOwogICAgICAgIG12WzFdID0gaW5kaWNlc1sxXTsKICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7CiAgICAgICAgZmxvYXQgbWVhbiA9IG1lYW5fYW5kX3ZhcmlhbmNlLnI7CiAgICAgICAgZmxvYXQgdmFyaWFuY2UgPSBtZWFuX2FuZF92YXJpYW5jZS5nOwoKICAgICAgICBpbnQgc2JbMV07CiAgICAgICAgc2JbMF0gPSBpbmRpY2VzWzFdOwogICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTsKICAgICAgICBmbG9hdCBiID0gX0Ioc2IpOwoKICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7CiAgICAgIH1gO3JldHVybnsuLi50LG91dHB1dDp7ZGltczpvLmRpbXMsdHlwZTpvLnR5cGUsdGV4dHVyZVR5cGU6MH0sdmFyaWFibGVzOlt7bmFtZToiZXBzaWxvbiIsdHlwZToiZmxvYXQiLGRhdGE6ZX1dLHNoYWRlclNvdXJjZTpjfX0scmI9KGEsdCxvLGUpPT57bGV0IHI9ey4uLmViLGNhY2hlSGludDpgJHtvfWB9O3JldHVybnsuLi5yLGdldDooKT0+dGIoYSxyLHQsbyxlKX19LG5iPWE9PntpZighYXx8YS5sZW5ndGghPT0zKXRocm93IG5ldyBFcnJvcigiSW5zdGFuY2VOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDMgaW5wdXRzLiIpO2xldCB0PWFbMF0sbz1hWzFdLGU9YVsyXTtpZih0LmRpbXMubGVuZ3RoPDN8fG8uZGltcy5sZW5ndGghPT0xfHxlLmRpbXMubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoby5kaW1zWzBdIT09dC5kaW1zWzFdfHxlLmRpbXNbMF0hPT10LmRpbXNbMV0pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBzaGFwZXMgYXJlIG1pc21hdGNoZWQuIik7aWYodC50eXBlIT09ImZsb2F0MzIiJiZ0LnR5cGUhPT0iZmxvYXQ2NCJ8fG8udHlwZSE9PSJmbG9hdDMyIiYmby50eXBlIT09ImZsb2F0NjQifHxlLnR5cGUhPT0iZmxvYXQzMiImJmUudHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZihhWzBdLmRpbXMubGVuZ3RoIT09NCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgc3VwcG9ydCA0LUQgaW5wdXQgc2hhcGUuIil9fSk7ZnVuY3Rpb24gb2IoYSx0KXtsZXQgbz1hWzBdLmRpbXNbMV0sZT1hWzBdLmRpbXMubGVuZ3RoLHI9LU1hdGguZmxvb3IoKHQuc2l6ZS0xKS8yKSxuPU1hdGguY2VpbCgodC5zaXplLTEpLzIpLHM9YGZsb2F0KCR7dC5hbHBoYX0pIC8gZmxvYXQoJHt0LnNpemV9KWAsaT1gZmxvYXQoJHt0LmJpYXN9KWAsdT1gZmxvYXQoJHt0LmJldGF9KWAsbD1gCiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7ZX1dKSB7CiAgICAgICAgaW50IGMgPSBpbmRpY2VzWzFdOwogICAgICAgIGZsb2F0IHggPSBfWChpbmRpY2VzKTsKICAgICAgICBmbG9hdCBzcXVhcmVfc3VtID0gMC4wOwoKICAgICAgICBmb3IgKGludCBpID0gJHtyfTsgaSA8PSAke259OyBpKyspIHsKICAgICAgICAgIGludCBpZHggPSBjICsgaTsKICAgICAgICAgIGlmIChjID49IDAgJiYgYyA8ICR7b30pIHsKICAgICAgICAgICAgaW5kaWNlc1sxXSA9IGlkeDsKICAgICAgICAgICAgZmxvYXQgaiA9IF9YKGluZGljZXMpOwogICAgICAgICAgICBzcXVhcmVfc3VtICs9IGogKiBqOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4geCAvIHBvdygke2l9ICsgJHtzfSAqIHNxdWFyZV9zdW0sICR7dX0pOwogICAgfWA7cmV0dXJuey4uLkJmLGNhY2hlSGludDp0LmNhY2hlS2V5LG91dHB1dDp7ZGltczphWzBdLmRpbXMsdHlwZTphWzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOmx9fWZ1bmN0aW9uIGliKGEsdCl7cmV0dXJuey4uLkJmLGNhY2hlSGludDp0LmNhY2hlS2V5LGdldDooKT0+b2IoYSx0KX19dmFyICRmLGtmLEJmLGFiLE5mPUwoKCk9PnsidXNlIHN0cmljdCI7VWUoKTthZSgpOyRmPShhLHQsbyk9PihhYih0KSxbYS5ydW4oaWIodCxvKSx0KV0pLGtmPWE9PntsZXQgdD1hLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwxZS00KSxvPWEuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmV0YSIsLjc1KSxlPWEuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmlhcyIsMSkscj1hLmF0dHJpYnV0ZXMuZ2V0SW50KCJzaXplIik7cmV0dXJuIFEoe2FscGhhOnQsYmV0YTpvLGJpYXM6ZSxzaXplOnJ9KX0sQmY9e25hbWU6IkxSTiIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOlswXX07YWI9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJMUk4gcmVxdWlyZXMgMSBpbnB1dC4iKTtpZihhWzBdLmRpbXMubGVuZ3RoIT09NCl0aHJvdyBuZXcgRXJyb3IoJ2N1cnJlbnRseSBvbmx5IHN1cHBvcnQgTFJOIGZvciBpbnB1dCB3aXRoICJOQ0hXIiBmb3JtYXQnKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiIpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdHlwZSIpfX0pO3ZhciBzYiwkaSxSZixNZixHZix1YixsYixmYixjYixwYixkYixoYixtYixVZj1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7ZmUoKTt3ZSgpO2FlKCk7c2I9e25hbWU6IlBhZCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOlswXX0sJGk9KGEsdCxvKT0+KGZiKHQpLFthLnJ1bih7Li4uc2IsY2FjaGVIaW50Om8uY2FjaGVLZXksZ2V0OigpPT5sYihhLHRbMF0sbyl9LHQpXSksUmY9YT0+e2xldCB0PWEuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpLG89YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJ2YWx1ZSIsMCksZT1hLmF0dHJpYnV0ZXMuZ2V0SW50cygicGFkcyIpO3JldHVybiBRKHttb2RlOnQsdmFsdWU6byxwYWRzOmV9KX0sTWY9KGEsdCxvKT0+e2NiKHQpO2xldCBlPXViKGEsdCxvKTtyZXR1cm4gJGkoYSxbdFswXV0sZSl9LEdmPWE9PmEuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpLHViPShhLHQsbyk9PntpZighYS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFsxXS5kYXRhSWQpfHx0Lmxlbmd0aD49MyYmIWEuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgcGFkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhbGxvd2VkIik7bGV0IGU9QXJyYXkuZnJvbSh0WzFdLmludGVnZXJEYXRhKSxyPXQubGVuZ3RoPj0zP3RbMl0uZmxvYXREYXRhWzBdOjA7cmV0dXJuIFEoe21vZGU6byxwYWRzOmUsdmFsdWU6cn0pfSxsYj0oYSx0LG8pPT57bGV0IGU9VS5wYWRTaGFwZSh0LmRpbXMuc2xpY2UoKSxvLnBhZHMpLHI9ZS5sZW5ndGgscz1gCiAgICAgICR7cGIoYSx0LG8pfQogICAgICBmbG9hdCBwcm9jZXNzKGludFske3J9XSBpbmRpY2VzKSB7CiAgICAgICAgICByZXR1cm4gcGFkQShpbmRpY2VzKTsKICAgICAgfWA7cmV0dXJue25hbWU6IlBhZCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOlswXSxvdXRwdXQ6e2RpbXM6ZSx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTowfSxzaGFkZXJTb3VyY2U6c319LGZiPWE9PntpZighYXx8YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sY2I9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTImJmEubGVuZ3RoIT09Myl0aHJvdyBuZXcgRXJyb3IoIlBhZCByZXF1aXJlcyAyIG9yIDMgaW5wdXRzIik7aWYoYVsxXS50eXBlIT09ImludDMyIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZihhLmxlbmd0aD49MyYmYVsyXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9LHBiPShhLHQsbyk9PntsZXQgZT1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxbcixuXT1hLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMsMCkscz1VLmNvbXB1dGVTdHJpZGVzKHQuZGltcyk7c3dpdGNoKG8ubW9kZSl7Y2FzZSJjb25zdGFudCI6cmV0dXJuIGRiKGUsdC5kaW1zLHMscixuLG8ucGFkcyxvLnZhbHVlKTtjYXNlInJlZmxlY3QiOnJldHVybiBoYihlLHQuZGltcyxzLHIsbixvLnBhZHMpO2Nhc2UiZWRnZSI6cmV0dXJuIG1iKGUsdC5kaW1zLHMscixuLG8ucGFkcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbW9kZSIpfX0sZGI9KGEsdCxvLGUscixuLHMpPT57bGV0IGk9dC5sZW5ndGgsdT0iIjtmb3IobGV0IGw9aS0xO2w+PTA7LS1sKXUrPWAKICAgICAgICBrID0gbVske2x9XSAtICR7bltsXX07CiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50OwogICAgICAgIGlmIChrID49ICR7dFtsXX0pIHJldHVybiBjb25zdGFudDsKICAgICAgICBvZmZzZXQgKz0gayAqICR7b1tsXX07CiAgICAgICAgYDtyZXR1cm5gCiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtpfV0pIHsKICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7c30pOwogICAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICAgIGludCBrID0gMDsKICAgICAgICAke3V9CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7ZX0sICR7cn0pOwogICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7YS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBgfSxoYj0oYSx0LG8sZSxyLG4pPT57bGV0IHM9dC5sZW5ndGgsaT0iIjtmb3IobGV0IHU9cy0xO3U+PTA7LS11KWkrPWAKICAgICAgICBrID0gbVske3V9XSAtICR7blt1XX07CiAgICAgICAgaWYgKGsgPCAwKSB7IGsgPSAtazsgfQogICAgICAgIHsKICAgICAgICAgIGNvbnN0IGludCBfMm5fMSA9ICR7MioodFt1XS0xKX07CiAgICAgICAgICBrID0gaW50KCBtb2QoIGZsb2F0KGspLCBmbG9hdChfMm5fMSkgKSApIDsKICAgICAgICAgIGlmKGsgPj0gJHt0W3VdfSkgeyBrID0gXzJuXzEgLSBrOyB9CiAgICAgICAgfQogICAgICAgIG9mZnNldCArPSBrICogJHtvW3VdfTsKICAgICAgICBgO3JldHVybmAKICAgICAgZmxvYXQgcGFkQShpbnQgbVske3N9XSkgewogICAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICAgIGludCBrID0gMDsKICAgICAgICAke2l9CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7ZX0sICR7cn0pOwogICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7YS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpOwogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBgfSxtYj0oYSx0LG8sZSxyLG4pPT57bGV0IHM9dC5sZW5ndGgsaT0iIjtmb3IobGV0IHU9cy0xO3U+PTA7LS11KWkrPWAKICAgICAgICBrID0gbVske3V9XSAtICR7blt1XX07CiAgICAgICAgaWYgKGsgPCAwKSAgayA9IDA7CiAgICAgICAgaWYgKGsgPj0gJHt0W3VdfSkgayA9ICR7dFt1XS0xfTsKICAgICAgICBvZmZzZXQgKz0gayAqICR7b1t1XX07CiAgICAgIGA7cmV0dXJuYAogICAgICBmbG9hdCBwYWRBKGludCBtWyR7c31dKSB7CiAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICAgaW50IGsgPSAwOwogICAgICAgICR7aX0KICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtlfSwgJHtyfSk7CiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHthLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIGB9fSk7dmFyIFZmLFdmLEhmLHFmLGpmLFlmLFhmLEtmLEpmLGJiLHpmLFpmLGFvLFFmLGlvLGdiLGVjPUwoKCk9PnsidXNlIHN0cmljdCI7VWUoKTtmZSgpO2FlKCk7VmY9KGEsdCxvKT0+e2FvKHQpO2xldCBlPXtuYW1lOiJBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOlswXSxjYWNoZUhpbnQ6by5jYWNoZUtleX07cmV0dXJuW2EucnVuKHsuLi5lLGdldDooKT0+SGYodCxlLCExLG8pfSx0KV19LFdmPWE9PntsZXQgdD1hLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG89YS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxlPWEuYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKSE9PTAscj1hLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIiksbj1hLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLHM9YS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZihvIT09MCl0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4gUSh7YXV0b1BhZDp0LGNlaWxNb2RlOm8sY291bnRJbmNsdWRlUGFkOmUsa2VybmVsU2hhcGU6cixzdHJpZGVzOm4scGFkczpzfSl9LEhmPShhLHQsbyxlKT0+e2xldFtyLG5dPUpmKGEsZSxvKSxzPVUuc2l6ZShyLmtlcm5lbFNoYXBlKSxpPSJ2YWx1ZSArPSBfWCh4KTsiLHU9IiI7ci5jb3VudEluY2x1ZGVQYWQ/dSs9YHZhbHVlIC89IGZsb2F0KCR7c30pO2A6dSs9YHZhbHVlIC89IGZsb2F0KCR7c30gLSBwYWQpO2A7bGV0IGM9YAogICAgICAgICR7UWYoYVswXS5kaW1zLHIsaSx1LCIwLjAiKX0KICAgICAgYDtyZXR1cm57Li4udCxvdXRwdXQ6e2RpbXM6bix0eXBlOmFbMF0udHlwZSx0ZXh0dXJlVHlwZTowfSxzaGFkZXJTb3VyY2U6Y319LHFmPShhLHQsbyk9Pnthbyh0KTtsZXQgZT17bmFtZToiR2xvYmFsQXZlcmFnZVBvb2wiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbMF0sY2FjaGVIaW50OmAke28uY291bnRJbmNsdWRlUGFkfWB9O3JldHVyblthLnJ1bih7Li4uZSxnZXQ6KCk9PkhmKHQsZSwhMCxvKX0sdCldfSxqZj1hPT57bGV0IHQ9YS5hdHRyaWJ1dGVzLmdldEludCgiY291bnRfaW5jbHVkZV9wYWQiLDApIT09MDtyZXR1cm4gUSh7YXV0b1BhZDoiIixjZWlsTW9kZTowLGNvdW50SW5jbHVkZVBhZDp0LGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXX0pfSxZZj0oYSx0LG8pPT57YW8odCk7bGV0IGU9e25hbWU6Ik1heFBvb2wiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbMF0sY2FjaGVIaW50Om8uY2FjaGVLZXl9O3JldHVyblthLnJ1bih7Li4uZSxnZXQ6KCk9PktmKHQsZSwhMSxvKX0sdCldfSxYZj1hPT57bGV0IHQ9YS5hdHRyaWJ1dGVzLmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxvPWEuYXR0cmlidXRlcy5nZXRJbnQoImNlaWxfbW9kZSIsMCksZT1hLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikscj1hLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLG49YS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKSxzPWEuYXR0cmlidXRlcy5nZXRJbnQoInN0b3JhZ2Vfb3JkZXIiLDApLGk9YS5hdHRyaWJ1dGVzLmdldEludHMoImRpbGF0aW9ucyIsW10pO2lmKHMhPT0wKXRocm93IG5ldyBFcnJvcigiY29sdW1uIG1ham9yIHN0b3JhZ2Ugb3JkZXIgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE1heFBvb2wiKTtpZihvIT09MCl0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO3JldHVybiBRKHthdXRvUGFkOnQsY2VpbE1vZGU6byxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6ZSxzdHJpZGVzOnIscGFkczpuLHN0b3JhZ2VPcmRlcjpzLGRpbGF0aW9uczppfSl9LEtmPShhLHQsbyxlKT0+e2xldFtyLG5dPUpmKGEsZSxvKSxzPWAKICAgICAgdmFsdWUgPSBtYXgoX1goeCksIHZhbHVlKTsKICAgIGAsaT0iIixsPWAKICAgICAgJHtRZihhWzBdLmRpbXMscixzLGksIi0xZTUiKX0KICAgIGA7cmV0dXJuey4uLnQsb3V0cHV0OntkaW1zOm4sdHlwZTphWzBdLnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOmx9fSxKZj0oYSx0LG8pPT57bGV0IGU9YVswXS5kaW1zLnNsaWNlKCkscj1PYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkaWxhdGlvbnMiKSxuPXQua2VybmVsU2hhcGUuc2xpY2UoKSxzPXQuc3RyaWRlcy5zbGljZSgpLGk9cj90LmRpbGF0aW9ucy5zbGljZSgpOltdLHU9dC5wYWRzLnNsaWNlKCk7bXIuYWRqdXN0UG9vbEF0dHJpYnV0ZXMobyxlLG4scyxpLHUpO2xldCBsPW1yLmNvbXB1dGVQb29sT3V0cHV0U2hhcGUobyxlLHMsaSxuLHUsdC5hdXRvUGFkKSxjPU9iamVjdC5hc3NpZ24oe30sdCk7cmV0dXJuIHI/T2JqZWN0LmFzc2lnbihjLHtrZXJuZWxTaGFwZTpuLHN0cmlkZXM6cyxwYWRzOnUsZGlsYXRpb25zOmksY2FjaGVLZXk6dC5jYWNoZUtleX0pOk9iamVjdC5hc3NpZ24oYyx7a2VybmVsU2hhcGU6bixzdHJpZGVzOnMscGFkczp1LGNhY2hlS2V5OnQuY2FjaGVLZXl9KSxbYyxsXX0sYmI9e2F1dG9QYWQ6IiIsY2VpbE1vZGU6MCxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdLHN0b3JhZ2VPcmRlcjowLGRpbGF0aW9uczpbXSxjYWNoZUtleToiIn0semY9e25hbWU6Ikdsb2JhbE1heFBvb2wiLGlucHV0TmFtZXM6WyJYIl0saW5wdXRUeXBlczpbMF19LFpmPShhLHQpPT4oYW8odCksW2EucnVuKHsuLi56ZixnZXQ6KCk9PktmKHQsemYsITAsYmIpfSx0KV0pLGFvPWE9PntpZighYXx8YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiUG9vbCBvcHMgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sUWY9KGEsdCxvLGUscik9PntsZXQgbj1hLmxlbmd0aDtpZih0Lmtlcm5lbFNoYXBlLmxlbmd0aDw9Mil7bGV0IHM9dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0xXSxpPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTFdLHU9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0xXSxsPXQucGFkc1t0LnBhZHMubGVuZ3RoLTFdLGM9YVtuLTFdLHA9IiIsZD0iIixUPSIiO2lmKHUrbCE9PTA/cD1gCiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7c307IGkrKykgewogICAgICAgICAgICB4WyR7bn0gLSAxXSA9IGluZGljZXNbJHtufSAtIDFdICogJHtpfSAtICR7dX0gKyBpOwogICAgICAgICAgICBpZiAoeFske259IC0gMV0gPCAwIHx8IHhbJHtufSAtIDFdID49ICR7Y30pIHsKICAgICAgICAgICAgICBwYWQrKzsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAke299CiAgICAgICAgICB9YDpwPWAKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtzfTsgaSsrKSB7CiAgICAgICAgICAgIHhbJHtufSAtIDFdID0gaW5kaWNlc1ske259IC0gMV0gKiAke2l9IC0gJHt1fSArIGk7CiAgICAgICAgICAgICR7b30KICAgICAgICAgIH1gLHQua2VybmVsU2hhcGUubGVuZ3RoPT09Mil7bGV0IHY9dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0yXSxTPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTJdLEE9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0yXSxDPXQucGFkc1t0LnBhZHMubGVuZ3RoLTJdLEY9YVtuLTJdO0ErQyE9PTA/ZD1gCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgJHt2fTsgaisrKSB7CiAgICAgICAgICAgICAgeFske259IC0gMl0gPSBpbmRpY2VzWyR7bn0gLSAyXSAqICR7U30gLSAke0F9ICsgajsKICAgICAgICAgICAgICBpZiAoeFske259IC0gMl0gPCAwIHx8IHhbJHtufSAtIDJdID49ICR7Rn0pIHsKICAgICAgICAgICAgICAgIHBhZCs9ICR7c307CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICBgOmQ9YAogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8ICR7dn07IGorKykgewogICAgICAgICAgICAgIHhbJHtufSAtIDJdID0gaW5kaWNlc1ske259IC0gMl0gKiAke1N9IC0gJHtBfSArIGo7CiAgICAgICAgICAgIGAsVD1gCiAgICAgICAgICB9CiAgICAgICAgYH1yZXR1cm5gCiAgICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske259XSkgewogICAgICAgICAgaW50IHhbJHtufV07CiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpOwoKICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHtyfTsKICAgICAgICAgIGludCBwYWQgPSAwOwogICAgICAgICAgJHtkfQogICAgICAgICAgJHtwfQogICAgICAgICAgJHtUfQogICAgICAgICAgJHtlfQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgYH1lbHNle2xldCBzPVUuc2l6ZSh0Lmtlcm5lbFNoYXBlKSxpPVUuY29tcHV0ZVN0cmlkZXModC5rZXJuZWxTaGFwZSksdT1pLmxlbmd0aCxsPXQucGFkcy5sZW5ndGgsYz1nYih1KSxwPWlvKGEsImlucHV0RGltcyIpLGQ9aW8odC5wYWRzLCJwYWRzIiksVD1pbyhpLCJrZXJuZWxTdHJpZGVzIiksdz1pbyh0LnN0cmlkZXMsInN0cmlkZXMiKSx2PXQucGFkcy5yZWR1Y2UoKEMsRik9PkMrRiksUz0iIjtyZXR1cm4gdj9TPWAKICAgICAgICAgICAgaWYgKHhbal0gPj0gaW5wdXREaW1zW2pdIHx8IHhbal0gPCAwKSB7CiAgICAgICAgICAgICAgcGFkKys7CiAgICAgICAgICAgICAgaXNQYWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWlzUGFkKSB7CiAgICAgICAgICAgICR7b30KICAgICAgICAgIH1gOlM9YAogICAgICAgICAgfQogICAgICAgICAgJHtvfQogICAgICAgIGAsYAogICAgICAgICR7Y30KICAgICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7bn1dKSB7CiAgICAgICAgICBpbnQgeFske259XTsKICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgeCk7CiAgICAgICAgICBpbnQgb2Zmc2V0WyR7dX1dOwogICAgICAgICAgaW50IHBhZHNbJHtsfV07CiAgICAgICAgICBpbnQgaW5wdXREaW1zWyR7bn1dOwogICAgICAgICAgaW50IGtlcm5lbFN0cmlkZXNbJHt1fV07CiAgICAgICAgICBpbnQgc3RyaWRlc1ske3V9XTsKICAgICAgICAgICR7ZH0KICAgICAgICAgICR7cH0KICAgICAgICAgICR7d30KICAgICAgICAgICR7VH0KCiAgICAgICAgICBmbG9hdCB2YWx1ZSA9ICR7cn07CiAgICAgICAgICBpbnQgcGFkID0gMDsKICAgICAgICAgIGJvb2wgaXNQYWQgPSBmYWxzZTsKICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtzfTsgaSsrKSB7CiAgICAgICAgICAgIG9mZnNldFRvSW5kaWNlcyhpLCBrZXJuZWxTdHJpZGVzLCBvZmZzZXQpOwogICAgICAgICAgICBpc1BhZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKGludCBqID0gJHtufSAtICR7dX07IGogPCAke259OyBqKyspIHsKICAgICAgICAgICAgICB4W2pdID0gaW5kaWNlc1tqXSAqIHN0cmlkZXNbaiAtICR7bn0gKyAke3V9XQogICAgICAgICAgICAgICAgKyBvZmZzZXRbaiAtICR7bn0gKyAke3V9XSAtIHBhZHNbaiAtIDJdOwogICAgICAgICAgICAgICR7U30KICAgICAgICAgIH0KICAgICAgICAgICR7ZX0KCiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICBgfX0saW89KGEsdCk9PntsZXQgbz0iIjtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKylvKz1gCiAgICAgICR7dH1bJHtlfV0gPSAke2FbZV19OwogICAgYDtyZXR1cm4gb30sZ2I9YT0+YAogIHZvaWQgb2Zmc2V0VG9JbmRpY2VzKGludCBvZmZzZXQsIGludFske2F9XSBzdHJpZGVzLCBvdXQgaW50WyR7YX1dIGluZGljZXMpIHsKICAgIGlmICgke2F9ID09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke2F9IC0gMTsgKytpKSB7CiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldOwogICAgICBvZmZzZXQgLT0gaW5kaWNlc1tpXSAqIHN0cmlkZXNbaV07CiAgICB9CiAgICBpbmRpY2VzWyR7YX0gLSAxXSA9IG9mZnNldDsKICB9YH0pO3ZhciB2cixlcix5YixUYix0YyxyYyxuYyxvYyxpYyxhYyxzYyx1Yz1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7cG4oKTtmZSgpO2FlKCk7dnI9KGEsdCxvLGUscik9PntUYih0KTtsZXQgbj17bmFtZTplLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbMF19O3JldHVyblthLnJ1bih7Li4ubixjYWNoZUhpbnQ6by5jYWNoZUtleSxnZXQ6KCk9PnliKGEsdCxvLGUscixuKX0sdCldfSxlcj1hPT57bGV0IHQ9YS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKSxvPWEuYXR0cmlidXRlcy5nZXRJbnQoImtlZXBkaW1zIiwxKT09PTE7cmV0dXJuIFEoe2F4ZXM6dCxrZWVwRGltczpvfSl9LHliPShhLHQsbyxlLHIsbik9PntsZXQgcz1bXSxpPXRbMF0uZGltcy5sZW5ndGh8fDEsdT1bXSxsPVUubm9ybWFsaXplQXhlcyhvLmF4ZXMsdFswXS5kaW1zLmxlbmd0aCksYz1yKHQsbCkscD1jWzFdO2ZvcihsZXQgdz0wO3c8dFswXS5kaW1zLmxlbmd0aDt3KyspbC5pbmRleE9mKHcpPj0wfHxsLmxlbmd0aD09PTA/KG8ua2VlcERpbXMmJnMucHVzaCgxKSxwPWAKICAgICAgICAgIGZvcihpbnQgaiR7d30gPSAwOyBqJHt3fSA8ICR7dFswXS5kaW1zW3ddfTsgaiR7d30rKykgewogICAgICAgICAgICBpbnB1dElkeFske3d9XSA9IGoke3d9OwogICAgICAgICAgICAke3B9CiAgICAgICAgICB9YCk6KHUucHVzaChgaW5wdXRJZHhbJHt3fV0gPSBvdXRwdXRJZHhbJHtzLmxlbmd0aH1dO2ApLHMucHVzaCh0WzBdLmRpbXNbd10pKTtsZXQgVD1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske3MubGVuZ3RofHwxfV0pIHsKICAgICAgICBmbG9hdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHJlc3VsdAogICAgICAgIGludCBpbnB1dElkeFske2l9XTsgICAgICAvLyBhZGRyZXNzaW5nIGlucHV0IGRhdGEKICAgICAgICAke3Uuam9pbihgCmApfQogICAgICAgICR7Y1swXX0gICAgICAgLy8gaW5pdCBvcHMgZm9yIHJlZHVjZSBtYXgvbWluCiAgICAgICAgJHtwfQogICAgICAgICR7Y1syXX0gICAgICAgLy8gZmluYWwgY29tcHV0YXRpb24gZm9yIHJlZHVjZSBtZWFuCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9YDtyZXR1cm57Li4ubixvdXRwdXQ6e2RpbXM6cyx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTowfSxzaGFkZXJTb3VyY2U6VH19LFRiPWE9PntpZighYXx8YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiUmVkdWNlIG9wIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoUXQuaW5kZXhPZihhWzBdLnR5cGUpPT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9LHRjPShhLHQsbyk9PnZyKGEsdCxvLCJSZWR1Y2VTdW0iLCgpPT5bInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLCIiXSkscmM9KGEsdCxvKT0+dnIoYSx0LG8sIlJlZHVjZU1lYW4iLChyLG4pPT57bGV0IHM9MTtmb3IobGV0IGk9MDtpPHJbMF0uZGltcy5sZW5ndGg7aSsrKShuLmluZGV4T2YoaSk+PTB8fG4ubGVuZ3RoPT09MCkmJihzKj1yWzBdLmRpbXNbaV0pO3JldHVyblsidmFsdWUgPSAwLjA7IiwidmFsdWUgKz0gX0EoaW5wdXRJZHgpOyIsYHZhbHVlIC89ICR7c30uO2BdfSksbmM9KGEsdCxvKT0+dnIoYSx0LG8sIlJlZHVjZU1heCIsKHIsbik9PntsZXQgcz1bXTtmb3IobGV0IGk9MDtpPHJbMF0uZGltcy5sZW5ndGg7aSsrKShuLmluZGV4T2YoaSk+PTB8fG4ubGVuZ3RoPT09MCkmJnMucHVzaChgaW5wdXRJZHhbJHtpfV0gPSAwO2ApO3JldHVybltgJHtzLmpvaW4oYApgKX0KdmFsdWUgPSBfQShpbnB1dElkeCk7YCwidmFsdWUgPSBtYXgodmFsdWUsIF9BKGlucHV0SWR4KSk7IiwiIl19KSxvYz0oYSx0LG8pPT52cihhLHQsbywiUmVkdWNlTWluIiwocixuKT0+e2xldCBzPVtdO2ZvcihsZXQgaT0wO2k8clswXS5kaW1zLmxlbmd0aDtpKyspKG4uaW5kZXhPZihpKT49MHx8bi5sZW5ndGg9PT0wKSYmcy5wdXNoKGBpbnB1dElkeFske2l9XSA9IDA7YCk7cmV0dXJuW2Ake3Muam9pbihgCmApfQp2YWx1ZSA9IF9BKGlucHV0SWR4KTtgLCJ2YWx1ZSA9IG1pbih2YWx1ZSwgX0EoaW5wdXRJZHgpKTsiLCIiXX0pLGljPShhLHQsbyk9PnZyKGEsdCxvLCJSZWR1Y2VQcm9kIiwoKT0+WyJ2YWx1ZSA9IDEuMDsiLCJ2YWx1ZSAqPSBfQShpbnB1dElkeCk7IiwiIl0pLGFjPShhLHQsbyk9PnZyKGEsdCxvLCJSZWR1Y2VMb2dTdW0iLCgpPT5bInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLCJ2YWx1ZSA9IGxvZyh2YWx1ZSk7Il0pLHNjPShhLHQsbyk9PnZyKGEsdCxvLCJSZWR1Y2VMb2dTdW1TcXVhcmUiLCgpPT5bImZsb2F0IHQ7IHZhbHVlID0gMC4wOyIsInQgPSBfQShpbnB1dElkeCk7IHZhbHVlICs9IHQgKiB0OyIsIiJdKX0pO3ZhciBsYyxmYz1MKCgpPT57InVzZSBzdHJpY3QiO2ZlKCk7bGM9KGEsdCk9PntsZXQgbz1VLmNhbGN1bGF0ZVJlc2hhcGVkRGltcyh0WzBdLmRpbXMsdFsxXS5pbnRlZ2VyRGF0YSk7cmV0dXJuIGEuc2Vzc2lvbi5wYWNrP1thLnJlc2hhcGVQYWNrZWQodFswXSxvKV06W2EucmVzaGFwZVVucGFja2VkKHRbMF0sbyldfX0pO3ZhciBjYyxraSxwYyxkYyxkbix4YixCaSxzbyxOaT1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7d2UoKTthZSgpO2NjPXtuYW1lOiJVcHNhbXBsZSIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOlswXX0sa2k9KGEsdCxvKT0+KEJpKHQsbyksW2EucnVuKHsuLi5jYyxjYWNoZUhpbnQ6by5jYWNoZUtleSxnZXQ6KCk9PnhiKGEsdCxvKX0sdCldKSxwYz1hPT5kbihhLDcpLGRjPWE9PmRuKGEsOSksZG49KGEsdCk9PntsZXQgbz10Pj0xMCxlPWEuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJuZWFyZXN0Iik7aWYoZSE9PSJuZWFyZXN0IiYmZSE9PSJsaW5lYXIiJiYodDwxMXx8ZSE9PSJjdWJpYyIpKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIG1vZGU6ICR7ZX1gKTtsZXQgcj1bXTt0PDkmJihyPWEuYXR0cmlidXRlcy5nZXRGbG9hdHMoInNjYWxlcyIpLHNvKHIsZSxvKSk7bGV0IG49YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJleHRyYXBvbGF0aW9uX3ZhbHVlIiwwKSxzPXQ+MTA/YS5hdHRyaWJ1dGVzLmdldFN0cmluZygiY29vcmRpbmF0ZV90cmFuc2Zvcm1hdGlvbl9tb2RlIiwiaGFsZl9waXhlbCIpOiJhc3ltbWV0cmljIjtpZihbImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZihzKT09PS0xKXRocm93IG5ldyBFcnJvcihgY29vcmRpbmF0ZV90cmFuc2Zvcm1fbW9kZSAnJHtzfScgaXMgbm90IHN1cHBvcnRlZGApO2xldCBpPXM9PT0idGZfY3JvcF9hbmRfcmVzaXplIix1PWksbD1lPT09Im5lYXJlc3QiJiZ0Pj0xMT9hLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJuZWFyZXN0X21vZGUiLCJyb3VuZF9wcmVmZXJfZmxvb3IiKToiIjtpZihbInJvdW5kX3ByZWZlcl9mbG9vciIsInJvdW5kX3ByZWZlcl9jZWlsIiwiZmxvb3IiLCJjZWlsIiwiIl0uaW5kZXhPZihsKT09PS0xKXRocm93IG5ldyBFcnJvcihgbmVhcmVzdF9tb2RlICcke2x9JyBpcyBub3Qgc3VwcG9ydGVkYCk7bGV0IGM9YS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJjdWJpY19jb2VmZl9hIiwtLjc1KSxwPWEuYXR0cmlidXRlcy5nZXRJbnQoImV4Y2x1ZGVfb3V0c2lkZSIsMCkhPT0wO2lmKHAmJmUhPT0iY3ViaWMiKXRocm93IG5ldyBFcnJvcigiZXhjbHVkZV9vdXRzaWRlIGNhbiBiZSBzZXQgdG8gMSBvbmx5IHdoZW4gbW9kZSBpcyBDVUJJQy4iKTtsZXQgZD10PDExPyEwOmU9PT0ibmVhcmVzdCImJnM9PT0iYXN5bW1ldHJpYyImJmw9PT0iZmxvb3IiLFQ9MCx3PTAsdj0wO3JldHVybiB0PjEwP2EuaW5wdXRzLmxlbmd0aD4yPyhUPTEsdz0yLHY9Myk6KHc9MSx2PTIpOnQ9PT05JiYodz0xKSxRKHtvcHNldDp0LGlzUmVzaXplOm8sbW9kZTplLHNjYWxlczpyLGV4dHJhcG9sYXRpb25WYWx1ZTpuLGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOnMsdXNlRXh0cmFwb2xhdGlvbjp1LG5lZWRSb2lJbnB1dDppLG5lYXJlc3RNb2RlOmwsY3ViaWNDb2VmZmljaWVudEE6YyxleGNsdWRlT3V0c2lkZTpwLHVzZU5lYXJlc3QyeE9wdGltaXphdGlvbjpkLHJvaUlucHV0SWR4OlQsc2NhbGVzSW5wdXRJZHg6dyxzaXplc0lucHV0SWR4OnZ9KX0seGI9KGEsdCxvKT0+e2xldCBlPUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtyLG5dPWEuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMF0uZGltcywwKSxzPXRbMF0uZGltcy5tYXAoKHYsUyk9Pk1hdGguZmxvb3IodipvLnNjYWxlc1tTXSkpLFtpLHVdPWEuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHMsMCksbD1zLmxlbmd0aCxjPW5ldyBBcnJheShsKSxwPW5ldyBBcnJheShsKSxkPWAKICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7bH1dOwogICAgICBpbnQgaW5wdXRfcGl0Y2hlc1ske2x9XTsKICAgICAgYDtmb3IobGV0IHY9bC0xO3Y+PTA7di0tKWNbdl09dj09PWwtMT8xOmNbdisxXSpzW3YrMV0scFt2XT12PT09bC0xPzE6cFt2KzFdKnRbMF0uZGltc1t2KzFdLGQrPWAKICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske3Z9XSA9ICR7Y1t2XX07CiAgICAgICAgaW5wdXRfcGl0Y2hlc1ske3Z9XSA9ICR7cFt2XX07CiAgICAgICAgYDtsZXQgVD1gCiAgICAgIGZsb2F0IGdldElucHV0RmxvYXQoaW50IGluZGV4KSB7CiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbmRleCwgJHtyfSwgJHtufSk7CiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oWCwgY29vcmRzKSk7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIGAsdz1vLm1vZGU9PT0ibmVhcmVzdCI/YAogICAgJHtUfQogICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2x9XSkgewogICAgICBpbnQgaW5wdXRfaW5kZXggPSAwOwogICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2l9LCAke3V9KTsKCiAgICAgICR7ZH0KCiAgICAgIGludCBkLCBtOwogICAgICBmb3IgKGludCBkaW0gPSAwOyBkaW0gPCAke2x9OyArK2RpbSkgewogICAgICAgIGQgPSBvdXRwdXRfaW5kZXggLyBvdXRwdXRfcGl0Y2hlc1tkaW1dOwogICAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBkICogb3V0cHV0X3BpdGNoZXNbZGltXTsKICAgICAgICBvdXRwdXRfaW5kZXggPSBtOwoKICAgICAgICBpZiAoc2NhbGVzW2RpbV0gIT0gMSAmJiBkID4gMCkgewogICAgICAgICAgaW50IGQyID0gZCAvIHNjYWxlc1tkaW1dOwogICAgICAgICAgbSA9IGQgLSBkMiAqIHNjYWxlc1tkaW1dOwogICAgICAgICAgZCA9IGQyOwogICAgICAgIH0KICAgICAgICBpbnB1dF9pbmRleCArPSBpbnB1dF9waXRjaGVzW2RpbV0gKiBkOwogICAgICB9CgogICAgICByZXR1cm4gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCk7CiAgICB9YDpsPT09ND9gCiAgICAke1R9CiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWzRdKSB7CiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7CiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7aX0sICR7dX0pOwoKICAgICAgJHtkfQoKICAgICAgaW50IG07CiAgICAgIGludCBpbmRleF9vZl9kaW0wLCBpbmRleF9vZl9kaW0xLCBpbmRleF9vZl9kaW0yLCBpbmRleF9vZl9kaW0zOwogICAgICBpbmRleF9vZl9kaW0wID0gb3V0cHV0X2luZGV4IC8gb3V0cHV0X3BpdGNoZXNbMF07CiAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBpbmRleF9vZl9kaW0wICogb3V0cHV0X3BpdGNoZXNbMF07CiAgICAgIGluZGV4X29mX2RpbTEgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMV07CiAgICAgIG0gPSBtIC0gaW5kZXhfb2ZfZGltMSAqIG91dHB1dF9waXRjaGVzWzFdOwogICAgICBpbmRleF9vZl9kaW0yID0gbSAvIG91dHB1dF9waXRjaGVzWzJdOwogICAgICBtID0gbSAtIGluZGV4X29mX2RpbTIgKiBvdXRwdXRfcGl0Y2hlc1syXTsKICAgICAgaW5kZXhfb2ZfZGltMyA9IG07CgogICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMiwgaW5kZXhfb2ZfaW5wdXRfZGltMywgeF9vZmZzZXQsIHlfb2Zmc2V0OwogICAgICBpbmRleF9vZl9pbnB1dF9kaW0yID0gaW5kZXhfb2ZfZGltMiAvIHNjYWxlc1syXTsKICAgICAgeV9vZmZzZXQgPSBpbmRleF9vZl9kaW0yIC0gaW5kZXhfb2ZfaW5wdXRfZGltMiAqIHNjYWxlc1syXTsKICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMyA9IGluZGV4X29mX2RpbTMgLyBzY2FsZXNbM107CiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMyAtIGluZGV4X29mX2lucHV0X2RpbTMgKiBzY2FsZXNbM107CgogICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICsKICAgICAgICAgICAgaW5kZXhfb2ZfZGltMSAqIGlucHV0X3BpdGNoZXNbMV0gKwogICAgICAgICAgICBpbmRleF9vZl9pbnB1dF9kaW0yICogaW5wdXRfcGl0Y2hlc1syXSArCiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTM7CgogICAgICBmbG9hdCB4MDAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTsKICAgICAgZmxvYXQgeDEwLCB4MDEsIHgxMTsKCiAgICAgIGJvb2wgZW5kX29mX2RpbTIgPSBmYWxzZTsKICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTIgPT0gKCR7dFswXS5kaW1zWzJdfSAtIDEpKSB7CiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAyCiAgICAgICAgeDAxID0geDAwOwogICAgICAgIGVuZF9vZl9kaW0yID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB4MDEgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1syXSk7CiAgICAgIH0KCiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0zID09IChpbnB1dF9waXRjaGVzWzJdIC0gMSkpIHsKICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDMKICAgICAgICB4MTAgPSB4MDA7CiAgICAgICAgeDExID0geDAxOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHgxMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyAxKTsKICAgICAgICB4MTEgPSBlbmRfb2ZfZGltMiA/IHgxMCA6IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdICsgMSk7CiAgICAgIH0KCiAgICAgIGZsb2F0IHkwID0geDAwICsgZmxvYXQoeV9vZmZzZXQpICogKHgwMSAtIHgwMCkgLyBmbG9hdChzY2FsZXNbMl0pOwogICAgICBmbG9hdCB5MSA9IHgxMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MTEgLSB4MTApIC8gZmxvYXQoc2NhbGVzWzJdKTsKICAgICAgcmV0dXJuIHkwICsgZmxvYXQoeF9vZmZzZXQpICogKHkxIC0geTApIC8gZmxvYXQoc2NhbGVzWzNdKTsKICAgIH1gOmAKICAgICR7VH0KICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbMl0pIHsKICAgICAgaW50IGlucHV0X2luZGV4ID0gMDsKICAgICAgaW50IG91dHB1dF9pbmRleCA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtpfSwgJHt1fSk7CgogICAgICAke2R9CgogICAgICBpbnQgbTsKICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTE7CiAgICAgIGluZGV4X29mX2RpbTAgPSBvdXRwdXRfaW5kZXggLyBvdXRwdXRfcGl0Y2hlc1swXTsKICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTsKICAgICAgaW5kZXhfb2ZfZGltMSA9IG07CgogICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMCwgaW5kZXhfb2ZfaW5wdXRfZGltMSwgeF9vZmZzZXQsIHlfb2Zmc2V0OwogICAgICBpbmRleF9vZl9pbnB1dF9kaW0wID0gaW5kZXhfb2ZfZGltMCAvIHNjYWxlc1swXTsKICAgICAgeV9vZmZzZXQgPSBpbmRleF9vZl9kaW0wIC0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIHNjYWxlc1swXTsKICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMSA9IGluZGV4X29mX2RpbTEgLyBzY2FsZXNbMV07CiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMSAtIGluZGV4X29mX2lucHV0X2RpbTEgKiBzY2FsZXNbMV07CgogICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2lucHV0X2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICsgaW5kZXhfb2ZfaW5wdXRfZGltMTsKCiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpOwogICAgICBmbG9hdCB4MTAsIHgwMSwgeDExOwoKICAgICAgYm9vbCBlbmRfb2ZfZGltMCA9IGZhbHNlOwogICAgICBpZiAoaW5kZXhfb2ZfaW5wdXRfZGltMCA9PSAoJHt0WzBdLmRpbXNbMF19IC0gMSkpIHsKICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDAKICAgICAgICB4MDEgPSB4MDA7CiAgICAgICAgZW5kX29mX2RpbTAgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzBdKTsKICAgICAgfQoKICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTEgPT0gKGlucHV0X3BpdGNoZXNbMF0gLSAxKSkgewogICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMQogICAgICAgIHgxMCA9IHgwMDsKICAgICAgICB4MTEgPSB4MDE7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpOwogICAgICAgIHgxMSA9IGVuZF9vZl9kaW0wID8geDEwIDogZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIGlucHV0X3BpdGNoZXNbMF0gKyAxKTsKICAgICAgfQoKICAgICAgZmxvYXQgeTAgPSB4MDAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDAxIC0geDAwKSAvIGZsb2F0KHNjYWxlc1swXSk7CiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMF0pOwogICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbMV0pOwogICAgfWA7cmV0dXJuey4uLmNjLG91dHB1dDp7ZGltczpzLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTp3LHZhcmlhYmxlczpbe25hbWU6InNjYWxlcyIsdHlwZToiaW50IixhcnJheUxlbmd0aDpvLnNjYWxlcy5sZW5ndGgsZGF0YTpvLnNjYWxlcy5tYXAodj0+TWF0aC5jZWlsKHYpKX1dfX0sQmk9KGEsdCk9PntpZighYXx8dC5vcHNldDw5JiZhLmxlbmd0aCE9PTF8fHQub3BzZXQ+PTkmJnQub3BzZXQ8MTEmJmEubGVuZ3RoIT09Mnx8dC5vcHNldD49MTEmJmEubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0cy4iKTtpZih0LnNjYWxlcy5sZW5ndGg+MCYmYVswXS5kaW1zLmxlbmd0aCE9PXQuc2NhbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoYVswXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0sc289KGEsdCxvKT0+e2lmKG8pe2ZvcihsZXQgZSBvZiBhKWlmKGU8PTApdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIil9ZWxzZSBmb3IobGV0IGUgb2YgYSlpZihlPDEpdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuIik7aWYoKHQ9PT0ibGluZWFyInx8dD09PSJjdWJpYyIpJiZhLmxlbmd0aCE9PTImJihhLmxlbmd0aCE9PTR8fGFbMF0hPT0xfHxhWzFdIT09MSkpdGhyb3cgbmV3IEVycm9yKGAnTGluZWFyJyBtb2RlIGFuZCAnQ3ViaWMnIG1vZGUgb25seSBzdXBwb3J0IDItRCBpbnB1dHMgKCdCaWxpbmVhcicsICdCaWN1YmljJykgICAgICAgICBvciA0LUQgaW5wdXRzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3V0ZXJtb3N0IDIgc2NhbGUgdmFsdWVzIGJlaW5nIDEgICAgICAgICBpbiB0aGUgJHtvPyJSZXNpemUiOiJVcHNhbXBsZSJ9IG9wZWFydG9yLmApfX0pO3ZhciBSaSxNaSxoYyxtYyx3Yix2YixfYixPYixiYz1MKCgpPT57InVzZSBzdHJpY3QiO3dlKCk7YWUoKTtCdCgpO1RyKCk7TmkoKTtSaT17bmFtZToiUmVzaXplIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6WzJdfSxNaT0oYSx0LG8pPT4oQmkodCxvKSxbYS5ydW4oey4uLlJpLGNhY2hlSGludDpvLmNhY2hlS2V5LGdldDooKT0+d2IoYSx0LG8pfSx0KV0pLGhjPWE9PmRuKGEsMTApLG1jPWE9PmRuKGEsMTEpLHdiPShhLHQsbyk9PntsZXQgZT1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxbcixuXT12Yih0LG8pO2lmKHIuZXZlcnkoRj0+Rj09PTEpJiZvLmNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlIT09InRmX2Nyb3BfYW5kX3Jlc2l6ZSIpcmV0dXJuey4uLlJpLG91dHB1dDp7ZGltczpuLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOjJ9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmVjNCB2ID0gJHtlLnRleHR1cmUyRH0oWCwgVGV4Q29vcmRzKTsKICAgICAgICAgICAgICAgICAgICAke2Uub3V0cHV0fSA9IHY7CiAgICAgICAgICAgICAgICB9YH07bGV0IGk9bi5sZW5ndGg7aWYoaTwyKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgYmUgYXQgbGVhc3QgMiwgYnV0IGdvdCAke2l9YCk7bGV0IHU9bltpLTJdLGw9bltpLTFdLGM9dFswXS5kaW1zO2lmKGkhPT1jLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG91dHB1dCBkaW1lbnNpb24gc2hvdWxkIG1hdGNoIGlucHV0ICR7Yy5sZW5ndGh9LCBidXQgZ290ICR7aX1gKTtsZXQgcD1jW2ktMl0sZD1jW2ktMV0sVD1yW2ktMl0sdz1yW2ktMV0sdj0iIjtpZihvLm1vZGUhPT0ibGluZWFyIil0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IG1vZGU6ICcke28ubW9kZX0nYCk7c3dpdGNoKG8uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpe2Nhc2UiYXN5bW1ldHJpYyI6dj1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KGNvb3JkcykgLyBzY2FsZVdIV0g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDticmVhaztjYXNlImhhbGZfcGl4ZWwiOnY9YAogICAgICAgICAgICAgICAgICAgIHZlYzQgZ2V0U291cmNlRnJhY0luZGV4KGl2ZWM0IGNvb3JkcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZlYzQoY29vcmRzKSArIDAuNSkgLyBzY2FsZVdIV0ggLSAwLjU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYDticmVhaztjYXNlInB5dG9yY2hfaGFsZl9waXhlbCI6dj1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2x9LjAgPiAxLjAgPyAoZmNvb3Jkcy54ICsgMC41KSAvIHNjYWxlV0hXSC54IC0gMC41IDogMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt1fS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7bH0uMCA+IDEuMCA/IChmY29vcmRzLnogKyAwLjUpIC8gc2NhbGVXSFdILnogLSAwLjUgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3V9LjAgPiAxLjAgPyAoZmNvb3Jkcy53ICsgMC41KSAvIHNjYWxlV0hXSC53IC0gMC41IDogMC4wCiAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgO2JyZWFrO2Nhc2UiYWxpZ25fY29ybmVycyI6dj1gCiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgcmVzaXplZCA9IHZlYzQoJHtsfS4wIC0gMS4wLCAke3V9LjAgLSAxLjAsICR7bH0uMCAtIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dX0uMCAtIDEuMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7ZH0uMCAtIDEuMCwgJHtwfS4wIC0gMS4wLCAke2R9LjAgLSAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3B9LjAgLSAxLjApOwogICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IG5ld19zY2FsZSA9IG9yaWdpbmFsIC8gcmVzaXplZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGByZXNpemUgKHBhY2tlZCkgZG9lcyBub3Qgc3VwcG9ydCBjb29yZGluYXRlVHJhbnNmb3JtTW9kZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJHtvLmNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlfSdgKX1sZXQgUz1RZShpKSxBPU50KCksQz1gCiAgICAgICAgICAgIGNvbnN0IHZlYzIgaW5wdXRXSCA9IHZlYzIoJHtwfS4wLCAke2R9LjApOwogICAgICAgICAgICBjb25zdCB2ZWM0IHNjYWxlV0hXSCA9IHZlYzQoZmxvYXQoJHtUfSksIGZsb2F0KCR7d30pLCBmbG9hdCgke1R9KSwgZmxvYXQoJHt3fSkpOwogICAgICAgICAgICAke0F9CiAgICAgICAgICAgICR7dn0KICAgICAgICAgICAgZmxvYXQgZ2V0QVZhbHVlKGludCB4MTAsIGludCByLCBpbnQgYywgaW50IGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKGdldEEoeDEwLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICAgICAgJHtTfSByYyA9IGdldE91dHB1dENvb3JkcygpOwoKICAgICAgICAgICAgICAgIGludCBiYXRjaCA9IHJjWzBdOwogICAgICAgICAgICAgICAgaW50IGRlcHRoID0gcmNbMV07CgogICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgdGhlIDQgY29vcmRpbmF0ZXMgdGhhdCBpcyB1c2VkIGluIHRoZSA0IHBhY2tlZCBvdXRwdXQgdmFsdWVzLgogICAgICAgICAgICAgICAgaXZlYzQgY29vcmRzID0gaXZlYzQocmMud3osIHJjLncgKyAxLCByYy56ICsgMSk7CgogICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBzb3VyY2UgaW5kZXggaW4gZnJhY3Rpb24KICAgICAgICAgICAgICAgIHZlYzQgc291cmNlRnJhYyA9IGdldFNvdXJjZUZyYWNJbmRleChjb29yZHMpOwoKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIG9mIHRoZSA0IHZhbHVlcyB0aGF0IHdpbGwgYmUgcGFja2VkIGludG8gb25lIHRleGVsLgogICAgICAgICAgICAgICAgaXZlYzQgeDAwID0gaXZlYzQobWF4KHNvdXJjZUZyYWMueHksIHZlYzIoMC4wKSksIG1pbihpbnB1dFdIIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWMueHkpKSk7CiAgICAgICAgICAgICAgICBpdmVjNCB4MDEgPSBpdmVjNChtYXgoc291cmNlRnJhYy54dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54dykpKTsKICAgICAgICAgICAgICAgIGl2ZWM0IHgxMCA9IGl2ZWM0KG1heChzb3VyY2VGcmFjLnp5LCB2ZWMyKDAuMCkpLCBtaW4oaW5wdXRXSCAtIDEuMCwgY2VpbChzb3VyY2VGcmFjLnp5KSkpOwogICAgICAgICAgICAgICAgaXZlYzQgeDExID0gaXZlYzQobWF4KHNvdXJjZUZyYWMuencsIHZlYzIoMC4wKSksIG1pbihpbnB1dFdIIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWMuencpKSk7CgogICAgICAgICAgICAgICAgYm9vbCBoYXNOZXh0Um93ID0gcmMudyA8ICR7dS0xfTsKICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dENvbCA9IHJjLnogPCAke2wtMX07CgogICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyB0b3AtbGVmdCBjb3JuZXIgaW50byBvbmUgdmVjNCBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgIHZlYzQgdG9wTGVmdCA9IHZlYzQoCiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC55KSwKICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAxLngsIHgwMS55KSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC55KSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEueSkgOiAwLjApOwoKICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLXJpZ2h0IGNvcm5lciBpbnRvIG9uZSB2ZWM0IHN0cnVjdHVyZQogICAgICAgICAgICAgICAgdmVjNCB0b3BSaWdodCA9IHZlYzQoCiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC53KSwKICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAxLngsIHgwMS53KSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC53KSA6IDAuMCwKICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEudykgOiAwLjApOwoKICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgYm90dG9tLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlCiAgICAgICAgICAgICAgICB2ZWM0IGJvdHRvbUxlZnQgPSB2ZWM0KAogICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAueSksCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEueSkgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMC56LCB4MTAueSkgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLnkpIDogMC4wKTsKCiAgICAgICAgICAgICAgICAvLyBwYWNrIHgwMCwgeDAxLCB4MTAsIHgxMSdzIGJvdHRvbS1yaWdodCBjb3JuZXIgaW50byBvbmUgdmVjNCBzdHJ1Y3R1cmUKICAgICAgICAgICAgICAgIHZlYzQgYm90dG9tUmlnaHQgPSB2ZWM0KAogICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAudyksCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEudykgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dFJvdyA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMC56LCB4MTAudykgOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLncpIDogMC4wKTsKCiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGludGVycG9sYXRpb24gZnJhY3Rpb24gb24gdSBhbmQgdiBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIHZlYzQgZnJhYyA9IHZlYzQoc291cmNlRnJhYykgLSBmbG9vcihzb3VyY2VGcmFjKTsKICAgICAgICAgICAgICAgIHZlYzQgY2xhbXBGcmFjID0gY2xhbXAoZnJhYywgdmVjNCgwLjApLCB2ZWM0KDEuMCkpOwoKICAgICAgICAgICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBjbGFtcEZyYWMueXd5dyk7CiAgICAgICAgICAgICAgICB2ZWM0IGJvdHRvbSA9IG1peChib3R0b21MZWZ0LCBib3R0b21SaWdodCwgY2xhbXBGcmFjLnl3eXcpOwogICAgICAgICAgICAgICAgdmVjNCBuZXdWYWx1ZSA9IG1peCh0b3AsIGJvdHRvbSwgY2xhbXBGcmFjLnh4enopOwoKICAgICAgICAgICAgICAgICR7ZS5vdXRwdXR9ID0gdmVjNChuZXdWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICBgO3JldHVybnsuLi5SaSxvdXRwdXQ6e2RpbXM6bix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZToyfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpDfX0sdmI9KGEsdCk9PntsZXQgZT1hWzBdLmRpbXMscj10LnNjYWxlcyxuO2lmKHIubGVuZ3RoPT09MCl7bGV0IGk9YVt0LnNjYWxlc0lucHV0SWR4XTtpZihpJiZpLnNpemUhPT0wKXtpZihhW3Quc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtyPV9iKGksdC5tb2RlLHQuaXNSZXNpemUpfWVsc2V7bGV0IHU9YVt0LnNpemVzSW5wdXRJZHhdO2lmKCF1fHx1LnNpemU9PT0wKXRocm93IG5ldyBFcnJvcigiRWl0aGVyIHNjYWxlcyBvciBzaXplcyBNVVNUIGJlIHByb3ZpZGVkIGFzIGlucHV0LiIpO249QXJyYXkuZnJvbSh1LmludGVnZXJEYXRhKSxyPU9iKG4sZSx0Lm1vZGUsdC5pc1Jlc2l6ZSl9fWVsc2UgaWYoYVt0LnNpemVzSW5wdXRJZHhdKXRocm93IG5ldyBFcnJvcigiT25seSBvbmUgb2Ygc2NhbGVzIG9yIHNpemVzIG11c3QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7bGV0IHM9bnx8ZS5tYXAoKGksdSk9Pk1hdGguZmxvb3IoaSpyW3VdKSk7cmV0dXJuW3Isc119LF9iPShhLHQsbyk9PntsZXQgZT1BcnJheS5mcm9tKGEuZmxvYXREYXRhKTtyZXR1cm4gc28oZSx0LG8pLGV9LE9iPShhLHQsbyxlKT0+e2xldCByPXQubGVuZ3RoLG49bmV3IEFycmF5KHIpO2ZvcihsZXQgcz0wLGk9cjtzPGk7cysrKWlmKHRbc109PT0wKXtpZihhW3NdIT09MCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRpbSBpcyB6ZXJvIGJ1dCByZXF1aXJlZCBvdXRwdXQgZGltIGlzIG5vbi16ZXJvLiIpO25bc109MX1lbHNlIG5bc109YVtzXS90W3NdO3JldHVybiBzbyhuLG8sZSksbn19KTt2YXIgZ2MsSWIseWM9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt5cigpO2djPShhLHQpPT4oSWIodCksW25ldyAkZShbdFswXS5kaW1zLmxlbmd0aF0sImludDMyIix2b2lkIDAsdm9pZCAwLG5ldyBJbnQzMkFycmF5KHRbMF0uZGltcykpXSksSWI9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSByZXF1aXJlcyAxIGlucHV0LiIpfX0pO3ZhciBHaSxUYyx4Yyx3YyxTYix2YyxBYixQYixfYz1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7cG4oKTtmZSgpO2FlKCk7R2k9e25hbWU6IlNsaWNlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6WzBdfSxUYz0oYSx0LG8pPT4oU2IodCksW2EucnVuKHsuLi5HaSxjYWNoZUhpbnQ6by5jYWNoZUtleSxnZXQ6KCk9PndjKGEsdFswXSxvKX0sdCldKSx4Yz1hPT57bGV0IHQ9YS5hdHRyaWJ1dGVzLmdldEludHMoInN0YXJ0cyIpLG89YS5hdHRyaWJ1dGVzLmdldEludHMoImVuZHMiKSxlPWEuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSk7cmV0dXJuIFEoe3N0YXJ0czp0LGVuZHM6byxheGVzOmV9KX0sd2M9KGEsdCxvKT0+e2xldCBlPW8uYXhlcy5sZW5ndGg9PT0wP3QuZGltcy5zbGljZSgwKS5tYXAoKHAsZCk9PmQpOm8uYXhlcyxyPVUubm9ybWFsaXplQXhlcyhlLHQuZGltcy5sZW5ndGgpLG49by5zdGFydHMubWFwKChwLGQpPT5wPnQuZGltc1tyW2RdXS0xP3QuZGltc1tyW2RdXTpVLm5vcm1hbGl6ZUF4aXMocCx0LmRpbXNbcltkXV0pKSxzPW8uZW5kcy5tYXAoKHAsZCk9PnA+dC5kaW1zW3JbZF1dLTE/dC5kaW1zW3JbZF1dOlUubm9ybWFsaXplQXhpcyhwLHQuZGltc1tyW2RdXSkpLGk9dC5kaW1zLnNsaWNlKCksdT1bXTtmb3IobGV0IHA9MDtwPHIubGVuZ3RoO3ArKylpW3JbcF1dPXNbcF0tbltwXSxuW3BdPjAmJnUucHVzaChgb3V0cHV0SWR4WyR7cltwXX1dICs9ICR7bltwXX07YCk7bGV0IGM9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHtpLmxlbmd0aH1dKSB7CiAgICAgICAgJHt1LmpvaW4oYAogICAgICBgKX0KICAgICAgICByZXR1cm4gX0Eob3V0cHV0SWR4KTsKICAgICAgfWA7cmV0dXJuey4uLkdpLG91dHB1dDp7ZGltczppLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTpjfX0sU2I9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJTbGljZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKFF0LmluZGV4T2YoYVswXS50eXBlKT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfSx2Yz0oYSx0KT0+e1BiKHQpO2xldCBvPUFiKGEsdCk7cmV0dXJuW2EucnVuKHsuLi5HaSxjYWNoZUhpbnQ6by5jYWNoZUtleSxnZXQ6KCk9PndjKGEsdFswXSxvKX0sW3RbMF1dKV19LEFiPShhLHQpPT57aWYoIWEuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWEuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKXx8dC5sZW5ndGg+PTQmJiFhLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzNdLmRhdGFJZCl8fHQubGVuZ3RoPj01JiYhYS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFs0XS5kYXRhSWQpKXRocm93IG5ldyBFcnJvcigiZHluYW1pYyBzbGljZSBhdHRyaWJ1dGVzIGFyZSBub3QgYWxsb3dlZCIpO2lmKHQubGVuZ3RoPj01JiZ0WzRdLmludGVnZXJEYXRhLnNvbWUocz0+cyE9PTEpKXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG5vbi0xIHN0ZXBzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNsaWNlIik7bGV0IG89QXJyYXkuZnJvbSh0WzFdLmludGVnZXJEYXRhKSxlPUFycmF5LmZyb20odFsyXS5pbnRlZ2VyRGF0YSkscj10Lmxlbmd0aD49ND9BcnJheS5mcm9tKHRbM10uaW50ZWdlckRhdGEpOltdLG49YCR7cn07JHtvfTske2V9YDtyZXR1cm57c3RhcnRzOm8sZW5kczplLGF4ZXM6cixjYWNoZUtleTpufX0sUGI9YT0+e2lmKCFhfHxhLmxlbmd0aDwzfHxhLmxlbmd0aD41KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBudW1iZXIuIik7aWYoYVsxXS50eXBlIT09ImludDMyInx8YVsxXS5kaW1zLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoYVsyXS50eXBlIT09ImludDMyInx8YVsyXS5kaW1zLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoYS5sZW5ndGg+PTQmJihhWzNdLnR5cGUhPT0iaW50MzIifHxhWzNdLmRpbXMubGVuZ3RoIT09MSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoYS5sZW5ndGg+PTUmJihhWzRdLnR5cGUhPT0iaW50MzIifHxhWzRdLmRpbXMubGVuZ3RoIT09MSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9fSk7dmFyIE9jLEljLFNjLEFjLFBjLEVjLERjLExjLEViLERiLExiLENjLEZjPUwoKCk9PnsidXNlIHN0cmljdCI7VWUoKTtmZSgpO3dlKCk7YWUoKTtvbygpO09jPXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZU1heCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOlswXX0sSWM9e25hbWU6IlNvZnRtYXhDb21wdXRlU2NhbGUiLGlucHV0TmFtZXM6WyJBIiwiTWF4Il0saW5wdXRUeXBlczpbMCwwXX0sU2M9e25hbWU6IlNvZnRNYXgiLGlucHV0TmFtZXM6WyJBIiwiTWF4IiwiTm9ybSJdLGlucHV0VHlwZXM6WzAsMCwwXX0sQWM9KGEsdCxvKT0+e0NjKHQpO2xldCBlPXRbMF0uZGltcy5zbGljZSgpLHI9VS5ub3JtYWxpemVBeGlzKG8uYXhpcyxlLmxlbmd0aCksbj1VLnNpemVUb0RpbWVuc2lvbihlLHIpLHM9VS5zaXplRnJvbURpbWVuc2lvbihlLHIpO3JldHVybiBMYyhhLHQsbyxuLHMpfSxQYz1hPT5RKHtheGlzOmEuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpfSksRWM9YT0+USh7YXhpczphLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwtMSl9KSxEYz0oYSx0LG8pPT57Q2ModCk7bGV0IGU9dFswXS5kaW1zLnNsaWNlKCkscj1VLm5vcm1hbGl6ZUF4aXMoby5heGlzLGUubGVuZ3RoKSxuPWUubGVuZ3RoLHM9ciE9PW4tMSxpPVtdLHU9W10sbD1bXSxjO3MmJih1PUFycmF5LmZyb20oe2xlbmd0aDpufSkubWFwKCh3LHYpPT52KSx1W3JdPW4tMSx1W24tMV09cix1Lm1hcCh3PT5pLnB1c2goZVt3XSkpLGM9USh7cGVybTp1fSksbD13cihhLHQsYykpO2xldCBwPXM/VS5zaXplVG9EaW1lbnNpb24oaSxuLTEpOlUuc2l6ZVRvRGltZW5zaW9uKGUsbi0xKSxkPXM/VS5zaXplRnJvbURpbWVuc2lvbihpLG4tMSk6VS5zaXplRnJvbURpbWVuc2lvbihlLG4tMSksVD1MYyhhLHM/bDp0LG8scCxkKTtyZXR1cm4gcz93cihhLFQsYyk6VH0sTGM9KGEsdCxvLGUscik9PntsZXQgbj1FYihhLHRbMF0sZSxyLFtlXSkscz1hLnJ1bih7Li4uT2MsY2FjaGVIaW50Om8uY2FjaGVLZXksZ2V0OigpPT5ufSx0KSxpPURiKGEsdFswXSxlLHIsbi5vdXRwdXQuZGltcyxbZV0pLHU9YS5ydW4oey4uLkljLGNhY2hlSGludDpvLmNhY2hlS2V5LGdldDooKT0+aX0sW3RbMF0sc10pLGw9TGIoYSx0WzBdLGUscixuLm91dHB1dC5kaW1zLGkub3V0cHV0LmRpbXMpO3JldHVyblthLnJ1bih7Li4uU2MsY2FjaGVIaW50Om8uY2FjaGVLZXksZ2V0OigpPT5sfSxbdFswXSxzLHVdKV19LEViPShhLHQsbyxlLHIpPT57bGV0W24sc109YS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLDApLGk9ci5sZW5ndGg7aWYobzwxfHxlPDEpdGhyb3cgbmV3IEVycm9yKCJMb2dpY2FsIHJvdyBjb3VudCBOIGFuZCBmZWF0dXJlIGNvdW50IEQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpO2lmKHIubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIDEiKTtpZihyWzBdIT09byl0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7bGV0IHU9SChhLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksbD1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7aX1dIGluZGljZXMpIHsKICAgICAgICBpbnQgbG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ID0gaW5kaWNlc1swXSAqICR7ZX07CgogICAgICAgIGZsb2F0IG1heCA9IGdldENvbG9yQXNGbG9hdCgke3UudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQsICR7bn0sCiAgICAgICAgJHtzfSApKSk7CiAgICAgICAgZm9yKGludCBpPTE7IGk8JHtlfTsgKytpKQogICAgICAgIHsKICAgICAgICAgIGZsb2F0IGN1cnJlbnQgPSBnZXRDb2xvckFzRmxvYXQoJHt1LnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSwKICAgICAgICAgICAgJHtufSwgJHtzfSkpKTsKICAgICAgICAgIGlmKGN1cnJlbnQgPiBtYXgpCiAgICAgICAgICBtYXggPSBjdXJyZW50OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG1heDsKICAgICAgfWA7cmV0dXJuey4uLk9jLG91dHB1dDp7ZGltczpyLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTpsfX0sRGI9KGEsdCxvLGUscixuKT0+e2xldFtzLGldPWEuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHQuZGltcywwKSx1PW4ubGVuZ3RoO2lmKG88MXx8ZTwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZihuLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSAxIik7aWYoblswXSE9PW8pdGhyb3cgbmV3IEVycm9yKCJTaGFwZSBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBlcXVhbCB0byBsb2dpY2FsIHJvdyBjb3VudCIpO2lmKHIubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgMSIpO2lmKHJbMF0hPT1vKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHNob3VsZCBiZSBlcXVhbCB0byBsb2dpY2FsIHJvdyBjb3VudCIpO2xldCBsPUgoYS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGM9YAogICAgICBmbG9hdCBwcm9jZXNzKGludFske3V9XSBpbmRpY2VzKSB7CiAgICAgICAgaW50IGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCA9IGluZGljZXNbMF0gKiAke2V9OwoKICAgICAgICBmbG9hdCBub3JtX2ZhY3RvciA9IDAuMDsKICAgICAgICBmbG9hdCBtYXggPSBfTWF4KGluZGljZXMpOwogICAgICAgIGZvcihpbnQgaT0wOyBpPCR7ZX07ICsraSkKICAgICAgICB7CiAgICAgICAgICBub3JtX2ZhY3RvciArPSBleHAoZ2V0Q29sb3JBc0Zsb2F0KCR7bC50ZXh0dXJlMkR9KEEsIG9mZnNldFRvQ29vcmRzKGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCArIGksCiAgICAgICAgICAgICR7c30sICR7aX0pKSkgLSBtYXgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5vcm1fZmFjdG9yOwogICAgICB9YDtyZXR1cm57Li4uSWMsb3V0cHV0OntkaW1zOm4sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOmN9fSxMYj0oYSx0LG8sZSxyLG4pPT57bGV0W3MsaV09YS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLDApLHU9dC5kaW1zLmxlbmd0aDtpZihvPDF8fGU8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoci5sZW5ndGghPT0xfHxuLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihyWzBdIT09b3x8blswXSE9PW8pdGhyb3cgbmV3IEVycm9yKCJTaGFwZSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7bGV0IGw9YAogICAgICBmbG9hdCBwcm9jZXNzKGludFske3V9XSBpbmRpY2VzKSB7CgogICAgICAvLyBnZXQgb2Zmc2V0IG9mIGN1cnJlbnQgbG9naWNhbCB0ZW5zb3IgaW5kZXggZnJvbSB0aGUgMi1EIHRleHR1cmUgY29vcmRpbmF0ZXMgKFRleENvb3JkcykKICAgICAgaW50IG9mZnNldCA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtzfSwgJHtpfSk7CgogICAgICAvL2RldGVybWluZSB0aGUgbG9naWNhbCByb3cgZm9yIHRoaXMgaW5kZXgKICAgICAgaW50IGxvZ2ljYWxfcm93X2luZGV4WzFdOwogICAgICBsb2dpY2FsX3Jvd19pbmRleFswXSA9IG9mZnNldCAvICR7ZX07CgogICAgICBmbG9hdCBub3JtX2ZhY3RvciA9IF9Ob3JtKGxvZ2ljYWxfcm93X2luZGV4KTsKCiAgICAgIC8vIGF2b2lkIHBvc3NpYmxlIGRpdmlzaW9uIGJ5IDAKICAgICAgLy8gaWYgbm9ybV9mYWNvciBpcyAwLCBhbGwgZWxlbWVudHMgYXJlIHplcm8KICAgICAgLy8gaWYgc28sIHJldHVybiAwCiAgICAgIGlmKG5vcm1fZmFjdG9yID09IDAuMCkKICAgICAgICByZXR1cm4gMC4wOwoKICAgICAgcmV0dXJuIGV4cChfQShpbmRpY2VzKSAtIF9NYXgobG9naWNhbF9yb3dfaW5kZXgpKSAvIG5vcm1fZmFjdG9yOwogICAgfWA7cmV0dXJuey4uLlNjLG91dHB1dDp7ZGltczp0LmRpbXMsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6MH0sc2hhZGVyU291cmNlOmx9fSxDYz1hPT57aWYoIWF8fGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlNvZnRtYXggcmVxdWlyZXMgMSBpbnB1dC4iKTtpZihhWzBdLnR5cGUhPT0iZmxvYXQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZSIpfX0pO3ZhciAkYyxrYyxCYyxDYixGYiwkYixOYz1MKCgpPT57InVzZSBzdHJpY3QiO1VlKCk7ZmUoKTthZSgpOyRjPXtuYW1lOiJTcGxpdCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOlswXX0sa2M9KGEsdCxvKT0+eyRiKHQpO2xldCBlPVUubm9ybWFsaXplQXhpcyhvLmF4aXMsdFswXS5kaW1zLmxlbmd0aCkscj1DYihhLHQsZSxvKSxuPVtdO2ZvcihsZXQgcz0wO3M8cjsrK3Mpbi5wdXNoKGEucnVuKHsuLi4kYyxjYWNoZUhpbnQ6YCR7by5jYWNoZUtleX07JHtzfWAsZ2V0OigpPT5GYihhLHRbMF0sbyxlLHMpfSx0KSk7cmV0dXJuIG59LEJjPWE9PntsZXQgdD1hLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwwKSxvPWEuYXR0cmlidXRlcy5nZXRJbnRzKCJzcGxpdCIsW10pLGU9YS5vdXRwdXRzLmxlbmd0aDtyZXR1cm4gUSh7YXhpczp0LHNwbGl0Om8sbnVtT3V0cHV0czplfSl9LENiPShhLHQsbyxlKT0+e2xldFsscl09YW4uc3BsaXRTaGFwZSh0WzBdLmRpbXMsbyxlLnNwbGl0LGUubnVtT3V0cHV0cyk7cmV0dXJuIHIubGVuZ3RofSxGYj0oYSx0LG8sZSxyKT0+e2xldFtuLHNdPWFuLnNwbGl0U2hhcGUodC5kaW1zLGUsby5zcGxpdCxvLm51bU91dHB1dHMpLGk9c1tyXSx1PW5bcl0sYz1gCiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt1Lmxlbmd0aH1dKSB7CiAgICAgICAgaW5kaWNlc1ske2V9XSArPSAke2l9OwogICAgICAgIHJldHVybiBfQShpbmRpY2VzKTsKICAgICAgfQogICAgYDtyZXR1cm57Li4uJGMsY2FjaGVIaW50OmAke28uY2FjaGVLZXl9OiR7cn1gLG91dHB1dDp7ZGltczp1LHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTpjfX0sJGI9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJTcGxpdCByZXF1aXJlcyBvbmUgaW5wdXQuIik7aWYoYVswXS50eXBlIT09ImludDgiJiZhWzBdLnR5cGUhPT0idWludDgiJiZhWzBdLnR5cGUhPT0iaW50MTYiJiZhWzBdLnR5cGUhPT0idWludDE2IiYmYVswXS50eXBlIT09ImludDMyIiYmYVswXS50eXBlIT09InVpbnQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDMyIiYmYVswXS50eXBlIT09ImZsb2F0NjQiJiZhWzBdLnR5cGUhPT0iYm9vbCIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIil9fSk7dmFyIFVpLFJjLE1jLGtiLEJiLEdjPUwoKCk9PnsidXNlIHN0cmljdCI7ZmUoKTtVaT0oYSx0LG8pPT57a2IodCk7bGV0IGU9VS5zcXVlZXplU2hhcGUodFswXS5kaW1zLG8pO3JldHVyblthLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGUpXX0sUmM9KGEsdCk9PihCYih0KSxVaShhLFt0WzBdXSxBcnJheS5mcm9tKHRbMV0uaW50ZWdlckRhdGEpKSksTWM9YT0+YS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiKSxrYj1hPT57aWYoIWF8fGEubGVuZ3RoIT09MSl0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZihhWzBdLnR5cGU9PT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfSxCYj1hPT57aWYoIWF8fGEubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoYVsxXS50eXBlIT09ImludDMyIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19KTt2YXIgVWMsTmIsUmIsemM9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt3ZSgpO2FlKCk7VWM9KGEsdCk9PntSYih0KTtsZXQgbz17bmFtZToiU3VtIixpbnB1dE5hbWVzOnQubWFwKChyLG4pPT5gWCR7bn1gKSxpbnB1dFR5cGVzOm5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbCgwKX07cmV0dXJuW2EucnVuKHsuLi5vLGdldDooKT0+TmIoYSx0LG8pfSx0KV19LE5iPShhLHQsbyk9PntsZXQgZT1IKGEuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxyPXRbMF0uZGltcy5zbGljZSgpLHM9YAogICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgdmVjNCByZXN1bHQgPSAke3QubWFwKChpLHUpPT5gJHtlLnRleHR1cmUyRH0oWCR7dX0sVGV4Q29vcmRzKWApLmpvaW4oIiArICIpfTsKICAgICAgICAke2Uub3V0cHV0fSA9IHJlc3VsdDsKICAgICAgfQogICAgYDtyZXR1cm57Li4ubyxvdXRwdXQ6e2RpbXM6cix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTowfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpzfX0sUmI9YT0+e2lmKCFhfHxhLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJTdW0gcmVxdWlyZXMgaW5wdXRzLiIpO2xldCB0PWFbMF0uZGltcy5sZW5ndGg7Zm9yKGxldCBvPTE7bzxhLmxlbmd0aDtvKyspe2lmKHQhPT1hW29dLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5wdXQgc2hhcGVzIGFyZSBtaXNtYXRjaGVkLiIpO2ZvcihsZXQgZT0wO2U8dDtlKyspaWYoYVswXS5kaW1zW2VdIT09YVtvXS5kaW1zW2VdKXRocm93IG5ldyBFcnJvcigiSW5wdXQgc2hhcGVzIGFyZSBub3QgbWF0Y2hlZC4iKX1pZihhWzBdLnR5cGUhPT0iZmxvYXQzMiImJmFbMF0udHlwZSE9PSJmbG9hdDY0Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtmb3IobGV0IG89MTtvPGEubGVuZ3RoO28rKylpZihhWzBdLnR5cGUhPT1hW29dLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCB0eXBlcyBhcmUgbm90IG1hdGNoZWQuIil9fSk7dmFyIFZjLE1iLEdiLFdjPUwoKCk9PnsidXNlIHN0cmljdCI7cG4oKTthZSgpO1ZjPShhLHQpPT57R2IodCk7bGV0IG89e25hbWU6IlRpbGUiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbMF19O3JldHVyblthLnJ1bih7Li4ubyxnZXQ6KCk9Pk1iKGEsdCxvKX0sdCldfSxNYj0oYSx0LG8pPT57bGV0IGU9dFswXS5kaW1zLnNsaWNlKCkscj1uZXcgQXJyYXkoZS5sZW5ndGgpLG49W107Zm9yKGxldCB1PTA7dTxlLmxlbmd0aDt1Kyspclt1XT1lW3VdKnRbMV0ubnVtYmVyRGF0YVt1XSxuLnB1c2goYGlucHV0SWR4WyR7dX1dID0gaW50KG1vZChmbG9hdChvdXRwdXRJZHhbJHt1fV0pLCAke2VbdV19LikpO2ApO2xldCBzPXIubGVuZ3RoLGk9YAogICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHtzfV0pIHsKICAgICAgICBpbnQgaW5wdXRJZHhbJHtzfV07CiAgICAgICAgJHtuLmpvaW4oYApgKX0KICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpOwogICAgICB9CiAgICBgO3JldHVybnsuLi5vLG91dHB1dDp7ZGltczpyLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOjB9LHNoYWRlclNvdXJjZTppfX0sR2I9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKCJUaWxlIHJlcXVpcmVzIDIgaW5wdXQuIik7aWYoYVsxXS5kaW1zLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJUaGUgc2Vjb25kIGlucHV0IHNoYXBlIG11c3QgMSBkaW1lbnNpb24uIik7aWYoYVsxXS5kaW1zWzBdIT09YVswXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoUXQuaW5kZXhPZihhWzBdLnR5cGUpPT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoYVsxXS50eXBlIT09ImludDMyIiYmYVsxXS50eXBlIT09ImludDE2Iil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcmVwZWF0IHR5cGUuIil9fSk7dmFyIHppLEhjLHFjLFViLHpiLGpjPUwoKCk9PnsidXNlIHN0cmljdCI7ZmUoKTt6aT0oYSx0LG8pPT57VWIodCk7bGV0IGU9VS51bnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbyk7cmV0dXJuW2EucmVzaGFwZVVucGFja2VkKHRbMF0sZSldfSxIYz0oYSx0KT0+KHpiKHQpLHppKGEsW3RbMF1dLEFycmF5LmZyb20odFsxXS5pbnRlZ2VyRGF0YSkpKSxxYz1hPT5hLmF0dHJpYnV0ZXMuZ2V0SW50cygiYXhlcyIpLFViPWE9PntpZighYXx8YS5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigiVW5zcXVlZXplIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoYVswXS50eXBlPT09InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0semI9YT0+e2lmKCFhfHxhLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKCJVbnNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoYVsxXS50eXBlIT09ImludDMyIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX19KTt2YXIgWWMsWGM9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtvbCgpO2dsKCk7eGwoKTtTbCgpO3RvKCk7ZmYoKTtiZigpO1RmKCk7dmYoKTtTZigpO0VmKCk7RmYoKTtOZigpO3JvKCk7VWYoKTtlYygpO3VjKCk7ZmMoKTtiYygpO3ljKCk7X2MoKTtGYygpO05jKCk7R2MoKTt6YygpO1djKCk7b28oKTtJaSgpO2pjKCk7TmkoKTtZYz1bWyJBYnMiLCIiLCI2KyIsQWxdLFsiQWNvcyIsIiIsIjcrIixQbF0sWyJBZGQiLCIiLCI3KyIsaWxdLFsiQW5kIiwiIiwiNysiLGFsXSxbIkFzaW4iLCIiLCI3KyIsRWxdLFsiQXRhbiIsIiIsIjcrIixEbF0sWyJBdmVyYWdlUG9vbCIsIiIsIjcrIixWZixXZl0sWyJCYXRjaE5vcm1hbGl6YXRpb24iLCIiLCI3KyIscmwsbmxdLFsiQ2FzdCIsIiIsIjYrIix5bCxUbF0sWyJDZWlsIiwiIiwiNisiLEZsXSxbIkNsaXAiLCIiLCI2LTEwIixfaSxMbF0sWyJDbGlwIiwiIiwiMTErIixDbF0sWyJDb25jYXQiLCIiLCI0KyIsX2wsSWxdLFsiQ29udiIsIiIsIjErIixMaSxDaV0sWyJDb252VHJhbnNwb3NlIiwiIiwiMSsiLHVmLGxmXSxbIkNvcyIsIiIsIjcrIiwkbF0sWyJEaXYiLCIiLCI3KyIsc2xdLFsiRHJvcG91dCIsIiIsIjcrIixPaV0sWyJEZXB0aFRvU3BhY2UiLCIiLCIxKyIsaGYsbWZdLFsiRXF1YWwiLCIiLCI3KyIsdWxdLFsiRWx1IiwiIiwiNisiLGtsLEJsXSxbIkV4cCIsIiIsIjYrIixObF0sWyJGbGF0dGVuIiwiIiwiMSsiLGdmLHlmXSxbIkZsb29yIiwiIiwiNisiLFJsXSxbIkZ1c2VkQ29udiIsImNvbS5taWNyb3NvZnQiLCIxKyIsTGksQ2ldLFsiR2F0aGVyIiwiIiwiMSsiLHhmLHdmXSxbIkdlbW0iLCIiLCI3LTEwIixGaSxPZl0sWyJHZW1tIiwiIiwiMTErIixGaSxJZl0sWyJHbG9iYWxBdmVyYWdlUG9vbCIsIiIsIjErIixxZixqZl0sWyJHbG9iYWxNYXhQb29sIiwiIiwiMSsiLFpmXSxbIkdyZWF0ZXIiLCIiLCI3KyIsbGxdLFsiSWRlbnRpdHkiLCIiLCIxKyIsT2ldLFsiSW1hZ2VTY2FsZXIiLCIiLCIxKyIsQWYsUGZdLFsiSW5zdGFuY2VOb3JtYWxpemF0aW9uIiwiIiwiNisiLExmLENmXSxbIkxlYWt5UmVsdSIsIiIsIjYrIixNbCxHbF0sWyJMZXNzIiwiIiwiNysiLGZsXSxbIkxSTiIsIiIsIjErIiwkZixrZl0sWyJMb2ciLCIiLCI2KyIsVWxdLFsiTWF0TXVsIiwiIiwiMSsiLGVmLHRmXSxbIk1heFBvb2wiLCIiLCIxKyIsWWYsWGZdLFsiTXVsIiwiIiwiNysiLGNsXSxbIk5lZyIsIiIsIjYrIix6bF0sWyJOb3QiLCIiLCIxKyIsVmxdLFsiT3IiLCIiLCI3KyIscGxdLFsiUGFkIiwiIiwiMi0xMCIsJGksUmZdLFsiUGFkIiwiIiwiMTErIixNZixHZl0sWyJQb3ciLCIiLCI3KyIsZGxdLFsiUFJlbHUiLCIiLCI3KyIsaGxdLFsiUmVkdWNlTG9nU3VtIiwiIiwiMSsiLGFjLGVyXSxbIlJlZHVjZU1heCIsIiIsIjErIixuYyxlcl0sWyJSZWR1Y2VNZWFuIiwiIiwiMSsiLHJjLGVyXSxbIlJlZHVjZU1pbiIsIiIsIjErIixvYyxlcl0sWyJSZWR1Y2VQcm9kIiwiIiwiMSsiLGljLGVyXSxbIlJlZHVjZVN1bSIsIiIsIjEtMTIiLHRjLGVyXSxbIlJlZHVjZVN1bVNxdWFyZSIsIiIsIjErIixzYyxlcl0sWyJSZWx1IiwiIiwiNisiLFdsXSxbIlJlc2hhcGUiLCIiLCI1KyIsbGNdLFsiUmVzaXplIiwiIiwiMTAiLE1pLGhjXSxbIlJlc2l6ZSIsIiIsIjExKyIsTWksbWNdLFsiU2hhcGUiLCIiLCIxKyIsZ2NdLFsiU2lnbW9pZCIsIiIsIjYrIixIbF0sWyJTaW4iLCIiLCI3KyIscWxdLFsiU2xpY2UiLCIiLCIxMCsiLHZjXSxbIlNsaWNlIiwiIiwiMS05IixUYyx4Y10sWyJTb2Z0bWF4IiwiIiwiMS0xMiIsQWMsUGNdLFsiU29mdG1heCIsIiIsIjEzKyIsRGMsRWNdLFsiU3BsaXQiLCIiLCIyLTEyIixrYyxCY10sWyJTcXJ0IiwiIiwiNisiLGpsXSxbIlNxdWVlemUiLCIiLCIxLTEyIixVaSxNY10sWyJTcXVlZXplIiwiIiwiMTMrIixSY10sWyJTdWIiLCIiLCI3KyIsbWxdLFsiU3VtIiwiIiwiNisiLFVjXSxbIlRhbiIsIiIsIjcrIixZbF0sWyJUYW5oIiwiIiwiNisiLFhsXSxbIlRpbGUiLCIiLCI2KyIsVmNdLFsiVHJhbnNwb3NlIiwiIiwiMSsiLHdyLHBmXSxbIlVwc2FtcGxlIiwiIiwiNy04IixraSxwY10sWyJVcHNhbXBsZSIsIiIsIjkiLGtpLGRjXSxbIlVuc3F1ZWV6ZSIsIiIsIjEtMTIiLHppLHFjXSxbIlVuc3F1ZWV6ZSIsIiIsIjEzKyIsSGNdLFsiWG9yIiwiIiwiNysiLGJsXV19KTtmdW5jdGlvbiBKYyhhKXtsZXQgdD17fSxvO2Zvcig7KG89S2MuZXhlYyhhKSkhPT1udWxsOyl7bGV0IGU9b1szXS5zcGxpdCgiLCIpLm1hcChyPT57bGV0IG49ci50cmltKCkuc3BsaXQoIiAiKTtyZXR1cm4gbiYmbi5sZW5ndGg9PT0yP3t0eXBlOm5bMF0sbmFtZTpuWzFdfTpudWxsfSkuZmlsdGVyKHI9PnIhPT1udWxsKTt0W29bMl1dPXtwYXJhbXM6ZSxib2R5Om9bNF19fWZvcihsZXQgZSBpbiB0KXtsZXQgcj1WYi5yZXBsYWNlKCJfX0ZVTkNfXyIsZSksbj1uZXcgUmVnRXhwKHIsImdtIik7Zm9yKDsobz1uLmV4ZWMoYSkpIT09bnVsbDspe2xldCBzPW9bMV0saT1vWzJdLHU9b1szXS5zcGxpdCgiLCIpLGw9cz9gJHtzfSAke2l9O2A6IiIsYz10W2VdLmJvZHkscD0iIjt0W2VdLnBhcmFtcy5mb3JFYWNoKChULHcpPT57VCYmKHArPWAke1QudHlwZX0gJHtULm5hbWV9ID0gJHt1W3ddfTsKYCl9KSxjPWAke3B9CiAke2N9YCxjPWMucmVwbGFjZSgicmV0dXJuIixgJHtpfSA9IGApO2xldCBkPWAKICAgICAgJHtsfQogICAgICB7CiAgICAgICAgJHtjfQogICAgICB9CiAgICAgIGA7YT1hLnJlcGxhY2Uob1swXSxkKX19cmV0dXJuIGE9YS5yZXBsYWNlKEtjLCIiKSxhfXZhciBLYyxWYixaYz1MKCgpPT57InVzZSBzdHJpY3QiO0tjPS9AaW5saW5lW1xzXG5ccl0rKFx3KylbXHNcblxyXSsoWzAtOWEtekEtWl9dKylccypcKChbXildKilcKVxzKnsoKFtefV18W1xuXHJdKSopfS9nbSxWYj0iKFxcdyspP1xccysoW18wLTlhLXpBLVpdKylcXHMrPVxccytfX0ZVTkNfX1xcKCguKilcXClcXHMqOyJ9KTtmdW5jdGlvbiBNcihhLHQpe2xldCBvPVtdLGU9W10scj10IT1udWxsJiZBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD09PTAsbj10PT1udWxsfHxyP251bGw6V2IodCxhKS5zb3J0KCkscz0wO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7KytpKXtpZihuIT1udWxsKXtpZihuW3NdPT09aSYmYVtpXSE9PTEpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBzcXVlZXplIGF4aXMgJHtpfSBzaW5jZSBpdHMgZGltICcke2FbaV19JyBpcyBub3QgMWApOyhuW3NdPT1udWxsfHxuW3NdPmkpJiZhW2ldPT09MSYmKG8ucHVzaChhW2ldKSxlLnB1c2goaSkpLG5bc108PWkmJnMrK31hW2ldIT09MSYmKG8ucHVzaChhW2ldKSxlLnB1c2goaSkpfXJldHVybntuZXdTaGFwZTpvLGtlcHREaW1zOmV9fWZ1bmN0aW9uIFdiKGEsdCl7bGV0IG89dC5sZW5ndGg7cmV0dXJuIGE9YT09bnVsbD90Lm1hcCgoZSxyKT0+cik6W10uY29uY2F0KGEpLEZyKGEuZXZlcnkoZT0+ZT49LW8mJmU8byksKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbiByYW5nZSBbLSR7b30sICR7b30pIGJ1dCBnb3QgYXhpcyAke2F9YCksRnIoYS5ldmVyeShIYiksKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgJHthfWApLGEubWFwKGU9PmU8MD9vK2U6ZSl9ZnVuY3Rpb24gSGIoYSl7cmV0dXJuIGElMT09PTB9ZnVuY3Rpb24gcWIoYSl7aWYoYS5sZW5ndGg9PT0wKXJldHVybiAxO2xldCB0PWFbMF07Zm9yKGxldCBvPTE7bzxhLmxlbmd0aDtvKyspdCo9YVtvXTtyZXR1cm4gdH1mdW5jdGlvbiBRYyhhKXtsZXQgdD1NYXRoLmNlaWwoTWF0aC5zcXJ0KGEpKTtyZXR1cm5bdCxNYXRoLmNlaWwoYS90KV19dmFyIHVvLFZpPUwoKCk9PnsidXNlIHN0cmljdCI7bHQoKTtmZSgpO3VvPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMubWF4VGV4dHVyZVNpemU9dH1jb21wdXRlVGV4dHVyZVdIKHQsbyl7bGV0IGU9dGhpcy5jb21wdXRlVGV4dHVyZSh0LG8pO3JldHVybiBvJiZvLmlzUGFja2VkJiYoZVswXS89MixlWzFdLz0yKSxvJiZvLnJldmVyc2VXSD9bZVsxXSxlWzBdXTplfWNvbXB1dGVUZXh0dXJlKHQsbyl7bGV0IGU9byYmby5pc1BhY2tlZDtpZih0Lmxlbmd0aD09PTApcmV0dXJuIGU/WzIsMl06WzEsMV07bGV0IHI9dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZihvJiZvLmJyZWFrQXhpcyE9PXZvaWQgMCl7bGV0IGk9by5icmVha0F4aXM+PXQubGVuZ3RoPzE6dC5zbGljZShvLmJyZWFrQXhpcykucmVkdWNlKChsLGMpPT5sKmMpLHU9by5icmVha0F4aXM8PTA/MTp0LnNsaWNlKDAsby5icmVha0F4aXMpLnJlZHVjZSgobCxjKT0+bCpjKTtpZihpPnJ8fHU+ciljZS52ZXJib3NlKCJUZXh0dXJlTGF5b3V0IixgR2l2ZW4gd2lkdGgvaGVpZ2h0IHByZWZlcmVuY2VzIHdlcmUgdW5hdHRhaW5hYmxlOiBzaGFwZToke3R9LCBicmVha0F4aXM6JHtvLmJyZWFrQXhpc31gKTtlbHNlIHJldHVybltpLHVdfWxldCBuPXQuc2xpY2UoMCk7ZSYmKHI9cioyLG49bi5tYXAoKGksdSk9PnU+PW4ubGVuZ3RoLTI/blt1XSUyPT09MD9uW3VdOm5bdV0rMTpuW3VdKSxuLmxlbmd0aD09PTEmJihuPVsyLG5bMF1dKSksbi5sZW5ndGghPT0yJiYobj1NcihuKS5uZXdTaGFwZSk7bGV0IHM9cWIobik7cmV0dXJuIG4ubGVuZ3RoPD0xJiZzPD1yP1sxLHNdOm4ubGVuZ3RoPT09MiYmblswXTw9ciYmblsxXTw9cj9uOm4ubGVuZ3RoPT09MyYmblswXSpuWzFdPD1yJiZuWzJdPD1yP1tuWzBdKm5bMV0sblsyXV06bi5sZW5ndGg9PT0zJiZuWzBdPD1yJiZuWzFdKm5bMl08PXI/W25bMF0sblsxXSpuWzJdXTpuLmxlbmd0aD09PTQmJm5bMF0qblsxXSpuWzJdPD1yJiZuWzNdPD1yP1tuWzBdKm5bMV0qblsyXSxuWzNdXTpuLmxlbmd0aD09PTQmJm5bMF08PXImJm5bMV0qblsyXSpuWzNdPD1yP1tuWzBdLG5bMV0qblsyXSpuWzNdXTplP1FjKHMvNCkubWFwKGk9PmkqMik6UWMocyl9fX0pO3ZhciBsbyxlcD1MKCgpPT57InVzZSBzdHJpY3QiO2ZlKCk7V3QoKTt3ZSgpO1ZpKCk7QnQoKTtsbz1jbGFzcyBleHRlbmRzIGR0e2NvbnN0cnVjdG9yKG8pe3N1cGVyKG8pfWdldEZ1bmN0aW9ucygpe3JldHVybnsuLi50aGlzLm9mZnNldFRvQ29vcmRzKCksLi4udGhpcy5jb29yZHNUb09mZnNldCgpLC4uLnRoaXMudG9WZWMoKSwuLi50aGlzLnZhbHVlRnJvbSgpLC4uLnRoaXMuZ2V0Q29tbW9uVXRpbEZ1bmNzKCksLi4udGhpcy5nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCksLi4udGhpcy5nZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoKX19Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1vZmZzZXRUb0Nvb3Jkcygpe2xldCBvPSJvZmZzZXRUb0Nvb3JkcyI7cmV0dXJue29mZnNldFRvQ29vcmRzOm5ldyBSKGAKICAgICAgdmVjMiAke299KGludCBvZmZzZXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgIGludCB0ID0gb2Zmc2V0IC8gd2lkdGg7CiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoOwogICAgICAgIHZlYzIgY29vcmRzID0gKHZlYzIocyx0KSArIHZlYzIoMC41LDAuNSkpIC8gdmVjMih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICByZXR1cm4gY29vcmRzOwogICAgICB9CiAgICAgIGApfX1jb29yZHNUb09mZnNldCgpe2xldCBvPSJjb29yZHNUb09mZnNldCI7cmV0dXJue2Nvb3Jkc1RvT2Zmc2V0Om5ldyBSKGAKICAgICAgaW50ICR7b30odmVjMiBjb29yZHMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgIGZsb2F0IHMgPSBjb29yZHMucyAqIGZsb2F0KHdpZHRoKTsKICAgICAgICBmbG9hdCB0ID0gY29vcmRzLnQgKiBmbG9hdChoZWlnaHQpOwogICAgICAgIGludCBvZmZzZXQgPSBpbnQodCkgKiB3aWR0aCArIGludChzKTsKICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICB9CiAgICAgIGApfX1nZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoKXtsZXQgbz10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dDtyZXR1cm4gby5pc1BhY2tlZD90aGlzLmdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChvKTp0aGlzLmdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KG8pfWdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChvKXtsZXQgZT1vLnVucGFja2VkU2hhcGUscj1bby53aWR0aCxvLmhlaWdodF0sbj17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOm5bc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6bltzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKGUscik7YnJlYWs7Y2FzZSAyOm5bc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3JkcyhlLHIpO2JyZWFrO2Nhc2UgMzpuW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMoZSxyKTticmVhaztkZWZhdWx0Om5bc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhlLHIpfWxldCB1PWAKICAgICAgdm9pZCBzZXRPdXRwdXQodmVjNCB2YWwpIHsKICAgICAgICAke0godGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmFsOwogICAgICB9CiAgICBgLGw9ImZsb2F0VGV4dHVyZVNldFJHQkEiO3JldHVybiBuW2xdPW5ldyBSKHUpLG59Z2V0VW5wYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQobyl7bGV0IGU9by51bnBhY2tlZFNoYXBlLHI9W28ud2lkdGgsby5oZWlnaHRdLG49e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpuW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOm5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKGUscik7YnJlYWs7Y2FzZSAyOm5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKGUscik7YnJlYWs7Y2FzZSAzOm5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKGUscik7YnJlYWs7Y2FzZSA0Om5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKGUscik7YnJlYWs7Y2FzZSA1Om5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKGUscik7YnJlYWs7Y2FzZSA2Om5bc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGUscik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHtlLmxlbmd0aH1gKX1sZXQgdT1gCiAgICAgICAgdm9pZCBzZXRPdXRwdXQoZmxvYXQgdmFsKSB7CiAgICAgICAgICAke0godGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmVjNCh2YWwsIDAsIDAsIDApOwogICAgICAgIH0KICAgIGAsbD0iZmxvYXRUZXh0dXJlU2V0UiI7cmV0dXJuIG5bbF09bmV3IFIodSksbn1nZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm4gbmV3IFIoYAogICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICBgKX1nZXRPdXRwdXRQYWNrZWQxRENvb3JkcyhvLGUpe2xldCByPWUsbj0iIjtyZXR1cm4gclswXT09PTE/KG49YAogICAgICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgICAgcmV0dXJuIDIgKiBpbnQoVGV4Q29vcmRzLnkgKiAke3JbMV19LjApOwogICAgICAgICAgfQogICAgICAgIGAsbmV3IFIobikpOnJbMV09PT0xPyhuPWAKICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICAgIHJldHVybiAyICogaW50KFRleENvb3Jkcy54ICogJHtyWzBdfS4wKTsKICAgICAgICAgIH0KICAgICAgICBgLG5ldyBSKG4pKToobj1gCiAgICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3JbMF19LCAke3JbMV19KSk7CiAgICAgICAgICByZXR1cm4gMiAqIChyZXNUZXhSQy55ICogJHtyWzBdfSArIHJlc1RleFJDLngpOwogICAgICAgIH0KICAgICAgYCxuZXcgUihuKSl9Z2V0T3V0cHV0UGFja2VkMkRDb29yZHMobyxlKXtsZXQgcj0iIjtpZihoci5hcnJheXNFcXVhbChvLGUpKXJldHVybiByPWAKICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKFRleENvb3Jkcy54eSAqIHZlYzIoJHtlWzBdfSwgJHtlWzFdfSkpOwogICAgICAgIH0KICAgICAgYCxuZXcgUihyKTtsZXQgbj1lLHM9TWF0aC5jZWlsKG9bMV0vMik7cmV0dXJuIHI9YAogICAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7blswXX0sICR7blsxXX0pKTsKCiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtuWzBdfSArIHJlc1RleFJDLng7CgogICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZQogICAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3N9KSAqIDI7CiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTsKCiAgICAgICAgICByZXR1cm4gaXZlYzIociwgYyk7CiAgICAgICAgfQogICAgICBgLG5ldyBSKHIpfWdldE91dHB1dFBhY2tlZDNEQ29vcmRzKG8sZSl7bGV0IHI9W2VbMF0sZVsxXV0sbj1NYXRoLmNlaWwob1syXS8yKSxzPW4qTWF0aC5jZWlsKG9bMV0vMiksaT1gCiAgICAgICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtyWzBdfSwgJHtyWzFdfSkpOwogICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7clswXX0gKyByZXNUZXhSQy54OwoKICAgICAgICAgIGludCBiID0gaW5kZXggLyAke3N9OwogICAgICAgICAgaW5kZXggLT0gYiAqICR7c307CgogICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZQogICAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke259KSAqIDI7CiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke259KTsKCiAgICAgICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgUihpKX1nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhvLGUpe2xldCByPVtlWzBdLGVbMV1dLG49TWF0aC5jZWlsKG9bby5sZW5ndGgtMV0vMikscz1uKk1hdGguY2VpbChvW28ubGVuZ3RoLTJdLzIpLGk9cyx1PSIiLGw9ImIsIHIsIGMiO2ZvcihsZXQgcD0yO3A8by5sZW5ndGgtMTtwKyspaSo9b1tvLmxlbmd0aC1wLTFdLHU9YAogICAgICBpbnQgYiR7cH0gPSBpbmRleCAvICR7aX07CiAgICAgIGluZGV4IC09IGIke3B9ICogJHtpfTsKICAgIGArdSxsPWBiJHtwfSwgYCtsO2xldCBjPWAKICAgICAgaXZlYyR7by5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtyWzBdfSwgJHtyWzFdfSkpOwogICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3JbMF19ICsgcmVzVGV4UkMueDsKCiAgICAgICAgJHt1fQoKICAgICAgICBpbnQgYiA9IGluZGV4IC8gJHtzfTsKICAgICAgICBpbmRleCAtPSBiICogJHtzfTsKCiAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZQogICAgICAgIGludCByID0gaW1vZChpbmRleCwgJHtufSkgKiAyOwogICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7bn0pOwoKICAgICAgICByZXR1cm4gaXZlYyR7by5sZW5ndGh9KCR7bH0pOwogICAgICB9CiAgICBgO3JldHVybiBuZXcgUihjKX1nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKG8sZSl7bGV0IHI9YAogICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2VbMF19LCAke2VbMV19KSk7CiAgICAgICAgICByZXR1cm4gcmVzVGV4UkMueSAqICR7ZVswXX0gKyByZXNUZXhSQy54OwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IFIocil9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhvLGUpe2xldCByPWAKICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2VbMF19LCAke2VbMV19KSk7CiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtlWzBdfSArIHJlc1RleFJDLng7CiAgICAgICAgICBpbnQgciA9IGluZGV4IC8gJHtvWzFdfTsKICAgICAgICAgIGludCBjID0gaW5kZXggLSByICogJHtvWzFdfTsKICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyBSKHIpfWdldE91dHB1dFVucGFja2VkM0RDb29yZHMobyxlKXtsZXQgcj0iIixuPW8ubGVuZ3RoLHM9bnVsbDtuPDImJihzPVtdKSxzPW5ldyBBcnJheShuLTEpLHNbbi0yXT1vW24tMV07Zm9yKGxldCBsPW4tMztsPj0wOy0tbClzW2xdPXNbbCsxXSpvW2wrMV07bGV0IGk9WyJyIiwiYyIsImQiXSx1PXMubWFwKChsLGMpPT57bGV0IHA9YGludCAke2lbY119ID0gaW5kZXggLyAke2x9YCxkPWM9PT1zLmxlbmd0aC0xP2BpbnQgJHtpW2MrMV19ID0gaW5kZXggLSAke2lbY119ICogJHtsfWA6YGluZGV4IC09ICR7aVtjXX0gKiAke2x9YDtyZXR1cm5gJHtwfTsgJHtkfTtgfSkuam9pbigiIik7cmV0dXJuIHI9YAogICAgICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHsKICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7ZVswXX0sICR7ZVsxXX0pKTsKICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke2VbMF19ICsgcmVzVGV4UkMueDsKICAgICAgICAgICR7dX0KICAgICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTsKICAgICAgICB9CiAgICAgIGAsbmV3IFIocil9Z2V0T3V0cHV0VW5wYWNrZWQ0RENvb3JkcyhvLGUpe2xldCByPSIiLG49by5sZW5ndGgscz1udWxsO248MiYmKHM9W10pLHM9bmV3IEFycmF5KG4tMSksc1tuLTJdPW9bbi0xXTtmb3IobGV0IGw9bi0zO2w+PTA7LS1sKXNbbF09c1tsKzFdKm9bbCsxXTtsZXQgaT1bInIiLCJjIiwiZCIsImQyIl0sdT1zLm1hcCgobCxjKT0+e2xldCBwPWBpbnQgJHtpW2NdfSA9IGluZGV4IC8gJHtsfWAsZD1jPT09cy5sZW5ndGgtMT9gaW50ICR7aVtjKzFdfSA9IGluZGV4IC0gJHtpW2NdfSAqICR7bH1gOmBpbmRleCAtPSAke2lbY119ICogJHtsfWA7cmV0dXJuYCR7cH07ICR7ZH07YH0pLmpvaW4oIiIpO3JldHVybiByPWAKICAgICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtlWzBdfSwgJHtlWzFdfSkpOwogICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7ZVswXX0gKyByZXNUZXhSQy54OwogICAgICAgICAgJHt1fQogICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTsKICAgICAgICB9CiAgICAgIGAsbmV3IFIocil9Z2V0T3V0cHV0VW5wYWNrZWQ1RENvb3JkcyhvLGUpe2xldCByPSIiLG49by5sZW5ndGgscz1udWxsO248MiYmKHM9W10pLHM9bmV3IEFycmF5KG4tMSksc1tuLTJdPW9bbi0xXTtmb3IobGV0IGw9bi0zO2w+PTA7LS1sKXNbbF09c1tsKzFdKm9bbCsxXTtsZXQgaT1bInIiLCJjIiwiZCIsImQyIiwiZDMiXSx1PXMubWFwKChsLGMpPT57bGV0IHA9YGludCAke2lbY119ID0gaW5kZXggLyAke2x9YCxkPWM9PT1zLmxlbmd0aC0xP2BpbnQgJHtpW2MrMV19ID0gaW5kZXggLSAke2lbY119ICogJHtsfWA6YGluZGV4IC09ICR7aVtjXX0gKiAke2x9YDtyZXR1cm5gJHtwfTsgJHtkfTtgfSkuam9pbigiIik7cmV0dXJuIHI9YAogICAgICBpdmVjNSBnZXRPdXRwdXRDb29yZHMoKSB7CiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2VbMF19LCAke2VbMV19KSk7CiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHtlWzBdfSArIHJlc1RleFJDLng7CiAgICAgICAgICAke3V9CiAgICAgICAgICByZXR1cm4gaXZlYzUociwgYywgZCwgZDIsIGQzKTsKICAgICAgICB9CiAgICAgIGAsbmV3IFIocil9Z2V0T3V0cHV0VW5wYWNrZWQ2RENvb3JkcyhvLGUpe2xldCByPSIiLG49by5sZW5ndGgscz1udWxsO248MiYmKHM9W10pLHM9bmV3IEFycmF5KG4tMSksc1tuLTJdPW9bbi0xXTtmb3IobGV0IGw9bi0zO2w+PTA7LS1sKXNbbF09c1tsKzFdKm9bbCsxXTtsZXQgaT1bInIiLCJjIiwiZCIsImQyIiwiZDMiLCJkNCJdLHU9cy5tYXAoKGwsYyk9PntsZXQgcD1gaW50ICR7aVtjXX0gPSBpbmRleCAvICR7bH1gLGQ9Yz09PXMubGVuZ3RoLTE/YGludCAke2lbYysxXX0gPSBpbmRleCAtICR7aVtjXX0gKiAke2x9YDpgaW5kZXggLT0gJHtpW2NdfSAqICR7bH1gO3JldHVybmAke3B9OyAke2R9O2B9KS5qb2luKCIiKTtyZXR1cm4gcj1gCiAgICAgaXZlYzYgZ2V0T3V0cHV0Q29vcmRzKCkgewogICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7ZVswXX0sICR7ZVsxXX0pKTsKICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7ZVswXX0gKyByZXNUZXhSQy54OwogICAgICAgICAke3V9CiAgICAgICAgIHJldHVybiBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTsKICAgICAgIH0KICAgICBgLG5ldyBSKHIpfWdldENvbW1vblV0aWxGdW5jcygpe2xldCBvPXt9LGU9InV2RnJvbUZsYXQiO29bZV09bmV3IFIoYAogICAgdmVjMiB1dkZyb21GbGF0KGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7CiAgICAgIGludCB0ZXhDID0gaW5kZXggLyB0ZXhOdW1SOwogICAgICBpbnQgdGV4UiA9IGluZGV4IC0gdGV4QyAqIHRleE51bVI7CiAgICAgIC8vIFRPRE86IHN3YXAgdGV4UiwgdGV4QyBvcmRlciBpbiBmb2xsb3dpbmcgZnVuY3Rpb24gc28gcm93IGlzIGNvcnJlc3BvbmRpbmcgdG8gdSBhbmQgY29sdW1uIGlzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgLy8gICAgICAgdi4KICAgICAgcmV0dXJuICh2ZWMyKHRleFIsIHRleEMpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtUiwgdGV4TnVtQyk7CiAgICB9CiAgICBgKSxlPSJwYWNrZWRVVmZyb20xRCIsb1tlXT1uZXcgUihgCiAgICAgIHZlYzIgcGFja2VkVVZmcm9tMUQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHsKICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IGluZGV4IC8gMjsKICAgICAgICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DOwogICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DOwogICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpOwogICAgICB9CiAgICAgIGApLGU9InBhY2tlZFVWZnJvbTJEIixvW2VdPW5ldyBSKGAKICAgICAgdmVjMiBwYWNrZWRVVmZyb20yRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCByb3csIGludCBjb2wpIHsKICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IChyb3cgLyAyKSAqIHRleGVsc0luTG9naWNhbFJvdyArIChjb2wgLyAyKTsKICAgICAgICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DOwogICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DOwogICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpOwogICAgICB9CiAgICAgIGApLGU9InBhY2tlZFVWZnJvbTNEIixvW2VdPW5ldyBSKGAKICAgICAgdmVjMiBwYWNrZWRVVmZyb20zRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsCiAgICAgICAgICBpbnQgdGV4ZWxzSW5CYXRjaCwgaW50IHRleGVsc0luTG9naWNhbFJvdywgaW50IGIsCiAgICAgICAgICBpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgaW50IGluZGV4ID0gYiAqIHRleGVsc0luQmF0Y2ggKyAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7CiAgICAgICAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7CiAgICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DOwogICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpOwogICAgICB9CiAgICAgIGApLGU9InNhbXBsZVRleHR1cmUiO2xldCByPUgodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gb1tlXT1uZXcgUihgCiAgICAgICAgZmxvYXQgc2FtcGxlVGV4dHVyZShzYW1wbGVyMkQgdGV4dHVyZVNhbXBsZXIsIHZlYzIgdXYpIHsKICAgICAgICAgICAgcmV0dXJuICR7ci50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjsKICAgICAgICB9YCksb31nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7bGV0IG89e30sZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dDtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgocixuKT0+e2xldCBzPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLGk9WW4ocik7cy5pc1BhY2tlZD9vW2ldPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChpLHIscyk6b1tpXT10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChpLHIscyk7bGV0IHU9R3Uocik7cy51bnBhY2tlZFNoYXBlLmxlbmd0aDw9ZS51bnBhY2tlZFNoYXBlLmxlbmd0aCYmKHMuaXNQYWNrZWQ/b1t1XT10aGlzLmdldFBhY2tlZFNhbXBsZXJBdE91dHB1dENvb3Jkcyh1LHMsZSxyKTpvW3VdPXRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHModSxzLGUscikpfSksb31nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMobyxlLHIsbil7bGV0IHM9ZS51bnBhY2tlZFNoYXBlLGk9ci51bnBhY2tlZFNoYXBlLGw9WW4obiksYz1zLmxlbmd0aCxwPWkubGVuZ3RoLGQ9WmUuZ2V0QnJvYWRjYXN0RGltcyhzLGkpLFQ9UWUocCksdz1wLWMsdixTPUR0KCk7Yz09PTA/dj0iIjpwPDImJmQubGVuZ3RoPj0xP3Y9ImNvb3JkcyA9IDA7Ijp2PWQubWFwKEhlPT5gY29vcmRzLiR7U1tIZSt3XX0gPSAwO2ApLmpvaW4oYApgKTtsZXQgQT0iIjtwPDImJmM+MD9BPSJjb29yZHMiOkE9cy5tYXAoKEhlLExlKT0+YGNvb3Jkcy4ke1NbTGUrd119YCkuam9pbigiLCAiKTtsZXQgQz0icmV0dXJuIG91dHB1dFZhbHVlOyIsSj1VLnNpemUocyk9PT0xLGllPVUuc2l6ZShpKT09PTE7aWYoYz09PTEmJiFKJiYhaWUpQz1gCiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTsKICAgICAgYDtlbHNlIGlmKEomJiFpZSlwPT09MT9DPWAKICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLngsIDAuLCAwLik7CiAgICAgICAgYDpDPWAKICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpOwogICAgICAgIGA7ZWxzZSBpZihkLmxlbmd0aCl7bGV0IEhlPWMtMixMZT1jLTE7ZC5pbmRleE9mKEhlKT4tMSYmZC5pbmRleE9mKExlKT4tMT9DPSJyZXR1cm4gdmVjNChvdXRwdXRWYWx1ZS54KTsiOmQuaW5kZXhPZihIZSk+LTE/Qz0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSwgb3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSk7IjpkLmluZGV4T2YoTGUpPi0xJiYoQz0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnp6KTsiKX1sZXQgRz1gCiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHtTW3AtMV19OwogICAgICAgIGNvb3Jkcy4ke1NbcC0xXX0gPSBjb29yZHMuJHtTW3AtMl19OwogICAgICAgIGNvb3Jkcy4ke1NbcC0yXX0gPSBsYXN0RGltOwogICAgICBgLFRlPWAKICAgICAgdmVjNCAke299KCkgewogICAgICAgICR7VH0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICAgICAgJHtHfQogICAgICAgICR7dn0KICAgICAgICB2ZWM0IG91dHB1dFZhbHVlID0gJHtsfSgke0F9KTsKICAgICAgICAke0N9CiAgICAgIH0KICAgIGA7cmV0dXJuIG5ldyBSKFRlLFsiY29vcmRpbmF0ZXMuZ2V0T3V0cHV0Q29vcmRzIl0pfWdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKG8sZSxyLG4pe2xldCBzPVtyLndpZHRoLHIuaGVpZ2h0XSxpPVtlLndpZHRoLGUuaGVpZ2h0XSx1PWUudW5wYWNrZWRTaGFwZS5sZW5ndGgsbD1yLnVucGFja2VkU2hhcGUubGVuZ3RoLGM9ZS51bnBhY2tlZFNoYXBlLHA9ci51bnBhY2tlZFNoYXBlLGQ9WW4obik7aWYodT09PWwmJmhyLmFycmF5c0VxdWFsKGkscykpe2xldCBKPWAKICAgICAgICAgIGZsb2F0ICR7b30oKSB7CiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7bn0sIFRleENvb3Jkcyk7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIoSixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9bGV0IFQ9UWUobCksdz1aZS5nZXRCcm9hZGNhc3REaW1zKGMscCksdj1sLXUsUyxBPUR0KCk7dT09PTA/Uz0iIjpsPDImJncubGVuZ3RoPj0xP1M9ImNvb3JkcyA9IDA7IjpTPXcubWFwKEo9PmBjb29yZHMuJHtBW0ordl19ID0gMDtgKS5qb2luKGAKYCk7bGV0IEM9IiI7bDwyJiZ1PjA/Qz0iY29vcmRzIjpDPWUudW5wYWNrZWRTaGFwZS5tYXAoKEosaik9PmBjb29yZHMuJHtBW2ordl19YCkuam9pbigiLCAiKTtsZXQgRj1gCiAgICAgICAgZmxvYXQgJHtvfSgpIHsKICAgICAgICAgICR7VH0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7CiAgICAgICAgICAke1N9CiAgICAgICAgICByZXR1cm4gJHtkfSgke0N9KTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyBSKEYsWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChvLGUscil7c3dpdGNoKHIudW5wYWNrZWRTaGFwZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKG8sZSk7Y2FzZSAxOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIxRChvLGUscik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIyRChvLGUscik7Y2FzZSAzOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIzRChvLGUscik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyTkQobyxlLHIpfX1nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQobyxlLHIpe2xldCBuPXIudW5wYWNrZWRTaGFwZTtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJTY2FsYXIobyxlLHIpO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIxRChvLGUscik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjJEKG8sZSxyKTtjYXNlIDM6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyM0QobyxlLHIpO2Nhc2UgNDpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI0RChvLGUscik7Y2FzZSA1OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjVEKG8sZSxyKTtjYXNlIDY6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNkQobyxlLHIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkaW1lbnNpb24gJHtuLmxlbmd0aH0tRGApfX1nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKG8sZSl7bGV0IHI9SCh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLG49YAogICAgICAgICAgdmVjNCAke299KCkgewogICAgICAgICAgICByZXR1cm4gJHtyLnRleHR1cmUyRH0oJHtlfSwgaGFsZkNSKTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgUihuKX1nZXRQYWNrZWRTYW1wbGVyMUQobyxlLHIpe2xldCBuPVtyLndpZHRoLHIuaGVpZ2h0XSxzPVtuWzFdLG5bMF1dLGk9SCh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGw9YHZlYzQgJHtvfShpbnQgaW5kZXgpIHsKICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKAogICAgICAke3NbMF19LCAke3NbMV19LCBpbmRleCk7CiAgICAgIHJldHVybiAke2kudGV4dHVyZTJEfSgke2V9LCB1dik7CiAgICB9YDtyZXR1cm4gbmV3IFIobCxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChvLGUscil7bGV0IG49ci51bnBhY2tlZFNoYXBlLHM9W3Iud2lkdGgsci5oZWlnaHRdLGk9SCh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLHU9c1swXSxsPXNbMV07aWYocyE9bnVsbCYmaHIuYXJyYXlzRXF1YWwobixzKSl7bGV0IHc9YHZlYzQgJHtvfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7bH0uMCwgJHt1fS4wKTsKICAgICAgICByZXR1cm4gJHtpLnRleHR1cmUyRH0oJHtlfSwgdXYpOwogICAgICB9YDtyZXR1cm4gbmV3IFIodyl9bGV0IGM9cyxwPU1hdGguY2VpbChuWzFdLzIpLFQ9YHZlYzQgJHtvfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCgke2NbMV19LCAke2NbMF19LCAke3B9LCByb3csIGNvbCk7CiAgICAgIHJldHVybiAke2kudGV4dHVyZTJEfSgke2V9LCB1dik7CiAgICB9YDtyZXR1cm4gbmV3IFIoVCxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTJEIl0pfWdldFBhY2tlZFNhbXBsZXIzRChvLGUscil7bGV0IG49ci51bnBhY2tlZFNoYXBlLHM9W3Iud2lkdGgsci5oZWlnaHRdLGk9W3NbMF0sc1sxXV0sdT1IKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbik7aWYoblswXT09PTEpe2xldCB2PW4uc2xpY2UoMSksUz1bMSwyXSxBPSRyKG4sdiksQz1bImIiLCJyb3ciLCJjb2wiXSxGPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocikpO0YudW5wYWNrZWRTaGFwZT1BO2xldCBKPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChvLGUsRiksaWU9YCR7Si5yb3V0aW5lQm9keX0KICAgICAgdmVjNCAke299KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgcmV0dXJuICR7b30oJHtrcihDLFMpfSk7CiAgICAgIH0gYDtyZXR1cm4gbmV3IFIoaWUsSi5kZXBlbmRlbmNpZXMpfWxldCBsPWlbMF0sYz1pWzFdLHA9TWF0aC5jZWlsKG5bMl0vMiksZD1wKk1hdGguY2VpbChuWzFdLzIpLHc9YHZlYzQgJHtvfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkgewogICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tM0QoCiAgICAgICAgJHtjfSwgJHtsfSwgJHtkfSwgJHtwfSwgYiwgcm93LCBjb2wpOwogICAgICByZXR1cm4gJHt1LnRleHR1cmUyRH0oJHtlfSwgdXYpO31gO3JldHVybiBuZXcgUih3LFsiY29vcmRpbmF0ZXMucGFja2VkVVZmcm9tM0QiXSl9Z2V0UGFja2VkU2FtcGxlck5EKG8sZSxyKXtsZXQgbj1yLnVucGFja2VkU2hhcGUscz1uLmxlbmd0aCxpPVtyLndpZHRoLHIuaGVpZ2h0XSx1PUgodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKSxsPVtpWzBdLGlbMV1dLGM9bFsxXSxwPWxbMF0sZD1NYXRoLmNlaWwobltzLTFdLzIpLFQ9ZCpNYXRoLmNlaWwobltzLTJdLzIpLHc9ImludCBiLCBpbnQgcm93LCBpbnQgY29sIix2PWBiICogJHtUfSArIChyb3cgLyAyKSAqICR7ZH0gKyAoY29sIC8gMilgO2ZvcihsZXQgQz0yO0M8cy0xO0MrKyl3PWBpbnQgYiR7Q30sIGArdyxUKj1uW3MtQy0xXSx2PWBiJHtDfSAqICR7VH0gKyBgK3Y7bGV0IEE9YHZlYzQgJHtvfSgke3d9KSB7CiAgICAgIGludCBpbmRleCA9ICR7dn07CiAgICAgIGludCB0ZXhSID0gaW5kZXggLyAke3B9OwogICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqICR7cH07CiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7cH0sICR7Y30pOwogICAgICByZXR1cm4gJHt1LnRleHR1cmUyRH0oJHtlfSwgdXYpOwogICAgfWA7cmV0dXJuIG5ldyBSKEEpfWdldFVucGFja2VkU2FtcGxlclNjYWxhcihvLGUscil7bGV0W24sc109W3Iud2lkdGgsci5oZWlnaHRdO2lmKG49PT0xJiZzPT09MSl7bGV0IHU9YAogICAgICAgICAgZmxvYXQgJHtvfSgpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtlfSwgaGFsZkNSKTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgUih1LFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1sZXQgaT1gCiAgICAgICAgZmxvYXQgJHtvfSgpIHsKICAgICAgICAgIGludCBvZmZzZXRfJHtlfSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtufSwgJHtzfSk7CiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke259LCAke3N9LCBvZmZzZXRfJHtlfSk7CiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgUihpLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXIxRChvLGUscil7bGV0IG49ci53aWR0aCxzPXIuaGVpZ2h0O2lmKHM9PT0xJiZuPT09MSl7bGV0IHU9YAogICAgICAgIGZsb2F0ICR7b30oaW50IGluZGV4KSB7CiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCBoYWxmQ1IpOwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IFIodSxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYocz09PTEpe2xldCB1PWAKICAgICAgICAgIGZsb2F0ICR7b30oaW50IGluZGV4KSB7CiAgICAgICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCkgKyAwLjUpIC8gJHtufS4wLCAwLjUpOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIodSxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYobj09PTEpe2xldCB1PWAKICAgICAgICAgIGZsb2F0ICR7b30oaW50IGluZGV4KSB7CiAgICAgICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4KSArIDAuNSkgLyAke3N9LjApOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIodSxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9bGV0IGk9YAogICAgICAgIGZsb2F0ICR7b30oaW50IGluZGV4KSB7CiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke259LCAke3N9LCBpbmRleCk7CiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgUihpLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMkQobyxlLHIpe2xldCBuPXIudW5wYWNrZWRTaGFwZSxzPVtyLmhlaWdodCxyLndpZHRoXTtpZihzIT1udWxsJiZoci5hcnJheXNFcXVhbChuLHMpKXtsZXQgVD1zWzFdLHc9c1swXSx2PWAKICAgICAgICAgIGZsb2F0ICR7b30oaW50IHJvdywgaW50IGNvbCkgewogICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIocm93LCBjb2wpICsgaGFsZkNSKSAvIHZlYzIoJHtUfS4wLCAke3d9LjApOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIodixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9bGV0e25ld1NoYXBlOmksa2VwdERpbXM6dX09TXIobiksbD1pO2lmKGwubGVuZ3RoPG4ubGVuZ3RoKXtsZXQgVD0kcihuLGwpLHc9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyKSk7dy51bnBhY2tlZFNoYXBlPVQ7bGV0IHY9WyJjb2wiLCJyb3ciXSxTPWAKICAgICAgICAgICR7dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQobyxlLHcpLnJvdXRpbmVCb2R5fQogICAgICAgICAgZmxvYXQgJHtvfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgICAgIHJldHVybiAke299KCR7a3Iodix1KX0pOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyBSKFMsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWxldCBjPXNbMV0scD1zWzBdO2lmKHA9PT0xKXtsZXQgVD1gCiAgICAgICAgICBmbG9hdCAke299KGludCByb3csIGludCBjb2wpIHsKICAgICAgICAgICAgaW50IG9mZnNldF8ke2V9ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2N9LCAke3B9KTsKICAgICAgICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgb2Zmc2V0XyR7ZX0pLCB2ZWMzKCR7blsxXX0sIDEsIDEpKTsKICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtjfS4wKTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtlfSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyBSKFQsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoYz09PTEpe2xldCBUPWAKICAgICAgICAgIGZsb2F0ICR7b30oaW50IHJvdywgaW50IGNvbCkgewogICAgICAgICAgICBpbnQgb2Zmc2V0XyR7ZX0gPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pOwogICAgICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCBvZmZzZXRfJHtlfSksIHZlYzMoJHtuWzFdfSwgMSwgMSkpOwogICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gJHtwfS4wLCAwLjUpOwogICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2V9LCB1dik7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIoVCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1sZXQgZD1gCiAgICAgICAgZmxvYXQgJHtvfShpbnQgcm93LCBpbnQgY29sKSB7CiAgICAgICAgICBpbnQgaW5kZXggPSBjb2wgKiAke25bMV19ICsgcm93OwogICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtjfSwgJHtwfSwgaW5kZXgpOwogICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtlfSwgdXYpOwogICAgICAgIH0KICAgICAgYDtyZXR1cm4gbmV3IFIoZCxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyM0QobyxlLHIpe2xldCBuPXIudW5wYWNrZWRTaGFwZSxzPW5bMV0qblsyXSxpPW5bMl0se25ld1NoYXBlOnUsa2VwdERpbXM6bH09TXIobiksYz11O2lmKGMubGVuZ3RoPG4ubGVuZ3RoKXtsZXQgdz0kcihuLGMpLHY9WyJiYXRjaCIsImNvbCIsInJvdyJdLFM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyKSk7Uy51bnBhY2tlZFNoYXBlPXc7bGV0IEE9dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQobyxlLFMpLEM9bC5yZXZlcnNlKCksRj1gCiAgICAgICAgICAke0Eucm91dGluZUJvZHl9CiAgICAgICAgICBmbG9hdCAke299KGludCBiYXRjaCwgaW50IHJvdywgaW50IGNvbCkgewogICAgICAgICAgICByZXR1cm4gJHtvfSgke2tyKHYsQyl9KTsKICAgICAgICAgIH0KICAgICAgICBgO3JldHVybiBuZXcgUihGLEEuZGVwZW5kZW5jaWVzKX1sZXQgcD1yLndpZHRoLGQ9ci5oZWlnaHQsVD1gCiAgICAgICAgICBmbG9hdCAke299KGludCBkZXB0aCwgaW50IHJvdywgaW50IGNvbCkgewogICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuCiAgICAgICAgICAgIGludCBpbmRleCA9IGRlcHRoICogJHtzfSArIGNvbCAqICR7aX0gKyByb3c7CiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7cH0sICR7ZH0sIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtlfSwgdXYpOwogICAgICAgICAgfQogICAgICBgO3JldHVybiBuZXcgUihULFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI0RChvLGUscil7bGV0IG49ci51bnBhY2tlZFNoYXBlLHM9blszXSxpPW5bMl0qcyx1PW5bMV0qaSxsPXIud2lkdGgsYz1yLmhlaWdodCxwPWAKICAgICAgICBmbG9hdCAke299KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikgewogICAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt1fSArIGNvbCAqICR7aX0gKwogICAgICAgICAgICAgIGRlcHRoMiAqICR7c30gKyBkZXB0aDsKICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bH0sICR7Y30sIGluZGV4KTsKICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7ZX0sIHV2KTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyBSKHAsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXI1RChvLGUscil7bGV0IG49ci51bnBhY2tlZFNoYXBlLHM9bls0XSxpPW5bM10qcyx1PW5bMl0qaSxsPW5bMV0qdSx7bmV3U2hhcGU6YyxrZXB0RGltczpwfT1NcihuKTtpZihjLmxlbmd0aDxuLmxlbmd0aCl7bGV0IHY9JHIobixjKSxTPVsicm93IiwiY29sIiwiZGVwdGgiLCJkZXB0aDIiLCJkZXB0aDMiXSxBPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocikpO0EudW5wYWNrZWRTaGFwZT12O2xldCBDPWAKICAgICAgICAgICR7dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQobyxlLEEpLnJvdXRpbmVCb2R5fQogICAgICAgICAgZmxvYXQgJHtvfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHsKICAgICAgICAgICAgcmV0dXJuICR7b30oJHtrcihTLHApfSk7CiAgICAgICAgICB9CiAgICAgICAgYDtyZXR1cm4gbmV3IFIoQyxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWxldCBkPXIud2lkdGgsVD1yLmhlaWdodCx3PWAKICAgICAgICBmbG9hdCAke299KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykgewogICAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtsfSArIGNvbCAqICR7dX0gKyBkZXB0aCAqICR7aX0gKwogICAgICAgICAgZGVwdGgzICogJHtzfSArIGRlcHRoMjsKICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7ZH0sICR7VH0sIGluZGV4KTsKICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7ZX0sIHV2KTsKICAgICAgICB9CiAgICAgIGA7cmV0dXJuIG5ldyBSKHcsWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI2RChvLGUscil7bGV0IG49ci51bnBhY2tlZFNoYXBlLHM9bls1XSxpPW5bNF0qcyx1PW5bM10qaSxsPW5bMl0qdSxjPW5bMV0qbCx7bmV3U2hhcGU6cCxrZXB0RGltczpkfT1NcihuKTtpZihwLmxlbmd0aDxuLmxlbmd0aCl7bGV0IFM9JHIobixwKSxBPVsicm93IiwiY29sIiwiZGVwdGgiLCJkZXB0aDIiLCJkZXB0aDMiLCJkZXB0aDQiXSxDPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocikpO0MudW5wYWNrZWRTaGFwZT1TO2xldCBGPWAKICAgICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChvLGUsQykucm91dGluZUJvZHl9CiAgICAgICAgICAgIGZsb2F0ICR7b30oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLAogICAgICAgICAgICAgIGludCBkZXB0aDIsIGludCBkZXB0aDMsIGludCBkZXB0aDQpIHsKICAgICAgICAgICAgICByZXR1cm4gJHtvfSgke2tyKEEsZCl9KTsKICAgICAgICAgICAgfQogICAgICAgICAgYDtyZXR1cm4gbmV3IFIoRixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWxldCBUPXIud2lkdGgsdz1yLmhlaWdodCx2PWAKICAgICAgICAgIGZsb2F0ICR7b30oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLAogICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7CiAgICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7Y30gKyBjb2wgKiAke2x9ICsgZGVwdGggKiAke3V9ICsKICAgICAgICAgICAgZGVwdGgyICogJHtpfSArIGRlcHRoMyAqICR7c30gKyBkZXB0aDQ7CiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7VH0sICR7d30sIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHtlfSwgdXYpOwogICAgICAgICAgfQogICAgICAgIGA7cmV0dXJuIG5ldyBSKHYsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLmNvb3Jkc1RvT2Zmc2V0Il0pfXRvVmVjKCl7bGV0IG89dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQsZT1vLnNoYXBlLmxlbmd0aCxyPW8uc3RyaWRlcyxuPW8ud2lkdGgscz1vLmhlaWdodCxpPVtdO2ZvcihsZXQgbD0wO2w8ZS0xOysrbClpLnB1c2goYAogICAgICAgIGNbJHtsfV0gPSBvZmZzZXQgLyAke3JbbF19O2ApLGkucHVzaChgCiAgICAgICAgb2Zmc2V0IC09IGNbJHtsfV0gKiAke3JbbF19O2ApO2kucHVzaChgCiAgICAgICAgY1ske2UtMX1dID0gb2Zmc2V0O2ApO2xldCB1PWAKICAgICAgdm9pZCB0b1ZlYyh2ZWMyIHRleENvb3Jkcywgb3V0IGludCBjWyR7ZX1dKSB7CiAgICAgICAgaW50IG9mZnNldCA9IGNvb3Jkc1RvT2Zmc2V0KHRleENvb3JkcywgJHtufSwgJHtzfSk7CiAgICAgICAgJHtpLmpvaW4oIiIpfQogICAgICB9CiAgICAgIHZvaWQgdG9WZWMoaW50IG9mZnNldCwgb3V0IGludCBjWyR7ZX1dKSB7CiAgICAgICAgJHtpLmpvaW4oIiIpfQogICAgICB9CiAgICBgO3JldHVybnt0b1ZlYzpuZXcgUih1LFsiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9fXZhbHVlRnJvbSgpe2xldCBvPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKChlLHIpPT57bGV0IG49dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbcl0saT0obi51bnBhY2tlZFNoYXBlLmxlbmd0aD4wP24udW5wYWNrZWRTaGFwZTpuLnNoYXBlKS5sZW5ndGgsdT1gXyR7ZX1gO29bdV09bmV3IFIodGhpcy5nZXRWYWx1ZUZyb21TaW5nbGUoZSxpLG4ud2lkdGgsbi5oZWlnaHQsITEpLFtgc2hhcGVVdGlscy5pbmRpY2VzVG9PZmZzZXQke3V9YCwiY29vcmRpbmF0ZXMub2Zmc2V0VG9Db29yZHMiLCJmcmFnY29sb3IuZ2V0Q29sb3JBc0Zsb2F0Il0pLHU9dSsiX1QiLG9bdV09bmV3IFIodGhpcy5nZXRWYWx1ZUZyb21TaW5nbGUoZSxpLG4ud2lkdGgsbi5oZWlnaHQsITApLFtgc2hhcGVVdGlscy5pbmRpY2VzVG9PZmZzZXQke3V9YCwiY29vcmRpbmF0ZXMub2Zmc2V0VG9Db29yZHMiLCJmcmFnY29sb3IuZ2V0Q29sb3JBc0Zsb2F0Il0pfSksb31nZXRWYWx1ZUZyb21TaW5nbGUobyxlLHIsbixzKXtsZXQgaT1gXyR7b31gO3MmJihpPWkrIl9UIik7bGV0IHU9SCh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pO3JldHVybmAKICAgICAgICBmbG9hdCAke2l9KGludCBtWyR7ZX1dKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0JHtpfShtKTsKICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke259KTsKICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7dS50ZXh0dXJlMkR9KCR7b30sIGNvb3JkcykpOwogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShvLGUscixuLHMpe2xldCBpPWBfJHtvfV9QYWNrYDtzJiYoaT1pKyJfVCIpO2xldCB1PUgodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm5gCiAgICAgICAgdmVjNCAke2l9KGludCBtWyR7ZX1dKSB7CiAgICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0XyR7b30obSk7CiAgICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtyfSwgJHtufSk7CiAgICAgICAgICByZXR1cm4gJHt1LnRleHR1cmUyRH0oJHtvfSwgY29vcmRzKTsKICAgICAgICB9CiAgICAgICAgYH19fSk7dmFyIGZvLHRwPUwoKCk9PnsidXNlIHN0cmljdCI7V3QoKTtmbz1jbGFzcyBhIGV4dGVuZHMgZHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuey4uLnRoaXMuZW5jb2RlRmxvYXQzMigpLC4uLnRoaXMuZGVjb2RlRmxvYXQzMigpfX1nZXRDdXN0b21UeXBlcygpe3JldHVybnt9fWVuY29kZUZsb2F0MzIoKXtyZXR1cm57ZW5jb2RlOm5ldyBSKGBoaWdocCB2ZWM0IGVuY29kZShoaWdocCBmbG9hdCBmKSB7CiAgICAgICAgcmV0dXJuIHZlYzQoZiwgMC4wLCAwLjAsIDAuMCk7CiAgICAgIH0KICAgICAgICBgKX19ZGVjb2RlRmxvYXQzMigpe3JldHVybntkZWNvZGU6bmV3IFIoYGhpZ2hwIGZsb2F0IGRlY29kZShoaWdocCB2ZWM0IHJnYmEpIHsKICAgICAgICByZXR1cm4gcmdiYS5yOwogICAgICB9CiAgICAgICAgYCl9fWVuY29kZVVpbnQ4KCl7bGV0IHQ9YS5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJue2VuY29kZTpuZXcgUihgCiAgICAgIGhpZ2hwIHZlYzQgZW5jb2RlKGhpZ2hwIGZsb2F0IGYpIHsKICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpOwogICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSBzdGVwKDAuMCwtZik7CiAgICAgICAgaGlnaHAgZmxvYXQgRXhwb25lbnQgPSBmbG9vcihsb2cyKEYpKTsKICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7CiAgICAgICAgRXhwb25lbnQgPSBmbG9vcihsb2cyKEYpICsgMTI3LjApICsgZmxvb3IobG9nMihNYW50aXNzYSkpOwogICAgICAgIGhpZ2hwIHZlYzQgcmdiYTsKICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpOwogICAgICAgIHJnYmFbMV0gPSAxMjguMCAqIG1vZChFeHBvbmVudCwyLjApICsgbW9kKGZsb29yKE1hbnRpc3NhKjEyOC4wKSwxMjguMCk7CiAgICAgICAgcmdiYVsyXSA9IGZsb29yKG1vZChmbG9vcihNYW50aXNzYSpleHAyKDIzLjAgLTguMCkpLGV4cDIoOC4wKSkpOwogICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpOwogICAgICAgICR7dH0KICAgICAgICByZ2JhID0gcmdiYSAvIDI1NS4wOyAvLyB2YWx1ZXMgbmVlZCB0byBiZSBub3JtYWxpemVkIHRvIFswLDFdCiAgICAgICAgcmV0dXJuIHJnYmE7CiAgICB9CiAgICAgICAgYCl9fWRlY29kZVVpbnQ4KCl7bGV0IHQ9YS5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJue2RlY29kZTpuZXcgUihgCiAgICAgICAgaGlnaHAgZmxvYXQgZGVjb2RlKGhpZ2hwIHZlYzQgcmdiYSkgewogICAgICAgICAgcmdiYSA9IHJnYmEgKiAyNTUuMDsgLy8gdmFsdWVzIG5lZWQgdG8gYmUgZGUtbm9ybWFsaXplZCBmcm9tIFswLDFdIHRvIFswLDI1NV0KICAgICAgICAgICR7dH0KICAgICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSAxLjAgLSBzdGVwKDEyOC4wLHJnYmFbMF0pKjIuMDsKICAgICAgICAgIGhpZ2hwIGZsb2F0IEV4cG9uZW50ID0gMi4wICogbW9kKHJnYmFbMF0sMTI4LjApICsgc3RlcCgxMjguMCxyZ2JhWzFdKSAtIDEyNy4wOwogICAgICAgICAgaGlnaHAgZmxvYXQgTWFudGlzc2EgPSBtb2QocmdiYVsxXSwxMjguMCkqNjU1MzYuMCArIHJnYmFbMl0qMjU2LjAgK3JnYmFbM10gKyBmbG9hdCgweDgwMDAwMCk7CiAgICAgICAgICBoaWdocCBmbG9hdCBSZXN1bHQgPSAgU2lnbiAqIGV4cDIoRXhwb25lbnQpICogKE1hbnRpc3NhICogZXhwMigtMjMuMCApKTsKICAgICAgICAgIHJldHVybiBSZXN1bHQ7CiAgICAgIH0KICAgICAgICBgKX19c3RhdGljIGlzTGl0dGxlRW5kaWFuKCl7bGV0IHQ9bmV3IEFycmF5QnVmZmVyKDQpLG89bmV3IFVpbnQzMkFycmF5KHQpLGU9bmV3IFVpbnQ4QXJyYXkodCk7aWYob1swXT0zNzM1OTI4NTU5LGVbMF09PT0yMzkpcmV0dXJuITA7aWYoZVswXT09PTIyMilyZXR1cm4hMTt0aHJvdyBuZXcgRXJyb3IoInVua25vd24gZW5kaWFubmVzcyIpfX19KTt2YXIgY28scnA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtXdCgpO3dlKCk7Y289Y2xhc3MgZXh0ZW5kcyBkdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1nZXRGdW5jdGlvbnMoKXtyZXR1cm57Li4udGhpcy5zZXRGcmFnQ29sb3IoKSwuLi50aGlzLmdldENvbG9yQXNGbG9hdCgpfX1nZXRDdXN0b21UeXBlcygpe3JldHVybnt9fXNldEZyYWdDb2xvcigpe2xldCB0PUgodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm57c2V0RnJhZ0NvbG9yOm5ldyBSKGAKICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkgewogICAgICAgICAgICAke3Qub3V0cHV0fSA9IGVuY29kZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybntnZXRDb2xvckFzRmxvYXQ6bmV3IFIoYAogICAgICAgIGZsb2F0IGdldENvbG9yQXNGbG9hdCh2ZWM0IGNvbG9yKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpOwogICAgICAgIH0KICAgICAgICBgLFsiZW5jb2RpbmcuZGVjb2RlIl0pfX19fSk7dmFyIHBvLG5wPUwoKCk9PnsidXNlIHN0cmljdCI7V3QoKTtwbz1jbGFzcyBhIGV4dGVuZHMgZHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuey4uLnRoaXMuYmNhc3RJbmRleCgpLC4uLnRoaXMuYmNhc3RNYXRtdWxJbmRleCgpLC4uLnRoaXMub2Zmc2V0VG9JbmRpY2VzKCksLi4udGhpcy5pbmRpY2VzVG9PZmZzZXQoKSwuLi50aGlzLmluY3JlbWVudEluZGljZXMoKX19Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1iY2FzdEluZGV4KCl7bGV0IHQ9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLG89e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKGUscik9PntsZXQgbj10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tyXS51bnBhY2tlZFNoYXBlO2lmKG4ubGVuZ3RoPD10KXtsZXQgcz1uLmxlbmd0aCxpPXQtcyx1PWBiY2FzdEluZGljZXNfJHtlfWAsbD0iIjtmb3IobGV0IHA9MDtwPHM7KytwKWwrPWAKICAgICAgICAgIHJlYWxJbmRpY2VzWyR7cH1dID0gaW50KCBtb2QoZmxvYXQoYmNhc3RlZEluZGljZXNbJHtpK3B9XSksICR7bltwXX0uMCkgKTsKICAgICAgICAgIGA7bGV0IGM9YAogICAgICAgIHZvaWQgJHt1fSAoaW50IGJjYXN0ZWRJbmRpY2VzWyR7dH1dLCBvdXQgaW50IHJlYWxJbmRpY2VzWyR7c31dKSB7CiAgICAgICAgICAke2x9CiAgICAgICAgfQogICAgICAgIGA7b1t1XT1uZXcgUihjKX19KSxvfWJjYXN0TWF0bXVsSW5kZXgoKXtsZXQgdD10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsbz17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoZSxyKT0+e2xldCBuPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW3JdLnNoYXBlO2lmKCEobi5sZW5ndGg8Mnx8bi5sZW5ndGg+dCkpe2xldCBzPW4ubGVuZ3RoLGk9dC1zLHU9YGJjYXN0TWF0bXVsSW5kaWNlc18ke2V9YCxsPSIiO2ZvcihsZXQgcD0wO3A8cy0yOysrcClsKz1gCiAgICAgICAgICByZWFsSW5kaWNlc1ske3B9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7aStwfV0pLCAke25bcF19LjApICk7CiAgICAgICAgICBgO2xldCBjPWAKICAgICAgICB2b2lkICR7dX0oaW50IGJjYXN0ZWRJbmRpY2VzWyR7dH1dLCBvdXQgaW50IHJlYWxJbmRpY2VzWyR7c31dKSB7CiAgICAgICAgICAke2x9CiAgICAgICAgICByZWFsSW5kaWNlc1ske3MtMX1dID0gYmNhc3RlZEluZGljZXNbJHt0LTF9XTsKICAgICAgICAgIHJlYWxJbmRpY2VzWyR7cy0yfV0gPSBiY2FzdGVkSW5kaWNlc1ske3QtMn1dOwogICAgICAgIH0KICAgICAgICBgO29bdV09bmV3IFIoYyl9fSksb31pbmRpY2VzVG9PZmZzZXQoKXtsZXQgdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgobyxlKT0+e2xldCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW2VdLnNoYXBlLG49dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbZV0uc3RyaWRlcyxzPXIubGVuZ3RoLGk9YGluZGljZXNUb09mZnNldF8ke299YDt0W2ldPW5ldyBSKGEuaW5kZXhUb09mZnNldFNpbmdsZShpLHMsbikpLGk9YGluZGljZXNUb09mZnNldF8ke299X1RgLHRbaV09bmV3IFIoYS5pbmRleFRvT2Zmc2V0U2luZ2xlKGkscyxuLnNsaWNlKCkucmV2ZXJzZSgpKSl9KSx0fXN0YXRpYyBpbmRleFRvT2Zmc2V0U2luZ2xlKHQsbyxlKXtsZXQgcj0iIjtmb3IobGV0IG49by0xO24+PTA7LS1uKXIrPWAKICAgICAgICBvZmZzZXQgKz0gaW5kaWNlc1ske259XSAqICR7ZVtuXX07CiAgICAgICAgYDtyZXR1cm5gCiAgICAgIGludCAke3R9KGludCBpbmRpY2VzWyR7b31dKSB7CiAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICAgJHtyfQogICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgIH0KICAgICAgYH1vZmZzZXRUb0luZGljZXMoKXtsZXQgdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgobyxlKT0+e2xldCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW2VdLnNoYXBlLG49dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbZV0uc3RyaWRlcyxzPXIubGVuZ3RoLGk9YG9mZnNldFRvSW5kaWNlc18ke299YDt0W2ldPW5ldyBSKGEub2Zmc2V0VG9JbmRpY2VzU2luZ2xlKGkscyxuKSksaT1gb2Zmc2V0VG9JbmRpY2VzXyR7b31fVGAsdFtpXT1uZXcgUihhLm9mZnNldFRvSW5kaWNlc1NpbmdsZShpLHMsbi5zbGljZSgpLnJldmVyc2UoKSkpfSksdH1zdGF0aWMgb2Zmc2V0VG9JbmRpY2VzU2luZ2xlKHQsbyxlKXtsZXQgcj1bXTtmb3IobGV0IG49MDtuPG8tMTsrK24pci5wdXNoKGAKICAgICAgaW5kaWNlc1ske259XSA9IG9mZnNldCAvICR7ZVtuXX07YCksci5wdXNoKGAKICAgICAgICBvZmZzZXQgLT0gaW5kaWNlc1ske259XSAqICR7ZVtuXX07YCk7cmV0dXJuIHIucHVzaChgCiAgICAgIGluZGljZXNbJHtvLTF9XSA9IG9mZnNldDtgKSxgCiAgICAgIHZvaWQgJHt0fShpbnQgb2Zmc2V0LCBvdXQgaW50IGluZGljZXNbJHtvfV0pIHsKICAgICAgICAke3Iuam9pbigiIil9CiAgICAgIH0KICAgICAgYH1pbmNyZW1lbnRJbmRpY2VzKCl7bGV0IHQ9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKG8sZSk9PntsZXQgcj10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tlXS5zaGFwZSxuPXIubGVuZ3RoLHM9YGluY3JlbWVudEluZGljZXNfJHtvfWAsaT0iIjtmb3IobGV0IGw9MDtsPG47KytsKWkrPWAKICAgICAgICBzaGFwZVske2x9XSA9ICR7cltsXX07YDtsZXQgdT1gCiAgICAgICAgdm9pZCAke3N9KGludCBheGlzLCBvdXQgaW50IGluZGljZXNbJHtufV0pIHsKICAgICAgICAgIGludCBzaGFwZVske259XTsKICAgICAgICAgICR7aX07CiAgICAgICAgICBmb3IoaW50IGkgPSAke259IC0xIDsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgaWYoaSA+IGF4aXMpIGNvbnRpbnVlOwogICAgICAgICAgICBpbmRpY2VzW2ldICs9IDE7CiAgICAgICAgICAgIGlmKGluZGljZXNbaV0gPCBzaGFwZVtpXSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZGljZXNbaV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBgO3Rbc109bmV3IFIodSl9KSx0fX19KTt2YXIgaG8sb3A9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtXdCgpO2hvPWNsYXNzIGV4dGVuZHMgZHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm57fX1nZXRGdW5jdGlvbnMoKXtyZXR1cm57Li4udGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSwuLi50aGlzLmNvcHlWZWMoKSwuLi50aGlzLnNldFZlY0l0ZW0oKSwuLi50aGlzLmdldFZlY0l0ZW0oKX19YmluYXJ5VmVjRnVuY3Rpb25zKCl7bGV0IG89dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLGU9e2FkZDoiKz0iLHN1YjoiLT0iLG11bDoiKj0iLGRpdjoiLz0ifSxyPXt9O2ZvcihsZXQgbiBpbiBlKXtsZXQgcz1gJHtufVZlY2AsaT0iIjtmb3IobGV0IGw9MDtsPG87KytsKWkrPWAKICAgICAgICAgIGRlc3RbJHtsfV0gJHtlW25dfSBzcmNbJHtsfV07CiAgICAgICAgICBgO2xldCB1PWAKICAgICAgICB2b2lkICR7c30oaW50IHNyY1ske299XSwgb3V0IGludCBkZXN0WyR7b31dKSB7CiAgICAgICAgICAke2l9CiAgICAgICAgfQogICAgICAgIGA7cltzXT1uZXcgUih1KX1yZXR1cm4gcn1jb3B5VmVjKCl7bGV0IG89dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLGU9IiI7Zm9yKGxldCBuPTA7bjxvOysrbillKz1gCiAgICAgICAgZGVzdFske259XSA9IHNyY1ske259XTsKICAgICAgICBgO2xldCByPWAKICAgICAgdm9pZCBjb3B5VmVjKGludCBzcmNbJHtvfV0sIG91dCBpbnQgZGVzdFske299XSkgewogICAgICAgICR7ZX0KICAgICAgfQogICAgICBgO3JldHVybntjb3B5VmVjOm5ldyBSKHIpfX1zZXRWZWNJdGVtKCl7bGV0IG89dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLGU9YAogICAgICAgIGlmKGluZGV4IDwgMCkKICAgICAgICAgICAgaW5kZXggPSR7b30gKyBpbmRleDsKICAgICAgICBpZiAoaW5kZXggPT0gMCkKICAgICAgICAgICAgbVswXSA9IHZhbHVlOwogICAgICAgIGA7Zm9yKGxldCBuPTE7bjxvLTE7KytuKWUrPWAKICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke259KQogICAgICAgICAgICBtWyR7bn1dID0gdmFsdWU7CiAgICAgICAgICAgIGA7ZSs9YAogICAgICAgIGVsc2UKICAgICAgICAgICAgbVske28tMX1dID0gdmFsdWU7CiAgICAgICAgYDtsZXQgcj1gCiAgICAgIHZvaWQgc2V0VmVjSXRlbShvdXQgaW50IG1bJHtvfV0sIGludCBpbmRleCwgaW50IHZhbHVlKSB7CiAgICAgICAgJHtlfQogICAgICB9CiAgICAgICAgYDtyZXR1cm57c2V0VmVjSXRlbTpuZXcgUihyKX19Z2V0VmVjSXRlbSgpe2xldCBvPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCxlPWAKICAgICAgICBpZihpbmRleCA8IDApCiAgICAgICAgICAgIGluZGV4ID0gJHtvfSArIGluZGV4OwogICAgICAgIGlmIChpbmRleCA9PSAwKQogICAgICAgICAgICByZXR1cm4gbVswXTsKICAgICAgYDtmb3IobGV0IG49MTtuPG8tMTsrK24pZSs9YAogICAgICAgIGVsc2UgaWYgKGluZGV4ID09ICR7bn0pCiAgICAgICAgICAgIHJldHVybiBtWyR7bn1dOwogICAgICBgO2UrPWAKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBtWyR7by0xfV07CiAgICAgICAgYDtsZXQgcj1gCiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7b31dLCBpbnQgaW5kZXgpIHsKICAgICAgICAke2V9CiAgICAgIH0KICAgIGA7cmV0dXJue2dldFZlY0l0ZW06bmV3IFIocil9fX19KTt2YXIgV2ksaXA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtlcCgpO3RwKCk7cnAoKTtucCgpO29wKCk7V2k9e2VuY29kaW5nOmZvLGZyYWdjb2xvcjpjbyx2ZWM6aG8sc2hhcGVVdGlsczpwbyxjb29yZGluYXRlczpsb319KTt2YXIgbW8sYXA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtXdCgpO1pjKCk7aXAoKTt3ZSgpO21vPWNsYXNze2NvbnN0cnVjdG9yKHQsbyxlLHIpe3RoaXMubGlicz17fTt0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoPXt9O3RoaXMuY29udGV4dD1uZXcgWm4odCxvLGUsciksT2JqZWN0LmtleXMoV2kpLmZvckVhY2gocz0+e2xldCBpPW5ldyBXaVtzXSh0aGlzLmNvbnRleHQpO3RoaXMubGlic1tzXT1pfSk7bGV0IG49dGhpcy5nbHNsTGliUm91dGluZURlcGVuZGVuY3lHcmFwaDtmb3IobGV0IHMgaW4gdGhpcy5saWJzKXtsZXQgdT10aGlzLmxpYnNbc10uZ2V0RnVuY3Rpb25zKCk7Zm9yKGxldCBsIGluIHUpe2xldCBjPXMrIi4iK2wscDtuW2NdPyhwPW5bY10scC5yb3V0aW5lQm9keT11W2xdLnJvdXRpbmVCb2R5KToocD1uZXcgY24oYyx1W2xdLnJvdXRpbmVCb2R5KSxuW2NdPXApO2xldCBkPXVbbF0uZGVwZW5kZW5jaWVzO2lmKGQpZm9yKGxldCBUPTA7VDxkLmxlbmd0aDsrK1QpaWYobltkW1RdXSlwLmFkZERlcGVuZGVuY3kobltkW1RdXSk7ZWxzZXtsZXQgdz1uZXcgY24oZFtUXSk7bltkW1RdXT13LHAuYWRkRGVwZW5kZW5jeSh3KX19fX1wcmVwcm9jZXNzKCl7bGV0IHQ9dGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLG89dC5zaGFkZXJTb3VyY2U7cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5oYXNNYWlufHwobz1gJHtvfQogICAgICAke011KHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbix0aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgpfWApLG89SmMobyksYCR7UnUodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKX0KICAgICR7dGhpcy5nZXRVbmlmb3Jtcyh0LmlucHV0TmFtZXMsdC52YXJpYWJsZXMpfQogICAgJHt0aGlzLmdldEltcG9ydHMobyl9CiAgICAke299YH1nZXRJbXBvcnRzKHQpe2xldCBvPXRoaXMuc2VsZWN0R2xzbExpYlJvdXRpbmVzVG9CZUluY2x1ZGVkKHQpO2lmKG8ubGVuZ3RoPT09MClyZXR1cm4iIjtsZXQgZT0iIjtmb3IobGV0IHI9MDtyPG8ubGVuZ3RoOysrcilpZihvW3JdLnJvdXRpbmVCb2R5KWUrPW9bcl0ucm91dGluZUJvZHkrYApgO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGJvZHkgZm9yIHRoZSBHbHNsIExpYnJhcnkgcm91dGluZTogJHtvW3JdLm5hbWV9YCk7cmV0dXJuIGV9c2VsZWN0R2xzbExpYlJvdXRpbmVzVG9CZUluY2x1ZGVkKHQpe2xldCBvPVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoKS5mb3JFYWNoKGU9PntsZXQgcj1lLnNwbGl0KCIuIilbMV07dC5pbmRleE9mKHIpIT09LTEmJm8ucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW2VdKX0pLFFuLnJldHVybk9yZGVyZWROb2RlcyhvKX1nZXRVbmlmb3Jtcyh0LG8pe2xldCBlPVtdO2lmKHQpZm9yKGxldCByIG9mIHQpZS5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3J9O2ApO2lmKG8pZm9yKGxldCByIG9mIG8pZS5wdXNoKGB1bmlmb3JtICR7ci50eXBlfSAke3IubmFtZX0ke3IuYXJyYXlMZW5ndGg/YFske3IuYXJyYXlMZW5ndGh9XWA6IiJ9O2ApO3JldHVybiBlLmpvaW4oYApgKX19fSk7dmFyIGJvLHNwPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTtsdCgpO2FwKCk7d2UoKTtibz1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8sZSl7dGhpcy5wcm9maWxlcj10O3RoaXMuZ2xDb250ZXh0PW87dGhpcy50ZXh0dXJlTGF5b3V0U3RyYXRlZ3k9ZTt0aGlzLnJlcG89bmV3IE1hcCx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMX1nZXRBcnRpZmFjdCh0KXtyZXR1cm4gdGhpcy5yZXBvLmdldCh0KX1zZXRBcnRpZmFjdCh0LG8pe3RoaXMucmVwby5zZXQodCxvKX1ydW4odCxvLGUpe3RoaXMucHJvZmlsZXIuZXZlbnQoIm9wIixgUHJvZ3JhbU1hbmFnZXIucnVuICR7dC5wcm9ncmFtSW5mby5uYW1lPz8idW5rbm93biBrZXJuZWwifWAsKCk9PntsZXQgcj10aGlzLmdsQ29udGV4dC5nbCxuPXQucHJvZ3JhbTtyLnVzZVByb2dyYW0obik7dHJ5e3RoaXMuYmluZE91dHB1dChlKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyh0LmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXModC51bmlmb3JtTG9jYXRpb25zLHQucHJvZ3JhbUluZm8udmFyaWFibGVzPz9bXSxvKX1jYXRjaChzKXt0aHJvdyBjZS5lcnJvcigiUHJvZ3JhbU1hbmFnZXIiLHQucHJvZ3JhbUluZm8uc2hhZGVyU291cmNlKSxzfXRoaXMucHJvZmlsZXIuZXZlbnQoImJhY2tlbmQiLCJHbENvbnRleHQuZHJhdygpIiwoKT0+e3RoaXMuZ2xDb250ZXh0LmRyYXcoKX0pfSx0aGlzLmdsQ29udGV4dCl9ZGlzcG9zZSgpe3RoaXMudmVydGV4U2hhZGVyJiZ0aGlzLmdsQ29udGV4dC5kZWxldGVTaGFkZXIodGhpcy52ZXJ0ZXhTaGFkZXIpLHRoaXMucmVwby5mb3JFYWNoKHQ9PnRoaXMuZ2xDb250ZXh0LmRlbGV0ZVByb2dyYW0odC5wcm9ncmFtKSl9YnVpbGQodCxvLGUpe3JldHVybiB0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiUHJvZ3JhbU1hbmFnZXIuYnVpbGQiLCgpPT57bGV0IHI9bmV3IG1vKHRoaXMuZ2xDb250ZXh0LHQsbyxlKSxuPXIucHJlcHJvY2VzcygpLHM9dGhpcy5jb21waWxlKG4pO3JldHVybntwcm9ncmFtSW5mbzp0LHByb2dyYW06cyx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhzLHIuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLHIuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhzKX19KX1jb21waWxlKHQpe2lmKCF0aGlzLnZlcnRleFNoYWRlcil7Y2UudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIiwiQ29tcGlsaW5nIGFuZCBjYWNoaW5nIFZlcnRleCBzaGFkZXIgZm9yIHRoZSBmaXJzdCB0aW1lIik7bGV0IHI9TnUodGhpcy5nbENvbnRleHQudmVyc2lvbik7dGhpcy52ZXJ0ZXhTaGFkZXI9dGhpcy5nbENvbnRleHQuY29tcGlsZVNoYWRlcihyLHRoaXMuZ2xDb250ZXh0LmdsLlZFUlRFWF9TSEFERVIpfVouZGVidWcmJmNlLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsYEZyYWdTaGFkZXI6CiR7dH0KYCk7bGV0IG89dGhpcy5nbENvbnRleHQuY29tcGlsZVNoYWRlcih0LHRoaXMuZ2xDb250ZXh0LmdsLkZSQUdNRU5UX1NIQURFUiksZT10aGlzLmdsQ29udGV4dC5jcmVhdGVQcm9ncmFtKHRoaXMudmVydGV4U2hhZGVyLG8pO3JldHVybiB0aGlzLmdsQ29udGV4dC5kZWxldGVTaGFkZXIobyksZX1iaW5kT3V0cHV0KHQpe2xldCBvPXQud2lkdGgsZT10LmhlaWdodDtjZS52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBCaW5kaW5nIG91dHB1dCB0ZXh0dXJlIHRvIEZyYW1lYnVmZmVyOiB3L2g9JHtvfS8ke2V9LCBzaGFwZT0ke3Quc2hhcGV9LCB0eXBlPSR7dC50ZW5zb3IudHlwZX1gKSx0aGlzLmdsQ29udGV4dC5hdHRhY2hGcmFtZWJ1ZmZlcih0LnRleHR1cmUsbyxlKX1iaW5kQXR0cmlidXRlcyh0KXtsZXQgbz10LnBvc2l0aW9uLGU9dC50ZXh0dXJlQ29vcmQ7dGhpcy5nbENvbnRleHQuc2V0VmVydGV4QXR0cmlidXRlcyhvLGUpLHRoaXMuYXR0cmlidXRlc0JvdW5kPSEwfWJpbmRVbmlmb3Jtcyh0LG8sZSl7bGV0IHI9dGhpcy5nbENvbnRleHQuZ2wsbj0wO2ZvcihsZXR7bmFtZTpzLHR5cGU6aSxsb2NhdGlvbjp1LGFycmF5TGVuZ3RoOmx9b2YgdCl7bGV0IGM9by5maW5kKHA9PnAubmFtZT09PXMpPy5kYXRhO2lmKGkhPT0ic2FtcGxlcjJEIiYmIWMpdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtzfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKGkpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKGVbbl0sdSxuKSxuKys7YnJlYWs7Y2FzZSJmbG9hdCI6bD9yLnVuaWZvcm0xZnYodSxjKTpyLnVuaWZvcm0xZih1LGMpO2JyZWFrO2Nhc2UiaW50IjpsP3IudW5pZm9ybTFpdih1LGMpOnIudW5pZm9ybTFpKHUsYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke2l9YCl9fX1iaW5kVGV4dHVyZSh0LG8sZSl7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0odC50ZXh0dXJlLGUsbyl9Z2V0QXR0cmliTG9jYXRpb25zKHQpe3JldHVybntwb3NpdGlvbjp0aGlzLmdldEF0dHJpYkxvY2F0aW9uKHQsInBvc2l0aW9uIiksdGV4dHVyZUNvb3JkOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24odCwidGV4dHVyZUNvb3JkIil9fWdldFVuaWZvcm1Mb2NhdGlvbnModCxvLGUpe2xldCByPVtdO2lmKG8pZm9yKGxldCBuIG9mIG8pci5wdXNoKHtuYW1lOm4sdHlwZToic2FtcGxlcjJEIixsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbih0LG4pfSk7aWYoZSlmb3IobGV0IG4gb2YgZSlyLnB1c2goey4uLm4sbG9jYXRpb246dGhpcy5nZXRVbmlmb3JtTG9jYXRpb24odCxuLm5hbWUpfSk7cmV0dXJuIHJ9Z2V0VW5pZm9ybUxvY2F0aW9uKHQsbyl7bGV0IHI9dGhpcy5nbENvbnRleHQuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHQsbyk7aWYocj09PW51bGwpdGhyb3cgbmV3IEVycm9yKGBVbmlmb3JtICR7b30gbm90IGZvdW5kLmApO3JldHVybiByfWdldEF0dHJpYkxvY2F0aW9uKHQsbyl7cmV0dXJuIHRoaXMuZ2xDb250ZXh0LmdsLmdldEF0dHJpYkxvY2F0aW9uKHQsbyl9fX0pO3ZhciBnbyx1cD1MKCgpPT57InVzZSBzdHJpY3QiO2x0KCk7bG4oKTtnbz1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8sZSxyKXt0aGlzLmdsQ29udGV4dD10O3RoaXMubGF5b3V0U3RyYXRlZ3k9bzt0aGlzLnByb2ZpbGVyPWU7dGhpcy5jb25maWc9cjt0aGlzLnBlbmRpbmdSZWFkPW5ldyBNYXA7ci5yZXVzZVRleHR1cmVzJiYodGhpcy5pblVzZVRleHR1cmVzPW5ldyBNYXAsdGhpcy5pZGxlVGV4dHVyZXM9bmV3IE1hcCx0aGlzLnRleHR1cmVMb29rdXA9bmV3IE1hcCl9Y3JlYXRlVGV4dHVyZUZyb21MYXlvdXQodCxvLGUscil7bGV0IG49dGhpcy50b0VuY29kZXJUeXBlKHQpLHM9dGhpcy5nbENvbnRleHQuZ2V0RW5jb2RlcihuLG8uY2hhbm5lbHN8fDEscik7aWYoby5pc1BhY2tlZCYmcj09PTEpdGhyb3cgbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTtsZXQgaT1vLndpZHRoLHU9by5oZWlnaHQsbCxjO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMpe2w9YCR7aX14JHt1fV8ke3MuZm9ybWF0fV8ke3MuaW50ZXJuYWxGb3JtYXR9XyR7cy50ZXh0dXJlVHlwZX1gLGM9dGhpcy5pblVzZVRleHR1cmVzLmdldChsKSxjfHwoYz1bXSx0aGlzLmluVXNlVGV4dHVyZXMuc2V0KGwsYykpO2xldCBkPXRoaXMuaWRsZVRleHR1cmVzLmdldChsKTtpZihkJiZkLmxlbmd0aD4wKXtsZXQgVD1kLnBvcCgpO3JldHVybiBjLnB1c2goVCkscj09PTEmJnRoaXMuZ2xDb250ZXh0LnVwZGF0ZVRleHR1cmUoVCxpLHUscyx0aGlzLnRvVGV4dHVyZURhdGEodCxlKSksVH19Y2UudmVyYm9zZSgiVGV4dHVyZU1hbmFnZXIiLGBDcmVhdGluZyBuZXcgdGV4dHVyZSBvZiBzaXplICR7by53aWR0aH14JHtvLmhlaWdodH1gKTtsZXQgcD10aGlzLmdsQ29udGV4dC5hbGxvY2F0ZVRleHR1cmUoaSx1LHMsdGhpcy50b1RleHR1cmVEYXRhKHQsZSkpO3JldHVybiB0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzJiYoYy5wdXNoKHApLHRoaXMudGV4dHVyZUxvb2t1cC5zZXQocCxsKSkscH1yZWFkVGV4dHVyZSh0LG8sZSl7cmV0dXJuIGV8fChlPTEpLHRoaXMucHJvZmlsZXIuZXZlbnQoImJhY2tlbmQiLCJUZXh0dXJlTWFuYWdlci5yZWFkVGV4dHVyZSIsKCk9PntsZXQgcj10LnNoYXBlLnJlZHVjZSgocyxpKT0+cyppKSplLG49dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUodC50ZXh0dXJlLHQud2lkdGgsdC5oZWlnaHQscix0aGlzLnRvRW5jb2RlclR5cGUobyksZSk7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKG8sbil9KX1hc3luYyByZWFkVGV4dHVyZUFzeW5jKHQsbyxlKXtsZXQgcj10LnRlbnNvci5kYXRhSWQ7aWYoZXx8KGU9MSksdGhpcy5wZW5kaW5nUmVhZC5oYXMocikpe2xldCBuPXRoaXMucGVuZGluZ1JlYWQuZ2V0KHIpO3JldHVybiBuZXcgUHJvbWlzZShzPT5uPy5wdXNoKHMpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLGFzeW5jKCk9Pnt0aGlzLnBlbmRpbmdSZWFkLnNldChyLFtdKTtsZXQgbj10LnNoYXBlLnJlZHVjZSgobCxjKT0+bCpjKSplO2F3YWl0IHRoaXMuZ2xDb250ZXh0LmNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpO2xldCBzPXRoaXMuZ2xDb250ZXh0LnJlYWRUZXh0dXJlKHQudGV4dHVyZSx0LndpZHRoLHQuaGVpZ2h0LG4sdGhpcy50b0VuY29kZXJUeXBlKG8pLGUpLGk9dGhpcy50b1RlbnNvckRhdGEobyxzKSx1PXRoaXMucGVuZGluZ1JlYWQuZ2V0KHIpO3JldHVybiB0aGlzLnBlbmRpbmdSZWFkLmRlbGV0ZShyKSx1Py5mb3JFYWNoKGw9PmwoaSkpLGl9KX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdCh0KXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKT0+e2xldCBvPXQuc2hhcGUucmVkdWNlKChyLG4pPT5yKm4pLGU9dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUodC50ZXh0dXJlLHQud2lkdGgsdC5oZWlnaHQsbyo0LCJieXRlIiw0KTtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsbyl9KX1yZWxlYXNlVGV4dHVyZSh0LG8pe2xldCBlO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMmJihlPXRoaXMudGV4dHVyZUxvb2t1cC5nZXQodC50ZXh0dXJlKSxlKSl7byYmdGhpcy50ZXh0dXJlTG9va3VwLmRlbGV0ZShlKTtsZXQgcj10aGlzLmluVXNlVGV4dHVyZXMuZ2V0KGUpO2lmKHIpe2xldCBuPXIuaW5kZXhPZih0LnRleHR1cmUpO2lmKG4hPT0tMSl7ci5zcGxpY2UobiwxKTtsZXQgcz10aGlzLmlkbGVUZXh0dXJlcy5nZXQoZSk7c3x8KHM9W10sdGhpcy5pZGxlVGV4dHVyZXMuc2V0KGUscykpLHMucHVzaCh0LnRleHR1cmUpfX19KCFlfHxvKSYmKGNlLnZlcmJvc2UoIlRleHR1cmVNYW5hZ2VyIixgRGVsZXRpbmcgdGV4dHVyZSBvZiBzaXplICR7dC53aWR0aH14JHt0LmhlaWdodH1gKSx0aGlzLmdsQ29udGV4dC5kZWxldGVUZXh0dXJlKHQudGV4dHVyZSkpfXRvVGVuc29yRGF0YSh0LG8pe3N3aXRjaCh0KXtjYXNlImludDE2IjpyZXR1cm4gbyBpbnN0YW5jZW9mIEludDE2QXJyYXk/bzpJbnQxNkFycmF5LmZyb20obyk7Y2FzZSJpbnQzMiI6cmV0dXJuIG8gaW5zdGFuY2VvZiBJbnQzMkFycmF5P286SW50MzJBcnJheS5mcm9tKG8pO2Nhc2UiaW50OCI6cmV0dXJuIG8gaW5zdGFuY2VvZiBJbnQ4QXJyYXk/bzpJbnQ4QXJyYXkuZnJvbShvKTtjYXNlInVpbnQxNiI6cmV0dXJuIG8gaW5zdGFuY2VvZiBVaW50MTZBcnJheT9vOlVpbnQxNkFycmF5LmZyb20obyk7Y2FzZSJ1aW50MzIiOnJldHVybiBvIGluc3RhbmNlb2YgVWludDMyQXJyYXk/bzpVaW50MzJBcnJheS5mcm9tKG8pO2Nhc2UidWludDgiOmNhc2UiYm9vbCI6cmV0dXJuIG8gaW5zdGFuY2VvZiBVaW50OEFycmF5P286VWludDhBcnJheS5mcm9tKG8pO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIG8gaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/bzpGbG9hdDMyQXJyYXkuZnJvbShvKTtjYXNlImZsb2F0NjQiOnJldHVybiBvIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5P286RmxvYXQ2NEFycmF5LmZyb20obyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckRhdGEgdHlwZSAke3R9IGlzIG5vdCBzdXBwb3J0ZWRgKX19dG9UZXh0dXJlRGF0YSh0LG8pe2lmKG8pcmV0dXJuIG8gaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/bzpuZXcgRmxvYXQzMkFycmF5KG8pfXRvRW5jb2RlclR5cGUodCl7cmV0dXJuImZsb2F0In1jbGVhckFjdGl2ZVRleHR1cmVzKCl7dGhpcy5nbENvbnRleHQuY2xlYXJBY3RpdmVUZXh0dXJlcygpfX19KTt2YXIgeW8sbHA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtsdCgpO19zKCk7ZWwoKTtYYygpO3NwKCk7VmkoKTt1cCgpO3lvPWNsYXNze2NvbnN0cnVjdG9yKHQsbyl7dGhpcy5iYWNrZW5kPXQ7dGhpcy5jb250ZXh0PW87dGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgdW8odC5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IGJvKHRoaXMuY29udGV4dC5wcm9maWxlcix0LmdsQ29udGV4dCx0aGlzLmxheW91dFN0cmF0ZWd5KSx0aGlzLnRleHR1cmVNYW5hZ2VyPW5ldyBnbyh0LmdsQ29udGV4dCx0aGlzLmxheW91dFN0cmF0ZWd5LHRoaXMuY29udGV4dC5wcm9maWxlcix7cmV1c2VUZXh0dXJlczp0LnRleHR1cmVDYWNoZU1vZGU9PT0iZnVsbCJ9KSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwLHRoaXMucGFjaz10LnBhY2ssdGhpcy5wYWNrMnVucGFja01hcD1uZXcgTWFwLHRoaXMudW5wYWNrMnBhY2tNYXA9bmV3IE1hcH1jcmVhdGVJbmZlcmVuY2VIYW5kbGVyKCl7cmV0dXJuIG5ldyBKbih0aGlzKX1vbkdyYXBoSW5pdGlhbGl6ZWQodCl7bGV0IG89dC5nZXRWYWx1ZXMoKS5maWx0ZXIoZT0+ZS5mcm9tPT09LTEmJmUudGVuc29yKS5tYXAoZT0+ZS50ZW5zb3IuZGF0YUlkKTt0aGlzLmluaXRpYWxpemVycz1uZXcgU2V0KG8pfWlzSW5pdGlhbGl6ZXIodCl7cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZXJzP3RoaXMuaW5pdGlhbGl6ZXJzLmhhcyh0KTohMX1hZGRJbml0aWFsaXplcih0KXt0aGlzLmluaXRpYWxpemVycy5hZGQodCl9Z2V0VGV4dHVyZURhdGEodCxvKXtyZXR1cm4gbz90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldCh0KX1zZXRUZXh0dXJlRGF0YSh0LG8sZT0hMSl7Y2UudmVyYm9zZSgiV2ViR0xTZXNzaW9uSGFuZGxlciIsIlN0b3JpbmcgVGV4dHVyZSBkYXRhIGluIGNhY2hlIiksZT90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuc2V0KHQsbyk6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuc2V0KHQsbyl9ZGlzcG9zZSgpe3RoaXMucHJvZ3JhbU1hbmFnZXIuZGlzcG9zZSgpLHRoaXMudGV4dHVyZU1hbmFnZXIuY2xlYXJBY3RpdmVUZXh0dXJlcygpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKHQ9PnRoaXMudGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUodCwhMCkpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwLHRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2godD0+dGhpcy50ZXh0dXJlTWFuYWdlci5yZWxlYXNlVGV4dHVyZSh0LCEwKSksdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcH1yZXNvbHZlKHQsbyxlKXtsZXQgcj12cyh0LG8sWWMpO3JldHVybntpbXBsOnIub3BJbXBsLGNvbnRleHQ6ci5vcEluaXQ/ci5vcEluaXQodCxlKTp0fX19fSk7ZnVuY3Rpb24gamIoYSl7bGV0IHQ9MDtmb3IoO3Q8YS5sZW5ndGgmJmFbdF0oKTsrK3QpO3JldHVybiB0LTF9dmFyIGhuLGZwPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTtsbigpO2xuKCk7QnQoKTtobj1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8pe3RoaXMuZnJhbWVCdWZmZXJCb3VuZD0hMTt0aGlzLml0ZW1zVG9Qb2xsPVtdO3RoaXMuZ2w9dCx0aGlzLnZlcnNpb249byx0aGlzLmdldEV4dGVuc2lvbnMoKSx0aGlzLnZlcnRleGJ1ZmZlcj10aGlzLmNyZWF0ZVZlcnRleGJ1ZmZlcigpLHRoaXMuZnJhbWVidWZmZXI9dGhpcy5jcmVhdGVGcmFtZWJ1ZmZlcigpLHRoaXMucXVlcnlWaXRhbFBhcmFtZXRlcnMoKX1hbGxvY2F0ZVRleHR1cmUodCxvLGUscil7bGV0IG49dGhpcy5nbCxzPW4uY3JlYXRlVGV4dHVyZSgpO24uYmluZFRleHR1cmUobi5URVhUVVJFXzJELHMpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsbi5ORUFSRVNUKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NQUdfRklMVEVSLG4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9TLG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9ULG4uQ0xBTVBfVE9fRURHRSk7bGV0IGk9cj9lLmVuY29kZShyLHQqbyk6bnVsbDtyZXR1cm4gbi50ZXhJbWFnZTJEKG4uVEVYVFVSRV8yRCwwLGUuaW50ZXJuYWxGb3JtYXQsdCxvLDAsZS5mb3JtYXQsZS50ZXh0dXJlVHlwZSxpKSx0aGlzLmNoZWNrRXJyb3IoKSxzfXVwZGF0ZVRleHR1cmUodCxvLGUscixuKXtsZXQgcz10aGlzLmdsO3MuYmluZFRleHR1cmUocy5URVhUVVJFXzJELHQpO2xldCBpPXIuZW5jb2RlKG4sbyplKTtzLnRleFN1YkltYWdlMkQocy5URVhUVVJFXzJELDAsMCwwLG8sZSxyLmZvcm1hdCxyLnRleHR1cmVUeXBlLGkpLHRoaXMuY2hlY2tFcnJvcigpfWF0dGFjaEZyYW1lYnVmZmVyKHQsbyxlKXtsZXQgcj10aGlzLmdsO3IuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHQpLHIuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsdGhpcy5mcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELHQsMCksdGhpcy5jaGVja0Vycm9yKCksci52aWV3cG9ydCgwLDAsbyxlKSxyLnNjaXNzb3IoMCwwLG8sZSl9cmVhZFRleHR1cmUodCxvLGUscixuLHMpe2xldCBpPXRoaXMuZ2w7c3x8KHM9MSksdGhpcy5mcmFtZUJ1ZmZlckJvdW5kfHx0aGlzLmF0dGFjaEZyYW1lYnVmZmVyKHQsbyxlKTtsZXQgdT10aGlzLmdldEVuY29kZXIobixzKSxsPXUuYWxsb2NhdGUobyplKTtyZXR1cm4gaS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfMkQsdCksaS5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLkZSQU1FQlVGRkVSLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5URVhUVVJFXzJELHQsMCksaS5yZWFkUGl4ZWxzKDAsMCxvLGUsaS5SR0JBLHUudGV4dHVyZVR5cGUsbCksdGhpcy5jaGVja0Vycm9yKCksdS5kZWNvZGUobCxyKX1pc0ZyYW1lYnVmZmVyUmVhZHkoKXtyZXR1cm4hMH1nZXRBY3RpdmVUZXh0dXJlKCl7bGV0IHQ9dGhpcy5nbDtyZXR1cm5gVEVYVFVSRSR7dC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5BQ1RJVkVfVEVYVFVSRSktdC5URVhUVVJFMH1gfWdldFRleHR1cmVCaW5kaW5nKCl7cmV0dXJuIHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKHRoaXMuZ2wuVEVYVFVSRV9CSU5ESU5HXzJEKX1nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKXtyZXR1cm4gdGhpcy5nbC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5GUkFNRUJVRkZFUl9CSU5ESU5HKX1zZXRWZXJ0ZXhBdHRyaWJ1dGVzKHQsbyl7bGV0IGU9dGhpcy5nbDtlLnZlcnRleEF0dHJpYlBvaW50ZXIodCwzLGUuRkxPQVQsITEsMjAsMCksZS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0KSxvIT09LTEmJihlLnZlcnRleEF0dHJpYlBvaW50ZXIobywyLGUuRkxPQVQsITEsMjAsMTIpLGUuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobykpLHRoaXMuY2hlY2tFcnJvcigpfWNyZWF0ZVByb2dyYW0odCxvKXtsZXQgZT10aGlzLmdsLHI9ZS5jcmVhdGVQcm9ncmFtKCk7cmV0dXJuIGUuYXR0YWNoU2hhZGVyKHIsdCksZS5hdHRhY2hTaGFkZXIocixvKSxlLmxpbmtQcm9ncmFtKHIpLHJ9Y29tcGlsZVNoYWRlcih0LG8pe2xldCBlPXRoaXMuZ2wscj1lLmNyZWF0ZVNoYWRlcihvKTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZVNoYWRlcigpIHJldHVybmVkIG51bGwgd2l0aCB0eXBlICR7b31gKTtpZihlLnNoYWRlclNvdXJjZShyLHQpLGUuY29tcGlsZVNoYWRlcihyKSxlLmdldFNoYWRlclBhcmFtZXRlcihyLGUuQ09NUElMRV9TVEFUVVMpPT09ITEpdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29tcGlsZSBzaGFkZXI6ICR7ZS5nZXRTaGFkZXJJbmZvTG9nKHIpfQpTaGFkZXIgc291cmNlOgoke3R9YCk7cmV0dXJuIHJ9ZGVsZXRlU2hhZGVyKHQpe3RoaXMuZ2wuZGVsZXRlU2hhZGVyKHQpfWJpbmRUZXh0dXJlVG9Vbmlmb3JtKHQsbyxlKXtsZXQgcj10aGlzLmdsO3IuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK28pLHRoaXMuY2hlY2tFcnJvcigpLHIuYmluZFRleHR1cmUoci5URVhUVVJFXzJELHQpLHRoaXMuY2hlY2tFcnJvcigpLHIudW5pZm9ybTFpKGUsbyksdGhpcy5jaGVja0Vycm9yKCl9ZHJhdygpe3RoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFX1NUUklQLDAsNCksdGhpcy5jaGVja0Vycm9yKCl9Y2hlY2tFcnJvcigpe2lmKFouZGVidWcpe2xldCB0PXRoaXMuZ2wsbz10LmdldEVycm9yKCksZT0iIjtzd2l0Y2gobyl7Y2FzZSB0Lk5PX0VSUk9SOnJldHVybjtjYXNlIHQuSU5WQUxJRF9FTlVNOmU9IklOVkFMSURfRU5VTSI7YnJlYWs7Y2FzZSB0LklOVkFMSURfVkFMVUU6ZT0iSU5WQUxJRF9WQUxVRSI7YnJlYWs7Y2FzZSB0LklOVkFMSURfT1BFUkFUSU9OOmU9IklOVkFMSURfT1BFUkFUSU9OIjticmVhaztjYXNlIHQuSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046ZT0iSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iO2JyZWFrO2Nhc2UgdC5PVVRfT0ZfTUVNT1JZOmU9Ik9VVF9PRl9NRU1PUlkiO2JyZWFrO2Nhc2UgdC5DT05URVhUX0xPU1RfV0VCR0w6ZT0iQ09OVEVYVF9MT1NUX1dFQkdMIjticmVhaztkZWZhdWx0OmU9YFVua25vd24gV2ViR0wgRXJyb3I6ICR7by50b1N0cmluZygxNil9YH10aHJvdyBuZXcgRXJyb3IoZSl9fWRlbGV0ZVRleHR1cmUodCl7dGhpcy5nbC5kZWxldGVUZXh0dXJlKHQpfWRlbGV0ZVByb2dyYW0odCl7dGhpcy5nbC5kZWxldGVQcm9ncmFtKHQpfWdldEVuY29kZXIodCxvLGU9MCl7aWYodGhpcy52ZXJzaW9uPT09MilyZXR1cm4gbmV3IFhuKHRoaXMuZ2wsbyk7c3dpdGNoKHQpe2Nhc2UiZmxvYXQiOnJldHVybiBlPT09MXx8dGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWQ/bmV3IHVuKHRoaXMuZ2wsbyk6bmV3IHVuKHRoaXMuZ2wsbyx0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMpO2Nhc2UiaW50Ijp0aHJvdyBuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO2Nhc2UiYnl0ZSI6cmV0dXJuIG5ldyBLbih0aGlzLmdsLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGFUeXBlOiAke3R9YCl9fWNsZWFyQWN0aXZlVGV4dHVyZXMoKXtsZXQgdD10aGlzLmdsO2ZvcihsZXQgbz0wO288dGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0czsrK28pdC5hY3RpdmVUZXh0dXJlKHQuVEVYVFVSRTArbyksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsbnVsbCl9ZGlzcG9zZSgpe2lmKHRoaXMuZGlzcG9zZWQpcmV0dXJuO2xldCB0PXRoaXMuZ2w7dC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixudWxsKSx0LmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpLHQuYmluZEJ1ZmZlcih0LkFSUkFZX0JVRkZFUixudWxsKSx0LmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleGJ1ZmZlciksdC5iaW5kQnVmZmVyKHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbnVsbCksdC5maW5pc2goKSx0aGlzLmRpc3Bvc2VkPSEwfWNyZWF0ZURlZmF1bHRHZW9tZXRyeSgpe3JldHVybiBuZXcgRmxvYXQzMkFycmF5KFstMSwxLDAsMCwxLC0xLC0xLDAsMCwwLDEsMSwwLDEsMSwxLC0xLDAsMSwwXSl9Y3JlYXRlVmVydGV4YnVmZmVyKCl7bGV0IHQ9dGhpcy5nbCxvPXQuY3JlYXRlQnVmZmVyKCk7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJjcmVhdGVCdWZmZXIoKSByZXR1cm5lZCBudWxsIik7bGV0IGU9dGhpcy5jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKTtyZXR1cm4gdC5iaW5kQnVmZmVyKHQuQVJSQVlfQlVGRkVSLG8pLHQuYnVmZmVyRGF0YSh0LkFSUkFZX0JVRkZFUixlLHQuU1RBVElDX0RSQVcpLHRoaXMuY2hlY2tFcnJvcigpLG99Y3JlYXRlRnJhbWVidWZmZXIoKXtsZXQgdD10aGlzLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjcmVhdGVGcmFtZWJ1ZmZlciByZXR1cm5lZCBudWxsIik7cmV0dXJuIHR9cXVlcnlWaXRhbFBhcmFtZXRlcnMoKXtsZXQgdD10aGlzLmdsO2lmKHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcj10aGlzLmNoZWNrRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXIoKSx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD10aGlzLmNoZWNrUmVuZGVyRmxvYXQzMigpLHRoaXMuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ9dGhpcy5jaGVja0Zsb2F0MzJEb3dubG9hZCgpLHRoaXMudmVyc2lvbj09PTEmJiF0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24mJiF0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZCl0aHJvdyBuZXcgRXJyb3IoImJvdGggZmxvYXQzMiBhbmQgZmxvYXQxNiBUZXh0dXJlVHlwZSBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuaXNCbGVuZFN1cHBvcnRlZD0hdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWR8fHRoaXMuY2hlY2tGbG9hdDMyQmxlbmQoKSx0aGlzLm1heFRleHR1cmVTaXplPXQuZ2V0UGFyYW1ldGVyKHQuTUFYX1RFWFRVUkVfU0laRSksdGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0cz10LmdldFBhcmFtZXRlcih0Lk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx0aGlzLnZlcnNpb259Z2V0RXh0ZW5zaW9ucygpe3RoaXMudmVyc2lvbj09PTI/KHRoaXMuY29sb3JCdWZmZXJGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpLHRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIikpOih0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXQiKSx0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKSl9Y2hlY2tGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcigpe2xldCB0PXRoaXMuZ2wsbz10LmNyZWF0ZVRleHR1cmUoKTt0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCxvKTtsZXQgZT10aGlzLnZlcnNpb249PT0yP3QuUkdCQTMyRjp0LlJHQkE7dC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLGUsMSwxLDAsdC5SR0JBLHQuRkxPQVQsbnVsbCk7bGV0IHI9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsciksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0LkZSQU1FQlVGRkVSLHQuQ09MT1JfQVRUQUNITUVOVDAsdC5URVhUVVJFXzJELG8sMCk7bGV0IG49dC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHQuRlJBTUVCVUZGRVIpPT09dC5GUkFNRUJVRkZFUl9DT01QTEVURTtyZXR1cm4gdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsbnVsbCksdC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixudWxsKSx0LmRlbGV0ZVRleHR1cmUobyksdC5kZWxldGVGcmFtZWJ1ZmZlcihyKSxufWNoZWNrUmVuZGVyRmxvYXQzMigpe2lmKHRoaXMudmVyc2lvbj09PTIpe2lmKCF0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24pcmV0dXJuITF9ZWxzZSBpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb24pcmV0dXJuITE7cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJEb3dubG9hZCgpe2lmKHRoaXMudmVyc2lvbj09PTIpe2lmKCF0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24pcmV0dXJuITF9ZWxzZSBpZighdGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb258fCF0aGlzLmdsLmdldEV4dGVuc2lvbigiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpcmV0dXJuITE7cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJCbGVuZCgpe2xldCB0PXRoaXMuZ2wsbyxlLHIsbixzO3RyeXtvPXQuY3JlYXRlVGV4dHVyZSgpLGU9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELG8pO2xldCBpPXRoaXMudmVyc2lvbj09PTI/dC5SR0JBMzJGOnQuUkdCQTtyZXR1cm4gdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLGksMSwxLDAsdC5SR0JBLHQuRkxPQVQsbnVsbCksdC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixlKSx0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKHQuRlJBTUVCVUZGRVIsdC5DT0xPUl9BVFRBQ0hNRU5UMCx0LlRFWFRVUkVfMkQsbywwKSx0LmVuYWJsZSh0LkJMRU5EKSxyPXQuY3JlYXRlU2hhZGVyKHQuVkVSVEVYX1NIQURFUiksIXJ8fCh0LnNoYWRlclNvdXJjZShyLCJ2b2lkIG1haW4oKXt9IiksdC5jb21waWxlU2hhZGVyKHIpLG49dC5jcmVhdGVTaGFkZXIodC5GUkFHTUVOVF9TSEFERVIpLCFuKXx8KHQuc2hhZGVyU291cmNlKG4sInByZWNpc2lvbiBoaWdocCBmbG9hdDt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dmVjNCgwLjUpO30iKSx0LmNvbXBpbGVTaGFkZXIobikscz10LmNyZWF0ZVByb2dyYW0oKSwhcyk/ITE6KHQuYXR0YWNoU2hhZGVyKHMsciksdC5hdHRhY2hTaGFkZXIocyxuKSx0LmxpbmtQcm9ncmFtKHMpLHQudXNlUHJvZ3JhbShzKSx0LmRyYXdBcnJheXModC5QT0lOVFMsMCwxKSx0LmdldEVycm9yKCk9PT10Lk5PX0VSUk9SKX1maW5hbGx5e3QuZGlzYWJsZSh0LkJMRU5EKSxzJiZ0LmRlbGV0ZVByb2dyYW0ocyksciYmdC5kZWxldGVTaGFkZXIociksbiYmdC5kZWxldGVTaGFkZXIobiksZSYmKHQuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsbnVsbCksdC5kZWxldGVGcmFtZWJ1ZmZlcihlKSksbyYmKHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELG51bGwpLHQuZGVsZXRlVGV4dHVyZShvKSl9fWJlZ2luVGltZXIoKXtpZih0aGlzLnZlcnNpb249PT0yJiZ0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil7bGV0IHQ9dGhpcy5nbCxvPXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uLGU9dC5jcmVhdGVRdWVyeSgpO3JldHVybiB0LmJlZ2luUXVlcnkoby5USU1FX0VMQVBTRURfRVhULGUpLGV9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIil9ZW5kVGltZXIoKXtpZih0aGlzLnZlcnNpb249PT0yJiZ0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbil7bGV0IHQ9dGhpcy5nbCxvPXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uO3QuZW5kUXVlcnkoby5USU1FX0VMQVBTRURfRVhUKTtyZXR1cm59ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKX1pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKHQpe2xldCBvPSExLGU9ITE7aWYodGhpcy52ZXJzaW9uPT09MiYmdGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb24pe2xldCByPXRoaXMuZ2wsbj10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjtvPXIuZ2V0UXVlcnlQYXJhbWV0ZXIodCxyLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpLGU9ci5nZXRQYXJhbWV0ZXIobi5HUFVfRElTSk9JTlRfRVhUKX1lbHNlIHRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3JldHVybiBvJiYhZX1nZXRUaW1lclJlc3VsdCh0KXtsZXQgbz0wO2lmKHRoaXMudmVyc2lvbj09PTIpe2xldCBlPXRoaXMuZ2w7bz1lLmdldFF1ZXJ5UGFyYW1ldGVyKHQsZS5RVUVSWV9SRVNVTFQpLGUuZGVsZXRlUXVlcnkodCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gby8xZTZ9YXN5bmMgd2FpdEZvclF1ZXJ5QW5kR2V0VGltZSh0KXtyZXR1cm4gYXdhaXQgbWkoKCk9PnRoaXMuaXNUaW1lclJlc3VsdEF2YWlsYWJsZSh0KSksdGhpcy5nZXRUaW1lclJlc3VsdCh0KX1hc3luYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKXtsZXQgdD10aGlzLmNyZWF0ZUZlbmNlKHRoaXMuZ2wpO3JldHVybiB0aGlzLnBvbGxGZW5jZSh0KX1jcmVhdGVGZW5jZSh0KXtsZXQgbyxlPXQscj1lLmZlbmNlU3luYyhlLlNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFLDApO3JldHVybiB0LmZsdXNoKCkscj09PW51bGw/bz0oKT0+ITA6bz0oKT0+e2xldCBuPWUuY2xpZW50V2FpdFN5bmMociwwLDApO3JldHVybiBuPT09ZS5BTFJFQURZX1NJR05BTEVEfHxuPT09ZS5DT05ESVRJT05fU0FUSVNGSUVEfSx7cXVlcnk6cixpc0ZlbmNlUGFzc2VkOm99fWFzeW5jIHBvbGxGZW5jZSh0KXtyZXR1cm4gbmV3IFByb21pc2Uobz0+e3RoaXMuYWRkSXRlbVRvUG9sbCgoKT0+dC5pc0ZlbmNlUGFzc2VkKCksKCk9Pm8oKSl9KX1wb2xsSXRlbXMoKXtsZXQgdD1qYih0aGlzLml0ZW1zVG9Qb2xsLm1hcChvPT5vLmlzRG9uZUZuKSk7Zm9yKGxldCBvPTA7bzw9dDsrK28pe2xldHtyZXNvbHZlRm46ZX09dGhpcy5pdGVtc1RvUG9sbFtvXTtlKCl9dGhpcy5pdGVtc1RvUG9sbD10aGlzLml0ZW1zVG9Qb2xsLnNsaWNlKHQrMSl9YXN5bmMgYWRkSXRlbVRvUG9sbCh0LG8pe3RoaXMuaXRlbXNUb1BvbGwucHVzaCh7aXNEb25lRm46dCxyZXNvbHZlRm46b30pLCEodGhpcy5pdGVtc1RvUG9sbC5sZW5ndGg+MSkmJmF3YWl0IG1pKCgpPT4odGhpcy5wb2xsSXRlbXMoKSx0aGlzLml0ZW1zVG9Qb2xsLmxlbmd0aD09PTApKX19fSk7ZnVuY3Rpb24gSGkoYSl7bGV0IHQ7aWYoKCFhfHxhPT09IndlYmdsMiIpJiYid2ViZ2wyImluIEdyP3Q9R3Iud2ViZ2wyOighYXx8YT09PSJ3ZWJnbCIpJiYid2ViZ2wiaW4gR3ImJih0PUdyLndlYmdsKSwhdCl0cnl7bGV0IGU9WGIoKTt0PWNwKGUsYSl9Y2F0Y2h7bGV0IHI9WWIoKTt0PWNwKHIsYSl9YT1hfHx0LnZlcnNpb249PT0xPyJ3ZWJnbCI6IndlYmdsMiI7bGV0IG89dC5nbDtyZXR1cm4gR3JbYV09dCxvLmlzQ29udGV4dExvc3QoKT8oZGVsZXRlIEdyW2FdLEhpKGEpKTooby5kaXNhYmxlKG8uREVQVEhfVEVTVCksby5kaXNhYmxlKG8uU1RFTkNJTF9URVNUKSxvLmRpc2FibGUoby5CTEVORCksby5kaXNhYmxlKG8uRElUSEVSKSxvLmRpc2FibGUoby5QT0xZR09OX09GRlNFVF9GSUxMKSxvLmRpc2FibGUoby5TQU1QTEVfQ09WRVJBR0UpLG8uZW5hYmxlKG8uU0NJU1NPUl9URVNUKSxvLmVuYWJsZShvLkNVTExfRkFDRSksby5jdWxsRmFjZShvLkJBQ0spLHQpfWZ1bmN0aW9uIGNwKGEsdCl7bGV0IG89e2FscGhhOiExLGRlcHRoOiExLGFudGlhbGlhczohMSxzdGVuY2lsOiExLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxwcmVtdWx0aXBsaWVkQWxwaGE6ITEsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMX0sZSxyPW87aWYoKCF0fHx0PT09IndlYmdsMiIpJiYoZT1hLmdldENvbnRleHQoIndlYmdsMiIsciksZSkpdHJ5e3JldHVybiBuZXcgaG4oZSwyKX1jYXRjaChuKXtjZS53YXJuaW5nKCJHbENvbnRleHRGYWN0b3J5IixgZmFpbGVkIHRvIGNyZWF0ZSBXZWJHTENvbnRleHQgdXNpbmcgY29udGV4dElkICd3ZWJnbDInLiBFcnJvcjogJHtufWApfWlmKCghdHx8dD09PSJ3ZWJnbCIpJiYoZT1hLmdldENvbnRleHQoIndlYmdsIixyKXx8YS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLHIpLGUpKXRyeXtyZXR1cm4gbmV3IGhuKGUsMSl9Y2F0Y2gobil7Y2Uud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wnIG9yICdleHBlcmltZW50YWwtd2ViZ2wnLiBFcnJvcjogJHtufWApfXRocm93IG5ldyBFcnJvcigiV2ViR0wgaXMgbm90IHN1cHBvcnRlZCIpfWZ1bmN0aW9uIFliKCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhczogZG9jdW1lbnQgaXMgbm90IHN1cHBvcnRlZCIpO2xldCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiBhLndpZHRoPTEsYS5oZWlnaHQ9MSxhfWZ1bmN0aW9uIFhiKCl7aWYodHlwZW9mIE9mZnNjcmVlbkNhbnZhcz4idSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBvZmZzY3JlZW4gY2FudmFzOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSl9dmFyIEdyLHBwPUwoKCk9PnsidXNlIHN0cmljdCI7bHQoKTtmcCgpO0dyPXt9fSk7dmFyIFRvLGRwPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTtsdCgpO2xwKCk7cHAoKTtUbz1jbGFzc3tnZXQgY29udGV4dElkKCl7cmV0dXJuIFoud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQodCl7Wi53ZWJnbC5jb250ZXh0SWQ9dH1nZXQgbWF0bXVsTWF4QmF0Y2hTaXplKCl7cmV0dXJuIFoud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplfXNldCBtYXRtdWxNYXhCYXRjaFNpemUodCl7Wi53ZWJnbC5tYXRtdWxNYXhCYXRjaFNpemU9dH1nZXQgdGV4dHVyZUNhY2hlTW9kZSgpe3JldHVybiBaLndlYmdsLnRleHR1cmVDYWNoZU1vZGV9c2V0IHRleHR1cmVDYWNoZU1vZGUodCl7Wi53ZWJnbC50ZXh0dXJlQ2FjaGVNb2RlPXR9Z2V0IHBhY2soKXtyZXR1cm4gWi53ZWJnbC5wYWNrfXNldCBwYWNrKHQpe1oud2ViZ2wucGFjaz10fWdldCBhc3luYygpe3JldHVybiBaLndlYmdsLmFzeW5jfXNldCBhc3luYyh0KXtaLndlYmdsLmFzeW5jPXR9aW5pdGlhbGl6ZSgpe3RyeXtyZXR1cm4gdGhpcy5nbENvbnRleHQ9SGkodGhpcy5jb250ZXh0SWQpLHR5cGVvZiB0aGlzLm1hdG11bE1heEJhdGNoU2l6ZSE9Im51bWJlciImJih0aGlzLm1hdG11bE1heEJhdGNoU2l6ZT0xNiksdHlwZW9mIHRoaXMudGV4dHVyZUNhY2hlTW9kZSE9InN0cmluZyImJih0aGlzLnRleHR1cmVDYWNoZU1vZGU9ImZ1bGwiKSx0eXBlb2YgdGhpcy5wYWNrIT0iYm9vbGVhbiImJih0aGlzLnBhY2s9ITEpLHR5cGVvZiB0aGlzLmFzeW5jIT0iYm9vbGVhbiImJih0aGlzLmFzeW5jPSExKSxjZS5zZXRXaXRoRW52KFopLFoud2ViZ2wuY29udGV4dHx8T2JqZWN0LmRlZmluZVByb3BlcnR5KFoud2ViZ2wsImNvbnRleHQiLHt2YWx1ZTp0aGlzLmdsQ29udGV4dC5nbH0pLGNlLnZlcmJvc2UoIldlYkdMQmFja2VuZCIsYENyZWF0ZWQgV2ViR0xDb250ZXh0OiAke3R5cGVvZiB0aGlzLmdsQ29udGV4dH0gd2l0aCBtYXRtdWxNYXhCYXRjaFNpemU6ICR7dGhpcy5tYXRtdWxNYXhCYXRjaFNpemV9OyB0ZXh0dXJlQ2FjaGVNb2RlOiAke3RoaXMudGV4dHVyZUNhY2hlTW9kZX07IHBhY2s6ICR7dGhpcy5wYWNrfTsgYXN5bmM6ICR7dGhpcy5hc3luY30uYCksITB9Y2F0Y2godCl7cmV0dXJuIGNlLndhcm5pbmcoIldlYkdMQmFja2VuZCIsYFVuYWJsZSB0byBpbml0aWFsaXplIFdlYkdMQmFja2VuZC4gJHt0fWApLCExfX1jcmVhdGVTZXNzaW9uSGFuZGxlcih0KXtyZXR1cm4gbmV3IHlvKHRoaXMsdCl9ZGlzcG9zZSgpe3RoaXMuZ2xDb250ZXh0LmRpc3Bvc2UoKX19fSk7YXN5bmMgZnVuY3Rpb24gcWkoYSl7aWYoYSl7bGV0IHQ9dHlwZW9mIGE9PSJzdHJpbmciP1thXTphO2ZvcihsZXQgbyBvZiB0KXtsZXQgZT1ocC5nZXQobyk7aWYoZSlyZXR1cm4gZTtsZXQgcj1hd2FpdCBKYihvKTtpZihyKXJldHVybiByfX1lbHNlIHJldHVybiBxaShbIndlYmdsIl0pO3Rocm93IG5ldyBFcnJvcigibm8gYXZhaWxhYmxlIGJhY2tlbmQgdG8gdXNlIil9YXN5bmMgZnVuY3Rpb24gSmIoYSl7bGV0IHQ9S2I7aWYodHlwZW9mIHRbYV08InUiJiZaYih0W2FdKSl7bGV0IG89dFthXSxlPW8uaW5pdGlhbGl6ZSgpO2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInRoZW4iaW4gZSYmKGU9YXdhaXQgZSksZSlyZXR1cm4gaHAuc2V0KGEsbyksb319ZnVuY3Rpb24gWmIoYSl7bGV0IHQ9YTtyZXR1cm4iaW5pdGlhbGl6ZSJpbiB0JiZ0eXBlb2YgdC5pbml0aWFsaXplPT0iZnVuY3Rpb24iJiYiY3JlYXRlU2Vzc2lvbkhhbmRsZXIiaW4gdCYmdHlwZW9mIHQuY3JlYXRlU2Vzc2lvbkhhbmRsZXI9PSJmdW5jdGlvbiImJiJkaXNwb3NlImluIHQmJnR5cGVvZiB0LmRpc3Bvc2U9PSJmdW5jdGlvbiJ9dmFyIGhwLEtiLG1wPUwoKCk9PnsidXNlIHN0cmljdCI7ZHAoKTtocD1uZXcgTWFwLEtiPXt3ZWJnbDpuZXcgVG99fSk7dmFyIGppLHhvLGJwPUwoKCk9PnsidXNlIHN0cmljdCI7bHQoKTtqaT1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8pe3RoaXMub3A9dDt0aGlzLm5vZGU9b319LHhvPWNsYXNze2NvbnN0cnVjdG9yKHQsbyxlKXt0aGlzLmdyYXBoPXQ7dGhpcy5wcm9maWxlcj1lO3RoaXMuaW5pdGlhbGl6ZShvKX1pbml0aWFsaXplKHQpe3RoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmluaXRpYWxpemUiLCgpPT57bGV0IG89dGhpcy5ncmFwaC5nZXROb2RlcygpO2lmKG8ubGVuZ3RoIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgc2l6ZSBvZiBub2RlcyBhbmQgT1BzIGRvIG5vdCBtYXRjaC4iKTt0aGlzLl9vcHM9dC5tYXAoKGUscik9Pm5ldyBqaShlLG9bcl0pKSx0aGlzLnJlc2V0KCksdGhpcy5fc3RhcnRlcj1bXSx0aGlzLl9vcHMuZm9yRWFjaCgoZSxyKT0+e2xldCBuPSEwO2ZvcihsZXQgcyBvZiBlLm5vZGUuaW5wdXRzKWlmKCF0aGlzLl92YWx1ZXNbc10mJnRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCkuaW5kZXhPZihzKT09PS0xKXtuPSExO2JyZWFrfW4mJnRoaXMuX3N0YXJ0ZXIucHVzaChyKX0pfSl9cmVzZXQoKXt0aGlzLl92YWx1ZXM9dGhpcy5ncmFwaC5nZXRWYWx1ZXMoKS5tYXAodD0+dC50ZW5zb3IpfWFzeW5jIGV4ZWN1dGUodCxvKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIkV4ZWN1dGlvblBsYW4uZXhlY3V0ZSIsYXN5bmMoKT0+e3RoaXMucmVzZXQoKTtsZXQgZT10LmNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKSxyPXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCk7aWYoby5sZW5ndGghPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzIGRvbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBtb2RlbDogYWN0dWFsOiAke28ubGVuZ3RofSBleHBlY3RlZDogJHtyLmxlbmd0aH1gKTtvLmZvckVhY2goKGMscCk9PntsZXQgZD1yW3BdO3RoaXMuX3ZhbHVlc1tkXT1jfSk7bGV0IG49dGhpcy5fc3RhcnRlci5zbGljZSgwKSxzPXRoaXMuZ3JhcGguZ2V0VmFsdWVzKCksaT10aGlzLmdyYXBoLmdldE5vZGVzKCksdT0wO2Zvcig7dTxuLmxlbmd0aDspe2xldCBjPW5bdSsrXSxwPXRoaXMuX29wc1tjXSxkPXAubm9kZS5pbnB1dHMubWFwKFM9PnRoaXMuX3ZhbHVlc1tTXSk7aWYoZC5pbmRleE9mKHZvaWQgMCkhPT0tMSl0aHJvdyBuZXcgRXJyb3IoYHVucmVzb2x2ZWQgaW5wdXQgZGV0ZWN0ZWQ6IG9wOiAke3Aubm9kZX1gKTtsZXQgVD1kO2NlLnZlcmJvc2UoIkV4ZWNQbGFuIixgUnVuaW5nIG9wOiR7cC5ub2RlLm5hbWV9ICgke1QubWFwKChTLEEpPT5gJyR7cC5ub2RlLmlucHV0c1tBXX0nOiAke1MudHlwZX1bJHtTLmRpbXMuam9pbigiLCIpfV1gKS5qb2luKCIsICIpfSlgKTtsZXQgdz1hd2FpdCB0aGlzLnByb2ZpbGVyLmV2ZW50KCJub2RlIixwLm5vZGUubmFtZSxhc3luYygpPT5wLm9wLmltcGwoZSxULHAub3AuY29udGV4dCkpO2lmKHcubGVuZ3RoIT09cC5ub2RlLm91dHB1dHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGhlIHNpemUgb2Ygb3V0cHV0IGRvZXMgbm90IG1hdGNoIG1vZGVsIGRlZmluaXRpb24uIik7dy5mb3JFYWNoKChTLEEpPT57bGV0IEM9cC5ub2RlLm91dHB1dHNbQV07aWYodGhpcy5fdmFsdWVzW0NdKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IFske0N9XSBhbHJlYWR5IGhhcyB2YWx1ZTogb3A6JHtwLm5vZGUubmFtZX1gKTt0aGlzLl92YWx1ZXNbQ109U30pO2xldCB2PW5ldyBTZXQ7dy5mb3JFYWNoKChTLEEpPT57bGV0IEM9cC5ub2RlLm91dHB1dHNbQV07Zm9yKGxldCBGIG9mIHNbQ10udG8pe2xldCBKPWlbRl0saj0hMDtmb3IobGV0IGllIG9mIEouaW5wdXRzKWlmKCF0aGlzLl92YWx1ZXNbaWVdKXtqPSExO2JyZWFrfWomJnYuYWRkKEYpfX0pLG4ucHVzaCguLi52KX1sZXQgbD1bXTtmb3IobGV0IGM9MDtjPHRoaXMuZ3JhcGguZ2V0T3V0cHV0SW5kaWNlcygpLmxlbmd0aDtjKyspe2xldCBwPXRoaXMuZ3JhcGguZ2V0T3V0cHV0SW5kaWNlcygpW2NdLGQ9dGhpcy5fdmFsdWVzW3BdO2lmKGQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGByZXF1aXJlZCBvdXRwdXQgWyR7cH1dIGRvZXMgbm90IGhhdmUgdmFsdWVgKTtwPT09MD9hd2FpdCBkLmdldERhdGEoKTpkLmRhdGEsbC5wdXNoKGQpfXJldHVybiBjZS52ZXJib3NlKCJFeGVjUGxhbiIsImRpc3Bvc2luZyBvZiBpbmZlcmVuY2VIYW5kbGVyIiksZS5kaXNwb3NlKCksbH0pfX19KTt2YXIgb2UsYnQsbW4sZ3A9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt0bigpO29lPUFyKENyKCkpO3lyKCk7ZmUoKTtidD1WLmV4cGVyaW1lbnRhbC5mYnMsbW49Y2xhc3MgYXtjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAsdCE9bnVsbCl7Zm9yKGxldCBvIG9mIHQpbyBpbnN0YW5jZW9mIG9lLm9ubnguQXR0cmlidXRlUHJvdG8/dGhpcy5fYXR0cmlidXRlcy5zZXQoby5uYW1lLFthLmdldFZhbHVlKG8pLGEuZ2V0VHlwZShvKV0pOm8gaW5zdGFuY2VvZiBidC5BdHRyaWJ1dGUmJnRoaXMuX2F0dHJpYnV0ZXMuc2V0KG8ubmFtZSgpLFthLmdldFZhbHVlKG8pLGEuZ2V0VHlwZShvKV0pO2lmKHRoaXMuX2F0dHJpYnV0ZXMuc2l6ZTx0Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZWQgYXR0cmlidXRlIG5hbWVzIil9fXNldCh0LG8sZSl7dGhpcy5fYXR0cmlidXRlcy5zZXQodCxbZSxvXSl9ZGVsZXRlKHQpe3RoaXMuX2F0dHJpYnV0ZXMuZGVsZXRlKHQpfWdldEZsb2F0KHQsbyl7cmV0dXJuIHRoaXMuZ2V0KHQsImZsb2F0IixvKX1nZXRJbnQodCxvKXtyZXR1cm4gdGhpcy5nZXQodCwiaW50IixvKX1nZXRTdHJpbmcodCxvKXtyZXR1cm4gdGhpcy5nZXQodCwic3RyaW5nIixvKX1nZXRUZW5zb3IodCxvKXtyZXR1cm4gdGhpcy5nZXQodCwidGVuc29yIixvKX1nZXRGbG9hdHModCxvKXtyZXR1cm4gdGhpcy5nZXQodCwiZmxvYXRzIixvKX1nZXRJbnRzKHQsbyl7cmV0dXJuIHRoaXMuZ2V0KHQsImludHMiLG8pfWdldFN0cmluZ3ModCxvKXtyZXR1cm4gdGhpcy5nZXQodCwic3RyaW5ncyIsbyl9Z2V0VGVuc29ycyh0LG8pe3JldHVybiB0aGlzLmdldCh0LCJ0ZW5zb3JzIixvKX1nZXQodCxvLGUpe2xldCByPXRoaXMuX2F0dHJpYnV0ZXMuZ2V0KHQpO2lmKHI9PT12b2lkIDApe2lmKGUhPT12b2lkIDApcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKGByZXF1aXJlZCBhdHRyaWJ1dGUgbm90IGZvdW5kOiAke3R9YCl9aWYoclsxXSE9PW8pdGhyb3cgbmV3IEVycm9yKGB0eXBlIG1pc21hdGNoOiBleHBlY3RlZCAke299IGJ1dCBnb3QgJHtyWzFdfWApO3JldHVybiByWzBdfXN0YXRpYyBnZXRUeXBlKHQpe2xldCBvPXQgaW5zdGFuY2VvZiBvZS5vbm54LkF0dHJpYnV0ZVByb3RvP3QudHlwZTp0LnR5cGUoKTtzd2l0Y2gobyl7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVQ6cmV0dXJuImZsb2F0IjtjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuImludCI7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HOnJldHVybiJzdHJpbmciO2Nhc2Ugb2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4idGVuc29yIjtjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVFM6cmV0dXJuImZsb2F0cyI7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UUzpyZXR1cm4iaW50cyI7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUzpyZXR1cm4ic3RyaW5ncyI7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUzpyZXR1cm4idGVuc29ycyI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiAke29lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtvXX1gKX19c3RhdGljIGdldFZhbHVlKHQpe2xldCBvPXQgaW5zdGFuY2VvZiBvZS5vbm54LkF0dHJpYnV0ZVByb3RvP3QudHlwZTp0LnR5cGUoKTtpZihvPT09b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIfHxvPT09b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIUyl0aHJvdyBuZXcgRXJyb3IoImdyYXBoIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2xldCBlPXRoaXMuZ2V0VmFsdWVOb0NoZWNrKHQpO2lmKG89PT1vZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UJiZpdC5pc0xvbmcoZSkpcmV0dXJuIGl0LmxvbmdUb051bWJlcihlKTtpZihvPT09b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVFMpe2xldCByPWUsbj1uZXcgQXJyYXkoci5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cysrKXtsZXQgaT1yW3NdO25bc109aXQubG9uZ1RvTnVtYmVyKGkpfXJldHVybiBufWlmKG89PT1vZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SKXJldHVybiB0IGluc3RhbmNlb2Ygb2Uub25ueC5BdHRyaWJ1dGVQcm90bz8kZS5mcm9tUHJvdG8oZSk6JGUuZnJvbU9ydFRlbnNvcihlKTtpZihvPT09b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUlMpe2lmKHQgaW5zdGFuY2VvZiBvZS5vbm54LkF0dHJpYnV0ZVByb3RvKXJldHVybiBlLm1hcChuPT4kZS5mcm9tUHJvdG8obikpO2lmKHQgaW5zdGFuY2VvZiBidC5BdHRyaWJ1dGUpcmV0dXJuIGUubWFwKG49PiRlLmZyb21PcnRUZW5zb3IobikpfXJldHVybiBvPT09b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklORyYmdCBpbnN0YW5jZW9mIG9lLm9ubnguQXR0cmlidXRlUHJvdG8/c24oZSk6bz09PW9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTJiZ0IGluc3RhbmNlb2Ygb2Uub25ueC5BdHRyaWJ1dGVQcm90bz9lLm1hcChzbik6ZX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygb2Uub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KHQpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdCh0KX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQodCl7c3dpdGNoKHQudHlwZSl7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVQ6cmV0dXJuIHQuZjtjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIHQuaTtjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIHQucztjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuIHQudDtjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gdC5nO2Nhc2Ugb2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gdC5mbG9hdHM7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UUzpyZXR1cm4gdC5pbnRzO2Nhc2Ugb2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuIHQuc3RyaW5ncztjYXNlIG9lLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiB0LnRlbnNvcnM7Y2FzZSBvZS5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEhTOnJldHVybiB0LmdyYXBocztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYXR0cmlidXRlIHR5cGU6ICR7b2Uub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlW3QudHlwZV19YCl9fXN0YXRpYyBnZXRWYWx1ZU5vQ2hlY2tGcm9tT3J0Rm9ybWF0KHQpe3N3aXRjaCh0LnR5cGUoKSl7Y2FzZSBidC5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiB0LmYoKTtjYXNlIGJ0LkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiB0LmkoKTtjYXNlIGJ0LkF0dHJpYnV0ZVR5cGUuU1RSSU5HOnJldHVybiB0LnMoKTtjYXNlIGJ0LkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiB0LnQoKTtjYXNlIGJ0LkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIHQuZygpO2Nhc2UgYnQuQXR0cmlidXRlVHlwZS5GTE9BVFM6cmV0dXJuIHQuZmxvYXRzQXJyYXkoKTtjYXNlIGJ0LkF0dHJpYnV0ZVR5cGUuSU5UUzp7bGV0IG89W107Zm9yKGxldCBlPTA7ZTx0LmludHNMZW5ndGgoKTtlKyspby5wdXNoKHQuaW50cyhlKSk7cmV0dXJuIG99Y2FzZSBidC5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6e2xldCBvPVtdO2ZvcihsZXQgZT0wO2U8dC5zdHJpbmdzTGVuZ3RoKCk7ZSsrKW8ucHVzaCh0LnN0cmluZ3MoZSkpO3JldHVybiBvfWNhc2UgYnQuQXR0cmlidXRlVHlwZS5URU5TT1JTOntsZXQgbz1bXTtmb3IobGV0IGU9MDtlPHQudGVuc29yc0xlbmd0aCgpO2UrKylvLnB1c2godC50ZW5zb3JzKGUpKTtyZXR1cm4gb31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYXR0cmlidXRlIHR5cGU6ICR7YnQuQXR0cmlidXRlVHlwZVt0LnR5cGUoKV19YCl9fX19KTt2YXIgWGksd28sS2ksTXQsdm8sWWkseXA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtncCgpO3RuKCk7WGk9QXIoQ3IoKSk7eXIoKTtmZSgpO3dvPVYuZXhwZXJpbWVudGFsLmZicyxLaT17ZnJvbTooYSx0KT0+bmV3IFlpKGEsdCl9LE10PWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2Zyb209dm9pZCAwLHRoaXMuX3RvPVtdLHRoaXMudGVuc29yPXZvaWQgMCx0aGlzLnR5cGU9dm9pZCAwLHQmJih0aGlzLnR5cGU9V2UudGVuc29yVmFsdWVUeXBlRnJvbVByb3RvKHQudHlwZS50ZW5zb3JUeXBlKSl9Z2V0IGZyb20oKXtyZXR1cm4gdGhpcy5fZnJvbX1nZXQgdG8oKXtyZXR1cm4gdGhpcy5fdG99fSx2bz1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8pe3QgaW5zdGFuY2VvZiBYaS5vbm54Lk5vZGVQcm90bz8odGhpcy5uYW1lPXQubmFtZSx0aGlzLm9wVHlwZT10Lm9wVHlwZSx0aGlzLmF0dHJpYnV0ZXM9bmV3IG1uKHQuYXR0cmlidXRlKSk6dCBpbnN0YW5jZW9mIHdvLk5vZGUmJih0aGlzLm5hbWU9bz8/dC5uYW1lKCksdGhpcy5vcFR5cGU9dC5vcFR5cGUoKSx0aGlzLmF0dHJpYnV0ZXM9bmV3IG1uKFdlLnRlbnNvckF0dHJpYnV0ZXNGcm9tT1JURm9ybWF0KHQpKSksdGhpcy5pbnB1dHM9W10sdGhpcy5vdXRwdXRzPVtdLHRoaXMuZXhlY3V0ZU5vZGU9ITB9fSxZaT1jbGFzc3tjb25zdHJ1Y3Rvcih0LG8pe2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoImdyYXBoIGlzIGVtcHR5Iik7dGhpcy5idWlsZEdyYXBoKHQpLHRoaXMudHJhbnNmb3JtR3JhcGgobyksdGhpcy5jaGVja0lzQWN5Y2xpYygpfWdldElucHV0SW5kaWNlcygpe3JldHVybiB0aGlzLl9hbGxJbnB1dEluZGljZXN9Z2V0SW5wdXROYW1lcygpe3JldHVybiB0aGlzLl9hbGxJbnB1dE5hbWVzfWdldE91dHB1dEluZGljZXMoKXtyZXR1cm4gdGhpcy5fYWxsT3V0cHV0SW5kaWNlc31nZXRPdXRwdXROYW1lcygpe3JldHVybiB0aGlzLl9hbGxPdXRwdXROYW1lc31nZXRWYWx1ZXMoKXtyZXR1cm4gdGhpcy5fYWxsRGF0YX1nZXROb2Rlcygpe3JldHVybiB0aGlzLl9ub2Rlc31idWlsZEdyYXBoKHQpe2lmKHQgaW5zdGFuY2VvZiBYaS5vbm54LkdyYXBoUHJvdG8pdGhpcy5idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQodCk7ZWxzZSBpZih0IGluc3RhbmNlb2Ygd28uR3JhcGgpdGhpcy5idWlsZEdyYXBoRnJvbU9ydEZvcm1hdCh0KTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIkdyYXBoIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4iKX1idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQodCl7bGV0IG89bmV3IE1hcDt0aGlzLl9hbGxEYXRhPVtdLHRoaXMuX2FsbElucHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxJbnB1dE5hbWVzPVtdLHRoaXMuX2FsbE91dHB1dEluZGljZXM9W10sdGhpcy5fYWxsT3V0cHV0TmFtZXM9W10sdGhpcy5fbm9kZXM9W107bGV0IGU9bmV3IE1hcDtpZighdC5pbnB1dCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IGlucHV0Iik7bGV0IHI9W107Zm9yKGxldCBuIG9mIHQuaW5wdXQpe2lmKG8uaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIGlucHV0IG5hbWU6ICR7bi5uYW1lfWApO2xldCBzPXRoaXMuX2FsbERhdGEucHVzaChuZXcgTXQobikpLTE7by5zZXQobi5uYW1lLHMpLHIucHVzaChuLm5hbWUpfWlmKCF0LmluaXRpYWxpemVyKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogaW5pdGlhbGl6ZXIiKTtmb3IobGV0IG4gb2YgdC5pbml0aWFsaXplcil7bGV0IHM9by5nZXQobi5uYW1lKTtpZihzPT09dm9pZCAwKXtsZXQgaT1uZXcgTXQ7aS50eXBlPXtzaGFwZTp7ZGltczpXZS50ZW5zb3JEaW1zRnJvbVByb3RvKG4uZGltcyl9LHRlbnNvclR5cGU6V2UudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8obi5kYXRhVHlwZSl9LHM9dGhpcy5fYWxsRGF0YS5wdXNoKGkpLTEsby5zZXQobi5uYW1lLHMpfXRoaXMuX2FsbERhdGFbc10uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVtzXS50ZW5zb3I9JGUuZnJvbVByb3RvKG4pfWZvcihsZXQgbj0wO248dGhpcy5fYWxsRGF0YS5sZW5ndGg7bisrKXRoaXMuX2FsbERhdGFbbl0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2gobiksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHJbbl0pKTtpZighdC5vdXRwdXQpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBvdXRwdXQiKTtmb3IobGV0IG4gb2YgdC5vdXRwdXQpe2lmKG8uaGFzKG4ubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG91dHB1dCBuYW1lOiAke24ubmFtZX1gKTtsZXQgcz10aGlzLl9hbGxEYXRhLnB1c2gobmV3IE10KG4pKS0xO28uc2V0KG4ubmFtZSxzKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2gocyksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChuLm5hbWUpfWlmKCF0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBub2RlIik7Zm9yKGxldCBuIG9mIHQubm9kZSl7aWYoIW4ubmFtZSlmb3IobGV0IGk9MDs7aSsrKXtsZXQgdT1gdW5uYW1lZF8ke24ub3BUeXBlfV8ke2l9YDtpZighZS5oYXModSkpe24ubmFtZT11O2JyZWFrfX1pZihlLmhhcyhuLm5hbWUpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBub2RlIG5hbWU6ICR7bi5uYW1lfWApO2xldCBzPXRoaXMuX25vZGVzLnB1c2gobmV3IHZvKG4pKS0xO2Uuc2V0KG4ubmFtZSxzKX1mb3IobGV0IG49MDtuPHRoaXMuX25vZGVzLmxlbmd0aDtuKyspe2xldCBzPXRoaXMuX25vZGVzW25dLGk9dC5ub2RlW25dO2lmKCFpLm91dHB1dCl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke2kubmFtZX1gKTtmb3IobGV0IHUgb2YgaS5vdXRwdXQpe2xldCBsPW8uZ2V0KHUpO2lmKHR5cGVvZiBsPiJ1IiYmKGw9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBNdCktMSxvLnNldCh1LGwpKSxzLm91dHB1dHMucHVzaChsKSx0aGlzLl9hbGxEYXRhW2xdLl9mcm9tIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2x9YCk7aWYodGhpcy5fYWxsRGF0YVtsXS5fZnJvbT1uLGkub3BUeXBlPT09IkNvbnN0YW50Iil7aWYoIWkuYXR0cmlidXRlfHxpLmF0dHJpYnV0ZS5sZW5ndGghPT0xfHwhaS5hdHRyaWJ1dGVbMF0udCl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgYXR0cmlidXRlcyBvciBtaXNzaW5nIHRlbnNvciB2YWx1ZSBpbiBhdHRyaWJ1dGVzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7aWYoIWkub3V0cHV0fHxpLm91dHB1dC5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBvdXRwdXQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBvdXRwdXRzIGZvciB0aGlzIENvbnN0YW50IG9wZXJhdG9yIik7cy5vdXRwdXRzLnBvcCgpLHMuZXhlY3V0ZU5vZGU9ITEsdGhpcy5fYWxsRGF0YVtsXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2xdLnRlbnNvcj0kZS5mcm9tUHJvdG8oaS5hdHRyaWJ1dGVbMF0udCl9fX1mb3IobGV0IG49MDtuPHRoaXMuX25vZGVzLmxlbmd0aDtuKyspe2xldCBzPXRoaXMuX25vZGVzW25dLGk9dC5ub2RlW25dO2lmKCFpLmlucHV0KXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBpbnB1dCBmb3Igbm9kZTogJHtpLm5hbWV9YCk7Zm9yKGxldCB1IG9mIGkuaW5wdXQpe2xldCBsPW8uZ2V0KHUpO2lmKHR5cGVvZiBsPiJ1Iil7aWYodT09PSIiJiYoaS5pbnB1dC5sZW5ndGg9PT0zfHxpLmlucHV0Lmxlbmd0aD09PTQpJiZpLm9wVHlwZT09PSJSZXNpemUiKWNvbnRpbnVlO3Rocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIGlucHV0ICcke3V9JyBmb3Igbm9kZTogJHtpLm5hbWV9YCl9cy5pbnB1dHMucHVzaChsKSx0aGlzLl9hbGxEYXRhW2xdLl90by5wdXNoKG4pfX1yZXR1cm4hMH1idWlsZEdyYXBoRnJvbU9ydEZvcm1hdCh0KXtsZXQgbz1uZXcgTWFwO3RoaXMuX2FsbERhdGE9W10sdGhpcy5fYWxsSW5wdXRJbmRpY2VzPVtdLHRoaXMuX2FsbElucHV0TmFtZXM9W10sdGhpcy5fYWxsT3V0cHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxPdXRwdXROYW1lcz1bXSx0aGlzLl9ub2Rlcz1bXTtsZXQgZT1uZXcgTWFwLHI9W107Zm9yKGxldCBuPTA7bjx0LmlucHV0c0xlbmd0aCgpO24rKyl7bGV0IHM9dC5pbnB1dHMobik7aWYoby5oYXMocykpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIGlucHV0IG5hbWU6ICR7c31gKTtmb3IobGV0IGk9MDtpPHQubm9kZUFyZ3NMZW5ndGgoKTtpKyspaWYodC5ub2RlQXJncyhpKT8ubmFtZSgpPT09cyl7bGV0IHU9bmV3IE10O2lmKHQubm9kZUFyZ3MoaSk/LnR5cGUoKT8udmFsdWVUeXBlKCkhPT13by5UeXBlSW5mb1ZhbHVlLnRlbnNvcl90eXBlKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIGZvciB0aGUgbm9kZUFyZy4iKTtsZXQgYz10Lm5vZGVBcmdzKGkpLnR5cGUoKS52YWx1ZShuZXcgd28uVGVuc29yVHlwZUFuZFNoYXBlKSxwPVdlLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGMuZWxlbVR5cGUoKSksZD1jLnNoYXBlKCksVD1bXTtmb3IobGV0IHY9MDt2PGQuZGltTGVuZ3RoKCk7disrKVQucHVzaChpdC5sb25nVG9OdW1iZXIoZC5kaW0odikudmFsdWUoKS5kaW1WYWx1ZSgpKSk7dS50eXBlPXtzaGFwZTp7ZGltczpUfSx0ZW5zb3JUeXBlOnB9O2xldCB3PXRoaXMuX2FsbERhdGEucHVzaCh1KS0xO28uc2V0KHMsdyksci5wdXNoKHMpfX1mb3IobGV0IG49MDtuPHQuaW5pdGlhbGl6ZXJzTGVuZ3RoKCk7bisrKXtsZXQgcz10LmluaXRpYWxpemVycyhuKSxpPW8uZ2V0KHMubmFtZSgpKTtpZihpPT09dm9pZCAwKXtsZXQgdT1uZXcgTXQsbD1XZS50ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChzKSxjPVdlLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKHMuZGF0YVR5cGUoKSk7dS50eXBlPXtzaGFwZTp7ZGltczpsfSx0ZW5zb3JUeXBlOmN9LGk9dGhpcy5fYWxsRGF0YS5wdXNoKHUpLTEsby5zZXQocy5uYW1lKCksaSl9dGhpcy5fYWxsRGF0YVtpXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2ldLnRlbnNvcj0kZS5mcm9tT3J0VGVuc29yKHMpfWZvcihsZXQgbj0wO248dGhpcy5fYWxsRGF0YS5sZW5ndGg7bisrKXRoaXMuX2FsbERhdGFbbl0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2gobiksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHJbbl0pKTtmb3IobGV0IG49MDtuPHQub3V0cHV0c0xlbmd0aCgpO24rKyl7bGV0IHM9dC5vdXRwdXRzKG4pO2lmKG8uaGFzKHMpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBvdXRwdXQgbmFtZTogJHtzfWApO2xldCBpPXRoaXMuX2FsbERhdGEucHVzaChuZXcgTXQpLTE7by5zZXQocyxpKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2goaSksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChzKX1pZighdC5ub2Rlcyl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IobGV0IG49MDtuPHQubm9kZXNMZW5ndGgoKTtuKyspe2xldCBzPXQubm9kZXMobiksaT1zLm5hbWUoKTtpZighaSlmb3IobGV0IGw9MDtpPWB1bm5hbWVkXyR7cy5vcFR5cGUoKX1fJHtsfWAsISFlLmhhcyhpKTtsKyspO2lmKGUuaGFzKGkpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBub2RlIG5hbWU6ICR7aX1gKTtsZXQgdT10aGlzLl9ub2Rlcy5wdXNoKG5ldyB2byhzLGkpKS0xO2Uuc2V0KGksdSl9Zm9yKGxldCBuPTA7bjx0aGlzLl9ub2Rlcy5sZW5ndGg7bisrKXtsZXQgcz10aGlzLl9ub2Rlc1tuXSxpPXQubm9kZXMobik7aWYoaT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYE5vIG5vZGUgZXhpc3RzIGF0IGluZGV4ICR7bn1gKTtpZihpPy5vdXRwdXRzTGVuZ3RoKCk9PT0wKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBvdXRwdXQgZm9yIG5vZGU6ICR7aS5uYW1lfWApO2ZvcihsZXQgdT0wO3U8aT8ub3V0cHV0c0xlbmd0aCgpO3UrKyl7bGV0IGw9aT8ub3V0cHV0cyh1KSxjPW8uZ2V0KGwpO2lmKHR5cGVvZiBjPiJ1IiYmKGM9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBNdCktMSxvLnNldChsLGMpKSxzLm91dHB1dHMucHVzaChjKSx0aGlzLl9hbGxEYXRhW2NdLl9mcm9tIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2N9YCk7aWYodGhpcy5fYWxsRGF0YVtjXS5fZnJvbT1uLGkub3BUeXBlKCk9PT0iQ29uc3RhbnQiKXtpZihpLmF0dHJpYnV0ZXNMZW5ndGgoKSE9PTF8fCFpLmF0dHJpYnV0ZXMoMCkudCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZihpLm91dHB1dHNMZW5ndGgoKSE9PTEpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtzLm91dHB1dHMucG9wKCkscy5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW2NdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbY10udGVuc29yPSRlLmZyb21PcnRUZW5zb3IoaS5hdHRyaWJ1dGVzKDApLnQoKSl9fX1mb3IobGV0IG49MDtuPHRoaXMuX25vZGVzLmxlbmd0aDtuKyspe2xldCBzPXRoaXMuX25vZGVzW25dLGk9dC5ub2RlcyhuKTtpZihpLmlucHV0c0xlbmd0aCgpPT09MCl0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgaW5wdXQgZm9yIG5vZGU6ICR7aS5uYW1lfWApO2ZvcihsZXQgdT0wO3U8aS5pbnB1dHNMZW5ndGgoKTt1Kyspe2xldCBsPWkuaW5wdXRzKHUpLGM9by5nZXQobCk7aWYodHlwZW9mIGM+InUiKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIGlucHV0ICcke2x9JyBmb3Igbm9kZTogJHtpLm5hbWUoKX1gKTtzLmlucHV0cy5wdXNoKGMpLHRoaXMuX2FsbERhdGFbY10uX3RvLnB1c2gobil9fX1jaGVja0lzQWN5Y2xpYygpe2xldCB0PW5ldyBTZXQ7dGhpcy5fYWxsSW5wdXRJbmRpY2VzLmZvckVhY2gocj0+e3RoaXMuX2FsbERhdGFbcl0uX3RvLmZvckVhY2gocz0+e3QuYWRkKHMpfSl9KTtsZXQgbz1BcnJheS5mcm9tKHQpLGU9bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCkuZmlsbCgid2hpdGUiKTtmb3IoO28ubGVuZ3RoPjA7KXtsZXQgcj1vLnBvcCgpO2Vbcl09PT0iZ3JheSI/ZVtyXT0iYmxhY2siOihvLnB1c2gociksZVtyXT0iZ3JheSIsdGhpcy5fbm9kZXNbcl0ub3V0cHV0cy5mb3JFYWNoKG49PntsZXQgcz10aGlzLl9hbGxEYXRhW25dO2lmKHR5cGVvZiBzLnRlbnNvcjwidSIpdGhyb3cgbmV3IEVycm9yKCJub2RlIG91dHB1dHMgc2hvdWxkIG5vdCBiZSBpbml0aWFsaXplZCIpO2lmKHMuX2Zyb20hPT1yKXRocm93IG5ldyBFcnJvcigiZnJvbSBwcm9wZXJ0eSBvZiB0aGUgVmFsdWUgb2JqZWN0IGRvZXNuJ3QgbWF0Y2ggaW5kZXggb2YgTm9kZSBiZWluZyBwcm9jZXNzZWQiKTtzLl90by5mb3JFYWNoKGk9PntpZihlW2ldPT09ImdyYXkiKXRocm93IG5ldyBFcnJvcigibW9kZWwgZ3JhcGggaXMgY3ljbGljIik7ZVtpXT09PSJ3aGl0ZSImJm8ucHVzaChpKX0pfSkpfX10cmFuc2Zvcm1HcmFwaCh0KXt0aGlzLnJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKSx0aGlzLnJlbW92ZUFsbERyb3BvdXROb2RlcygpLHRoaXMuZnVzZUNvbnZBY3RpdmF0aW9uTm9kZXMoKSx0JiZ0LnRyYW5zZm9ybUdyYXBoKHRoaXMpLHRoaXMuZmluYWxpemVHcmFwaCgpfWZpbmFsaXplR3JhcGgoKXtsZXQgdD0wLG89bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCwwKSxlPTA7Zm9yKGxldCByPTA7cjx0aGlzLl9ub2Rlcy5sZW5ndGg7cisrKW9bcl09ZSx0aGlzLl9ub2Rlc1tyXS5leGVjdXRlTm9kZT8oZSE9PXImJih0aGlzLl9ub2Rlc1tlXT10aGlzLl9ub2Rlc1tyXSksZSsrKTp0aGlzLl9ub2Rlc1tyXS5vdXRwdXRzLmZvckVhY2gobj0+e3RoaXMuX2FsbERhdGFbbl0uX2Zyb209LTJ9KTt0aGlzLl9ub2Rlcy5zcGxpY2UoZSx0aGlzLl9ub2Rlcy5sZW5ndGgtZSk7Zm9yKGxldCByPTA7cjx0aGlzLl9hbGxEYXRhLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuX2FsbERhdGFbcl07bi5fZnJvbSE9PXZvaWQgMCYmbi5fZnJvbSE9PS0xJiZuLl9mcm9tIT09LTImJihuLl9mcm9tPW9bbi5fZnJvbV0pO2ZvcihsZXQgcz0wO3M8bi5fdG8ubGVuZ3RoO3MrKylpZihuLl90b1tzXT49MCluLl90b1tzXT1vW24uX3RvW3NdXTtlbHNlIHRocm93IG5ldyBFcnJvcigiVHJ5aW5nIHRvIHVwZGF0ZSBhIHJlbW92ZWQgbm9kZSIpfXQ9MDtmb3IobGV0IHI9MDtyPHRoaXMuX2FsbERhdGEubGVuZ3RoO3IrKyl7aWYodGhpcy5fYWxsRGF0YVtyXS5mcm9tPT09LTImJnRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZihyK3QpPT09LTEpe3QrKyx0aGlzLl9hbGxEYXRhLnNwbGljZShyLDEpLHItLTtjb250aW51ZX1pZih0PjApe2xldCBuPS0xO3RoaXMuX2FsbERhdGFbcl0uZnJvbSE9PXZvaWQgMCYmdGhpcy5fYWxsRGF0YVtyXS5mcm9tIT09LTE/KG49dGhpcy5fbm9kZXNbdGhpcy5fYWxsRGF0YVtyXS5mcm9tXS5vdXRwdXRzLmluZGV4T2Yocit0KSxuIT09LTEmJih0aGlzLl9ub2Rlc1t0aGlzLl9hbGxEYXRhW3JdLmZyb21dLm91dHB1dHNbbl09cikpOihuPXRoaXMuX2FsbElucHV0SW5kaWNlcy5pbmRleE9mKHIrdCksbiE9PS0xJiYodGhpcy5fYWxsSW5wdXRJbmRpY2VzW25dPXIpKSx0aGlzLl9hbGxEYXRhW3JdLnRvLmZvckVhY2gocz0+e249dGhpcy5fbm9kZXNbc10uaW5wdXRzLmluZGV4T2Yocit0KSxuIT09LTEmJih0aGlzLl9ub2Rlc1tzXS5pbnB1dHNbbl09cil9KSx0aGlzLl9hbGxEYXRhW3JdLnRvLmxlbmd0aD09PTAmJihuPXRoaXMuX2FsbE91dHB1dEluZGljZXMuaW5kZXhPZihyK3QpLG4hPT0tMSYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbbl09cikpfX19ZGVsZXRlTm9kZSh0KXtsZXQgbz10aGlzLl9ub2Rlc1t0XTtpZihvLm91dHB1dHMubGVuZ3RoPjEpe2ZvcihsZXQgaT0xO2k8by5vdXRwdXRzLmxlbmd0aDtpKyspaWYodGhpcy5fYWxsRGF0YVtvLm91dHB1dHNbaV1dLnRvLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiTm9kZSBkZWxldGlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgb3V0cHV0IGNvbm5lY3RlZCB0byBvdGhlciBub2RlcyBpcyBub3Qgc3VwcG9ydGVkLiAiKX1vLmV4ZWN1dGVOb2RlPSExO2xldCBlPW8uaW5wdXRzWzBdLHI9by5vdXRwdXRzWzBdLG49dGhpcy5fYWxsRGF0YVtyXS50bztmb3IobGV0IGk9MDtpPG8uaW5wdXRzLmxlbmd0aDtpKyspe2xldCB1PXRoaXMuX2FsbERhdGFbby5pbnB1dHNbaV1dLnRvLmluZGV4T2YodCk7aWYodT09PS0xKXRocm93IG5ldyBFcnJvcigiVGhlIFZhbHVlIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIGN1cnJlbnQgTm9kZSBpbiBpdCdzICd0bycgcHJvcGVydHkgIik7dGhpcy5fYWxsRGF0YVtvLmlucHV0c1tpXV0udG8uc3BsaWNlKHUsMSl9dGhpcy5fYWxsRGF0YVtyXS5fdG89W107bGV0IHM9dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHIpO2lmKHMhPT0tMSYmKHRoaXMuX2FsbE91dHB1dEluZGljZXNbc109ZSksbiYmbi5sZW5ndGg+MClmb3IobGV0IGkgb2Ygbil7bGV0IHU9dGhpcy5fbm9kZXNbaV0uaW5wdXRzLmluZGV4T2Yocik7aWYodT09PS0xKXRocm93IG5ldyBFcnJvcigiVGhlIE5vZGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgb3V0cHV0IFZhbHVlIGluIGl0J3MgJ2lucHV0cycgcHJvcGVydHkgIik7dGhpcy5fbm9kZXNbaV0uaW5wdXRzW3VdPWUsdGhpcy5fYWxsRGF0YVtlXS50by5wdXNoKGkpfX1yZW1vdmVBbGxEcm9wb3V0Tm9kZXMoKXtsZXQgdD0wO2ZvcihsZXQgbyBvZiB0aGlzLl9ub2Rlcyl7aWYoby5vcFR5cGU9PT0iRHJvcG91dCIpe2lmKG8uaW5wdXRzLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIGlucHV0LiAiKTtpZihvLm91dHB1dHMubGVuZ3RoIT09MSYmby5vdXRwdXRzLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBjb250YWluIGVpdGhlciAxIG9yIDIgb3V0cHV0KHMpIik7aWYoby5vdXRwdXRzLmxlbmd0aD09PTImJnRoaXMuX2FsbERhdGFbby5vdXRwdXRzWzFdXS5fdG8ubGVuZ3RoIT09MCl0aHJvdyBuZXcgRXJyb3IoIkRyb3BvdXQgbm9kZXMncyBzZWNvbmQgb3V0cHV0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBieSBvdGhlciBub2RlcyIpO3RoaXMuZGVsZXRlTm9kZSh0KX10Kyt9fXJlbW92ZUFsbElkZW50aXR5Tm9kZXMoKXtsZXQgdD0wO2ZvcihsZXQgbyBvZiB0aGlzLl9ub2RlcylvLm9wVHlwZT09PSJJZGVudGl0eSImJnRoaXMuZGVsZXRlTm9kZSh0KSx0Kyt9aXNBY3RpdmF0aW9uKHQpe3N3aXRjaCh0Lm9wVHlwZSl7Y2FzZSJSZWx1IjpjYXNlIlNpZ21vaWQiOmNhc2UiQ2xpcCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVzZUNvbnZBY3RpdmF0aW9uTm9kZXMoKXtmb3IobGV0IHQgb2YgdGhpcy5fbm9kZXMpaWYodC5vcFR5cGU9PT0iQ29udiIpe2xldCBvPXRoaXMuX2FsbERhdGFbdC5vdXRwdXRzWzBdXS5fdG87aWYoby5sZW5ndGg9PT0xJiZ0aGlzLmlzQWN0aXZhdGlvbih0aGlzLl9ub2Rlc1tvWzBdXSkpe2xldCBlPXRoaXMuX25vZGVzW29bMF1dO2lmKGUub3BUeXBlPT09IkNsaXAiKWlmKGUuaW5wdXRzLmxlbmd0aD09PTEpdHJ5e3QuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb25fcGFyYW1zIiwiZmxvYXRzIixbZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtaW4iKSxlLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1heCIpXSl9Y2F0Y2h7dC5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbl9wYXJhbXMiLCJmbG9hdHMiLFticixncl0pfWVsc2UgaWYoZS5pbnB1dHMubGVuZ3RoPj0zJiZ0aGlzLl9hbGxEYXRhW2UuaW5wdXRzWzFdXS50ZW5zb3IhPT12b2lkIDAmJnRoaXMuX2FsbERhdGFbZS5pbnB1dHNbMl1dLnRlbnNvciE9PXZvaWQgMCl0LmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW3RoaXMuX2FsbERhdGFbZS5pbnB1dHNbMV1dLnRlbnNvci5mbG9hdERhdGFbMF0sdGhpcy5fYWxsRGF0YVtlLmlucHV0c1syXV0udGVuc29yLmZsb2F0RGF0YVswXV0pO2Vsc2UgY29udGludWU7dC5hdHRyaWJ1dGVzLnNldCgiYWN0aXZhdGlvbiIsInN0cmluZyIsZS5vcFR5cGUpLHRoaXMuZGVsZXRlTm9kZShvWzBdKX19fX19KTt2YXIgVHAsUWIsX28seHA9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt6bigpO3lwKCk7dG4oKTtUcD1BcihDcigpKTtmZSgpO1FiPVYuZXhwZXJpbWVudGFsLmZicyxfbz1jbGFzc3tjb25zdHJ1Y3Rvcigpe31sb2FkKHQsbyxlKXtsZXQgcjtpZighZSl0cnl7dGhpcy5sb2FkRnJvbU9ubnhGb3JtYXQodCxvKTtyZXR1cm59Y2F0Y2gobil7aWYoZSE9PXZvaWQgMCl0aHJvdyBuO3I9bn10cnl7dGhpcy5sb2FkRnJvbU9ydEZvcm1hdCh0LG8pfWNhdGNoKG4pe3Rocm93IGUhPT12b2lkIDA/bjpuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1vZGVsIGFzIE9OTlggZm9ybWF0OiAke3J9CmFzIE9SVCBmb3JtYXQ6ICR7bn1gKX19bG9hZEZyb21Pbm54Rm9ybWF0KHQsbyl7bGV0IGU9VHAub25ueC5Nb2RlbFByb3RvLmRlY29kZSh0KTtpZihpdC5sb25nVG9OdW1iZXIoZS5pclZlcnNpb24pPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9ZS5vcHNldEltcG9ydC5tYXAobj0+KHtkb21haW46bi5kb21haW4sdmVyc2lvbjppdC5sb25nVG9OdW1iZXIobi52ZXJzaW9uKX0pKSx0aGlzLl9ncmFwaD1LaS5mcm9tKGUuZ3JhcGgsbyl9bG9hZEZyb21PcnRGb3JtYXQodCxvKXtsZXQgZT1uZXcgXy5CeXRlQnVmZmVyKHQpLHI9UWIuSW5mZXJlbmNlU2Vzc2lvbi5nZXRSb290QXNJbmZlcmVuY2VTZXNzaW9uKGUpLm1vZGVsKCk7aWYoaXQubG9uZ1RvTnVtYmVyKHIuaXJWZXJzaW9uKCkpPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9W107Zm9yKGxldCBzPTA7czxyLm9wc2V0SW1wb3J0TGVuZ3RoKCk7cysrKXtsZXQgaT1yLm9wc2V0SW1wb3J0KHMpO3RoaXMuX29wc2V0cy5wdXNoKHtkb21haW46aT8uZG9tYWluKCksdmVyc2lvbjppdC5sb25nVG9OdW1iZXIoaS52ZXJzaW9uKCkpfSl9dGhpcy5fZ3JhcGg9S2kuZnJvbShyLmdyYXBoKCksbyl9Z2V0IGdyYXBoKCl7cmV0dXJuIHRoaXMuX2dyYXBofWdldCBvcHNldHMoKXtyZXR1cm4gdGhpcy5fb3BzZXRzfX19KTt2YXIgT28sd3A9TCgoKT0+eyJ1c2Ugc3RyaWN0IjttcCgpO2JwKCk7bHQoKTt4cCgpO09vPWNsYXNze2NvbnN0cnVjdG9yKHQ9e30pe3RoaXMuX2luaXRpYWxpemVkPSExLHRoaXMuYmFja2VuZEhpbnQ9dC5iYWNrZW5kSGludCx0aGlzLnByb2ZpbGVyPUduLmNyZWF0ZSh0LnByb2ZpbGVyKSx0aGlzLmNvbnRleHQ9e3Byb2ZpbGVyOnRoaXMucHJvZmlsZXIsZ3JhcGhJbnB1dFR5cGVzOltdLGdyYXBoSW5wdXREaW1zOltdfX1nZXQgaW5wdXROYW1lcygpe3JldHVybiB0aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCl9Z2V0IG91dHB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCl9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnByb2ZpbGVyLnN0YXJ0KCl9ZW5kUHJvZmlsaW5nKCl7dGhpcy5wcm9maWxlci5zdG9wKCl9YXN5bmMgbG9hZE1vZGVsKHQsbyxlKXthd2FpdCB0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiU2Vzc2lvbi5sb2FkTW9kZWwiLGFzeW5jKCk9PntsZXQgcj1hd2FpdCBxaSh0aGlzLmJhY2tlbmRIaW50KTtpZih0aGlzLnNlc3Npb25IYW5kbGVyPXIuY3JlYXRlU2Vzc2lvbkhhbmRsZXIodGhpcy5jb250ZXh0KSx0aGlzLl9tb2RlbD1uZXcgX28sdHlwZW9mIHQ9PSJzdHJpbmciKXtsZXQgbj10LmVuZHNXaXRoKCIub3J0Iik7aWYodHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGUpe2xldCBzPWF3YWl0KHZvaWQgMCkodCk7dGhpcy5pbml0aWFsaXplKHMsbil9ZWxzZXtsZXQgaT1hd2FpdChhd2FpdCBmZXRjaCh0KSkuYXJyYXlCdWZmZXIoKTt0aGlzLmluaXRpYWxpemUobmV3IFVpbnQ4QXJyYXkoaSksbil9fWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpKXRoaXMuaW5pdGlhbGl6ZSh0KTtlbHNle2xldCBuPW5ldyBVaW50OEFycmF5KHQsb3x8MCxlfHx0LmJ5dGVMZW5ndGgpO3RoaXMuaW5pdGlhbGl6ZShuKX19KX1pbml0aWFsaXplKHQsbyl7aWYodGhpcy5faW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24uaW5pdGlhbGl6ZSIsKCk9PntsZXQgZT10aGlzLnNlc3Npb25IYW5kbGVyLnRyYW5zZm9ybUdyYXBoP3RoaXMuc2Vzc2lvbkhhbmRsZXI6dm9pZCAwO3RoaXMuX21vZGVsLmxvYWQodCxlLG8pLHRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkJiZ0aGlzLnNlc3Npb25IYW5kbGVyLm9uR3JhcGhJbml0aWFsaXplZCh0aGlzLl9tb2RlbC5ncmFwaCksdGhpcy5pbml0aWFsaXplT3BzKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLl9leGVjdXRpb25QbGFuPW5ldyB4byh0aGlzLl9tb2RlbC5ncmFwaCx0aGlzLl9vcHMsdGhpcy5wcm9maWxlcil9KSx0aGlzLl9pbml0aWFsaXplZD0hMH1hc3luYyBydW4odCl7aWYoIXRoaXMuX2luaXRpYWxpemVkKXRocm93IG5ldyBFcnJvcigic2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLnJ1biIsYXN5bmMoKT0+e2xldCBvPXRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVJbnB1dHModCksZT1hd2FpdCB0aGlzLl9leGVjdXRpb25QbGFuLmV4ZWN1dGUodGhpcy5zZXNzaW9uSGFuZGxlcixvKTtyZXR1cm4gdGhpcy5jcmVhdGVPdXRwdXQoZSl9KX1ub3JtYWxpemVBbmRWYWxpZGF0ZUlucHV0cyh0KXtsZXQgbz10aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCk7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYodC5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBhcnJheSBsZW5ndGg6IGV4cGVjdGVkICR7by5sZW5ndGh9IGJ1dCBnb3QgJHt0Lmxlbmd0aH1gKX1lbHNle2lmKHQuc2l6ZSE9PW8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaW5jb3JyZWN0IGlucHV0IG1hcCBzaXplOiBleHBlY3RlZCAke28ubGVuZ3RofSBidXQgZ290ICR7dC5zaXplfWApO2xldCBlPW5ldyBBcnJheSh0LnNpemUpLHI9MDtmb3IobGV0IG49MDtuPG8ubGVuZ3RoOysrbil7bGV0IHM9dC5nZXQob1tuXSk7aWYoIXMpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IHRlbnNvciBmb3I6ICcke25hbWV9J2ApO2VbcisrXT1zfXQ9ZX1pZighdGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlc3x8dGhpcy5jb250ZXh0LmdyYXBoSW5wdXRUeXBlcy5sZW5ndGg9PT0wfHwhdGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zfHx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMubGVuZ3RoPT09MCl7bGV0IGU9dGhpcy5fbW9kZWwuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCkscj10aGlzLl9tb2RlbC5ncmFwaC5nZXRWYWx1ZXMoKSxuPW5ldyBBcnJheShlLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDsrK3Mpe2xldCBpPXJbZVtzXV07bltzXT1pLnR5cGUuc2hhcGUuZGltcyx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLnB1c2goaS50eXBlLnRlbnNvclR5cGUpLHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5wdXNoKHRbc10uZGltcyl9dGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyhuLHQsITApfWVsc2UgdGhpcy52YWxpZGF0ZUlucHV0VGVuc29yRGltcyh0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dERpbXMsdCwhMSk7cmV0dXJuIHRoaXMudmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKHRoaXMuY29udGV4dC5ncmFwaElucHV0VHlwZXMsdCksdH12YWxpZGF0ZUlucHV0VGVuc29yVHlwZXModCxvKXtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7bGV0IHI9dFtlXSxuPW9bZV0udHlwZTtpZihyIT09bil0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske2V9XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHR5cGUgJyR7cn0nIGJ1dCBnb3QgJHtufWApfX12YWxpZGF0ZUlucHV0VGVuc29yRGltcyh0LG8sZSl7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspe2xldCBuPXRbcl0scz1vW3JdLmRpbXM7aWYoIXRoaXMuY29tcGFyZVRlbnNvckRpbXMobixzLGUpKXRocm93IG5ldyBFcnJvcihgaW5wdXQgdGVuc29yWyR7cn1dIGNoZWNrIGZhaWxlZDogZXhwZWN0ZWQgc2hhcGUgJ1ske24uam9pbigiLCIpfV0nIGJ1dCBnb3QgWyR7cy5qb2luKCIsIil9XWApfX1jb21wYXJlVGVuc29yRGltcyh0LG8sZSl7aWYodC5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoOysrcilpZih0W3JdIT09b1tyXSYmKCFlfHx0W3JdIT09MCkpcmV0dXJuITE7cmV0dXJuITB9Y3JlYXRlT3V0cHV0KHQpe2xldCBvPXRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCk7aWYodC5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIG51bWJlciBvZiBvdXRwdXRzIGRvIG5vdCBtYXRjaCBudW1iZXIgb2YgZ2VuZXJhdGVkIG91dHB1dHMiKTtsZXQgZT1uZXcgTWFwO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7KytyKWUuc2V0KG9bcl0sdFtyXSk7cmV0dXJuIGV9aW5pdGlhbGl6ZU9wcyh0KXtsZXQgbz10LmdldE5vZGVzKCk7dGhpcy5fb3BzPW5ldyBBcnJheShvLmxlbmd0aCk7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspdGhpcy5fb3BzW2VdPXRoaXMuc2Vzc2lvbkhhbmRsZXIucmVzb2x2ZShvW2VdLHRoaXMuX21vZGVsLm9wc2V0cyx0KX19fSk7dmFyIElvLHZwPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTt5cigpO0lvPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuc2Vzc2lvbj10O3RoaXMuaW5wdXROYW1lcz10aGlzLnNlc3Npb24uaW5wdXROYW1lcyx0aGlzLm91dHB1dE5hbWVzPXRoaXMuc2Vzc2lvbi5vdXRwdXROYW1lc31hc3luYyBkaXNwb3NlKCl7fWFzeW5jIHJ1bih0LG8sZSl7bGV0IHI9bmV3IE1hcDtmb3IobGV0IGkgaW4gdClpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpKXtsZXQgdT10W2ldO3Iuc2V0KGksbmV3ICRlKHUuZGltcyx1LnR5cGUsdm9pZCAwLHZvaWQgMCx1LmRhdGEpKX1sZXQgbj1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKHIpLHM9e307cmV0dXJuIG4uZm9yRWFjaCgoaSx1KT0+e3NbdV09bmV3IE1lKGkudHlwZSxpLmRhdGEsaS5kaW1zKX0pLHN9c3RhcnRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uc3RhcnRQcm9maWxpbmcoKX1lbmRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uZW5kUHJvZmlsaW5nKCl9fX0pO3ZhciBfcD17fTtTcihfcCx7b25ueGpzQmFja2VuZDooKT0+dGd9KTt2YXIgSmksdGcsT3A9TCgoKT0+eyJ1c2Ugc3RyaWN0Ijt3cCgpO3ZwKCk7Smk9Y2xhc3N7YXN5bmMgaW5pdCgpe31hc3luYyBjcmVhdGVJbmZlcmVuY2VTZXNzaW9uSGFuZGxlcih0LG8pe2xldCBlPW5ldyBPbyhvKTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP2F3YWl0IGUubG9hZE1vZGVsKHQpOmF3YWl0IGUubG9hZE1vZGVsKHQpLG5ldyBJbyhlKX19LHRnPW5ldyBKaX0pO3ZhciBaaT17fTtTcihaaSx7Y3JlYXRlUmVhZFN0cmVhbTooKT0+SXAscmVhZEZpbGU6KCk9PnJnLHJlYWRGaWxlU3luYzooKT0+bmd9KTt2YXIgcmcsbmcsSXAsUWk9TCgoKT0+e3JnPXZvaWQgMCxuZz12b2lkIDAsSXA9dm9pZCAwfSk7dmFyIGVhPXt9O1NyKGVhLHtqb2luOigpPT5vZ30pO3ZhciBvZyx0YT1MKCgpPT57b2c9dm9pZCAwfSk7dmFyIFBwPW1lKChBcCxyYSk9PnsidXNlIHN0cmljdCI7dmFyIFNwPSgoKT0+e3ZhciBhPXR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQuY3VycmVudFNjcmlwdD8uc3JjOnZvaWQgMDtyZXR1cm4gdHlwZW9mIF9fZmlsZW5hbWU8InUiJiYoYXx8PV9fZmlsZW5hbWUpLGZ1bmN0aW9uKHQ9e30pe3ZhciBvPXQsZSxyLG49bmV3IFByb21pc2UoKG0seCk9PntlPW0scj14fSkscz1PYmplY3QuYXNzaWduKHt9LG8pLGk9Ii4vdGhpcy5wcm9ncmFtIix1PXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLGw9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsYz10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIscD0iIixkLFQsdztpZihjKXt2YXIgdj0oUWkoKSxhcihaaSkpLFM9KHRhKCksYXIoZWEpKTtwPWw/Uy5kaXJuYW1lKHApKyIvIjpfX2Rpcm5hbWUrIi8iLGQ9KG0seCk9PihtPUtlKG0pP25ldyBVUkwobSk6Uy5ub3JtYWxpemUobSksdi5yZWFkRmlsZVN5bmMobSx4P3ZvaWQgMDoidXRmOCIpKSx3PW09PihtPWQobSwhMCksbS5idWZmZXJ8fChtPW5ldyBVaW50OEFycmF5KG0pKSxtKSxUPShtLHgsTyxEPSEwKT0+e209S2UobSk/bmV3IFVSTChtKTpTLm5vcm1hbGl6ZShtKSx2LnJlYWRGaWxlKG0sRD92b2lkIDA6InV0ZjgiLChNLHEpPT57TT9PKE0pOngoRD9xLmJ1ZmZlcjpxKX0pfSwhby50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoaT1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFwvZywiLyIpKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMil9ZWxzZSh1fHxsKSYmKGw/cD1zZWxmLmxvY2F0aW9uLmhyZWY6dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKHA9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLGEmJihwPWEpLHAuc3RhcnRzV2l0aCgiYmxvYjoiKT9wPSIiOnA9cC5zdWJzdHIoMCxwLnJlcGxhY2UoL1s/I10uKi8sIiIpLmxhc3RJbmRleE9mKCIvIikrMSksZD1tPT57dmFyIHg9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB4Lm9wZW4oIkdFVCIsbSwhMSkseC5zZW5kKG51bGwpLHgucmVzcG9uc2VUZXh0fSxsJiYodz1tPT57dmFyIHg9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB4Lm9wZW4oIkdFVCIsbSwhMSkseC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix4LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoeC5yZXNwb25zZSl9KSxUPShtLHgsTyk9Pnt2YXIgRD1uZXcgWE1MSHR0cFJlcXVlc3Q7RC5vcGVuKCJHRVQiLG0sITApLEQucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsRC5vbmxvYWQ9KCk9PntELnN0YXR1cz09MjAwfHxELnN0YXR1cz09MCYmRC5yZXNwb25zZT94KEQucmVzcG9uc2UpOk8oKX0sRC5vbmVycm9yPU8sRC5zZW5kKG51bGwpfSk7dmFyIEE9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxDPWNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKG8scykscz1udWxsO3ZhciBGLEo9ITEsaixpZSxHLFRlLEhlO2Z1bmN0aW9uIExlKCl7dmFyIG09Ri5idWZmZXI7by5IRUFQOD1qPW5ldyBJbnQ4QXJyYXkobSksby5IRUFQMTY9bmV3IEludDE2QXJyYXkobSksby5IRUFQVTg9aWU9bmV3IFVpbnQ4QXJyYXkobSksby5IRUFQVTE2PW5ldyBVaW50MTZBcnJheShtKSxvLkhFQVAzMj1HPW5ldyBJbnQzMkFycmF5KG0pLG8uSEVBUFUzMj1UZT1uZXcgVWludDMyQXJyYXkobSksby5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkobSksby5IRUFQRjY0PUhlPW5ldyBGbG9hdDY0QXJyYXkobSl9dmFyIFk9W10sTmU9W10sU2U9W10seXQ9MCxldD1udWxsLGVlPW51bGw7ZnVuY3Rpb24gcWUobSl7dGhyb3cgbT0iQWJvcnRlZCgiK20rIikiLEMobSksSj0hMCxtPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IobSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLHIobSksbX12YXIgSHQ9bT0+bS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIiksS2U9bT0+bS5zdGFydHNXaXRoKCJmaWxlOi8vIiksYXQ7aWYoYXQ9Im9ydC13YXNtLndhc20iLCFIdChhdCkpe3ZhciBSZT1hdDthdD1vLmxvY2F0ZUZpbGU/by5sb2NhdGVGaWxlKFJlLHApOnArUmV9ZnVuY3Rpb24gQ2UobSl7aWYodylyZXR1cm4gdyhtKTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gSHIobSl7aWYodXx8bCl7aWYodHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iJiYhS2UobSkpcmV0dXJuIGZldGNoKG0se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKHg9PntpZigheC5vayl0aHJvd2BmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICcke219J2A7cmV0dXJuIHguYXJyYXlCdWZmZXIoKX0pLmNhdGNoKCgpPT5DZShtKSk7aWYoVClyZXR1cm4gbmV3IFByb21pc2UoKHgsTyk9PntUKG0sRD0+eChuZXcgVWludDhBcnJheShEKSksTyl9KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+Q2UobSkpfWZ1bmN0aW9uIFR0KG0seCxPKXtyZXR1cm4gSHIobSkudGhlbihEPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShELHgpKS50aGVuKE8sRD0+e0MoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7RH1gKSxxZShEKX0pfWZ1bmN0aW9uIHF0KG0seCl7dmFyIE89YXQ7cmV0dXJuIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyE9ImZ1bmN0aW9uInx8SHQoTyl8fEtlKE8pfHxjfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/VHQoTyxtLHgpOmZldGNoKE8se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKEQ9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKEQsbSkudGhlbih4LGZ1bmN0aW9uKE0pe3JldHVybiBDKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtNfWApLEMoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksVHQoTyxtLHgpfSkpfXZhciB4dCxMdD17Nzk4MDg4OihtLHgsTyxEKT0+e2lmKHR5cGVvZiBvPiJ1Inx8IW8ueWEpcmV0dXJuIDE7aWYobT1qZShtPj4+MCksbS5zdGFydHNXaXRoKCIuLyIpJiYobT1tLnN1YnN0cmluZygyKSksbT1vLnlhLmdldChtKSwhbSlyZXR1cm4gMjtpZih4Pj4+PTAsTz4+Pj0wLHgrTz5tLmJ5dGVMZW5ndGgpcmV0dXJuIDM7dHJ5e3JldHVybiBpZS5zZXQobS5zdWJhcnJheSh4LHgrTyksRD4+PjA+Pj4wKSwwfWNhdGNoe3JldHVybiA0fX19O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHgpe3RoaXMud2E9eC0yNH19dmFyIHR0PTAsdHI9MCxrZT10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxCZT0obSx4LE8pPT57eD4+Pj0wO3ZhciBEPXgrTztmb3IoTz14O21bT10mJiEoTz49RCk7KSsrTztpZigxNjxPLXgmJm0uYnVmZmVyJiZrZSlyZXR1cm4ga2UuZGVjb2RlKG0uc3ViYXJyYXkoeCxPKSk7Zm9yKEQ9IiI7eDxPOyl7dmFyIE09bVt4KytdO2lmKE0mMTI4KXt2YXIgcT1tW3grK10mNjM7aWYoKE0mMjI0KT09MTkyKUQrPVN0cmluZy5mcm9tQ2hhckNvZGUoKE0mMzEpPDw2fHEpO2Vsc2V7dmFyIHJlPW1beCsrXSY2MztNPShNJjI0MCk9PTIyND8oTSYxNSk8PDEyfHE8PDZ8cmU6KE0mNyk8PDE4fHE8PDEyfHJlPDw2fG1beCsrXSY2Myw2NTUzNj5NP0QrPVN0cmluZy5mcm9tQ2hhckNvZGUoTSk6KE0tPTY1NTM2LEQrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8TT4+MTAsNTYzMjB8TSYxMDIzKSl9fWVsc2UgRCs9U3RyaW5nLmZyb21DaGFyQ29kZShNKX1yZXR1cm4gRH0samU9KG0seCk9PihtPj4+PTApP0JlKGllLG0seCk6IiIsdnQ9bT0+e2Zvcih2YXIgeD0wLE89MDtPPG0ubGVuZ3RoOysrTyl7dmFyIEQ9bS5jaGFyQ29kZUF0KE8pOzEyNz49RD94Kys6MjA0Nz49RD94Kz0yOjU1Mjk2PD1EJiY1NzM0Mz49RD8oeCs9NCwrK08pOngrPTN9cmV0dXJuIHh9LF90PShtLHgsTyxEKT0+e2lmKE8+Pj49MCwhKDA8RCkpcmV0dXJuIDA7dmFyIE09TztEPU8rRC0xO2Zvcih2YXIgcT0wO3E8bS5sZW5ndGg7KytxKXt2YXIgcmU9bS5jaGFyQ29kZUF0KHEpO2lmKDU1Mjk2PD1yZSYmNTczNDM+PXJlKXt2YXIgRmU9bS5jaGFyQ29kZUF0KCsrcSk7cmU9NjU1MzYrKChyZSYxMDIzKTw8MTApfEZlJjEwMjN9aWYoMTI3Pj1yZSl7aWYoTz49RClicmVhazt4W08rKz4+PjBdPXJlfWVsc2V7aWYoMjA0Nz49cmUpe2lmKE8rMT49RClicmVhazt4W08rKz4+PjBdPTE5MnxyZT4+Nn1lbHNle2lmKDY1NTM1Pj1yZSl7aWYoTysyPj1EKWJyZWFrO3hbTysrPj4+MF09MjI0fHJlPj4xMn1lbHNle2lmKE8rMz49RClicmVhazt4W08rKz4+PjBdPTI0MHxyZT4+MTgseFtPKys+Pj4wXT0xMjh8cmU+PjEyJjYzfXhbTysrPj4+MF09MTI4fHJlPj42JjYzfXhbTysrPj4+MF09MTI4fHJlJjYzfX1yZXR1cm4geFtPPj4+MF09MCxPLU19LGp0PW09Pm0lND09PTAmJihtJTEwMCE9PTB8fG0lNDAwPT09MCkscXI9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0sVG49WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sQ3Q9W10sT3I9e30scnI9KCk9PntpZighbnIpe3ZhciBtPXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzppfHwiLi90aGlzLnByb2dyYW0ifSx4O2Zvcih4IGluIE9yKU9yW3hdPT09dm9pZCAwP2RlbGV0ZSBtW3hdOm1beF09T3JbeF07dmFyIE89W107Zm9yKHggaW4gbSlPLnB1c2goYCR7eH09JHttW3hdfWApO25yPU99cmV0dXJuIG5yfSxucix4bj1bbnVsbCxbXSxbXV0sR3Q9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx3bj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGhlKG0pe3ZhciB4PUFycmF5KHZ0KG0pKzEpO3JldHVybiBfdChtLHgsMCx4Lmxlbmd0aCkseH1mdW5jdGlvbiBqcihtLHgsTyxEKXtmdW5jdGlvbiBNKFAscGUseGUpe2ZvcihQPXR5cGVvZiBQPT0ibnVtYmVyIj9QLnRvU3RyaW5nKCk6UHx8IiI7UC5sZW5ndGg8cGU7KVA9eGVbMF0rUDtyZXR1cm4gUH1mdW5jdGlvbiBxKFAscGUpe3JldHVybiBNKFAscGUsIjAiKX1mdW5jdGlvbiByZShQLHBlKXtmdW5jdGlvbiB4ZShacil7cmV0dXJuIDA+WnI/LTE6MDxacj8xOjB9dmFyIEZ0O3JldHVybihGdD14ZShQLmdldEZ1bGxZZWFyKCktcGUuZ2V0RnVsbFllYXIoKSkpPT09MCYmKEZ0PXhlKFAuZ2V0TW9udGgoKS1wZS5nZXRNb250aCgpKSk9PT0wJiYoRnQ9eGUoUC5nZXREYXRlKCktcGUuZ2V0RGF0ZSgpKSksRnR9ZnVuY3Rpb24gRmUoUCl7c3dpdGNoKFAuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoUC5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gUDtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKFAuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoUC5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShQLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKFAuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKFAuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gc3QoUCl7dmFyIHBlPVAuc2E7Zm9yKFA9bmV3IERhdGUobmV3IERhdGUoUC50YSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPHBlOyl7dmFyIHhlPVAuZ2V0TW9udGgoKSxGdD0oanQoUC5nZXRGdWxsWWVhcigpKT9HdDp3bilbeGVdO2lmKHBlPkZ0LVAuZ2V0RGF0ZSgpKXBlLT1GdC1QLmdldERhdGUoKSsxLFAuc2V0RGF0ZSgxKSwxMT54ZT9QLnNldE1vbnRoKHhlKzEpOihQLnNldE1vbnRoKDApLFAuc2V0RnVsbFllYXIoUC5nZXRGdWxsWWVhcigpKzEpKTtlbHNle1Auc2V0RGF0ZShQLmdldERhdGUoKStwZSk7YnJlYWt9fXJldHVybiB4ZT1uZXcgRGF0ZShQLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHBlPUZlKG5ldyBEYXRlKFAuZ2V0RnVsbFllYXIoKSwwLDQpKSx4ZT1GZSh4ZSksMD49cmUocGUsUCk/MD49cmUoeGUsUCk/UC5nZXRGdWxsWWVhcigpKzE6UC5nZXRGdWxsWWVhcigpOlAuZ2V0RnVsbFllYXIoKS0xfW0+Pj49MCx4Pj4+PTAsTz4+Pj0wLEQ+Pj49MDt2YXIgemU9VGVbRCs0MD4+PjI+Pj4wXTtEPXtCYTpHW0Q+Pj4yPj4+MF0sQWE6R1tEKzQ+Pj4yPj4+MF0sdWE6R1tEKzg+Pj4yPj4+MF0seGE6R1tEKzEyPj4+Mj4+PjBdLHZhOkdbRCsxNj4+PjI+Pj4wXSx0YTpHW0QrMjA+Pj4yPj4+MF0sbmE6R1tEKzI0Pj4+Mj4+PjBdLHNhOkdbRCsyOD4+PjI+Pj4wXSxEYTpHW0QrMzI+Pj4yPj4+MF0semE6R1tEKzM2Pj4+Mj4+PjBdLENhOnplP2plKHplKToiIn0sTz1qZShPKSx6ZT17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In07Zm9yKHZhciBWZSBpbiB6ZSlPPU8ucmVwbGFjZShuZXcgUmVnRXhwKFZlLCJnIiksemVbVmVdKTt2YXIgSnI9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLFl0PSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO3plPXsiJWEiOlA9PkpyW1AubmFdLnN1YnN0cmluZygwLDMpLCIlQSI6UD0+SnJbUC5uYV0sIiViIjpQPT5ZdFtQLnZhXS5zdWJzdHJpbmcoMCwzKSwiJUIiOlA9Pll0W1AudmFdLCIlQyI6UD0+cSgoUC50YSsxOTAwKS8xMDB8MCwyKSwiJWQiOlA9PnEoUC54YSwyKSwiJWUiOlA9Pk0oUC54YSwyLCIgIiksIiVnIjpQPT5zdChQKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOnN0LCIlSCI6UD0+cShQLnVhLDIpLCIlSSI6UD0+KFA9UC51YSxQPT0wP1A9MTI6MTI8UCYmKFAtPTEyKSxxKFAsMikpLCIlaiI6UD0+e2Zvcih2YXIgcGU9MCx4ZT0wO3hlPD1QLnZhLTE7cGUrPShqdChQLnRhKzE5MDApP0d0OnduKVt4ZSsrXSk7cmV0dXJuIHEoUC54YStwZSwzKX0sIiVtIjpQPT5xKFAudmErMSwyKSwiJU0iOlA9PnEoUC5BYSwyKSwiJW4iOigpPT5gCmAsIiVwIjpQPT4wPD1QLnVhJiYxMj5QLnVhPyJBTSI6IlBNIiwiJVMiOlA9PnEoUC5CYSwyKSwiJXQiOigpPT4iCSIsIiV1IjpQPT5QLm5hfHw3LCIlVSI6UD0+cShNYXRoLmZsb29yKChQLnNhKzctUC5uYSkvNyksMiksIiVWIjpQPT57dmFyIHBlPU1hdGguZmxvb3IoKFAuc2ErNy0oUC5uYSs2KSU3KS83KTtpZigyPj0oUC5uYSszNzEtUC5zYS0yKSU3JiZwZSsrLHBlKXBlPT01MyYmKHhlPShQLm5hKzM3MS1QLnNhKSU3LHhlPT00fHx4ZT09MyYmanQoUC50YSl8fChwZT0xKSk7ZWxzZXtwZT01Mjt2YXIgeGU9KFAubmErNy1QLnNhLTEpJTc7KHhlPT00fHx4ZT09NSYmanQoUC50YSU0MDAtMSkpJiZwZSsrfXJldHVybiBxKHBlLDIpfSwiJXciOlA9PlAubmEsIiVXIjpQPT5xKE1hdGguZmxvb3IoKFAuc2ErNy0oUC5uYSs2KSU3KS83KSwyKSwiJXkiOlA9PihQLnRhKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlWSI6UD0+UC50YSsxOTAwLCIleiI6UD0+e1A9UC56YTt2YXIgcGU9MDw9UDtyZXR1cm4gUD1NYXRoLmFicyhQKS82MCwocGU/IisiOiItIikrKCIwMDAwIisoUC82MCoxMDArUCU2MCkpLnNsaWNlKC00KX0sIiVaIjpQPT5QLkNhLCIlJSI6KCk9PiIlIn0sTz1PLnJlcGxhY2UoLyUlL2csIlwwXDAiKTtmb3IoVmUgaW4gemUpTy5pbmNsdWRlcyhWZSkmJihPPU8ucmVwbGFjZShuZXcgUmVnRXhwKFZlLCJnIiksemVbVmVdKEQpKSk7cmV0dXJuIE89Ty5yZXBsYWNlKC9cMFwwL2csIiUiKSxWZT1oZShPKSxWZS5sZW5ndGg+eD8wOihqLnNldChWZSxtPj4+MCksVmUubGVuZ3RoLTEpfXZhciBZcj17YTpmdW5jdGlvbihtLHgsTyl7bT4+Pj0wO3ZhciBEPW5ldyB3dChtKTt0aHJvdyBUZVtELndhKzE2Pj4+Mj4+PjBdPTAsVGVbRC53YSs0Pj4+Mj4+PjBdPXg+Pj4wLFRlW0Qud2ErOD4+PjI+Pj4wXT1PPj4+MCx0dD1tLHRyKyssdHR9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSDpmdW5jdGlvbigpe30seDpmdW5jdGlvbigpe30sejpmdW5jdGlvbigpe30sSjpmdW5jdGlvbigpe3JldHVybiAwfSxGOmZ1bmN0aW9uKCl7fSxBOmZ1bmN0aW9uKCl7fSxFOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx5OmZ1bmN0aW9uKCl7fSx2OmZ1bmN0aW9uKCl7fSxHOmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxrOigpPT4xLEk6ZnVuY3Rpb24obSx4LE8pe3JldHVybiB4Pj4+PTAsaWUuY29weVdpdGhpbihtPj4+MD4+PjAseD4+PjAseCsoTz4+PjApPj4+MCl9LG46ZnVuY3Rpb24obSx4LE8pe209eCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhbT8obT4+PjApKzQyOTQ5NjcyOTYqeDpOYU4sTz4+Pj0wLG09bmV3IERhdGUoMWUzKm0pLEdbTz4+PjI+Pj4wXT1tLmdldFVUQ1NlY29uZHMoKSxHW08rND4+PjI+Pj4wXT1tLmdldFVUQ01pbnV0ZXMoKSxHW08rOD4+PjI+Pj4wXT1tLmdldFVUQ0hvdXJzKCksR1tPKzEyPj4+Mj4+PjBdPW0uZ2V0VVRDRGF0ZSgpLEdbTysxNj4+PjI+Pj4wXT1tLmdldFVUQ01vbnRoKCksR1tPKzIwPj4+Mj4+PjBdPW0uZ2V0VVRDRnVsbFllYXIoKS0xOTAwLEdbTysyND4+PjI+Pj4wXT1tLmdldFVUQ0RheSgpLEdbTysyOD4+PjI+Pj4wXT0obS5nZXRUaW1lKCktRGF0ZS5VVEMobS5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MH0sbzpmdW5jdGlvbihtLHgsTyl7bT14KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFtPyhtPj4+MCkrNDI5NDk2NzI5Nip4Ok5hTixPPj4+PTAsbT1uZXcgRGF0ZSgxZTMqbSksR1tPPj4+Mj4+PjBdPW0uZ2V0U2Vjb25kcygpLEdbTys0Pj4+Mj4+PjBdPW0uZ2V0TWludXRlcygpLEdbTys4Pj4+Mj4+PjBdPW0uZ2V0SG91cnMoKSxHW08rMTI+Pj4yPj4+MF09bS5nZXREYXRlKCksR1tPKzE2Pj4+Mj4+PjBdPW0uZ2V0TW9udGgoKSxHW08rMjA+Pj4yPj4+MF09bS5nZXRGdWxsWWVhcigpLTE5MDAsR1tPKzI0Pj4+Mj4+PjBdPW0uZ2V0RGF5KCksR1tPKzI4Pj4+Mj4+PjBdPShqdChtLmdldEZ1bGxZZWFyKCkpP3FyOlRuKVttLmdldE1vbnRoKCldK20uZ2V0RGF0ZSgpLTF8MCxHW08rMzY+Pj4yPj4+MF09LSg2MCptLmdldFRpbWV6b25lT2Zmc2V0KCkpLHg9bmV3IERhdGUobS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgRD1uZXcgRGF0ZShtLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0dbTyszMj4+PjI+Pj4wXT0oeCE9RCYmbS5nZXRUaW1lem9uZU9mZnNldCgpPT1NYXRoLm1pbihELHgpKXwwfSxwOmZ1bmN0aW9uKG0pe20+Pj49MDt2YXIgeD1uZXcgRGF0ZShHW20rMjA+Pj4yPj4+MF0rMTkwMCxHW20rMTY+Pj4yPj4+MF0sR1ttKzEyPj4+Mj4+PjBdLEdbbSs4Pj4+Mj4+PjBdLEdbbSs0Pj4+Mj4+PjBdLEdbbT4+PjI+Pj4wXSwwKSxPPUdbbSszMj4+PjI+Pj4wXSxEPXguZ2V0VGltZXpvbmVPZmZzZXQoKSxNPW5ldyBEYXRlKHguZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscT1uZXcgRGF0ZSh4LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLHJlPU1hdGgubWluKHEsTSk7cmV0dXJuIDA+Tz9HW20rMzI+Pj4yPj4+MF09KyhNIT1xJiZyZT09RCk6MDxPIT0ocmU9PUQpJiYoTT1NYXRoLm1heChxLE0pLHguc2V0VGltZSh4LmdldFRpbWUoKSs2ZTQqKCgwPE8/cmU6TSktRCkpKSxHW20rMjQ+Pj4yPj4+MF09eC5nZXREYXkoKSxHW20rMjg+Pj4yPj4+MF09KGp0KHguZ2V0RnVsbFllYXIoKSk/cXI6VG4pW3guZ2V0TW9udGgoKV0reC5nZXREYXRlKCktMXwwLEdbbT4+PjI+Pj4wXT14LmdldFNlY29uZHMoKSxHW20rND4+PjI+Pj4wXT14LmdldE1pbnV0ZXMoKSxHW20rOD4+PjI+Pj4wXT14LmdldEhvdXJzKCksR1ttKzEyPj4+Mj4+PjBdPXguZ2V0RGF0ZSgpLEdbbSsxNj4+PjI+Pj4wXT14LmdldE1vbnRoKCksR1ttKzIwPj4+Mj4+PjBdPXguZ2V0WWVhcigpLG09eC5nZXRUaW1lKCksbT1pc05hTihtKT8tMTptLzFlMyxYcigoeHQ9bSwxPD0rTWF0aC5hYnMoeHQpPzA8eHQ/K01hdGguZmxvb3IoeHQvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeHQtKyh+fnh0Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKSksbT4+PjB9LGw6ZnVuY3Rpb24oKXtyZXR1cm4tNTJ9LG06ZnVuY3Rpb24oKXt9LHQ6ZnVuY3Rpb24obSx4LE8sRCl7Tz4+Pj0wLEQ+Pj49MDt2YXIgTT1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkscT1uZXcgRGF0ZShNLDAsMSkscmU9bmV3IERhdGUoTSw2LDEpO009cS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBGZT1yZS5nZXRUaW1lem9uZU9mZnNldCgpO1RlW20+Pj4wPj4+Mj4+PjBdPTYwKk1hdGgubWF4KE0sRmUpLEdbeD4+PjA+Pj4yPj4+MF09KyhNIT1GZSksbT1zdD0+c3QudG9Mb2NhbGVUaW1lU3RyaW5nKHZvaWQgMCx7aG91cjEyOiExLHRpbWVab25lTmFtZToic2hvcnQifSkuc3BsaXQoIiAiKVsxXSxxPW0ocSkscmU9bShyZSksRmU8TT8oX3QocSxpZSxPLDE3KSxfdChyZSxpZSxELDE3KSk6KF90KHEsaWUsRCwxNyksX3QocmUsaWUsTywxNykpfSxkOigpPT57cWUoIiIpfSxCOmZ1bmN0aW9uKG0seCxPKXttPj4+PTAseD4+Pj0wLE8+Pj49MCxDdC5sZW5ndGg9MDtmb3IodmFyIEQ7RD1pZVt4Kys+Pj4wXTspe3ZhciBNPUQhPTEwNTtNJj1EIT0xMTIsTys9TSYmTyU4PzQ6MCxDdC5wdXNoKEQ9PTExMj9UZVtPPj4+Mj4+PjBdOkQ9PTEwNT9HW08+Pj4yPj4+MF06SGVbTz4+PjM+Pj4wXSksTys9TT84OjR9cmV0dXJuIEx0W21dKC4uLkN0KX0saDooKT0+RGF0ZS5ub3coKSx1OmZ1bmN0aW9uKCl7cmV0dXJuIDQyOTQ5MDE3NjB9LGI6KCk9PnBlcmZvcm1hbmNlLm5vdygpLHM6ZnVuY3Rpb24obSl7bT4+Pj0wO3ZhciB4PWllLmxlbmd0aDtpZig0Mjk0OTAxNzYwPG0pcmV0dXJuITE7Zm9yKHZhciBPPTE7ND49TztPKj0yKXt2YXIgRD14KigxKy4yL08pO0Q9TWF0aC5taW4oRCxtKzEwMDY2MzI5Nik7dmFyIE09TWF0aDtEPU1hdGgubWF4KG0sRCk7ZTp7TT0oTS5taW4uY2FsbChNLDQyOTQ5MDE3NjAsRCsoNjU1MzYtRCU2NTUzNiklNjU1MzYpLUYuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzUpLzY1NTM2O3RyeXtGLmdyb3coTSksTGUoKTt2YXIgcT0xO2JyZWFrIGV9Y2F0Y2h7fXE9dm9pZCAwfWlmKHEpcmV0dXJuITB9cmV0dXJuITF9LEM6ZnVuY3Rpb24obSx4KXttPj4+PTAseD4+Pj0wO3ZhciBPPTA7cmV0dXJuIHJyKCkuZm9yRWFjaCgoRCxNKT0+e3ZhciBxPXgrTztmb3IoTT1UZVttKzQqTT4+PjI+Pj4wXT1xLHE9MDtxPEQubGVuZ3RoOysrcSlqW00rKz4+PjBdPUQuY2hhckNvZGVBdChxKTtqW00+Pj4wXT0wLE8rPUQubGVuZ3RoKzF9KSwwfSxEOmZ1bmN0aW9uKG0seCl7bT4+Pj0wLHg+Pj49MDt2YXIgTz1ycigpO1RlW20+Pj4yPj4+MF09Ty5sZW5ndGg7dmFyIEQ9MDtyZXR1cm4gTy5mb3JFYWNoKE09PkQrPU0ubGVuZ3RoKzEpLFRlW3g+Pj4yPj4+MF09RCwwfSxmOigpPT41MixqOmZ1bmN0aW9uKCl7cmV0dXJuIDUyfSxxOmZ1bmN0aW9uKCl7cmV0dXJuIDcwfSxpOmZ1bmN0aW9uKG0seCxPLEQpe3g+Pj49MCxPPj4+PTAsRD4+Pj0wO2Zvcih2YXIgTT0wLHE9MDtxPE87cSsrKXt2YXIgcmU9VGVbeD4+PjI+Pj4wXSxGZT1UZVt4KzQ+Pj4yPj4+MF07eCs9ODtmb3IodmFyIHN0PTA7c3Q8RmU7c3QrKyl7dmFyIHplPWllW3JlK3N0Pj4+MF0sVmU9eG5bbV07emU9PT0wfHx6ZT09PTEwPygobT09PTE/QTpDKShCZShWZSwwKSksVmUubGVuZ3RoPTApOlZlLnB1c2goemUpfU0rPUZlfXJldHVybiBUZVtEPj4+Mj4+PjBdPU0sMH0scjpqcixjOmZ1bmN0aW9uKG0seCxPLEQpe3JldHVybiBqcihtPj4+MCx4Pj4+MCxPPj4+MCxEPj4+MCl9fSx0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG0oTyl7cmV0dXJuIHRlPU8uZXhwb3J0cyx0ZT1fbigpLEY9dGUuSyxMZSgpLE5lLnVuc2hpZnQodGUuTCkseXQtLSx5dD09MCYmKGV0IT09bnVsbCYmKGNsZWFySW50ZXJ2YWwoZXQpLGV0PW51bGwpLGVlJiYoTz1lZSxlZT1udWxsLE8oKSkpLHRlfXZhciB4PXthOllyfTtpZih5dCsrLG8uaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gby5pbnN0YW50aWF0ZVdhc20oeCxtKX1jYXRjaChPKXtDKGBNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAke099YCkscihPKX1yZXR1cm4gcXQoeCxmdW5jdGlvbihPKXttKE8uaW5zdGFuY2UpfSkuY2F0Y2gocikse319KCk7by5fT3J0SW5pdD0obSx4KT0+KG8uX09ydEluaXQ9dGUuTSkobSx4KSxvLl9PcnRHZXRMYXN0RXJyb3I9KG0seCk9PihvLl9PcnRHZXRMYXN0RXJyb3I9dGUuTikobSx4KSxvLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0obSx4LE8sRCxNLHEscmUsRmUsc3QsemUpPT4oby5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9dGUuTykobSx4LE8sRCxNLHEscmUsRmUsc3QsemUpLG8uX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShtLHgpPT4oby5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9dGUuUCkobSx4KSxvLl9PcnRBZGRGcmVlRGltZW5zaW9uT3ZlcnJpZGU9KG0seCxPKT0+KG8uX09ydEFkZEZyZWVEaW1lbnNpb25PdmVycmlkZT10ZS5RKShtLHgsTyksby5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShtLHgsTyk9PihvLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9dGUuUikobSx4LE8pLG8uX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1tPT4oby5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPXRlLlMpKG0pLG8uX09ydENyZWF0ZVNlc3Npb249KG0seCxPKT0+KG8uX09ydENyZWF0ZVNlc3Npb249dGUuVCkobSx4LE8pLG8uX09ydFJlbGVhc2VTZXNzaW9uPW09PihvLl9PcnRSZWxlYXNlU2Vzc2lvbj10ZS5VKShtKSxvLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShtLHgsTyk9PihvLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PXRlLlYpKG0seCxPKSxvLl9PcnRHZXRJbnB1dE5hbWU9KG0seCk9PihvLl9PcnRHZXRJbnB1dE5hbWU9dGUuVykobSx4KSxvLl9PcnRHZXRPdXRwdXROYW1lPShtLHgpPT4oby5fT3J0R2V0T3V0cHV0TmFtZT10ZS5YKShtLHgpLG8uX09ydEZyZWU9bT0+KG8uX09ydEZyZWU9dGUuWSkobSksby5fT3J0Q3JlYXRlVGVuc29yPShtLHgsTyxELE0scSk9PihvLl9PcnRDcmVhdGVUZW5zb3I9dGUuWikobSx4LE8sRCxNLHEpLG8uX09ydEdldFRlbnNvckRhdGE9KG0seCxPLEQsTSk9PihvLl9PcnRHZXRUZW5zb3JEYXRhPXRlLl8pKG0seCxPLEQsTSksby5fT3J0UmVsZWFzZVRlbnNvcj1tPT4oby5fT3J0UmVsZWFzZVRlbnNvcj10ZS4kKShtKSxvLl9PcnRDcmVhdGVSdW5PcHRpb25zPShtLHgsTyxEKT0+KG8uX09ydENyZWF0ZVJ1bk9wdGlvbnM9dGUuYWEpKG0seCxPLEQpLG8uX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PShtLHgsTyk9PihvLl9PcnRBZGRSdW5Db25maWdFbnRyeT10ZS5iYSkobSx4LE8pLG8uX09ydFJlbGVhc2VSdW5PcHRpb25zPW09PihvLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz10ZS5jYSkobSksby5fT3J0Q3JlYXRlQmluZGluZz1tPT4oby5fT3J0Q3JlYXRlQmluZGluZz10ZS5kYSkobSksby5fT3J0QmluZElucHV0PShtLHgsTyk9PihvLl9PcnRCaW5kSW5wdXQ9dGUuZWEpKG0seCxPKSxvLl9PcnRCaW5kT3V0cHV0PShtLHgsTyxEKT0+KG8uX09ydEJpbmRPdXRwdXQ9dGUuZmEpKG0seCxPLEQpLG8uX09ydENsZWFyQm91bmRPdXRwdXRzPW09PihvLl9PcnRDbGVhckJvdW5kT3V0cHV0cz10ZS5nYSkobSksby5fT3J0UmVsZWFzZUJpbmRpbmc9bT0+KG8uX09ydFJlbGVhc2VCaW5kaW5nPXRlLmhhKShtKSxvLl9PcnRSdW5XaXRoQmluZGluZz0obSx4LE8sRCxNKT0+KG8uX09ydFJ1bldpdGhCaW5kaW5nPXRlLmlhKShtLHgsTyxELE0pLG8uX09ydFJ1bj0obSx4LE8sRCxNLHEscmUsRmUpPT4oby5fT3J0UnVuPXRlLmphKShtLHgsTyxELE0scSxyZSxGZSksby5fT3J0RW5kUHJvZmlsaW5nPW09PihvLl9PcnRFbmRQcm9maWxpbmc9dGUua2EpKG0pLG8uX21hbGxvYz1tPT4oby5fbWFsbG9jPXRlLmxhKShtKSxvLl9mcmVlPW09PihvLl9mcmVlPXRlLm1hKShtKTt2YXIgWHI9bT0+KFhyPXRlLm9hKShtKSx2bj1tPT4odm49dGUucGEpKG0pLFg9bT0+KFg9dGUucWEpKG0pLG9yPSgpPT4ob3I9dGUucmEpKCk7ZnVuY3Rpb24gX24oKXt2YXIgbT10ZTttPU9iamVjdC5hc3NpZ24oe30sbSk7dmFyIHg9Tz0+RD0+TyhEKT4+PjA7cmV0dXJuIG0ubGE9eChtLmxhKSxtLnFhPXgobS5xYSksbS5yYT0oTz0+KCk9Pk8oKT4+PjApKG0ucmEpLG19by5zdGFja1NhdmU9KCk9Pm9yKCksby5zdGFja1Jlc3RvcmU9bT0+dm4obSksby5zdGFja0FsbG9jPW09PlgobSksby5VVEY4VG9TdHJpbmc9amUsby5zdHJpbmdUb1VURjg9KG0seCxPKT0+X3QobSxpZSx4LE8pLG8ubGVuZ3RoQnl0ZXNVVEY4PXZ0O3ZhciBVdDtlZT1mdW5jdGlvbiBtKCl7VXR8fEtyKCksVXR8fChlZT1tKX07ZnVuY3Rpb24gS3IoKXtpZighKDA8eXQpKXtpZihvLnByZVJ1bilmb3IodHlwZW9mIG8ucHJlUnVuPT0iZnVuY3Rpb24iJiYoby5wcmVSdW49W28ucHJlUnVuXSk7by5wcmVSdW4ubGVuZ3RoOyl7dmFyIG09by5wcmVSdW4uc2hpZnQoKTtZLnVuc2hpZnQobSl9Zm9yKDswPFkubGVuZ3RoOylZLnNoaWZ0KCkobyk7aWYoISgwPHl0fHxVdHx8KFV0PSEwLG8uY2FsbGVkUnVuPSEwLEopKSl7Zm9yKDswPE5lLmxlbmd0aDspTmUuc2hpZnQoKShvKTtmb3IoZShvKTswPFNlLmxlbmd0aDspU2Uuc2hpZnQoKShvKX19fXJldHVybiBLcigpLG59fSkoKTt0eXBlb2YgQXA9PSJvYmplY3QiJiZ0eXBlb2YgcmE9PSJvYmplY3QiP3JhLmV4cG9ydHM9U3A6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lKFtdLCgpPT5TcCl9KTt2YXIgRXA9bWUoKCk9Pnt9KTt2YXIgRHA9bWUoKCk9Pnt9KTt2YXIgTHA9e307U3IoTHAse2NwdXM6KCk9PmlnfSk7dmFyIGlnLENwPUwoKCk9PntpZz12b2lkIDB9KTt2YXIga3A9bWUoKCRwLG5hKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgRnA9KCgpPT57dmFyIGE9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5jdXJyZW50U2NyaXB0Py5zcmM6dm9pZCAwO3JldHVybiB0eXBlb2YgX19maWxlbmFtZTwidSImJihhfHw9X19maWxlbmFtZSksZnVuY3Rpb24odD17fSl7ZnVuY3Rpb24gbygpe3JldHVybiBTZS5idWZmZXIhPXFlLmJ1ZmZlciYmQ2UoKSxxZX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNlLmJ1ZmZlciE9cWUuYnVmZmVyJiZDZSgpLEh0fWZ1bmN0aW9uIHIoKXtyZXR1cm4gU2UuYnVmZmVyIT1xZS5idWZmZXImJkNlKCksS2V9ZnVuY3Rpb24gbigpe3JldHVybiBTZS5idWZmZXIhPXFlLmJ1ZmZlciYmQ2UoKSxhdH1mdW5jdGlvbiBzKCl7cmV0dXJuIFNlLmJ1ZmZlciE9cWUuYnVmZmVyJiZDZSgpLFJlfXZhciBpPXQsdSxsLGM9bmV3IFByb21pc2UoKGYsYik9Pnt1PWYsbD1ifSkscD1PYmplY3QuYXNzaWduKHt9LGkpLGQ9Ii4vdGhpcy5wcm9ncmFtIixUPShmLGIpPT57dGhyb3cgYn0sdz10eXBlb2Ygd2luZG93PT0ib2JqZWN0Iix2PXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLFM9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PSJzdHJpbmciLEE9aS5FTlZJUk9OTUVOVF9JU19QVEhSRUFEfHwhMSxDPSIiO2Z1bmN0aW9uIEYoZil7cmV0dXJuIGkubG9jYXRlRmlsZT9pLmxvY2F0ZUZpbGUoZixDKTpDK2Z9dmFyIEosaixpZTtpZihTKXt2YXIgRz0oUWkoKSxhcihaaSkpLFRlPSh0YSgpLGFyKGVhKSk7Qz12P1RlLmRpcm5hbWUoQykrIi8iOl9fZGlybmFtZSsiLyIsSj0oZixiKT0+KGY9amUoZik/bmV3IFVSTChmKTpUZS5ub3JtYWxpemUoZiksRy5yZWFkRmlsZVN5bmMoZixiP3ZvaWQgMDoidXRmOCIpKSxpZT1mPT4oZj1KKGYsITApLGYuYnVmZmVyfHwoZj1uZXcgVWludDhBcnJheShmKSksZiksaj0oZixiLHksST0hMCk9PntmPWplKGYpP25ldyBVUkwoZik6VGUubm9ybWFsaXplKGYpLEcucmVhZEZpbGUoZixJP3ZvaWQgMDoidXRmOCIsKGssJCk9PntrP3koayk6YihJPyQuYnVmZmVyOiQpfSl9LCFpLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihkPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxUPShmLGIpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1mLGJ9LGdsb2JhbC5Xb3JrZXI9RXAoKS5Xb3JrZXJ9ZWxzZSh3fHx2KSYmKHY/Qz1zZWxmLmxvY2F0aW9uLmhyZWY6dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKEM9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHR5cGVvZiBhPCJ1IiYmYSYmKEM9YSksQy5zdGFydHNXaXRoKCJibG9iOiIpP0M9IiI6Qz1DLnN1YnN0cigwLEMucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxTfHwoSj1mPT57dmFyIGI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiBiLm9wZW4oIkdFVCIsZiwhMSksYi5zZW5kKG51bGwpLGIucmVzcG9uc2VUZXh0fSx2JiYoaWU9Zj0+e3ZhciBiPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gYi5vcGVuKCJHRVQiLGYsITEpLGIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsYi5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KGIucmVzcG9uc2UpfSksaj0oZixiLHkpPT57dmFyIEk9bmV3IFhNTEh0dHBSZXF1ZXN0O0kub3BlbigiR0VUIixmLCEwKSxJLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLEkub25sb2FkPSgpPT57SS5zdGF0dXM9PTIwMHx8SS5zdGF0dXM9PTAmJkkucmVzcG9uc2U/YihJLnJlc3BvbnNlKTp5KCl9LEkub25lcnJvcj15LEkuc2VuZChudWxsKX0pKTtTJiZ0eXBlb2YgcGVyZm9ybWFuY2U+InUiJiYoZ2xvYmFsLnBlcmZvcm1hbmNlPURwKCkucGVyZm9ybWFuY2UpO3ZhciBIZT1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLExlPWNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtTJiYoSGU9KC4uLmYpPT5HLndyaXRlU3luYygxLGYuam9pbigiICIpK2AKYCksTGU9KC4uLmYpPT5HLndyaXRlU3luYygyLGYuam9pbigiICIpK2AKYCkpO3ZhciBZPUhlLE5lPUxlO09iamVjdC5hc3NpZ24oaSxwKSxwPW51bGw7dmFyIFNlLHl0LGV0PSExLGVlLHFlLEh0LEtlLGF0LFJlO2Z1bmN0aW9uIENlKCl7dmFyIGY9U2UuYnVmZmVyO2kuSEVBUDg9cWU9bmV3IEludDhBcnJheShmKSxpLkhFQVAxNj1uZXcgSW50MTZBcnJheShmKSxpLkhFQVBVOD1IdD1uZXcgVWludDhBcnJheShmKSxpLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGYpLGkuSEVBUDMyPUtlPW5ldyBJbnQzMkFycmF5KGYpLGkuSEVBUFUzMj1hdD1uZXcgVWludDMyQXJyYXkoZiksaS5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoZiksaS5IRUFQRjY0PVJlPW5ldyBGbG9hdDY0QXJyYXkoZil9dmFyIEhyPTE2Nzc3MjE2O2lmKEEpU2U9aS53YXNtTWVtb3J5O2Vsc2UgaWYoaS53YXNtTWVtb3J5KVNlPWkud2FzbU1lbW9yeTtlbHNlIGlmKFNlPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6SHIvNjU1MzYsbWF4aW11bTo2NTUzNixzaGFyZWQ6ITB9KSwhKFNlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyBOZSgicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksUyYmTmUoIihvbiBub2RlIHlvdSBtYXkgbmVlZDogLS1leHBlcmltZW50YWwtd2FzbS10aHJlYWRzIC0tZXhwZXJpbWVudGFsLXdhc20tYnVsay1tZW1vcnkgYW5kL29yIHJlY2VudCB2ZXJzaW9uKSIpLEVycm9yKCJiYWQgbWVtb3J5Iik7Q2UoKSxIcj1TZS5idWZmZXIuYnl0ZUxlbmd0aDt2YXIgVHQ9W10scXQ9W10seHQ9W10sTHQ9MCx3dD1udWxsLHR0PW51bGw7ZnVuY3Rpb24gdHIoKXtpZihMdC0tLEx0PT0wJiYod3QhPT1udWxsJiYoY2xlYXJJbnRlcnZhbCh3dCksd3Q9bnVsbCksdHQpKXt2YXIgZj10dDt0dD1udWxsLGYoKX19ZnVuY3Rpb24ga2UoZil7dGhyb3cgZj0iQWJvcnRlZCgiK2YrIikiLE5lKGYpLGV0PSEwLGVlPTEsZj1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGYrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxsKGYpLGZ9dmFyIEJlPWY9PmYuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpLGplPWY9PmYuc3RhcnRzV2l0aCgiZmlsZTovLyIpLHZ0O3Z0PSJvcnQtd2FzbS10aHJlYWRlZC53YXNtIixCZSh2dCl8fCh2dD1GKHZ0KSk7ZnVuY3Rpb24gX3QoZil7aWYoaWUpcmV0dXJuIGllKGYpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBqdChmKXtpZih3fHx2KXtpZih0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJiFqZShmKSlyZXR1cm4gZmV0Y2goZix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oYj0+e2lmKCFiLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7Zn0nYDtyZXR1cm4gYi5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9Pl90KGYpKTtpZihqKXJldHVybiBuZXcgUHJvbWlzZSgoYix5KT0+e2ooZixJPT5iKG5ldyBVaW50OEFycmF5KEkpKSx5KX0pfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5fdChmKSl9ZnVuY3Rpb24gcXIoZixiLHkpe3JldHVybiBqdChmKS50aGVuKEk9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEksYikpLnRoZW4oeSxJPT57TmUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7SX1gKSxrZShJKX0pfWZ1bmN0aW9uIFRuKGYsYil7dmFyIHk9dnQ7cmV0dXJuIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyE9ImZ1bmN0aW9uInx8QmUoeSl8fGplKHkpfHxTfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/cXIoeSxmLGIpOmZldGNoKHkse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKEk9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKEksZikudGhlbihiLGZ1bmN0aW9uKGspe3JldHVybiBOZShgd2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICR7a31gKSxOZSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxxcih5LGYsYil9KSl9dmFyIEN0LE9yPXs3OTk0NDQ6KGYsYix5LEkpPT57aWYodHlwZW9mIGk+InUifHwhaS5iYilyZXR1cm4gMTtpZihmPUZlKGY+Pj4wKSxmLnN0YXJ0c1dpdGgoIi4vIikmJihmPWYuc3Vic3RyaW5nKDIpKSxmPWkuYmIuZ2V0KGYpLCFmKXJldHVybiAyO2lmKGI+Pj49MCx5Pj4+PTAsST4+Pj0wLGIreT5mLmJ5dGVMZW5ndGgpcmV0dXJuIDM7dHJ5e3JldHVybiBlKCkuc2V0KGYuc3ViYXJyYXkoYixiK3kpLEk+Pj4wKSwwfWNhdGNoe3JldHVybiA0fX19O2Z1bmN0aW9uIHJyKGYpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPWBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7Zn0pYCx0aGlzLnN0YXR1cz1mfXZhciBucj1mPT57Zi50ZXJtaW5hdGUoKSxmLm9ubWVzc2FnZT0oKT0+e319LHhuPWY9PntYLk9hLmxlbmd0aD09MCYmKFhyKCksWC5YYShYLk9hWzBdKSk7dmFyIGI9WC5PYS5wb3AoKTtpZighYilyZXR1cm4gNjtYLlBhLnB1c2goYiksWC5MYVtmLk5hXT1iLGIuTmE9Zi5OYTt2YXIgeT17Y21kOiJydW4iLHN0YXJ0X3JvdXRpbmU6Zi5nYixhcmc6Zi5jYixwdGhyZWFkX3B0cjpmLk5hfTtyZXR1cm4gUyYmYi51bnJlZigpLGIucG9zdE1lc3NhZ2UoeSxmLm1iKSwwfSxHdD0wLHduPWY9Pnt2YXIgYj16bygpO3JldHVybiBmPWYoKSxTbihiKSxmfSxoZT0oZixiLC4uLnkpPT53bigoKT0+e2Zvcih2YXIgST15Lmxlbmd0aCxrPVVvKDgqSSksJD1rPj4+Myx6PTA7ejx5Lmxlbmd0aDt6Kyspe3ZhciBPZT15W3pdO3MoKVskK3o+Pj4wXT1PZX1yZXR1cm4ga2EoZiwwLEksayxiKX0pO2Z1bmN0aW9uIGpyKGYpe2lmKEEpcmV0dXJuIGhlKDAsMSxmKTtlZT1mLDA8R3R8fChYLmhiKCksaS5vbkV4aXQ/LihmKSxldD0hMCksVChmLG5ldyBycihmKSl9dmFyIFlyPWY9PntpZihlZT1mLEEpdGhyb3cgX24oZiksInVud2luZCI7anIoZil9O2Z1bmN0aW9uIHRlKCl7Zm9yKHZhciBmPWkubnVtVGhyZWFkcztmLS07KVhyKCk7VHQudW5zaGlmdCgoKT0+e0x0Kyssdm4oKCk9PnRyKCkpfSl9ZnVuY3Rpb24gWHIoKXt2YXIgZj1GKCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtmPW5ldyBXb3JrZXIoZiksWC5PYS5wdXNoKGYpfWZ1bmN0aW9uIHZuKGYpe0E/ZigpOlByb21pc2UuYWxsKFguT2EubWFwKFguWGEpKS50aGVuKGYpfXZhciBYPXtPYTpbXSxQYTpbXSxhYjpbXSxMYTp7fSxWYSgpe0E/KFgucmVjZWl2ZU9iamVjdFRyYW5zZmVyPVguZmIsWC50aHJlYWRJbml0VExTPVguJGEsWC5zZXRFeGl0U3RhdHVzPVguWmEpOnRlKCl9LFphOmY9PmVlPWYscGI6WyIkdGVybWluYXRlV29ya2VyIl0saGI6KCk9Pntmb3IodmFyIGYgb2YgWC5QYSlucihmKTtmb3IoZiBvZiBYLk9hKW5yKGYpO1guT2E9W10sWC5QYT1bXSxYLkxhPVtdfSxZYTpmPT57dmFyIGI9Zi5OYTtkZWxldGUgWC5MYVtiXSxYLk9hLnB1c2goZiksWC5QYS5zcGxpY2UoWC5QYS5pbmRleE9mKGYpLDEpLGYuTmE9MCxNbyhiKX0sZmIoKXt9LCRhKCl7WC5hYi5mb3JFYWNoKGY9PmYoKSl9LFhhOmY9Pm5ldyBQcm9taXNlKGI9PntmLm9ubWVzc2FnZT0kPT57JD0kLmRhdGE7dmFyIHo9JC5jbWQ7aWYoJC50YXJnZXRUaHJlYWQmJiQudGFyZ2V0VGhyZWFkIT1JbigpKXt2YXIgT2U9WC5MYVskLnRhcmdldFRocmVhZF07T2U/T2UucG9zdE1lc3NhZ2UoJCwkLnRyYW5zZmVyTGlzdCk6TmUoYEludGVybmFsIGVycm9yISBXb3JrZXIgc2VudCBhIG1lc3NhZ2UgIiR7en0iIHRvIHRhcmdldCBwdGhyZWFkICR7JC50YXJnZXRUaHJlYWR9LCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyFgKX1lbHNlIHo9PT0iY2hlY2tNYWlsYm94Ij9PbigpOno9PT0ic3Bhd25UaHJlYWQiP3huKCQpOno9PT0iY2xlYW51cFRocmVhZCI/WC5ZYShYLkxhWyQudGhyZWFkXSk6ej09PSJraWxsVGhyZWFkIj8oJD0kLnRocmVhZCx6PVguTGFbJF0sZGVsZXRlIFguTGFbJF0sbnIoeiksTW8oJCksWC5QYS5zcGxpY2UoWC5QYS5pbmRleE9mKHopLDEpLHouTmE9MCk6ej09PSJjYW5jZWxUaHJlYWQiP1guTGFbJC50aHJlYWRdLnBvc3RNZXNzYWdlKHtjbWQ6ImNhbmNlbCJ9KTp6PT09ImxvYWRlZCI/KGYubG9hZGVkPSEwLFMmJiFmLk5hJiZmLnVucmVmKCksYihmKSk6ej09PSJhbGVydCI/YWxlcnQoYFRocmVhZCAkeyQudGhyZWFkSWR9OiAkeyQudGV4dH1gKTokLnRhcmdldD09PSJzZXRpbW1lZGlhdGUiP2YucG9zdE1lc3NhZ2UoJCk6ej09PSJjYWxsSGFuZGxlciI/aVskLmhhbmRsZXJdKC4uLiQuYXJncyk6eiYmTmUoYHdvcmtlciBzZW50IGFuIHVua25vd24gY29tbWFuZCAke3p9YCl9LGYub25lcnJvcj0kPT57dGhyb3cgTmUoYHdvcmtlciBzZW50IGFuIGVycm9yISAkeyQuZmlsZW5hbWV9OiR7JC5saW5lbm99OiAkeyQubWVzc2FnZX1gKSwkfSxTJiYoZi5vbigibWVzc2FnZSIsJD0+Zi5vbm1lc3NhZ2Uoe2RhdGE6JH0pKSxmLm9uKCJlcnJvciIsJD0+Zi5vbmVycm9yKCQpKSk7dmFyIHk9W10sST1bIm9uRXhpdCJdLGs7Zm9yKGsgb2YgSSlpLmhhc093blByb3BlcnR5KGspJiZ5LnB1c2goayk7Zi5wb3N0TWVzc2FnZSh7Y21kOiJsb2FkIixoYW5kbGVyczp5LHVybE9yQmxvYjppLm1haW5TY3JpcHRVcmxPckJsb2J8fGEsd2FzbU1lbW9yeTpTZSx3YXNtTW9kdWxlOnl0fSl9KX07aS5QVGhyZWFkPVg7dmFyIG9yPWY9Pntmb3IoOzA8Zi5sZW5ndGg7KWYuc2hpZnQoKShpKX07aS5lc3RhYmxpc2hTdGFja1NwYWNlPSgpPT57dmFyIGY9SW4oKSxiPW4oKVtmKzUyPj4+Mj4+PjBdO2Y9bigpW2YrNTY+Pj4yPj4+MF0sUmEoYixiLWYpLFNuKGIpfTtmdW5jdGlvbiBfbihmKXtpZihBKXJldHVybiBoZSgxLDAsZik7WXIoZil9dmFyIFV0PVtdLEtyO2kuaW52b2tlRW50cnlQb2ludD0oZixiKT0+e0d0PTA7dmFyIHk9VXRbZl07eXx8KGY+PVV0Lmxlbmd0aCYmKFV0Lmxlbmd0aD1mKzEpLFV0W2ZdPXk9S3IuZ2V0KGYpKSxmPXkoYiksMDxHdD9YLlphKGYpOkdvKGYpfTtjbGFzcyBte2NvbnN0cnVjdG9yKGIpe3RoaXMuVWE9Yi0yNH1WYShiLHkpe24oKVt0aGlzLlVhKzE2Pj4+Mj4+PjBdPTAsbigpW3RoaXMuVWErND4+PjI+Pj4wXT1iLG4oKVt0aGlzLlVhKzg+Pj4yPj4+MF09eX19dmFyIHg9MCxPPTA7ZnVuY3Rpb24gRChmLGIseSxJKXtyZXR1cm4gQT9oZSgyLDEsZixiLHksSSk6TShmLGIseSxJKX1mdW5jdGlvbiBNKGYsYix5LEkpe2lmKGY+Pj49MCxiPj4+PTAseT4+Pj0wLEk+Pj49MCx0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI+InUiKXJldHVybiBOZSgiQ3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFNoYXJlZEFycmF5QnVmZmVyLCBwdGhyZWFkcyBhcmUgbm90IGF2YWlsYWJsZSEiKSw2O3ZhciBrPVtdO3JldHVybiBBJiZrLmxlbmd0aD09PTA/RChmLGIseSxJKTooZj17Z2I6eSxOYTpmLGNiOkksbWI6a30sQT8oZi5vYj0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKGYsayksMCk6eG4oZikpfXZhciBxPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwLHJlPShmLGIseSk9PntiPj4+PTA7dmFyIEk9Yit5O2Zvcih5PWI7Zlt5XSYmISh5Pj1JKTspKyt5O2lmKDE2PHktYiYmZi5idWZmZXImJnEpcmV0dXJuIHEuZGVjb2RlKGYuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/Zi5zbGljZShiLHkpOmYuc3ViYXJyYXkoYix5KSk7Zm9yKEk9IiI7Yjx5Oyl7dmFyIGs9ZltiKytdO2lmKGsmMTI4KXt2YXIgJD1mW2IrK10mNjM7aWYoKGsmMjI0KT09MTkyKUkrPVN0cmluZy5mcm9tQ2hhckNvZGUoKGsmMzEpPDw2fCQpO2Vsc2V7dmFyIHo9ZltiKytdJjYzO2s9KGsmMjQwKT09MjI0PyhrJjE1KTw8MTJ8JDw8Nnx6OihrJjcpPDwxOHwkPDwxMnx6PDw2fGZbYisrXSY2Myw2NTUzNj5rP0krPVN0cmluZy5mcm9tQ2hhckNvZGUoayk6KGstPTY1NTM2LEkrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8az4+MTAsNTYzMjB8ayYxMDIzKSl9fWVsc2UgSSs9U3RyaW5nLmZyb21DaGFyQ29kZShrKX1yZXR1cm4gSX0sRmU9KGYsYik9PihmPj4+PTApP3JlKGUoKSxmLGIpOiIiO2Z1bmN0aW9uIHN0KGYsYix5KXtyZXR1cm4gQT9oZSgzLDEsZixiLHkpOjB9ZnVuY3Rpb24gemUoZixiKXtpZihBKXJldHVybiBoZSg0LDEsZixiKX12YXIgVmU9Zj0+e2Zvcih2YXIgYj0wLHk9MDt5PGYubGVuZ3RoOysreSl7dmFyIEk9Zi5jaGFyQ29kZUF0KHkpOzEyNz49ST9iKys6MjA0Nz49ST9iKz0yOjU1Mjk2PD1JJiY1NzM0Mz49ST8oYis9NCwrK3kpOmIrPTN9cmV0dXJuIGJ9LEpyPShmLGIseSxJKT0+e2lmKHk+Pj49MCwhKDA8SSkpcmV0dXJuIDA7dmFyIGs9eTtJPXkrSS0xO2Zvcih2YXIgJD0wOyQ8Zi5sZW5ndGg7KyskKXt2YXIgej1mLmNoYXJDb2RlQXQoJCk7aWYoNTUyOTY8PXomJjU3MzQzPj16KXt2YXIgT2U9Zi5jaGFyQ29kZUF0KCsrJCk7ej02NTUzNisoKHomMTAyMyk8PDEwKXxPZSYxMDIzfWlmKDEyNz49eil7aWYoeT49SSlicmVhaztiW3krKz4+PjBdPXp9ZWxzZXtpZigyMDQ3Pj16KXtpZih5KzE+PUkpYnJlYWs7Ylt5Kys+Pj4wXT0xOTJ8ej4+Nn1lbHNle2lmKDY1NTM1Pj16KXtpZih5KzI+PUkpYnJlYWs7Ylt5Kys+Pj4wXT0yMjR8ej4+MTJ9ZWxzZXtpZih5KzM+PUkpYnJlYWs7Ylt5Kys+Pj4wXT0yNDB8ej4+MTgsYlt5Kys+Pj4wXT0xMjh8ej4+MTImNjN9Ylt5Kys+Pj4wXT0xMjh8ej4+NiY2M31iW3krKz4+PjBdPTEyOHx6JjYzfX1yZXR1cm4gYlt5Pj4+MF09MCx5LWt9LFl0PShmLGIseSk9PkpyKGYsZSgpLGIseSk7ZnVuY3Rpb24gUChmLGIpe2lmKEEpcmV0dXJuIGhlKDUsMSxmLGIpfWZ1bmN0aW9uIHBlKGYsYix5KXtpZihBKXJldHVybiBoZSg2LDEsZixiLHkpfWZ1bmN0aW9uIHhlKGYsYix5KXtyZXR1cm4gQT9oZSg3LDEsZixiLHkpOjB9ZnVuY3Rpb24gRnQoZixiKXtpZihBKXJldHVybiBoZSg4LDEsZixiKX1mdW5jdGlvbiBacihmLGIseSl7aWYoQSlyZXR1cm4gaGUoOSwxLGYsYix5KX1mdW5jdGlvbiBoYShmLGIseSxJKXtpZihBKXJldHVybiBoZSgxMCwxLGYsYix5LEkpfWZ1bmN0aW9uIG1hKGYsYix5LEkpe2lmKEEpcmV0dXJuIGhlKDExLDEsZixiLHksSSl9ZnVuY3Rpb24gYmEoZixiLHksSSl7aWYoQSlyZXR1cm4gaGUoMTIsMSxmLGIseSxJKX1mdW5jdGlvbiBnYShmKXtpZihBKXJldHVybiBoZSgxMywxLGYpfWZ1bmN0aW9uIHlhKGYsYil7aWYoQSlyZXR1cm4gaGUoMTQsMSxmLGIpfWZ1bmN0aW9uIFRhKGYsYix5KXtpZihBKXJldHVybiBoZSgxNSwxLGYsYix5KX1mdW5jdGlvbiAkbyhmKXtmPj4+PTAsdHlwZW9mIEF0b21pY3MubmI9PSJmdW5jdGlvbiImJihBdG9taWNzLm5iKHIoKSxmPj4+MixmKS52YWx1ZS50aGVuKE9uKSxmKz0xMjgsQXRvbWljcy5zdG9yZShyKCksZj4+PjIsMSkpfWkuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PSRvO3ZhciBPbj0oKT0+e3ZhciBmPUluKCk7aWYoZiYmKCRvKGYpLGY9QmEsIWV0KSl0cnl7aWYoZigpLCEoMDxHdCkpdHJ5e0E/R28oZWUpOllyKGVlKX1jYXRjaChiKXtiIGluc3RhbmNlb2YgcnJ8fGI9PSJ1bndpbmQifHxUKDEsYil9fWNhdGNoKGIpe2IgaW5zdGFuY2VvZiBycnx8Yj09InVud2luZCJ8fFQoMSxiKX19O2kuY2hlY2tNYWlsYm94PU9uO3ZhciBrbz1bXSxJcj1mPT5mJTQ9PT0wJiYoZiUxMDAhPT0wfHxmJTQwMD09PTApLHhhPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHdhPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdO2Z1bmN0aW9uIHZhKGYsYix5LEksaywkLHosT2Upe3JldHVybiBBP2hlKDE2LDEsZixiLHksSSxrLCQseixPZSk6LTUyfWZ1bmN0aW9uIF9hKGYsYix5LEksaywkLHope2lmKEEpcmV0dXJuIGhlKDE3LDEsZixiLHksSSxrLCQseil9dmFyIEJvPVtdLE5vPXt9LE9hPSgpPT57aWYoIVJvKXt2YXIgZj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOih0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86ZHx8Ii4vdGhpcy5wcm9ncmFtIn0sYjtmb3IoYiBpbiBObylOb1tiXT09PXZvaWQgMD9kZWxldGUgZltiXTpmW2JdPU5vW2JdO3ZhciB5PVtdO2ZvcihiIGluIGYpeS5wdXNoKGAke2J9PSR7ZltiXX1gKTtSbz15fXJldHVybiBSb30sUm87ZnVuY3Rpb24gSWEoZixiKXtpZihBKXJldHVybiBoZSgxOCwxLGYsYik7Zj4+Pj0wLGI+Pj49MDt2YXIgeT0wO3JldHVybiBPYSgpLmZvckVhY2goKEksayk9Pnt2YXIgJD1iK3k7Zm9yKGs9bigpW2YrNCprPj4+Mj4+PjBdPSQsJD0wOyQ8SS5sZW5ndGg7KyskKW8oKVtrKys+Pj4wXT1JLmNoYXJDb2RlQXQoJCk7bygpW2s+Pj4wXT0wLHkrPUkubGVuZ3RoKzF9KSwwfWZ1bmN0aW9uIFNhKGYsYil7aWYoQSlyZXR1cm4gaGUoMTksMSxmLGIpO2Y+Pj49MCxiPj4+PTA7dmFyIHk9T2EoKTtuKClbZj4+PjI+Pj4wXT15Lmxlbmd0aDt2YXIgST0wO3JldHVybiB5LmZvckVhY2goaz0+SSs9ay5sZW5ndGgrMSksbigpW2I+Pj4yPj4+MF09SSwwfWZ1bmN0aW9uIEFhKGYpe3JldHVybiBBP2hlKDIwLDEsZik6NTJ9ZnVuY3Rpb24gUGEoZixiLHksSSl7cmV0dXJuIEE/aGUoMjEsMSxmLGIseSxJKTo1Mn1mdW5jdGlvbiBFYShmLGIseSxJLGspe3JldHVybiBBP2hlKDIyLDEsZixiLHksSSxrKTo3MH12YXIgYmQ9W251bGwsW10sW11dO2Z1bmN0aW9uIERhKGYsYix5LEkpe2lmKEEpcmV0dXJuIGhlKDIzLDEsZixiLHksSSk7Yj4+Pj0wLHk+Pj49MCxJPj4+PTA7Zm9yKHZhciBrPTAsJD0wOyQ8eTskKyspe3ZhciB6PW4oKVtiPj4+Mj4+PjBdLE9lPW4oKVtiKzQ+Pj4yPj4+MF07Yis9ODtmb3IodmFyICR0PTA7JHQ8T2U7JHQrKyl7dmFyIFllPWUoKVt6KyR0Pj4+MF0scnQ9YmRbZl07WWU9PT0wfHxZZT09PTEwPygoZj09PTE/WTpOZSkocmUocnQsMCkpLHJ0Lmxlbmd0aD0wKTpydC5wdXNoKFllKX1rKz1PZX1yZXR1cm4gbigpW0k+Pj4yPj4+MF09aywwfXZhciBMYT1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLENhPVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV07ZnVuY3Rpb24gZ2QoZil7dmFyIGI9QXJyYXkoVmUoZikrMSk7cmV0dXJuIEpyKGYsYiwwLGIubGVuZ3RoKSxifXZhciB5ZD0oZixiKT0+e28oKS5zZXQoZixiPj4+MCl9O2Z1bmN0aW9uIEZhKGYsYix5LEkpe2Z1bmN0aW9uIGsoRSxkZSxJZSl7Zm9yKEU9dHlwZW9mIEU9PSJudW1iZXIiP0UudG9TdHJpbmcoKTpFfHwiIjtFLmxlbmd0aDxkZTspRT1JZVswXStFO3JldHVybiBFfWZ1bmN0aW9uICQoRSxkZSl7cmV0dXJuIGsoRSxkZSwiMCIpfWZ1bmN0aW9uIHooRSxkZSl7ZnVuY3Rpb24gSWUoemEpe3JldHVybiAwPnphPy0xOjA8emE/MTowfXZhciBpcjtyZXR1cm4oaXI9SWUoRS5nZXRGdWxsWWVhcigpLWRlLmdldEZ1bGxZZWFyKCkpKT09PTAmJihpcj1JZShFLmdldE1vbnRoKCktZGUuZ2V0TW9udGgoKSkpPT09MCYmKGlyPUllKEUuZ2V0RGF0ZSgpLWRlLmdldERhdGUoKSkpLGlyfWZ1bmN0aW9uIE9lKEUpe3N3aXRjaChFLmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKEUuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIEU7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShFLmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKEUuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUoRS5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShFLmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZShFLmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uICR0KEUpe3ZhciBkZT1FLlFhO2ZvcihFPW5ldyBEYXRlKG5ldyBEYXRlKEUuUmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDxkZTspe3ZhciBJZT1FLmdldE1vbnRoKCksaXI9KElyKEUuZ2V0RnVsbFllYXIoKSk/TGE6Q2EpW0llXTtpZihkZT5pci1FLmdldERhdGUoKSlkZS09aXItRS5nZXREYXRlKCkrMSxFLnNldERhdGUoMSksMTE+SWU/RS5zZXRNb250aChJZSsxKTooRS5zZXRNb250aCgwKSxFLnNldEZ1bGxZZWFyKEUuZ2V0RnVsbFllYXIoKSsxKSk7ZWxzZXtFLnNldERhdGUoRS5nZXREYXRlKCkrZGUpO2JyZWFrfX1yZXR1cm4gSWU9bmV3IERhdGUoRS5nZXRGdWxsWWVhcigpKzEsMCw0KSxkZT1PZShuZXcgRGF0ZShFLmdldEZ1bGxZZWFyKCksMCw0KSksSWU9T2UoSWUpLDA+PXooZGUsRSk/MD49eihJZSxFKT9FLmdldEZ1bGxZZWFyKCkrMTpFLmdldEZ1bGxZZWFyKCk6RS5nZXRGdWxsWWVhcigpLTF9Zj4+Pj0wLGI+Pj49MCx5Pj4+PTAsST4+Pj0wO3ZhciBZZT1uKClbSSs0MD4+PjI+Pj4wXTtJPXtrYjpyKClbST4+PjI+Pj4wXSxqYjpyKClbSSs0Pj4+Mj4+PjBdLFNhOnIoKVtJKzg+Pj4yPj4+MF0sV2E6cigpW0krMTI+Pj4yPj4+MF0sVGE6cigpW0krMTY+Pj4yPj4+MF0sUmE6cigpW0krMjA+Pj4yPj4+MF0sTWE6cigpW0krMjQ+Pj4yPj4+MF0sUWE6cigpW0krMjg+Pj4yPj4+MF0scWI6cigpW0krMzI+Pj4yPj4+MF0saWI6cigpW0krMzY+Pj4yPj4+MF0sbGI6WWU/RmUoWWUpOiIifSx5PUZlKHkpLFllPXsiJWMiOiIlYSAlYiAlZCAlSDolTTolUyAlWSIsIiVEIjoiJW0vJWQvJXkiLCIlRiI6IiVZLSVtLSVkIiwiJWgiOiIlYiIsIiVyIjoiJUk6JU06JVMgJXAiLCIlUiI6IiVIOiVNIiwiJVQiOiIlSDolTTolUyIsIiV4IjoiJW0vJWQvJXkiLCIlWCI6IiVIOiVNOiVTIiwiJUVjIjoiJWMiLCIlRUMiOiIlQyIsIiVFeCI6IiVtLyVkLyV5IiwiJUVYIjoiJUg6JU06JVMiLCIlRXkiOiIleSIsIiVFWSI6IiVZIiwiJU9kIjoiJWQiLCIlT2UiOiIlZSIsIiVPSCI6IiVIIiwiJU9JIjoiJUkiLCIlT20iOiIlbSIsIiVPTSI6IiVNIiwiJU9TIjoiJVMiLCIlT3UiOiIldSIsIiVPVSI6IiVVIiwiJU9WIjoiJVYiLCIlT3ciOiIldyIsIiVPVyI6IiVXIiwiJU95IjoiJXkifTtmb3IodmFyIHJ0IGluIFllKXk9eS5yZXBsYWNlKG5ldyBSZWdFeHAocnQsImciKSxZZVtydF0pO3ZhciBHYT0iU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkiLnNwbGl0KCIgIiksVWE9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7WWU9eyIlYSI6RT0+R2FbRS5NYV0uc3Vic3RyaW5nKDAsMyksIiVBIjpFPT5HYVtFLk1hXSwiJWIiOkU9PlVhW0UuVGFdLnN1YnN0cmluZygwLDMpLCIlQiI6RT0+VWFbRS5UYV0sIiVDIjpFPT4kKChFLlJhKzE5MDApLzEwMHwwLDIpLCIlZCI6RT0+JChFLldhLDIpLCIlZSI6RT0+ayhFLldhLDIsIiAiKSwiJWciOkU9PiR0KEUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlRyI6JHQsIiVIIjpFPT4kKEUuU2EsMiksIiVJIjpFPT4oRT1FLlNhLEU9PTA/RT0xMjoxMjxFJiYoRS09MTIpLCQoRSwyKSksIiVqIjpFPT57Zm9yKHZhciBkZT0wLEllPTA7SWU8PUUuVGEtMTtkZSs9KElyKEUuUmErMTkwMCk/TGE6Q2EpW0llKytdKTtyZXR1cm4gJChFLldhK2RlLDMpfSwiJW0iOkU9PiQoRS5UYSsxLDIpLCIlTSI6RT0+JChFLmpiLDIpLCIlbiI6KCk9PmAKYCwiJXAiOkU9PjA8PUUuU2EmJjEyPkUuU2E/IkFNIjoiUE0iLCIlUyI6RT0+JChFLmtiLDIpLCIldCI6KCk9PiIJIiwiJXUiOkU9PkUuTWF8fDcsIiVVIjpFPT4kKE1hdGguZmxvb3IoKEUuUWErNy1FLk1hKS83KSwyKSwiJVYiOkU9Pnt2YXIgZGU9TWF0aC5mbG9vcigoRS5RYSs3LShFLk1hKzYpJTcpLzcpO2lmKDI+PShFLk1hKzM3MS1FLlFhLTIpJTcmJmRlKyssZGUpZGU9PTUzJiYoSWU9KEUuTWErMzcxLUUuUWEpJTcsSWU9PTR8fEllPT0zJiZJcihFLlJhKXx8KGRlPTEpKTtlbHNle2RlPTUyO3ZhciBJZT0oRS5NYSs3LUUuUWEtMSklNzsoSWU9PTR8fEllPT01JiZJcihFLlJhJTQwMC0xKSkmJmRlKyt9cmV0dXJuICQoZGUsMil9LCIldyI6RT0+RS5NYSwiJVciOkU9PiQoTWF0aC5mbG9vcigoRS5RYSs3LShFLk1hKzYpJTcpLzcpLDIpLCIleSI6RT0+KEUuUmErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjpFPT5FLlJhKzE5MDAsIiV6IjpFPT57RT1FLmliO3ZhciBkZT0wPD1FO3JldHVybiBFPU1hdGguYWJzKEUpLzYwLChkZT8iKyI6Ii0iKSsoIjAwMDAiKyhFLzYwKjEwMCtFJTYwKSkuc2xpY2UoLTQpfSwiJVoiOkU9PkUubGIsIiUlIjooKT0+IiUifSx5PXkucmVwbGFjZSgvJSUvZywiXDBcMCIpO2ZvcihydCBpbiBZZSl5LmluY2x1ZGVzKHJ0KSYmKHk9eS5yZXBsYWNlKG5ldyBSZWdFeHAocnQsImciKSxZZVtydF0oSSkpKTtyZXR1cm4geT15LnJlcGxhY2UoL1wwXDAvZywiJSIpLHJ0PWdkKHkpLHJ0Lmxlbmd0aD5iPzA6KHlkKHJ0LGYpLHJ0Lmxlbmd0aC0xKX1YLlZhKCk7dmFyIFRkPVtqcixfbixELHN0LHplLFAscGUseGUsRnQsWnIsaGEsbWEsYmEsZ2EseWEsVGEsdmEsX2EsSWEsU2EsQWEsUGEsRWEsRGFdLHhkPXtiOmZ1bmN0aW9uKGYsYix5KXt0aHJvdyBmPj4+PTAsbmV3IG0oZikuVmEoYj4+PjAseT4+PjApLHg9ZixPKysseH0sTDpmdW5jdGlvbihmKXskYShmPj4+MCwhdiwxLCF3LDEzMTA3MiwhMSksWC4kYSgpfSxqOmZ1bmN0aW9uKGYpe2Y+Pj49MCxBP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDpmfSk6WC5ZYShYLkxhW2ZdKX0sSDpNLGg6c3QsUzp6ZSxEOlAsRjpwZSxUOnhlLFE6RnQsSjpacixQOmhhLG46bWEsRTpiYSxCOmdhLFI6eWEsQzpUYSxwOigpPT4xLHo6ZnVuY3Rpb24oZixiKXtmPj4+PTAsZj09Yj4+PjA/c2V0VGltZW91dChPbik6QT9wb3N0TWVzc2FnZSh7dGFyZ2V0VGhyZWFkOmYsY21kOiJjaGVja01haWxib3gifSk6KGY9WC5MYVtmXSkmJmYucG9zdE1lc3NhZ2Uoe2NtZDoiY2hlY2tNYWlsYm94In0pfSxJOmZ1bmN0aW9uKGYsYix5LEksayl7Yj4+Pj0wLHk+Pj49MCxrby5sZW5ndGg9SSxrPWs+Pj4wPj4+Mztmb3IodmFyICQ9MDskPEk7JCsrKWtvWyRdPXMoKVtrKyQ+Pj4wXTtyZXR1cm4gZj1iP09yW2JdOlRkW2ZdLFguZWI9eSx5PWYoLi4ua28pLFguZWI9MCx5fSxLOiRvLG86ZnVuY3Rpb24oZil7UyYmWC5MYVtmPj4+MF0ucmVmKCl9LHM6ZnVuY3Rpb24oZixiLHkpe2Y9YisyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZj8oZj4+PjApKzQyOTQ5NjcyOTYqYjpOYU4seT4+Pj0wLGY9bmV3IERhdGUoMWUzKmYpLHIoKVt5Pj4+Mj4+PjBdPWYuZ2V0VVRDU2Vjb25kcygpLHIoKVt5KzQ+Pj4yPj4+MF09Zi5nZXRVVENNaW51dGVzKCkscigpW3krOD4+PjI+Pj4wXT1mLmdldFVUQ0hvdXJzKCkscigpW3krMTI+Pj4yPj4+MF09Zi5nZXRVVENEYXRlKCkscigpW3krMTY+Pj4yPj4+MF09Zi5nZXRVVENNb250aCgpLHIoKVt5KzIwPj4+Mj4+PjBdPWYuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLHIoKVt5KzI0Pj4+Mj4+PjBdPWYuZ2V0VVRDRGF5KCksZj0oZi5nZXRUaW1lKCktRGF0ZS5VVEMoZi5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MCxyKClbeSsyOD4+PjI+Pj4wXT1mfSx0OmZ1bmN0aW9uKGYsYix5KXtmPWIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWY/KGY+Pj4wKSs0Mjk0OTY3Mjk2KmI6TmFOLHk+Pj49MCxmPW5ldyBEYXRlKDFlMypmKSxyKClbeT4+PjI+Pj4wXT1mLmdldFNlY29uZHMoKSxyKClbeSs0Pj4+Mj4+PjBdPWYuZ2V0TWludXRlcygpLHIoKVt5Kzg+Pj4yPj4+MF09Zi5nZXRIb3VycygpLHIoKVt5KzEyPj4+Mj4+PjBdPWYuZ2V0RGF0ZSgpLHIoKVt5KzE2Pj4+Mj4+PjBdPWYuZ2V0TW9udGgoKSxyKClbeSsyMD4+PjI+Pj4wXT1mLmdldEZ1bGxZZWFyKCktMTkwMCxyKClbeSsyND4+PjI+Pj4wXT1mLmdldERheSgpLGI9KElyKGYuZ2V0RnVsbFllYXIoKSk/eGE6d2EpW2YuZ2V0TW9udGgoKV0rZi5nZXREYXRlKCktMXwwLHIoKVt5KzI4Pj4+Mj4+PjBdPWIscigpW3krMzY+Pj4yPj4+MF09LSg2MCpmLmdldFRpbWV6b25lT2Zmc2V0KCkpLGI9bmV3IERhdGUoZi5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgST1uZXcgRGF0ZShmLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO2Y9KGIhPUkmJmYuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4oSSxiKSl8MCxyKClbeSszMj4+PjI+Pj4wXT1mfSx1OmZ1bmN0aW9uKGYpe2Y+Pj49MDt2YXIgYj1uZXcgRGF0ZShyKClbZisyMD4+PjI+Pj4wXSsxOTAwLHIoKVtmKzE2Pj4+Mj4+PjBdLHIoKVtmKzEyPj4+Mj4+PjBdLHIoKVtmKzg+Pj4yPj4+MF0scigpW2YrND4+PjI+Pj4wXSxyKClbZj4+PjI+Pj4wXSwwKSx5PXIoKVtmKzMyPj4+Mj4+PjBdLEk9Yi5nZXRUaW1lem9uZU9mZnNldCgpLGs9bmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSwkPW5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCksej1NYXRoLm1pbigkLGspO3JldHVybiAwPnk/cigpW2YrMzI+Pj4yPj4+MF09KyhrIT0kJiZ6PT1JKTowPHkhPSh6PT1JKSYmKGs9TWF0aC5tYXgoJCxrKSxiLnNldFRpbWUoYi5nZXRUaW1lKCkrNmU0KigoMDx5P3o6ayktSSkpKSxyKClbZisyND4+PjI+Pj4wXT1iLmdldERheSgpLHk9KElyKGIuZ2V0RnVsbFllYXIoKSk/eGE6d2EpW2IuZ2V0TW9udGgoKV0rYi5nZXREYXRlKCktMXwwLHIoKVtmKzI4Pj4+Mj4+PjBdPXkscigpW2Y+Pj4yPj4+MF09Yi5nZXRTZWNvbmRzKCkscigpW2YrND4+PjI+Pj4wXT1iLmdldE1pbnV0ZXMoKSxyKClbZis4Pj4+Mj4+PjBdPWIuZ2V0SG91cnMoKSxyKClbZisxMj4+PjI+Pj4wXT1iLmdldERhdGUoKSxyKClbZisxNj4+PjI+Pj4wXT1iLmdldE1vbnRoKCkscigpW2YrMjA+Pj4yPj4+MF09Yi5nZXRZZWFyKCksZj1iLmdldFRpbWUoKSxmPWlzTmFOKGYpPy0xOmYvMWUzLE5hKChDdD1mLDE8PStNYXRoLmFicyhDdCk/MDxDdD8rTWF0aC5mbG9vcihDdC80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKChDdC0rKH5+Q3Q+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSxmPj4+MH0scTp2YSxyOl9hLHk6ZnVuY3Rpb24oZixiLHksSSl7Zj4+Pj0wLGI+Pj49MCx5Pj4+PTAsST4+Pj0wO3ZhciBrPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSwkPW5ldyBEYXRlKGssMCwxKSx6PW5ldyBEYXRlKGssNiwxKTtrPSQuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgT2U9ei5nZXRUaW1lem9uZU9mZnNldCgpLCR0PU1hdGgubWF4KGssT2UpO24oKVtmPj4+Mj4+PjBdPTYwKiR0LHIoKVtiPj4+Mj4+PjBdPSsoayE9T2UpLGY9WWU9PlllLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sJD1mKCQpLHo9Zih6KSxPZTxrPyhZdCgkLHksMTcpLFl0KHosSSwxNykpOihZdCgkLEksMTcpLFl0KHoseSwxNykpfSxjOigpPT57a2UoIiIpfSxPOmZ1bmN0aW9uKGYsYix5KXtmPj4+PTAsYj4+Pj0wLHk+Pj49MCxCby5sZW5ndGg9MDtmb3IodmFyIEk7ST1lKClbYisrPj4+MF07KXt2YXIgaz1JIT0xMDU7ayY9SSE9MTEyLHkrPWsmJnklOD80OjAsQm8ucHVzaChJPT0xMTI/bigpW3k+Pj4yPj4+MF06ST09MTA1P3IoKVt5Pj4+Mj4+PjBdOnMoKVt5Pj4+Mz4+PjBdKSx5Kz1rPzg6NH1yZXR1cm4gT3JbZl0oLi4uQm8pfSxrOigpPT57fSxpOigpPT5EYXRlLm5vdygpLFU6KCk9Pnt0aHJvdyBHdCs9MSwidW53aW5kIn0sQTpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxlOigpPT5wZXJmb3JtYW5jZS50aW1lT3JpZ2luK3BlcmZvcm1hbmNlLm5vdygpLGY6KCk9PlM/KENwKCksYXIoTHApKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LHg6ZnVuY3Rpb24oZil7Zj4+Pj0wO3ZhciBiPWUoKS5sZW5ndGg7aWYoZjw9Ynx8NDI5NDkwMTc2MDxmKXJldHVybiExO2Zvcih2YXIgeT0xOzQ+PXk7eSo9Mil7dmFyIEk9YiooMSsuMi95KTtJPU1hdGgubWluKEksZisxMDA2NjMyOTYpO3ZhciBrPU1hdGg7ST1NYXRoLm1heChmLEkpO2U6e2s9KGsubWluLmNhbGwoayw0Mjk0OTAxNzYwLEkrKDY1NTM2LUklNjU1MzYpJTY1NTM2KS1TZS5idWZmZXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e1NlLmdyb3coayksQ2UoKTt2YXIgJD0xO2JyZWFrIGV9Y2F0Y2h7fSQ9dm9pZCAwfWlmKCQpcmV0dXJuITB9cmV0dXJuITF9LE06SWEsTjpTYSxHOllyLGc6QWEsbTpQYSx2OkVhLGw6RGEsYTpTZXx8aS53YXNtTWVtb3J5LHc6RmEsZDpmdW5jdGlvbihmLGIseSxJKXtyZXR1cm4gRmEoZj4+PjAsYj4+PjAseT4+PjAsST4+PjApfX0sSz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoeSxJKXtyZXR1cm4gSz15LmV4cG9ydHMsSz13ZCgpLFguYWIucHVzaChLLnlhKSxLcj1LLnphLHF0LnVuc2hpZnQoSy5WKSx5dD1JLHRyKCksS312YXIgYj17YTp4ZH07aWYoTHQrKyxpLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGkuaW5zdGFudGlhdGVXYXNtKGIsZil9Y2F0Y2goeSl7TmUoYE1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICR7eX1gKSxsKHkpfXJldHVybiBUbihiLGZ1bmN0aW9uKHkpe2YoeS5pbnN0YW5jZSx5Lm1vZHVsZSl9KS5jYXRjaChsKSx7fX0oKTtpLl9PcnRJbml0PShmLGIpPT4oaS5fT3J0SW5pdD1LLlcpKGYsYiksaS5fT3J0R2V0TGFzdEVycm9yPShmLGIpPT4oaS5fT3J0R2V0TGFzdEVycm9yPUsuWCkoZixiKSxpLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0oZixiLHksSSxrLCQseixPZSwkdCxZZSk9PihpLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1LLlkpKGYsYix5LEksaywkLHosT2UsJHQsWWUpLGkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShmLGIpPT4oaS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Sy5aKShmLGIpLGkuX09ydEFkZEZyZWVEaW1lbnNpb25PdmVycmlkZT0oZixiLHkpPT4oaS5fT3J0QWRkRnJlZURpbWVuc2lvbk92ZXJyaWRlPUsuXykoZixiLHkpLGkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZixiLHkpPT4oaS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PUsuJCkoZixiLHkpLGkuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1mPT4oaS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPUsuYWEpKGYpLGkuX09ydENyZWF0ZVNlc3Npb249KGYsYix5KT0+KGkuX09ydENyZWF0ZVNlc3Npb249Sy5iYSkoZixiLHkpLGkuX09ydFJlbGVhc2VTZXNzaW9uPWY9PihpLl9PcnRSZWxlYXNlU2Vzc2lvbj1LLmNhKShmKSxpLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShmLGIseSk9PihpLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PUsuZGEpKGYsYix5KSxpLl9PcnRHZXRJbnB1dE5hbWU9KGYsYik9PihpLl9PcnRHZXRJbnB1dE5hbWU9Sy5lYSkoZixiKSxpLl9PcnRHZXRPdXRwdXROYW1lPShmLGIpPT4oaS5fT3J0R2V0T3V0cHV0TmFtZT1LLmZhKShmLGIpLGkuX09ydEZyZWU9Zj0+KGkuX09ydEZyZWU9Sy5nYSkoZiksaS5fT3J0Q3JlYXRlVGVuc29yPShmLGIseSxJLGssJCk9PihpLl9PcnRDcmVhdGVUZW5zb3I9Sy5oYSkoZixiLHksSSxrLCQpLGkuX09ydEdldFRlbnNvckRhdGE9KGYsYix5LEksayk9PihpLl9PcnRHZXRUZW5zb3JEYXRhPUsuaWEpKGYsYix5LEksayksaS5fT3J0UmVsZWFzZVRlbnNvcj1mPT4oaS5fT3J0UmVsZWFzZVRlbnNvcj1LLmphKShmKSxpLl9PcnRDcmVhdGVSdW5PcHRpb25zPShmLGIseSxJKT0+KGkuX09ydENyZWF0ZVJ1bk9wdGlvbnM9Sy5rYSkoZixiLHksSSksaS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGYsYix5KT0+KGkuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PUsubGEpKGYsYix5KSxpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1mPT4oaS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9Sy5tYSkoZiksaS5fT3J0Q3JlYXRlQmluZGluZz1mPT4oaS5fT3J0Q3JlYXRlQmluZGluZz1LLm5hKShmKSxpLl9PcnRCaW5kSW5wdXQ9KGYsYix5KT0+KGkuX09ydEJpbmRJbnB1dD1LLm9hKShmLGIseSksaS5fT3J0QmluZE91dHB1dD0oZixiLHksSSk9PihpLl9PcnRCaW5kT3V0cHV0PUsucGEpKGYsYix5LEkpLGkuX09ydENsZWFyQm91bmRPdXRwdXRzPWY9PihpLl9PcnRDbGVhckJvdW5kT3V0cHV0cz1LLnFhKShmKSxpLl9PcnRSZWxlYXNlQmluZGluZz1mPT4oaS5fT3J0UmVsZWFzZUJpbmRpbmc9Sy5yYSkoZiksaS5fT3J0UnVuV2l0aEJpbmRpbmc9KGYsYix5LEksayk9PihpLl9PcnRSdW5XaXRoQmluZGluZz1LLnNhKShmLGIseSxJLGspLGkuX09ydFJ1bj0oZixiLHksSSxrLCQseixPZSk9PihpLl9PcnRSdW49Sy50YSkoZixiLHksSSxrLCQseixPZSksaS5fT3J0RW5kUHJvZmlsaW5nPWY9PihpLl9PcnRFbmRQcm9maWxpbmc9Sy51YSkoZik7dmFyIEluPWkuX3B0aHJlYWRfc2VsZj0oKT0+KEluPWkuX3B0aHJlYWRfc2VsZj1LLnZhKSgpO2kuX21hbGxvYz1mPT4oaS5fbWFsbG9jPUsud2EpKGYpLGkuX2ZyZWU9Zj0+KGkuX2ZyZWU9Sy54YSkoZiksaS5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9KCk9PihpLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1LLnlhKSgpO3ZhciAkYT1pLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD0oZixiLHksSSxrLCQpPT4oJGE9aS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9Sy5BYSkoZixiLHksSSxrLCQpO2kuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPSgpPT4oaS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9Sy5CYSkoKTt2YXIga2E9KGYsYix5LEksayk9PihrYT1LLkNhKShmLGIseSxJLGspLE1vPWY9PihNbz1LLkRhKShmKSxHbz1pLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1mPT4oR289aS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9Sy5FYSkoZiksQmE9KCk9PihCYT1LLkZhKSgpLE5hPWY9PihOYT1LLkdhKShmKSxSYT0oZixiKT0+KFJhPUsuSGEpKGYsYiksU249Zj0+KFNuPUsuSWEpKGYpLFVvPWY9PihVbz1LLkphKShmKSx6bz0oKT0+KHpvPUsuS2EpKCk7ZnVuY3Rpb24gd2QoKXt2YXIgZj1LO2Y9T2JqZWN0LmFzc2lnbih7fSxmKTt2YXIgYj1JPT4oKT0+SSgpPj4+MCx5PUk9Pms9Pkkoayk+Pj4wO3JldHVybiBmLnZhPWIoZi52YSksZi53YT15KGYud2EpLGYuZW1zY3JpcHRlbl9tYWluX3J1bnRpbWVfdGhyZWFkX2lkPWIoZi5lbXNjcmlwdGVuX21haW5fcnVudGltZV90aHJlYWRfaWQpLGYuSmE9eShmLkphKSxmLkthPWIoZi5LYSksZn1pLndhc21NZW1vcnk9U2UsaS5zdGFja1NhdmU9KCk9PnpvKCksaS5zdGFja1Jlc3RvcmU9Zj0+U24oZiksaS5zdGFja0FsbG9jPWY9PlVvKGYpLGkua2VlcFJ1bnRpbWVBbGl2ZT0oKT0+MDxHdCxpLlVURjhUb1N0cmluZz1GZSxpLnN0cmluZ1RvVVRGOD1ZdCxpLmxlbmd0aEJ5dGVzVVRGOD1WZSxpLkV4aXRTdGF0dXM9cnIsaS5QVGhyZWFkPVg7dmFyIEFuO3R0PWZ1bmN0aW9uIGYoKXtBbnx8TWEoKSxBbnx8KHR0PWYpfTtmdW5jdGlvbiBNYSgpe2lmKCEoMDxMdCkpaWYoQSl1KGkpLEF8fG9yKHF0KSxzdGFydFdvcmtlcihpKTtlbHNle2lmKGkucHJlUnVuKWZvcih0eXBlb2YgaS5wcmVSdW49PSJmdW5jdGlvbiImJihpLnByZVJ1bj1baS5wcmVSdW5dKTtpLnByZVJ1bi5sZW5ndGg7KVR0LnVuc2hpZnQoaS5wcmVSdW4uc2hpZnQoKSk7b3IoVHQpLDA8THR8fEFufHwoQW49ITAsaS5jYWxsZWRSdW49ITAsZXR8fChBfHxvcihxdCksdShpKSxBfHxvcih4dCkpKX19cmV0dXJuIE1hKCksY319KSgpO3R5cGVvZiAkcD09Im9iamVjdCImJnR5cGVvZiBuYT09Im9iamVjdCI/bmEuZXhwb3J0cz1GcDp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoW10sKCk9PkZwKX0pO3ZhciBCcD1tZSgoYU8sYWcpPT57YWcuZXhwb3J0cz0nInVzZSBzdHJpY3QiO3ZhciBNb2R1bGU9e30sRU5WSVJPTk1FTlRfSVNfTk9ERT10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyI7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7dmFyIG5vZGVXb3JrZXJUaHJlYWRzPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIikscGFyZW50UG9ydD1ub2RlV29ya2VyVGhyZWFkcy5wYXJlbnRQb3J0O3BhcmVudFBvcnQub24oIm1lc3NhZ2UiLGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpO3ZhciBmcz1yZXF1aXJlKCJmcyIpLHZtPXJlcXVpcmUoInZtIik7T2JqZWN0LmFzc2lnbihnbG9iYWwse3NlbGY6Z2xvYmFsLHJlcXVpcmUsTW9kdWxlLGxvY2F0aW9uOntocmVmOl9fZmlsZW5hbWV9LFdvcmtlcjpub2RlV29ya2VyVGhyZWFkcy5Xb3JrZXIsaW1wb3J0U2NyaXB0czplPT52bS5ydW5JblRoaXNDb250ZXh0KGZzLnJlYWRGaWxlU3luYyhlLCJ1dGY4Iikse2ZpbGVuYW1lOmV9KSxwb3N0TWVzc2FnZTplPT5wYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGUpLHBlcmZvcm1hbmNlOmdsb2JhbC5wZXJmb3JtYW5jZXx8e25vdzpEYXRlLm5vd319KX12YXIgaW5pdGlhbGl6ZWRKUz0hMTtmdW5jdGlvbiB0aHJlYWRQcmludEVyciguLi5lKXt2YXIgYT1lLmpvaW4oIiAiKTtpZihFTlZJUk9OTUVOVF9JU19OT0RFKXtmcy53cml0ZVN5bmMoMixhK2BcbmApO3JldHVybn1jb25zb2xlLmVycm9yKGEpfWZ1bmN0aW9uIHRocmVhZEFsZXJ0KC4uLmUpe3ZhciBhPWUuam9pbigiICIpO3Bvc3RNZXNzYWdlKHtjbWQ6ImFsZXJ0Iix0ZXh0OmEsdGhyZWFkSWQ6TW9kdWxlLl9wdGhyZWFkX3NlbGYoKX0pfXZhciBlcnI9dGhyZWFkUHJpbnRFcnI7c2VsZi5hbGVydD10aHJlYWRBbGVydCxNb2R1bGUuaW5zdGFudGlhdGVXYXNtPShlLGEpPT57dmFyIHI9TW9kdWxlLndhc21Nb2R1bGU7TW9kdWxlLndhc21Nb2R1bGU9bnVsbDt2YXIgdD1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UocixlKTtyZXR1cm4gYSh0KX0sc2VsZi5vbnVuaGFuZGxlZHJlamVjdGlvbj1lPT57dGhyb3cgZS5yZWFzb258fGV9O2Z1bmN0aW9uIGhhbmRsZU1lc3NhZ2UoZSl7dHJ5e2lmKGUuZGF0YS5jbWQ9PT0ibG9hZCIpe2xldCByPVtdO3NlbGYub25tZXNzYWdlPXQ9PnIucHVzaCh0KSxzZWxmLnN0YXJ0V29ya2VyPXQ9PntNb2R1bGU9dCxwb3N0TWVzc2FnZSh7Y21kOiJsb2FkZWQifSk7Zm9yKGxldCBzIG9mIHIpaGFuZGxlTWVzc2FnZShzKTtzZWxmLm9ubWVzc2FnZT1oYW5kbGVNZXNzYWdlfSxNb2R1bGUud2FzbU1vZHVsZT1lLmRhdGEud2FzbU1vZHVsZTtmb3IoY29uc3QgdCBvZiBlLmRhdGEuaGFuZGxlcnMpTW9kdWxlW3RdPSguLi5zKT0+e3Bvc3RNZXNzYWdlKHtjbWQ6ImNhbGxIYW5kbGVyIixoYW5kbGVyOnQsYXJnczpzfSl9O2lmKE1vZHVsZS53YXNtTWVtb3J5PWUuZGF0YS53YXNtTWVtb3J5LE1vZHVsZS5idWZmZXI9TW9kdWxlLndhc21NZW1vcnkuYnVmZmVyLE1vZHVsZS5FTlZJUk9OTUVOVF9JU19QVEhSRUFEPSEwLHR5cGVvZiBlLmRhdGEudXJsT3JCbG9iPT0ic3RyaW5nIilpbXBvcnRTY3JpcHRzKGUuZGF0YS51cmxPckJsb2IpO2Vsc2V7dmFyIGE9VVJMLmNyZWF0ZU9iamVjdFVSTChlLmRhdGEudXJsT3JCbG9iKTtpbXBvcnRTY3JpcHRzKGEpLFVSTC5yZXZva2VPYmplY3RVUkwoYSl9b3J0V2FzbVRocmVhZGVkKE1vZHVsZSl9ZWxzZSBpZihlLmRhdGEuY21kPT09InJ1biIpe01vZHVsZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQoZS5kYXRhLnB0aHJlYWRfcHRyLDAsMCwxKSxNb2R1bGUuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0KGUuZGF0YS5wdGhyZWFkX3B0ciksTW9kdWxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxNb2R1bGUuUFRocmVhZC5yZWNlaXZlT2JqZWN0VHJhbnNmZXIoZS5kYXRhKSxNb2R1bGUuUFRocmVhZC50aHJlYWRJbml0VExTKCksaW5pdGlhbGl6ZWRKU3x8KGluaXRpYWxpemVkSlM9ITApO3RyeXtNb2R1bGUuaW52b2tlRW50cnlQb2ludChlLmRhdGEuc3RhcnRfcm91dGluZSxlLmRhdGEuYXJnKX1jYXRjaChyKXtpZihyIT0idW53aW5kIil0aHJvdyByfX1lbHNlIGUuZGF0YS5jbWQ9PT0iY2FuY2VsIj9Nb2R1bGUuX3B0aHJlYWRfc2VsZigpJiZNb2R1bGUuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0KC0xKTplLmRhdGEudGFyZ2V0PT09InNldGltbWVkaWF0ZSJ8fChlLmRhdGEuY21kPT09ImNoZWNrTWFpbGJveCI/aW5pdGlhbGl6ZWRKUyYmTW9kdWxlLmNoZWNrTWFpbGJveCgpOmUuZGF0YS5jbWQmJihlcnIoYHdvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgJHtlLmRhdGEuY21kfWApLGVycihlLmRhdGEpKSl9Y2F0Y2gocil7dGhyb3cgTW9kdWxlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD8uKCkscn19c2VsZi5vbm1lc3NhZ2U9aGFuZGxlTWVzc2FnZTtcbid9KTt2YXIgUnAsc2csb2EsaWEsU28sTnAsdWcsbGcsZmcsTXAsRGUsVXI9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtScD1QcCgpO3NnPWtwKCksaWE9ITEsU289ITEsTnA9ITEsdWc9YT0+e2lmKGE9PT0xKXJldHVybiExO2lmKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj4idSIpcmV0dXJuIHR5cGVvZiBzZWxmPCJ1IiYmIXNlbGYuY3Jvc3NPcmlnaW5Jc29sYXRlZCYmY29uc29sZS53YXJuKCJlbnYud2FzbS5udW1UaHJlYWRzIGlzIHNldCB0byAiK2ErIiwgYnV0IHRoaXMgd2lsbCBub3Qgd29yayB1bmxlc3MgeW91IGVuYWJsZSBjcm9zc09yaWdpbklzb2xhdGVkIG1vZGUuIFNlZSBodHRwczovL3dlYi5kZXYvY3Jvc3Mtb3JpZ2luLWlzb2xhdGlvbi1ndWlkZS8gZm9yIG1vcmUgaW5mby4iKSwhMTt0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSYmY29uc29sZS53YXJuKCJlbnYud2FzbS5udW1UaHJlYWRzIGlzIHNldCB0byAiK2ErIiwgaG93ZXZlciwgY3VycmVudGx5IG9ubnhydW50aW1lLXdlYiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLXRocmVhZHMgaW4gTm9kZS5qcy4gUGxlYXNlIGNvbnNpZGVyIHVzaW5nIG9ubnhydW50aW1lLW5vZGUgZm9yIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNjZW5hcmlvcy4iKTt0cnl7cmV0dXJuIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSImJm5ldyBNZXNzYWdlQ2hhbm5lbCgpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKX1jYXRjaHtyZXR1cm4hMX19LGxnPSgpPT57dHJ5e3JldHVybiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsMTAsMzAsMSwyOCwwLDY1LDAsMjUzLDE1LDI1MywxMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1MywxODYsMSwyNiwxMV0pKX1jYXRjaHtyZXR1cm4hMX19LGZnPShhLHQpPT5hP3Q/Im9ydC13YXNtLXNpbWQtdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLXNpbWQud2FzbSI6dD8ib3J0LXdhc20tdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLndhc20iLE1wPWFzeW5jIGE9PntpZihpYSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYoU28pdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byAnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KCknIGRldGVjdGVkLiIpO2lmKE5wKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KCknIGZhaWxlZC4iKTtTbz0hMDtsZXQgdD1hLmluaXRUaW1lb3V0LG89YS5udW1UaHJlYWRzLGU9YS5zaW1kLHI9dWcobyksbj1lJiZsZygpLHM9YS53YXNtUGF0aHMsaT10eXBlb2Ygcz09InN0cmluZyI/czp2b2lkIDAsdT1mZyhuLHIpLGw9dHlwZW9mIHM9PSJvYmplY3QiP3NbdV06dm9pZCAwLGM9ITEscD1bXTtpZih0PjAmJnAucHVzaChuZXcgUHJvbWlzZShkPT57c2V0VGltZW91dCgoKT0+e2M9ITAsZCgpfSx0KX0pKSxwLnB1c2gobmV3IFByb21pc2UoKGQsVCk9PntsZXQgdz1yP3NnOlJwLHY9e2xvY2F0ZUZpbGU6KFMsQSk9PnImJlMuZW5kc1dpdGgoIi53b3JrZXIuanMiKSYmdHlwZW9mIEJsb2I8InUiP1VSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0JwKCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpOlMuZW5kc1dpdGgoIi53YXNtIik/bHx8KGk/P0EpK3U6QStTfTtpZihyKWlmKHYubnVtVGhyZWFkcz1vLHR5cGVvZiBCbG9iPiJ1Iil2Lm1haW5TY3JpcHRVcmxPckJsb2I9KHZvaWQgMCkoX19kaXJuYW1lLCJvcnQtd2FzbS10aHJlYWRlZC5qcyIpO2Vsc2V7bGV0IFM9YHZhciBvcnRXYXNtVGhyZWFkZWQ9JHt3LnRvU3RyaW5nKCl9O2A7di5tYWluU2NyaXB0VXJsT3JCbG9iPW5ldyBCbG9iKFtTXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pfXcodikudGhlbihTPT57U289ITEsaWE9ITAsb2E9UyxkKCl9LFM9PntTbz0hMSxOcD0hMCxUKFMpfSl9KSksYXdhaXQgUHJvbWlzZS5yYWNlKHApLGMpdGhyb3cgbmV3IEVycm9yKGBXZWJBc3NlbWJseSBiYWNrZW5kIGluaXRpYWxpemluZyBmYWlsZWQgZHVlIHRvIHRpbWVvdXQ6ICR7dH1tc2ApfSxEZT0oKT0+e2lmKGlhJiZvYSlyZXR1cm4gb2E7dGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiIpfX0pO3ZhciB2ZSxibixfZSxBbz1MKCgpPT57InVzZSBzdHJpY3QiO1VyKCk7dmU9KGEsdCk9PntsZXQgbz1EZSgpLGU9by5sZW5ndGhCeXRlc1VURjgoYSkrMSxyPW8uX21hbGxvYyhlKTtyZXR1cm4gby5zdHJpbmdUb1VURjgoYSxyLGUpLHQucHVzaChyKSxyfSxibj0oYSx0LG8sZSk9PntpZih0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsKXtpZihvLmhhcyhhKSl0aHJvdyBuZXcgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBpbiBvcHRpb25zIik7by5hZGQoYSl9T2JqZWN0LmVudHJpZXMoYSkuZm9yRWFjaCgoW3Isbl0pPT57bGV0IHM9dD90K3I6cjtpZih0eXBlb2Ygbj09Im9iamVjdCIpYm4obixzKyIuIixvLGUpO2Vsc2UgaWYodHlwZW9mIG49PSJzdHJpbmcifHx0eXBlb2Ygbj09Im51bWJlciIpZShzLG4udG9TdHJpbmcoKSk7ZWxzZSBpZih0eXBlb2Ygbj09ImJvb2xlYW4iKWUocyxuPyIxIjoiMCIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBoYW5kbGUgZXh0cmEgY29uZmlnIHR5cGU6ICR7dHlwZW9mIG59YCl9KX0sX2U9YT0+e2xldCB0PURlKCksbz10LnN0YWNrU2F2ZSgpO3RyeXtsZXQgZT10LnN0YWNrQWxsb2MoOCk7dC5fT3J0R2V0TGFzdEVycm9yKGUsZSs0KTtsZXQgcj10LkhFQVAzMltlLzRdLG49dC5IRUFQVTMyW2UvNCsxXSxzPW4/dC5VVEY4VG9TdHJpbmcobik6IiI7dGhyb3cgbmV3IEVycm9yKGAke2F9IEVSUk9SX0NPREU6ICR7cn0sIEVSUk9SX01FU1NBR0U6ICR7c31gKX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKG8pfX19KTt2YXIgR3AsVXA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVcigpO0FvKCk7R3A9YT0+e2xldCB0PURlKCksbz0wLGU9W10scj1hfHx7fTt0cnl7aWYoYT8ubG9nU2V2ZXJpdHlMZXZlbD09PXZvaWQgMClyLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKHR5cGVvZiBhLmxvZ1NldmVyaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihhLmxvZ1NldmVyaXR5TGV2ZWwpfHxhLmxvZ1NldmVyaXR5TGV2ZWw8MHx8YS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHthLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYoYT8ubG9nVmVyYm9zaXR5TGV2ZWw9PT12b2lkIDApci5sb2dWZXJib3NpdHlMZXZlbD0wO2Vsc2UgaWYodHlwZW9mIGEubG9nVmVyYm9zaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihhLmxvZ1ZlcmJvc2l0eUxldmVsKSl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2EubG9nVmVyYm9zaXR5TGV2ZWx9YCk7YT8udGVybWluYXRlPT09dm9pZCAwJiYoci50ZXJtaW5hdGU9ITEpO2xldCBuPTA7cmV0dXJuIGE/LnRhZyE9PXZvaWQgMCYmKG49dmUoYS50YWcsZSkpLG89dC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhyLmxvZ1NldmVyaXR5TGV2ZWwsci5sb2dWZXJib3NpdHlMZXZlbCwhIXIudGVybWluYXRlLG4pLG89PT0wJiZfZSgiQ2FuJ3QgY3JlYXRlIHJ1biBvcHRpb25zLiIpLGE/LmV4dHJhIT09dm9pZCAwJiZibihhLmV4dHJhLCIiLG5ldyBXZWFrU2V0LChzLGkpPT57bGV0IHU9dmUocyxlKSxsPXZlKGksZSk7dC5fT3J0QWRkUnVuQ29uZmlnRW50cnkobyx1LGwpIT09MCYmX2UoYENhbid0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7c30gLSAke2l9LmApfSksW28sZV19Y2F0Y2gobil7dGhyb3cgbyE9PTAmJnQuX09ydFJlbGVhc2VSdW5PcHRpb25zKG8pLGUuZm9yRWFjaChzPT50Ll9mcmVlKHMpKSxufX19KTt2YXIgY2cscGcsZGcsaGcsenAsVnA9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtVcigpO0FvKCk7Y2c9YT0+e3N3aXRjaChhKXtjYXNlImRpc2FibGVkIjpyZXR1cm4gMDtjYXNlImJhc2ljIjpyZXR1cm4gMTtjYXNlImV4dGVuZGVkIjpyZXR1cm4gMjtjYXNlImFsbCI6cmV0dXJuIDk5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBncmFwaCBvcHRpbWl6YXRpb24gbGV2ZWw6ICR7YX1gKX19LHBnPWE9Pntzd2l0Y2goYSl7Y2FzZSJzZXF1ZW50aWFsIjpyZXR1cm4gMDtjYXNlInBhcmFsbGVsIjpyZXR1cm4gMTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZXhlY3V0aW9uIG1vZGU6ICR7YX1gKX19LGRnPWE9PnthLmV4dHJhfHwoYS5leHRyYT17fSksYS5leHRyYS5zZXNzaW9ufHwoYS5leHRyYS5zZXNzaW9uPXt9KTtsZXQgdD1hLmV4dHJhLnNlc3Npb247dC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5fHwodC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5PSIxIiksYS5leGVjdXRpb25Qcm92aWRlcnMmJmEuZXhlY3V0aW9uUHJvdmlkZXJzLnNvbWUobz0+KHR5cGVvZiBvPT0ic3RyaW5nIj9vOm8ubmFtZSk9PT0id2ViZ3B1IikmJihhLmVuYWJsZU1lbVBhdHRlcm49ITEpfSxoZz0oYSx0LG8pPT57Zm9yKGxldCBlIG9mIHQpe2xldCByPXR5cGVvZiBlPT0ic3RyaW5nIj9lOmUubmFtZTtzd2l0Y2gocil7Y2FzZSJ3ZWJubiI6aWYocj0iV0VCTk4iLHR5cGVvZiBlIT0ic3RyaW5nIil7bGV0IHM9ZTtpZihzPy5kZXZpY2VUeXBlKXtsZXQgaT12ZSgiZGV2aWNlVHlwZSIsbyksdT12ZShzLmRldmljZVR5cGUsbyk7RGUoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGEsaSx1KSE9PTAmJl9lKGBDYW4ndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJ2RldmljZVR5cGUnIC0gJHtzLmRldmljZVR5cGV9LmApfWlmKHM/Lm51bVRocmVhZHMpe2xldCBpPXMubnVtVGhyZWFkczsodHlwZW9mIGkhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihpKXx8aTwwKSYmKGk9MCk7bGV0IHU9dmUoIm51bVRocmVhZHMiLG8pLGw9dmUoaS50b1N0cmluZygpLG8pO0RlKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShhLHUsbCkhPT0wJiZfZShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdudW1UaHJlYWRzJyAtICR7cy5udW1UaHJlYWRzfS5gKX1pZihzPy5wb3dlclByZWZlcmVuY2Upe2xldCBpPXZlKCJwb3dlclByZWZlcmVuY2UiLG8pLHU9dmUocy5wb3dlclByZWZlcmVuY2Usbyk7RGUoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGEsaSx1KSE9PTAmJl9lKGBDYW4ndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJ3Bvd2VyUHJlZmVyZW5jZScgLSAke3MucG93ZXJQcmVmZXJlbmNlfS5gKX19YnJlYWs7Y2FzZSJ3ZWJncHUiOmlmKHI9IkpTIix0eXBlb2YgZSE9InN0cmluZyIpe2xldCBzPWU7aWYocz8ucHJlZmVycmVkTGF5b3V0KXtpZihzLnByZWZlcnJlZExheW91dCE9PSJOQ0hXIiYmcy5wcmVmZXJyZWRMYXlvdXQhPT0iTkhXQyIpdGhyb3cgbmV3IEVycm9yKGBwcmVmZXJyZWRMYXlvdXQgbXVzdCBiZSBlaXRoZXIgJ05DSFcnIG9yICdOSFdDJzogJHtzLnByZWZlcnJlZExheW91dH1gKTtsZXQgaT12ZSgicHJlZmVycmVkTGF5b3V0IixvKSx1PXZlKHMucHJlZmVycmVkTGF5b3V0LG8pO0RlKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShhLGksdSkhPT0wJiZfZShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdwcmVmZXJyZWRMYXlvdXQnIC0gJHtzLnByZWZlcnJlZExheW91dH0uYCl9fWJyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGV4ZWN1dGlvbiBwcm92aWRlcjogJHtyfWApfWxldCBuPXZlKHIsbyk7RGUoKS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXIoYSxuKSE9PTAmJl9lKGBDYW4ndCBhcHBlbmQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3J9LmApfX0senA9YT0+e2xldCB0PURlKCksbz0wLGU9W10scj1hfHx7fTtkZyhyKTt0cnl7bGV0IG49Y2coci5ncmFwaE9wdGltaXphdGlvbkxldmVsPz8iYWxsIikscz1wZyhyLmV4ZWN1dGlvbk1vZGU/PyJzZXF1ZW50aWFsIiksaT10eXBlb2Ygci5sb2dJZD09InN0cmluZyI/dmUoci5sb2dJZCxlKTowLHU9ci5sb2dTZXZlcml0eUxldmVsPz8yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHUpfHx1PDB8fHU+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke3V9YCk7bGV0IGw9ci5sb2dWZXJib3NpdHlMZXZlbD8/MDtpZighTnVtYmVyLmlzSW50ZWdlcihsKXx8bDwwfHxsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtsfWApO2xldCBjPXR5cGVvZiByLm9wdGltaXplZE1vZGVsRmlsZVBhdGg9PSJzdHJpbmciP3ZlKHIub3B0aW1pemVkTW9kZWxGaWxlUGF0aCxlKTowO2lmKG89dC5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMobiwhIXIuZW5hYmxlQ3B1TWVtQXJlbmEsISFyLmVuYWJsZU1lbVBhdHRlcm4scywhIXIuZW5hYmxlUHJvZmlsaW5nLDAsaSx1LGwsYyksbz09PTAmJl9lKCJDYW4ndCBjcmVhdGUgc2Vzc2lvbiBvcHRpb25zLiIpLHIuZXhlY3V0aW9uUHJvdmlkZXJzJiZoZyhvLHIuZXhlY3V0aW9uUHJvdmlkZXJzLGUpLHIuZW5hYmxlR3JhcGhDYXB0dXJlIT09dm9pZCAwKXtpZih0eXBlb2Ygci5lbmFibGVHcmFwaENhcHR1cmUhPSJib29sZWFuIil0aHJvdyBuZXcgRXJyb3IoYGVuYWJsZUdyYXBoQ2FwdHVyZSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZTogJHtyLmVuYWJsZUdyYXBoQ2FwdHVyZX1gKTtsZXQgcD12ZSgiZW5hYmxlR3JhcGhDYXB0dXJlIixlKSxkPXZlKHIuZW5hYmxlR3JhcGhDYXB0dXJlLnRvU3RyaW5nKCksZSk7dC5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KG8scCxkKSE9PTAmJl9lKGBDYW4ndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJ2VuYWJsZUdyYXBoQ2FwdHVyZScgLSAke3IuZW5hYmxlR3JhcGhDYXB0dXJlfS5gKX1pZihyLmZyZWVEaW1lbnNpb25PdmVycmlkZXMpZm9yKGxldFtwLGRdb2YgT2JqZWN0LmVudHJpZXMoci5mcmVlRGltZW5zaW9uT3ZlcnJpZGVzKSl7aWYodHlwZW9mIHAhPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOiAke3B9YCk7aWYodHlwZW9mIGQhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihkKXx8ZDwwKXRocm93IG5ldyBFcnJvcihgZnJlZSBkaW1lbnNpb24gb3ZlcnJpZGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOiAke2R9YCk7bGV0IFQ9dmUocCxlKTt0Ll9PcnRBZGRGcmVlRGltZW5zaW9uT3ZlcnJpZGUobyxULGQpIT09MCYmX2UoYENhbid0IHNldCBhIGZyZWUgZGltZW5zaW9uIG92ZXJyaWRlOiAke3B9IC0gJHtkfS5gKX1yZXR1cm4gci5leHRyYSE9PXZvaWQgMCYmYm4oci5leHRyYSwiIixuZXcgV2Vha1NldCwocCxkKT0+e2xldCBUPXZlKHAsZSksdz12ZShkLGUpO3QuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShvLFQsdykhPT0wJiZfZShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICR7cH0gLSAke2R9LmApfSksW28sZV19Y2F0Y2gobil7dGhyb3cgbyE9PTAmJnQuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhvKSxlLmZvckVhY2gocz0+dC5fZnJlZShzKSksbn19fSk7dmFyIGFhLFdwLHNhLEhwLHFwLFBvLGpwLHVhPUwoKCk9PnsidXNlIHN0cmljdCI7YWE9YT0+e3N3aXRjaChhKXtjYXNlImludDgiOnJldHVybiAzO2Nhc2UidWludDgiOnJldHVybiAyO2Nhc2UiYm9vbCI6cmV0dXJuIDk7Y2FzZSJpbnQxNiI6cmV0dXJuIDU7Y2FzZSJ1aW50MTYiOnJldHVybiA0O2Nhc2UiaW50MzIiOnJldHVybiA2O2Nhc2UidWludDMyIjpyZXR1cm4gMTI7Y2FzZSJmbG9hdDE2IjpyZXR1cm4gMTA7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gMTtjYXNlImZsb2F0NjQiOnJldHVybiAxMTtjYXNlInN0cmluZyI6cmV0dXJuIDg7Y2FzZSJpbnQ2NCI6cmV0dXJuIDc7Y2FzZSJ1aW50NjQiOnJldHVybiAxMztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2F9YCl9fSxXcD1hPT57c3dpdGNoKGEpe2Nhc2UgMzpyZXR1cm4iaW50OCI7Y2FzZSAyOnJldHVybiJ1aW50OCI7Y2FzZSA5OnJldHVybiJib29sIjtjYXNlIDU6cmV0dXJuImludDE2IjtjYXNlIDQ6cmV0dXJuInVpbnQxNiI7Y2FzZSA2OnJldHVybiJpbnQzMiI7Y2FzZSAxMjpyZXR1cm4idWludDMyIjtjYXNlIDEwOnJldHVybiJmbG9hdDE2IjtjYXNlIDE6cmV0dXJuImZsb2F0MzIiO2Nhc2UgMTE6cmV0dXJuImZsb2F0NjQiO2Nhc2UgODpyZXR1cm4ic3RyaW5nIjtjYXNlIDc6cmV0dXJuImludDY0IjtjYXNlIDEzOnJldHVybiJ1aW50NjQiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7YX1gKX19LHNhPWE9Plt2b2lkIDAsNCwxLDEsMiwyLDQsOCx2b2lkIDAsMSwyLDgsNCw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwXVthXSxIcD1hPT57c3dpdGNoKGEpe2Nhc2UiZmxvYXQxNiI6cmV0dXJuIHR5cGVvZiBGbG9hdDE2QXJyYXk8InUiJiZGbG9hdDE2QXJyYXkuZnJvbT9GbG9hdDE2QXJyYXk6VWludDE2QXJyYXk7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gRmxvYXQzMkFycmF5O2Nhc2UidWludDgiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiaW50OCI6cmV0dXJuIEludDhBcnJheTtjYXNlInVpbnQxNiI6cmV0dXJuIFVpbnQxNkFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UiaW50MzIiOnJldHVybiBJbnQzMkFycmF5O2Nhc2UiYm9vbCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHthfWApfX0scXA9YT0+e3N3aXRjaChhKXtjYXNlInZlcmJvc2UiOnJldHVybiAwO2Nhc2UiaW5mbyI6cmV0dXJuIDE7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gMjtjYXNlImVycm9yIjpyZXR1cm4gMztjYXNlImZhdGFsIjpyZXR1cm4gNDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgbG9nZ2luZyBsZXZlbDogJHthfWApfX0sUG89YT0+YT09PSJmbG9hdDMyInx8YT09PSJmbG9hdDE2Inx8YT09PSJpbnQzMiJ8fGE9PT0iaW50NjQifHxhPT09InVpbnQzMiJ8fGE9PT0idWludDgifHxhPT09ImJvb2wiLGpwPWE9Pntzd2l0Y2goYSl7Y2FzZSJub25lIjpyZXR1cm4gMDtjYXNlImNwdSI6cmV0dXJuIDE7Y2FzZSJjcHUtcGlubmVkIjpyZXR1cm4gMjtjYXNlInRleHR1cmUiOnJldHVybiAzO2Nhc2UiZ3B1LWJ1ZmZlciI6cmV0dXJuIDQ7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgbG9jYXRpb246ICR7YX1gKX19fSk7dmFyIGduLGxhPUwoKCk9PnsidXNlIHN0cmljdCI7Z249YXN5bmMgYT0+e2lmKHR5cGVvZiBhPT0ic3RyaW5nIilpZih0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl0cnl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0KHZvaWQgMCkoYSkpfWNhdGNoKHQpe2lmKHQuY29kZT09PSJFUlJfRlNfRklMRV9UT09fTEFSR0UiKXtsZXQgbz0odm9pZCAwKShhKSxlPVtdO2ZvciBhd2FpdChsZXQgciBvZiBvKWUucHVzaChyKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChlKSl9dGhyb3cgdH1lbHNle2xldCB0PWF3YWl0IGZldGNoKGEpO2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgZXh0ZXJuYWwgZGF0YSBmaWxlOiAke2F9YCk7bGV0IG89dC5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKSxlPW8/cGFyc2VJbnQobywxMCk6MDtpZihlPDEwNzM3NDE4MjQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHQuYXJyYXlCdWZmZXIoKSk7e2lmKCF0LmJvZHkpdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCBleHRlcm5hbCBkYXRhIGZpbGU6ICR7YX0sIG5vIHJlc3BvbnNlIGJvZHkuYCk7bGV0IHI9dC5ib2R5LmdldFJlYWRlcigpLG47dHJ5e249bmV3IEFycmF5QnVmZmVyKGUpfWNhdGNoKGkpe2lmKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtsZXQgdT1NYXRoLmNlaWwoZS82NTUzNik7bj1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOnUsbWF4aW11bTp1fSkuYnVmZmVyfWVsc2UgdGhyb3cgaX1sZXQgcz0wO2Zvcig7Oyl7bGV0e2RvbmU6aSx2YWx1ZTp1fT1hd2FpdCByLnJlYWQoKTtpZihpKWJyZWFrO2xldCBsPXUuYnl0ZUxlbmd0aDtuZXcgVWludDhBcnJheShuLHMsbCkuc2V0KHUpLHMrPWx9cmV0dXJuIG5ldyBVaW50OEFycmF5KG4sMCxlKX19ZWxzZSByZXR1cm4gYSBpbnN0YW5jZW9mIEJsb2I/bmV3IFVpbnQ4QXJyYXkoYXdhaXQgYS5hcnJheUJ1ZmZlcigpKTphIGluc3RhbmNlb2YgVWludDhBcnJheT9hOm5ldyBVaW50OEFycmF5KGEpfX0pO3ZhciBtZyxYcCxLcCx6cixiZyxmYSxKcCxacCxZcCxRcCxlZCx0ZCxyZD1MKCgpPT57InVzZSBzdHJpY3QiO1VwKCk7VnAoKTt1YSgpO1VyKCk7QW8oKTtsYSgpO21nPShhLHQpPT57RGUoKS5fT3J0SW5pdChhLHQpIT09MCYmX2UoIkNhbid0IGluaXRpYWxpemUgb25ueHJ1bnRpbWUuIil9LFhwPWFzeW5jIGE9PnttZyhhLndhc20ubnVtVGhyZWFkcyxxcChhLmxvZ0xldmVsKSl9LEtwPWFzeW5jKGEsdCk9Pnt9LHpyPW5ldyBNYXAsYmc9YT0+e2xldCB0PURlKCksbz10LnN0YWNrU2F2ZSgpO3RyeXtsZXQgZT10LnN0YWNrQWxsb2MoOCk7cmV0dXJuIHQuX09ydEdldElucHV0T3V0cHV0Q291bnQoYSxlLGUrNCkhPT0wJiZfZSgiQ2FuJ3QgZ2V0IHNlc3Npb24gaW5wdXQvb3V0cHV0IGNvdW50LiIpLFt0LkhFQVAzMltlLzRdLHQuSEVBUDMyW2UvNCsxXV19ZmluYWxseXt0LnN0YWNrUmVzdG9yZShvKX19LGZhPWE9PntsZXQgdD1EZSgpLG89dC5fbWFsbG9jKGEuYnl0ZUxlbmd0aCk7aWYobz09PTApdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBjcmVhdGUgYSBzZXNzaW9uLiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSAke2EuYnl0ZUxlbmd0aH0uYCk7cmV0dXJuIHQuSEVBUFU4LnNldChhLG8pLFtvLGEuYnl0ZUxlbmd0aF19LEpwPWFzeW5jKGEsdCk9PntsZXQgbyxlLHI9RGUoKTtBcnJheS5pc0FycmF5KGEpP1tvLGVdPWE6YS5idWZmZXI9PT1yLkhFQVBVOC5idWZmZXI/W28sZV09W2EuYnl0ZU9mZnNldCxhLmJ5dGVMZW5ndGhdOltvLGVdPWZhKGEpO2xldCBuPTAscz0wLGk9MCx1PVtdLGw9W10sYz1bXTt0cnl7aWYoW3MsdV09enAodCksdD8uZXh0ZXJuYWxEYXRhJiZyLm1vdW50RXh0ZXJuYWxEYXRhKXtsZXQgQz1bXTtmb3IobGV0IEYgb2YgdC5leHRlcm5hbERhdGEpe2xldCBKPXR5cGVvZiBGPT0ic3RyaW5nIj9GOkYucGF0aDtDLnB1c2goZ24odHlwZW9mIEY9PSJzdHJpbmciP0Y6Ri5kYXRhKS50aGVuKGo9PntyLm1vdW50RXh0ZXJuYWxEYXRhKEosail9KSl9YXdhaXQgUHJvbWlzZS5hbGwoQyl9bj1hd2FpdCByLl9PcnRDcmVhdGVTZXNzaW9uKG8sZSxzKSxuPT09MCYmX2UoIkNhbid0IGNyZWF0ZSBhIHNlc3Npb24uIik7bGV0W3AsZF09YmcobiksVD0hIXQ/LmVuYWJsZUdyYXBoQ2FwdHVyZSx3PVtdLHY9W10sUz1bXTtmb3IobGV0IEM9MDtDPHA7QysrKXtsZXQgRj1yLl9PcnRHZXRJbnB1dE5hbWUobixDKTtGPT09MCYmX2UoIkNhbid0IGdldCBhbiBpbnB1dCBuYW1lLiIpLGwucHVzaChGKSx3LnB1c2goci5VVEY4VG9TdHJpbmcoRikpfWZvcihsZXQgQz0wO0M8ZDtDKyspe2xldCBGPXIuX09ydEdldE91dHB1dE5hbWUobixDKTtGPT09MCYmX2UoIkNhbid0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxjLnB1c2goRik7bGV0IEo9ci5VVEY4VG9TdHJpbmcoRik7di5wdXNoKEopfWxldCBBPW51bGw7cmV0dXJuIHpyLnNldChuLFtuLGwsYyxBLFQsITFdKSxbbix3LHZdfWNhdGNoKHApe3Rocm93IGwuZm9yRWFjaChkPT5yLl9PcnRGcmVlKGQpKSxjLmZvckVhY2goZD0+ci5fT3J0RnJlZShkKSksaSE9PTAmJnIuX09ydFJlbGVhc2VCaW5kaW5nKGkpLG4hPT0wJiZyLl9PcnRSZWxlYXNlU2Vzc2lvbihuKSxwfWZpbmFsbHl7ci5fZnJlZShvKSxzIT09MCYmci5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKHMpLHUuZm9yRWFjaChwPT5yLl9mcmVlKHApKSxyLnVubW91bnRFeHRlcm5hbERhdGE/LigpfX0sWnA9YT0+e2xldCB0PURlKCksbz16ci5nZXQoYSk7aWYoIW8pdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVsZWFzZSBzZXNzaW9uLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7YX1gKTtsZXRbZSxyLG4scyxpXT1vO3MmJihpJiZ0Ll9PcnRDbGVhckJvdW5kT3V0cHV0cyhzLmhhbmRsZSksdC5fT3J0UmVsZWFzZUJpbmRpbmcocy5oYW5kbGUpKSx0LmpzZXBPblJlbGVhc2VTZXNzaW9uPy4oYSksci5mb3JFYWNoKHU9PnQuX09ydEZyZWUodSkpLG4uZm9yRWFjaCh1PT50Ll9PcnRGcmVlKHUpKSx0Ll9PcnRSZWxlYXNlU2Vzc2lvbihlKSx6ci5kZWxldGUoYSl9LFlwPShhLHQsbyxlLHIsbj0hMSk9PntpZighYSl7dC5wdXNoKDApO3JldHVybn1sZXQgcz1EZSgpLGk9YVswXSx1PWFbMV0sbD1hWzNdLGMscDtpZihpPT09InN0cmluZyImJmw9PT0iZ3B1LWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKCJTdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgb24gR1BVLiIpO2lmKG4mJmwhPT0iZ3B1LWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCBidWZmZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgaW5wdXQvb3V0cHV0IGluZGV4ICR7cn0gd2hlbiBlbmFibGVHcmFwaENhcHR1cmUgaXMgdHJ1ZS5gKTtpZihsPT09ImdwdS1idWZmZXIiKXtsZXQgdz1hWzJdLmdwdUJ1ZmZlcix2PXNhKGFhKGkpKTtwPXUucmVkdWNlKChBLEMpPT5BKkMsMSkqdjtsZXQgUz1zLmpzZXBSZWdpc3RlckJ1ZmZlcjtpZighUyl0aHJvdyBuZXcgRXJyb3IoJ1RlbnNvciBsb2NhdGlvbiAiZ3B1LWJ1ZmZlciIgaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IHVzaW5nIFdlYkdQVS4nKTtjPVMoZSxyLHcscCl9ZWxzZXtsZXQgdz1hWzJdO2lmKEFycmF5LmlzQXJyYXkodykpe3A9NCp3Lmxlbmd0aCxjPXMuX21hbGxvYyhwKSxvLnB1c2goYyk7bGV0IHY9Yy80O2ZvcihsZXQgUz0wO1M8dy5sZW5ndGg7UysrKXtpZih0eXBlb2Ygd1tTXSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcihgdGVuc29yIGRhdGEgYXQgaW5kZXggJHtTfSBpcyBub3QgYSBzdHJpbmdgKTtzLkhFQVBVMzJbdisrXT12ZSh3W1NdLG8pfX1lbHNlIHA9dy5ieXRlTGVuZ3RoLGM9cy5fbWFsbG9jKHApLG8ucHVzaChjKSxzLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkody5idWZmZXIsdy5ieXRlT2Zmc2V0LHApLGMpfWxldCBkPXMuc3RhY2tTYXZlKCksVD1zLnN0YWNrQWxsb2MoNCp1Lmxlbmd0aCk7dHJ5e2xldCB3PVQvNDt1LmZvckVhY2goUz0+cy5IRUFQMzJbdysrXT1TKTtsZXQgdj1zLl9PcnRDcmVhdGVUZW5zb3IoYWEoaSksYyxwLFQsdS5sZW5ndGgsanAobCkpO3Y9PT0wJiZfZShgQ2FuJ3QgY3JlYXRlIHRlbnNvciBmb3IgaW5wdXQvb3V0cHV0LiBzZXNzaW9uPSR7ZX0sIGluZGV4PSR7cn0uYCksdC5wdXNoKHYpfWZpbmFsbHl7cy5zdGFja1Jlc3RvcmUoZCl9fSxRcD1hc3luYyhhLHQsbyxlLHIsbik9PntsZXQgcz1EZSgpLGk9enIuZ2V0KGEpO2lmKCFpKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHthfWApO2xldCB1PWlbMF0sbD1pWzFdLGM9aVsyXSxwPWlbM10sZD1pWzRdLFQ9aVs1XSx3PXQubGVuZ3RoLHY9ZS5sZW5ndGgsUz0wLEE9W10sQz1bXSxGPVtdLEo9W10saj1zLnN0YWNrU2F2ZSgpLGllPXMuc3RhY2tBbGxvYyh3KjQpLEc9cy5zdGFja0FsbG9jKHcqNCksVGU9cy5zdGFja0FsbG9jKHYqNCksSGU9cy5zdGFja0FsbG9jKHYqNCk7dHJ5e1tTLEFdPUdwKG4pO2ZvcihsZXQgZWU9MDtlZTx3O2VlKyspWXAob1tlZV0sQyxKLGEsdFtlZV0sZCk7Zm9yKGxldCBlZT0wO2VlPHY7ZWUrKylZcChyW2VlXSxGLEosYSx3K2VbZWVdLGQpO2xldCBMZT1pZS80LFk9Ry80LE5lPVRlLzQsU2U9SGUvNDtmb3IobGV0IGVlPTA7ZWU8dztlZSsrKXMuSEVBUFUzMltMZSsrXT1DW2VlXSxzLkhFQVBVMzJbWSsrXT1sW3RbZWVdXTtmb3IobGV0IGVlPTA7ZWU8djtlZSsrKXMuSEVBUFUzMltOZSsrXT1GW2VlXSxzLkhFQVBVMzJbU2UrK109Y1tlW2VlXV07cy5qc2VwT25SdW5TdGFydD8uKHUpO2xldCB5dDt5dD1hd2FpdCBzLl9PcnRSdW4odSxHLGllLHcsSGUsdixUZSxTKSx5dCE9PTAmJl9lKCJmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4iKTtsZXQgZXQ9W107Zm9yKGxldCBlZT0wO2VlPHY7ZWUrKyl7bGV0IHFlPXMuSEVBUFUzMltUZS80K2VlXTtpZihxZT09PUZbZWVdKXtldC5wdXNoKHJbZWVdKTtjb250aW51ZX1sZXQgSHQ9cy5zdGFja1NhdmUoKSxLZT1zLnN0YWNrQWxsb2MoNCo0KSxhdD0hMSxSZSxDZT0wO3RyeXtzLl9PcnRHZXRUZW5zb3JEYXRhKHFlLEtlLEtlKzQsS2UrOCxLZSsxMikhPT0wJiZfZShgQ2FuJ3QgYWNjZXNzIG91dHB1dCB0ZW5zb3IgZGF0YSBvbiBpbmRleCAke2VlfS5gKTtsZXQgVHQ9S2UvNCxxdD1zLkhFQVBVMzJbVHQrK107Q2U9cy5IRUFQVTMyW1R0KytdO2xldCB4dD1zLkhFQVBVMzJbVHQrK10sTHQ9cy5IRUFQVTMyW1R0KytdLHd0PVtdO2ZvcihsZXQga2U9MDtrZTxMdDtrZSsrKXd0LnB1c2gocy5IRUFQVTMyW3h0LzQra2VdKTtzLl9PcnRGcmVlKHh0KTtsZXQgdHQ9d3QucmVkdWNlKChrZSxCZSk9PmtlKkJlLDEpO1JlPVdwKHF0KTtsZXQgdHI9cD8ub3V0cHV0UHJlZmVycmVkTG9jYXRpb25zW2VbZWVdXTtpZihSZT09PSJzdHJpbmciKXtpZih0cj09PSJncHUtYnVmZmVyIil0aHJvdyBuZXcgRXJyb3IoIlN0cmluZyB0ZW5zb3IgaXMgbm90IHN1cHBvcnRlZCBvbiBHUFUuIik7bGV0IGtlPVtdLEJlPUNlLzQ7Zm9yKGxldCBqZT0wO2plPHR0O2plKyspe2xldCB2dD1zLkhFQVBVMzJbQmUrK10sX3Q9amU9PT10dC0xP3ZvaWQgMDpzLkhFQVBVMzJbQmVdLXZ0O2tlLnB1c2gocy5VVEY4VG9TdHJpbmcodnQsX3QpKX1ldC5wdXNoKFtSZSx3dCxrZSwiY3B1Il0pfWVsc2UgaWYodHI9PT0iZ3B1LWJ1ZmZlciImJnR0PjApe2xldCBrZT1zLmpzZXBHZXRCdWZmZXI7aWYoIWtlKXRocm93IG5ldyBFcnJvcigncHJlZmVycmVkTG9jYXRpb24gImdwdS1idWZmZXIiIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCB1c2luZyBXZWJHUFUuJyk7bGV0IEJlPWtlKENlKSxqZT1zYShxdCk7aWYoamU9PT12b2lkIDB8fCFQbyhSZSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7UmV9YCk7YXQ9ITAsZXQucHVzaChbUmUsd3Qse2dwdUJ1ZmZlcjpCZSxkb3dubG9hZDpzLmpzZXBDcmVhdGVEb3dubG9hZGVyKEJlLHR0KmplLFJlKSxkaXNwb3NlOigpPT57cy5fT3J0UmVsZWFzZVRlbnNvcihxZSl9fSwiZ3B1LWJ1ZmZlciJdKX1lbHNle2xldCBrZT1IcChSZSksQmU9bmV3IGtlKHR0KTtuZXcgVWludDhBcnJheShCZS5idWZmZXIsQmUuYnl0ZU9mZnNldCxCZS5ieXRlTGVuZ3RoKS5zZXQocy5IRUFQVTguc3ViYXJyYXkoQ2UsQ2UrQmUuYnl0ZUxlbmd0aCkpLGV0LnB1c2goW1JlLHd0LEJlLCJjcHUiXSl9fWZpbmFsbHl7cy5zdGFja1Jlc3RvcmUoSHQpLFJlPT09InN0cmluZyImJkNlJiZzLl9mcmVlKENlKSxhdHx8cy5fT3J0UmVsZWFzZVRlbnNvcihxZSl9fXJldHVybiBwJiYhZCYmKHMuX09ydENsZWFyQm91bmRPdXRwdXRzKHAuaGFuZGxlKSx6ci5zZXQoYSxbdSxsLGMscCxkLCExXSkpLGV0fWZpbmFsbHl7cy5zdGFja1Jlc3RvcmUoaiksQy5mb3JFYWNoKExlPT5zLl9PcnRSZWxlYXNlVGVuc29yKExlKSksRi5mb3JFYWNoKExlPT5zLl9PcnRSZWxlYXNlVGVuc29yKExlKSksSi5mb3JFYWNoKExlPT5zLl9mcmVlKExlKSksUyE9PTAmJnMuX09ydFJlbGVhc2VSdW5PcHRpb25zKFMpLEEuZm9yRWFjaChMZT0+cy5fZnJlZShMZSkpfX0sZWQ9YT0+e2xldCB0PURlKCksbz16ci5nZXQoYSk7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNlc3Npb24gaWQiKTtsZXQgZT1vWzBdLHI9dC5fT3J0RW5kUHJvZmlsaW5nKGUpO3I9PT0wJiZfZSgiQ2FuJ3QgZ2V0IGFuIHByb2ZpbGUgZmlsZSBuYW1lLiIpLHQuX09ydEZyZWUocil9LHRkPWE9PntsZXQgdD1bXTtmb3IobGV0IG8gb2YgYSl7bGV0IGU9b1syXTshQXJyYXkuaXNBcnJheShlKSYmImJ1ZmZlciJpbiBlJiZ0LnB1c2goZS5idWZmZXIpfXJldHVybiB0fX0pO3ZhciBuZD1tZSgoSU8seWcpPT57eWcuZXhwb3J0cz0nLyohXG4gKiBPTk5YIFJ1bnRpbWUgV2ViIHYxLjE4LjBcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG4idXNlIHN0cmljdCI7KCgpPT57dmFyIHZ0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcXI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgVnI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIEpyPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIF90PShpLGMpPT4oKT0+KGkmJihjPWkoaT0wKSksYyk7dmFyIEtlPShpLGMpPT4oKT0+KGN8fGkoKGM9e2V4cG9ydHM6e319KS5leHBvcnRzLGMpLGMuZXhwb3J0cyksRXQ9KGksYyk9Pntmb3IodmFyIGEgaW4gYyl2dChpLGEse2dldDpjW2FdLGVudW1lcmFibGU6ITB9KX0sWHI9KGksYyxhLGgpPT57aWYoYyYmdHlwZW9mIGM9PSJvYmplY3QifHx0eXBlb2YgYz09ImZ1bmN0aW9uIilmb3IobGV0IGYgb2YgVnIoYykpIUpyLmNhbGwoaSxmKSYmZiE9PWEmJnZ0KGksZix7Z2V0OigpPT5jW2ZdLGVudW1lcmFibGU6IShoPXFyKGMsZikpfHxoLmVudW1lcmFibGV9KTtyZXR1cm4gaX07dmFyIGV0PWk9PlhyKHZ0KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxpKTt2YXIgU3Q9e307RXQoU3Qse2NyZWF0ZVJlYWRTdHJlYW06KCk9PmxyLHJlYWRGaWxlOigpPT5RcixyZWFkRmlsZVN5bmM6KCk9PlpyfSk7dmFyIFFyLFpyLGxyLEF0PV90KCgpPT57UXI9dm9pZCAwLFpyPXZvaWQgMCxscj12b2lkIDB9KTt2YXIgVHQ9e307RXQoVHQse2pvaW46KCk9PktyfSk7dmFyIEtyLE10PV90KCgpPT57S3I9dm9pZCAwfSk7dmFyIHByPUtlKChkcixDdCk9PnsidXNlIHN0cmljdCI7dmFyIGNyPSgoKT0+e3ZhciBpPXR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQuY3VycmVudFNjcmlwdD8uc3JjOnZvaWQgMDtyZXR1cm4gdHlwZW9mIF9fZmlsZW5hbWU8InUiJiYoaXx8PV9fZmlsZW5hbWUpLGZ1bmN0aW9uKGM9e30pe3ZhciBhPWMsaCxmLHc9bmV3IFByb21pc2UoKHQsbyk9PntoPXQsZj1vfSksZz1PYmplY3QuYXNzaWduKHt9LGEpLHM9Ii4vdGhpcy5wcm9ncmFtIixTPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLHg9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsSD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsQT0iIixJLFYsUjtpZihIKXt2YXIgQj0oQXQoKSxldChTdCkpLEQ9KE10KCksZXQoVHQpKTtBPXg/RC5kaXJuYW1lKEEpKyIvIjpfX2Rpcm5hbWUrIi8iLEk9KHQsbyk9Pih0PWNlKHQpP25ldyBVUkwodCk6RC5ub3JtYWxpemUodCksQi5yZWFkRmlsZVN5bmModCxvP3ZvaWQgMDoidXRmOCIpKSxSPXQ9Pih0PUkodCwhMCksdC5idWZmZXJ8fCh0PW5ldyBVaW50OEFycmF5KHQpKSx0KSxWPSh0LG8sdSxtPSEwKT0+e3Q9Y2UodCk/bmV3IFVSTCh0KTpELm5vcm1hbGl6ZSh0KSxCLnJlYWRGaWxlKHQsbT92b2lkIDA6InV0ZjgiLChPLEUpPT57Tz91KE8pOm8obT9FLmJ1ZmZlcjpFKX0pfSwhYS50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYocz1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKX1lbHNlKFN8fHgpJiYoeD9BPXNlbGYubG9jYXRpb24uaHJlZjp0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoQT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksaSYmKEE9aSksQS5zdGFydHNXaXRoKCJibG9iOiIpP0E9IiI6QT1BLnN1YnN0cigwLEEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxJPXQ9Pnt2YXIgbz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG8ub3BlbigiR0VUIix0LCExKSxvLnNlbmQobnVsbCksby5yZXNwb25zZVRleHR9LHgmJihSPXQ9Pnt2YXIgbz1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIG8ub3BlbigiR0VUIix0LCExKSxvLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG8uc2VuZChudWxsKSxuZXcgVWludDhBcnJheShvLnJlc3BvbnNlKX0pLFY9KHQsbyx1KT0+e3ZhciBtPW5ldyBYTUxIdHRwUmVxdWVzdDttLm9wZW4oIkdFVCIsdCwhMCksbS5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixtLm9ubG9hZD0oKT0+e20uc3RhdHVzPT0yMDB8fG0uc3RhdHVzPT0wJiZtLnJlc3BvbnNlP28obS5yZXNwb25zZSk6dSgpfSxtLm9uZXJyb3I9dSxtLnNlbmQobnVsbCl9KTt2YXIgVD1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLEw9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO09iamVjdC5hc3NpZ24oYSxnKSxnPW51bGw7dmFyIFcsZGU9ITEscGUsWixfLEosUGU7ZnVuY3Rpb24gbGUoKXt2YXIgdD1XLmJ1ZmZlcjthLkhFQVA4PXBlPW5ldyBJbnQ4QXJyYXkodCksYS5IRUFQMTY9bmV3IEludDE2QXJyYXkodCksYS5IRUFQVTg9Wj1uZXcgVWludDhBcnJheSh0KSxhLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KHQpLGEuSEVBUDMyPV89bmV3IEludDMyQXJyYXkodCksYS5IRUFQVTMyPUo9bmV3IFVpbnQzMkFycmF5KHQpLGEuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KHQpLGEuSEVBUEY2ND1QZT1uZXcgRmxvYXQ2NEFycmF5KHQpfXZhciBJZT1bXSxuZT1bXSxYPVtdLHdlPTAsbWU9bnVsbCxGPW51bGw7ZnVuY3Rpb24gaWUodCl7dGhyb3cgdD0iQWJvcnRlZCgiK3QrIikiLEwodCksZGU9ITAsdD1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHQrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxmKHQpLHR9dmFyIHhlPXQ9PnQuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpLGNlPXQ9PnQuc3RhcnRzV2l0aCgiZmlsZTovLyIpLGJlO2lmKGJlPSJvcnQtd2FzbS53YXNtIiwheGUoYmUpKXt2YXIgYWU9YmU7YmU9YS5sb2NhdGVGaWxlP2EubG9jYXRlRmlsZShhZSxBKTpBK2FlfWZ1bmN0aW9uIEsodCl7aWYoUilyZXR1cm4gUih0KTt0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gamUodCl7aWYoU3x8eCl7aWYodHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iJiYhY2UodCkpcmV0dXJuIGZldGNoKHQse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKG89PntpZighby5vayl0aHJvd2BmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0IFwnJHt0fVwnYDtyZXR1cm4gby5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PksodCkpO2lmKFYpcmV0dXJuIG5ldyBQcm9taXNlKChvLHUpPT57Vih0LG09Pm8obmV3IFVpbnQ4QXJyYXkobSkpLHUpfSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PksodCkpfWZ1bmN0aW9uIE9lKHQsbyx1KXtyZXR1cm4gamUodCkudGhlbihtPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtLG8pKS50aGVuKHUsbT0+e0woYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bX1gKSxpZShtKX0pfWZ1bmN0aW9uIFVlKHQsbyl7dmFyIHU9YmU7cmV0dXJuIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyE9ImZ1bmN0aW9uInx8eGUodSl8fGNlKHUpfHxIfHx0eXBlb2YgZmV0Y2ghPSJmdW5jdGlvbiI/T2UodSx0LG8pOmZldGNoKHUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKG09PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKG0sdCkudGhlbihvLGZ1bmN0aW9uKE8pe3JldHVybiBMKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtPfWApLEwoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksT2UodSx0LG8pfSkpfXZhciB2ZSxBZT17Nzk4MDg4Oih0LG8sdSxtKT0+e2lmKHR5cGVvZiBhPiJ1Inx8IWEueWEpcmV0dXJuIDE7aWYodD11ZSh0Pj4+MCksdC5zdGFydHNXaXRoKCIuLyIpJiYodD10LnN1YnN0cmluZygyKSksdD1hLnlhLmdldCh0KSwhdClyZXR1cm4gMjtpZihvPj4+PTAsdT4+Pj0wLG8rdT50LmJ5dGVMZW5ndGgpcmV0dXJuIDM7dHJ5e3JldHVybiBaLnNldCh0LnN1YmFycmF5KG8sbyt1KSxtPj4+MD4+PjApLDB9Y2F0Y2h7cmV0dXJuIDR9fX07Y2xhc3MgX2V7Y29uc3RydWN0b3Iobyl7dGhpcy53YT1vLTI0fX12YXIgZ2U9MCxCZT0wLHRlPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwLHJlPSh0LG8sdSk9PntvPj4+PTA7dmFyIG09byt1O2Zvcih1PW87dFt1XSYmISh1Pj1tKTspKyt1O2lmKDE2PHUtbyYmdC5idWZmZXImJnRlKXJldHVybiB0ZS5kZWNvZGUodC5zdWJhcnJheShvLHUpKTtmb3IobT0iIjtvPHU7KXt2YXIgTz10W28rK107aWYoTyYxMjgpe3ZhciBFPXRbbysrXSY2MztpZigoTyYyMjQpPT0xOTIpbSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoTyYzMSk8PDZ8RSk7ZWxzZXt2YXIgVT10W28rK10mNjM7Tz0oTyYyNDApPT0yMjQ/KE8mMTUpPDwxMnxFPDw2fFU6KE8mNyk8PDE4fEU8PDEyfFU8PDZ8dFtvKytdJjYzLDY1NTM2Pk8/bSs9U3RyaW5nLmZyb21DaGFyQ29kZShPKTooTy09NjU1MzYsbSs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxPPj4xMCw1NjMyMHxPJjEwMjMpKX19ZWxzZSBtKz1TdHJpbmcuZnJvbUNoYXJDb2RlKE8pfXJldHVybiBtfSx1ZT0odCxvKT0+KHQ+Pj49MCk/cmUoWix0LG8pOiIiLEVlPXQ9Pntmb3IodmFyIG89MCx1PTA7dTx0Lmxlbmd0aDsrK3Upe3ZhciBtPXQuY2hhckNvZGVBdCh1KTsxMjc+PW0/bysrOjIwNDc+PW0/bys9Mjo1NTI5Njw9bSYmNTczNDM+PW0/KG8rPTQsKyt1KTpvKz0zfXJldHVybiBvfSxTZT0odCxvLHUsbSk9PntpZih1Pj4+PTAsISgwPG0pKXJldHVybiAwO3ZhciBPPXU7bT11K20tMTtmb3IodmFyIEU9MDtFPHQubGVuZ3RoOysrRSl7dmFyIFU9dC5jaGFyQ29kZUF0KEUpO2lmKDU1Mjk2PD1VJiY1NzM0Mz49VSl7dmFyIGVlPXQuY2hhckNvZGVBdCgrK0UpO1U9NjU1MzYrKChVJjEwMjMpPDwxMCl8ZWUmMTAyM31pZigxMjc+PVUpe2lmKHU+PW0pYnJlYWs7b1t1Kys+Pj4wXT1VfWVsc2V7aWYoMjA0Nz49VSl7aWYodSsxPj1tKWJyZWFrO29bdSsrPj4+MF09MTkyfFU+PjZ9ZWxzZXtpZig2NTUzNT49VSl7aWYodSsyPj1tKWJyZWFrO29bdSsrPj4+MF09MjI0fFU+PjEyfWVsc2V7aWYodSszPj1tKWJyZWFrO29bdSsrPj4+MF09MjQwfFU+PjE4LG9bdSsrPj4+MF09MTI4fFU+PjEyJjYzfW9bdSsrPj4+MF09MTI4fFU+PjYmNjN9b1t1Kys+Pj4wXT0xMjh8VSY2M319cmV0dXJuIG9bdT4+PjBdPTAsdS1PfSxMZT10PT50JTQ9PT0wJiYodCUxMDAhPT0wfHx0JTQwMD09PTApLHplPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLHJ0PVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdLFRlPVtdLEdlPXt9LGtlPSgpPT57aWYoIVdlKXt2YXIgdD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOih0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86c3x8Ii4vdGhpcy5wcm9ncmFtIn0sbztmb3IobyBpbiBHZSlHZVtvXT09PXZvaWQgMD9kZWxldGUgdFtvXTp0W29dPUdlW29dO3ZhciB1PVtdO2ZvcihvIGluIHQpdS5wdXNoKGAke299PSR7dFtvXX1gKTtXZT11fXJldHVybiBXZX0sV2UsbnQ9W251bGwsW10sW11dLERlPVszMSwyOSwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sYXQ9WzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtmdW5jdGlvbiBHKHQpe3ZhciBvPUFycmF5KEVlKHQpKzEpO3JldHVybiBTZSh0LG8sMCxvLmxlbmd0aCksb31mdW5jdGlvbiBxZSh0LG8sdSxtKXtmdW5jdGlvbiBPKGQsaywkKXtmb3IoZD10eXBlb2YgZD09Im51bWJlciI/ZC50b1N0cmluZygpOmR8fCIiO2QubGVuZ3RoPGs7KWQ9JFswXStkO3JldHVybiBkfWZ1bmN0aW9uIEUoZCxrKXtyZXR1cm4gTyhkLGssIjAiKX1mdW5jdGlvbiBVKGQsayl7ZnVuY3Rpb24gJChaZSl7cmV0dXJuIDA+WmU/LTE6MDxaZT8xOjB9dmFyIE1lO3JldHVybihNZT0kKGQuZ2V0RnVsbFllYXIoKS1rLmdldEZ1bGxZZWFyKCkpKT09PTAmJihNZT0kKGQuZ2V0TW9udGgoKS1rLmdldE1vbnRoKCkpKT09PTAmJihNZT0kKGQuZ2V0RGF0ZSgpLWsuZ2V0RGF0ZSgpKSksTWV9ZnVuY3Rpb24gZWUoZCl7c3dpdGNoKGQuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZDtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24geWUoZCl7dmFyIGs9ZC5zYTtmb3IoZD1uZXcgRGF0ZShuZXcgRGF0ZShkLnRhKzE5MDAsMCwxKS5nZXRUaW1lKCkpOzA8azspe3ZhciAkPWQuZ2V0TW9udGgoKSxNZT0oTGUoZC5nZXRGdWxsWWVhcigpKT9EZTphdClbJF07aWYoaz5NZS1kLmdldERhdGUoKSlrLT1NZS1kLmdldERhdGUoKSsxLGQuc2V0RGF0ZSgxKSwxMT4kP2Quc2V0TW9udGgoJCsxKTooZC5zZXRNb250aCgwKSxkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSsxKSk7ZWxzZXtkLnNldERhdGUoZC5nZXREYXRlKCkrayk7YnJlYWt9fXJldHVybiAkPW5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSsxLDAsNCksaz1lZShuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksMCw0KSksJD1lZSgkKSwwPj1VKGssZCk/MD49VSgkLGQpP2QuZ2V0RnVsbFllYXIoKSsxOmQuZ2V0RnVsbFllYXIoKTpkLmdldEZ1bGxZZWFyKCktMX10Pj4+PTAsbz4+Pj0wLHU+Pj49MCxtPj4+PTA7dmFyIG9lPUpbbSs0MD4+PjI+Pj4wXTttPXtCYTpfW20+Pj4yPj4+MF0sQWE6X1ttKzQ+Pj4yPj4+MF0sdWE6X1ttKzg+Pj4yPj4+MF0seGE6X1ttKzEyPj4+Mj4+PjBdLHZhOl9bbSsxNj4+PjI+Pj4wXSx0YTpfW20rMjA+Pj4yPj4+MF0sbmE6X1ttKzI0Pj4+Mj4+PjBdLHNhOl9bbSsyOD4+PjI+Pj4wXSxEYTpfW20rMzI+Pj4yPj4+MF0semE6X1ttKzM2Pj4+Mj4+PjBdLENhOm9lP3VlKG9lKToiIn0sdT11ZSh1KSxvZT17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In07Zm9yKHZhciBzZSBpbiBvZSl1PXUucmVwbGFjZShuZXcgUmVnRXhwKHNlLCJnIiksb2Vbc2VdKTt2YXIgUWU9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLFJlPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO29lPXsiJWEiOmQ9PlFlW2QubmFdLnN1YnN0cmluZygwLDMpLCIlQSI6ZD0+UWVbZC5uYV0sIiViIjpkPT5SZVtkLnZhXS5zdWJzdHJpbmcoMCwzKSwiJUIiOmQ9PlJlW2QudmFdLCIlQyI6ZD0+RSgoZC50YSsxOTAwKS8xMDB8MCwyKSwiJWQiOmQ9PkUoZC54YSwyKSwiJWUiOmQ9Pk8oZC54YSwyLCIgIiksIiVnIjpkPT55ZShkKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOnllLCIlSCI6ZD0+RShkLnVhLDIpLCIlSSI6ZD0+KGQ9ZC51YSxkPT0wP2Q9MTI6MTI8ZCYmKGQtPTEyKSxFKGQsMikpLCIlaiI6ZD0+e2Zvcih2YXIgaz0wLCQ9MDskPD1kLnZhLTE7ays9KExlKGQudGErMTkwMCk/RGU6YXQpWyQrK10pO3JldHVybiBFKGQueGEraywzKX0sIiVtIjpkPT5FKGQudmErMSwyKSwiJU0iOmQ9PkUoZC5BYSwyKSwiJW4iOigpPT5gXG5gLCIlcCI6ZD0+MDw9ZC51YSYmMTI+ZC51YT8iQU0iOiJQTSIsIiVTIjpkPT5FKGQuQmEsMiksIiV0IjooKT0+IgkiLCIldSI6ZD0+ZC5uYXx8NywiJVUiOmQ9PkUoTWF0aC5mbG9vcigoZC5zYSs3LWQubmEpLzcpLDIpLCIlViI6ZD0+e3ZhciBrPU1hdGguZmxvb3IoKGQuc2ErNy0oZC5uYSs2KSU3KS83KTtpZigyPj0oZC5uYSszNzEtZC5zYS0yKSU3JiZrKyssaylrPT01MyYmKCQ9KGQubmErMzcxLWQuc2EpJTcsJD09NHx8JD09MyYmTGUoZC50YSl8fChrPTEpKTtlbHNle2s9NTI7dmFyICQ9KGQubmErNy1kLnNhLTEpJTc7KCQ9PTR8fCQ9PTUmJkxlKGQudGElNDAwLTEpKSYmaysrfXJldHVybiBFKGssMil9LCIldyI6ZD0+ZC5uYSwiJVciOmQ9PkUoTWF0aC5mbG9vcigoZC5zYSs3LShkLm5hKzYpJTcpLzcpLDIpLCIleSI6ZD0+KGQudGErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjpkPT5kLnRhKzE5MDAsIiV6IjpkPT57ZD1kLnphO3ZhciBrPTA8PWQ7cmV0dXJuIGQ9TWF0aC5hYnMoZCkvNjAsKGs/IisiOiItIikrKCIwMDAwIisoZC82MCoxMDArZCU2MCkpLnNsaWNlKC00KX0sIiVaIjpkPT5kLkNhLCIlJSI6KCk9PiIlIn0sdT11LnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpO2ZvcihzZSBpbiBvZSl1LmluY2x1ZGVzKHNlKSYmKHU9dS5yZXBsYWNlKG5ldyBSZWdFeHAoc2UsImciKSxvZVtzZV0obSkpKTtyZXR1cm4gdT11LnJlcGxhY2UoL1xcMFxcMC9nLCIlIiksc2U9Ryh1KSxzZS5sZW5ndGg+bz8wOihwZS5zZXQoc2UsdD4+PjApLHNlLmxlbmd0aC0xKX12YXIgVmU9e2E6ZnVuY3Rpb24odCxvLHUpe3Q+Pj49MDt2YXIgbT1uZXcgX2UodCk7dGhyb3cgSlttLndhKzE2Pj4+Mj4+PjBdPTAsSlttLndhKzQ+Pj4yPj4+MF09bz4+PjAsSlttLndhKzg+Pj4yPj4+MF09dT4+PjAsZ2U9dCxCZSsrLGdlfSxlOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LEg6ZnVuY3Rpb24oKXt9LHg6ZnVuY3Rpb24oKXt9LHo6ZnVuY3Rpb24oKXt9LEo6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sRjpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sRTpmdW5jdGlvbigpe30sZzpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sdjpmdW5jdGlvbigpe30sRzpmdW5jdGlvbigpe30sdzpmdW5jdGlvbigpe30sazooKT0+MSxJOmZ1bmN0aW9uKHQsbyx1KXtyZXR1cm4gbz4+Pj0wLFouY29weVdpdGhpbih0Pj4+MD4+PjAsbz4+PjAsbysodT4+PjApPj4+MCl9LG46ZnVuY3Rpb24odCxvLHUpe3Q9bysyMDk3MTUyPj4+MDw0MTk0MzA1LSEhdD8odD4+PjApKzQyOTQ5NjcyOTYqbzpOYU4sdT4+Pj0wLHQ9bmV3IERhdGUoMWUzKnQpLF9bdT4+PjI+Pj4wXT10LmdldFVUQ1NlY29uZHMoKSxfW3UrND4+PjI+Pj4wXT10LmdldFVUQ01pbnV0ZXMoKSxfW3UrOD4+PjI+Pj4wXT10LmdldFVUQ0hvdXJzKCksX1t1KzEyPj4+Mj4+PjBdPXQuZ2V0VVRDRGF0ZSgpLF9bdSsxNj4+PjI+Pj4wXT10LmdldFVUQ01vbnRoKCksX1t1KzIwPj4+Mj4+PjBdPXQuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLF9bdSsyND4+PjI+Pj4wXT10LmdldFVUQ0RheSgpLF9bdSsyOD4+PjI+Pj4wXT0odC5nZXRUaW1lKCktRGF0ZS5VVEModC5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MH0sbzpmdW5jdGlvbih0LG8sdSl7dD1vKzIwOTcxNTI+Pj4wPDQxOTQzMDUtISF0Pyh0Pj4+MCkrNDI5NDk2NzI5NipvOk5hTix1Pj4+PTAsdD1uZXcgRGF0ZSgxZTMqdCksX1t1Pj4+Mj4+PjBdPXQuZ2V0U2Vjb25kcygpLF9bdSs0Pj4+Mj4+PjBdPXQuZ2V0TWludXRlcygpLF9bdSs4Pj4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxfW3UrMTI+Pj4yPj4+MF09dC5nZXREYXRlKCksX1t1KzE2Pj4+Mj4+PjBdPXQuZ2V0TW9udGgoKSxfW3UrMjA+Pj4yPj4+MF09dC5nZXRGdWxsWWVhcigpLTE5MDAsX1t1KzI0Pj4+Mj4+PjBdPXQuZ2V0RGF5KCksX1t1KzI4Pj4+Mj4+PjBdPShMZSh0LmdldEZ1bGxZZWFyKCkpP3plOnJ0KVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxfW3UrMzY+Pj4yPj4+MF09LSg2MCp0LmdldFRpbWV6b25lT2Zmc2V0KCkpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgbT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO19bdSszMj4+PjI+Pj4wXT0obyE9bSYmdC5nZXRUaW1lem9uZU9mZnNldCgpPT1NYXRoLm1pbihtLG8pKXwwfSxwOmZ1bmN0aW9uKHQpe3Q+Pj49MDt2YXIgbz1uZXcgRGF0ZShfW3QrMjA+Pj4yPj4+MF0rMTkwMCxfW3QrMTY+Pj4yPj4+MF0sX1t0KzEyPj4+Mj4+PjBdLF9bdCs4Pj4+Mj4+PjBdLF9bdCs0Pj4+Mj4+PjBdLF9bdD4+PjI+Pj4wXSwwKSx1PV9bdCszMj4+PjI+Pj4wXSxtPW8uZ2V0VGltZXpvbmVPZmZzZXQoKSxPPW5ldyBEYXRlKG8uZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksRT1uZXcgRGF0ZShvLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLFU9TWF0aC5taW4oRSxPKTtyZXR1cm4gMD51P19bdCszMj4+PjI+Pj4wXT0rKE8hPUUmJlU9PW0pOjA8dSE9KFU9PW0pJiYoTz1NYXRoLm1heChFLE8pLG8uc2V0VGltZShvLmdldFRpbWUoKSs2ZTQqKCgwPHU/VTpPKS1tKSkpLF9bdCsyND4+PjI+Pj4wXT1vLmdldERheSgpLF9bdCsyOD4+PjI+Pj4wXT0oTGUoby5nZXRGdWxsWWVhcigpKT96ZTpydClbby5nZXRNb250aCgpXStvLmdldERhdGUoKS0xfDAsX1t0Pj4+Mj4+PjBdPW8uZ2V0U2Vjb25kcygpLF9bdCs0Pj4+Mj4+PjBdPW8uZ2V0TWludXRlcygpLF9bdCs4Pj4+Mj4+PjBdPW8uZ2V0SG91cnMoKSxfW3QrMTI+Pj4yPj4+MF09by5nZXREYXRlKCksX1t0KzE2Pj4+Mj4+PjBdPW8uZ2V0TW9udGgoKSxfW3QrMjA+Pj4yPj4+MF09by5nZXRZZWFyKCksdD1vLmdldFRpbWUoKSx0PWlzTmFOKHQpPy0xOnQvMWUzLEplKCh2ZT10LDE8PStNYXRoLmFicyh2ZSk/MDx2ZT8rTWF0aC5mbG9vcih2ZS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh2ZS0rKH5+dmU+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSx0Pj4+MH0sbDpmdW5jdGlvbigpe3JldHVybi01Mn0sbTpmdW5jdGlvbigpe30sdDpmdW5jdGlvbih0LG8sdSxtKXt1Pj4+PTAsbT4+Pj0wO3ZhciBPPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxFPW5ldyBEYXRlKE8sMCwxKSxVPW5ldyBEYXRlKE8sNiwxKTtPPUUuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgZWU9VS5nZXRUaW1lem9uZU9mZnNldCgpO0pbdD4+PjA+Pj4yPj4+MF09NjAqTWF0aC5tYXgoTyxlZSksX1tvPj4+MD4+PjI+Pj4wXT0rKE8hPWVlKSx0PXllPT55ZS50b0xvY2FsZVRpbWVTdHJpbmcodm9pZCAwLHtob3VyMTI6ITEsdGltZVpvbmVOYW1lOiJzaG9ydCJ9KS5zcGxpdCgiICIpWzFdLEU9dChFKSxVPXQoVSksZWU8Tz8oU2UoRSxaLHUsMTcpLFNlKFUsWixtLDE3KSk6KFNlKEUsWixtLDE3KSxTZShVLFosdSwxNykpfSxkOigpPT57aWUoIiIpfSxCOmZ1bmN0aW9uKHQsbyx1KXt0Pj4+PTAsbz4+Pj0wLHU+Pj49MCxUZS5sZW5ndGg9MDtmb3IodmFyIG07bT1aW28rKz4+PjBdOyl7dmFyIE89bSE9MTA1O08mPW0hPTExMix1Kz1PJiZ1JTg/NDowLFRlLnB1c2gobT09MTEyP0pbdT4+PjI+Pj4wXTptPT0xMDU/X1t1Pj4+Mj4+PjBdOlBlW3U+Pj4zPj4+MF0pLHUrPU8/ODo0fXJldHVybiBBZVt0XSguLi5UZSl9LGg6KCk9PkRhdGUubm93KCksdTpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxiOigpPT5wZXJmb3JtYW5jZS5ub3coKSxzOmZ1bmN0aW9uKHQpe3Q+Pj49MDt2YXIgbz1aLmxlbmd0aDtpZig0Mjk0OTAxNzYwPHQpcmV0dXJuITE7Zm9yKHZhciB1PTE7ND49dTt1Kj0yKXt2YXIgbT1vKigxKy4yL3UpO209TWF0aC5taW4obSx0KzEwMDY2MzI5Nik7dmFyIE89TWF0aDttPU1hdGgubWF4KHQsbSk7ZTp7Tz0oTy5taW4uY2FsbChPLDQyOTQ5MDE3NjAsbSsoNjU1MzYtbSU2NTUzNiklNjU1MzYpLVcuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzUpLzY1NTM2O3RyeXtXLmdyb3coTyksbGUoKTt2YXIgRT0xO2JyZWFrIGV9Y2F0Y2h7fUU9dm9pZCAwfWlmKEUpcmV0dXJuITB9cmV0dXJuITF9LEM6ZnVuY3Rpb24odCxvKXt0Pj4+PTAsbz4+Pj0wO3ZhciB1PTA7cmV0dXJuIGtlKCkuZm9yRWFjaCgobSxPKT0+e3ZhciBFPW8rdTtmb3IoTz1KW3QrNCpPPj4+Mj4+PjBdPUUsRT0wO0U8bS5sZW5ndGg7KytFKXBlW08rKz4+PjBdPW0uY2hhckNvZGVBdChFKTtwZVtPPj4+MF09MCx1Kz1tLmxlbmd0aCsxfSksMH0sRDpmdW5jdGlvbih0LG8pe3Q+Pj49MCxvPj4+PTA7dmFyIHU9a2UoKTtKW3Q+Pj4yPj4+MF09dS5sZW5ndGg7dmFyIG09MDtyZXR1cm4gdS5mb3JFYWNoKE89Pm0rPU8ubGVuZ3RoKzEpLEpbbz4+PjI+Pj4wXT1tLDB9LGY6KCk9PjUyLGo6ZnVuY3Rpb24oKXtyZXR1cm4gNTJ9LHE6ZnVuY3Rpb24oKXtyZXR1cm4gNzB9LGk6ZnVuY3Rpb24odCxvLHUsbSl7bz4+Pj0wLHU+Pj49MCxtPj4+PTA7Zm9yKHZhciBPPTAsRT0wO0U8dTtFKyspe3ZhciBVPUpbbz4+PjI+Pj4wXSxlZT1KW28rND4+PjI+Pj4wXTtvKz04O2Zvcih2YXIgeWU9MDt5ZTxlZTt5ZSsrKXt2YXIgb2U9WltVK3llPj4+MF0sc2U9bnRbdF07b2U9PT0wfHxvZT09PTEwPygodD09PTE/VDpMKShyZShzZSwwKSksc2UubGVuZ3RoPTApOnNlLnB1c2gob2UpfU8rPWVlfXJldHVybiBKW20+Pj4yPj4+MF09TywwfSxyOnFlLGM6ZnVuY3Rpb24odCxvLHUsbSl7cmV0dXJuIHFlKHQ+Pj4wLG8+Pj4wLHU+Pj4wLG0+Pj4wKX19LFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHUpe3JldHVybiBQPXUuZXhwb3J0cyxQPXN0KCksVz1QLkssbGUoKSxuZS51bnNoaWZ0KFAuTCksd2UtLSx3ZT09MCYmKG1lIT09bnVsbCYmKGNsZWFySW50ZXJ2YWwobWUpLG1lPW51bGwpLEYmJih1PUYsRj1udWxsLHUoKSkpLFB9dmFyIG89e2E6VmV9O2lmKHdlKyssYS5pbnN0YW50aWF0ZVdhc20pdHJ5e3JldHVybiBhLmluc3RhbnRpYXRlV2FzbShvLHQpfWNhdGNoKHUpe0woYE1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICR7dX1gKSxmKHUpfXJldHVybiBVZShvLGZ1bmN0aW9uKHUpe3QodS5pbnN0YW5jZSl9KS5jYXRjaChmKSx7fX0oKTthLl9PcnRJbml0PSh0LG8pPT4oYS5fT3J0SW5pdD1QLk0pKHQsbyksYS5fT3J0R2V0TGFzdEVycm9yPSh0LG8pPT4oYS5fT3J0R2V0TGFzdEVycm9yPVAuTikodCxvKSxhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz0odCxvLHUsbSxPLEUsVSxlZSx5ZSxvZSk9PihhLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucz1QLk8pKHQsbyx1LG0sTyxFLFUsZWUseWUsb2UpLGEuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPSh0LG8pPT4oYS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9UC5QKSh0LG8pLGEuX09ydEFkZEZyZWVEaW1lbnNpb25PdmVycmlkZT0odCxvLHUpPT4oYS5fT3J0QWRkRnJlZURpbWVuc2lvbk92ZXJyaWRlPVAuUSkodCxvLHUpLGEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0odCxvLHUpPT4oYS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PVAuUikodCxvLHUpLGEuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz10PT4oYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPVAuUykodCksYS5fT3J0Q3JlYXRlU2Vzc2lvbj0odCxvLHUpPT4oYS5fT3J0Q3JlYXRlU2Vzc2lvbj1QLlQpKHQsbyx1KSxhLl9PcnRSZWxlYXNlU2Vzc2lvbj10PT4oYS5fT3J0UmVsZWFzZVNlc3Npb249UC5VKSh0KSxhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PSh0LG8sdSk9PihhLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PVAuVikodCxvLHUpLGEuX09ydEdldElucHV0TmFtZT0odCxvKT0+KGEuX09ydEdldElucHV0TmFtZT1QLlcpKHQsbyksYS5fT3J0R2V0T3V0cHV0TmFtZT0odCxvKT0+KGEuX09ydEdldE91dHB1dE5hbWU9UC5YKSh0LG8pLGEuX09ydEZyZWU9dD0+KGEuX09ydEZyZWU9UC5ZKSh0KSxhLl9PcnRDcmVhdGVUZW5zb3I9KHQsbyx1LG0sTyxFKT0+KGEuX09ydENyZWF0ZVRlbnNvcj1QLlopKHQsbyx1LG0sTyxFKSxhLl9PcnRHZXRUZW5zb3JEYXRhPSh0LG8sdSxtLE8pPT4oYS5fT3J0R2V0VGVuc29yRGF0YT1QLl8pKHQsbyx1LG0sTyksYS5fT3J0UmVsZWFzZVRlbnNvcj10PT4oYS5fT3J0UmVsZWFzZVRlbnNvcj1QLiQpKHQpLGEuX09ydENyZWF0ZVJ1bk9wdGlvbnM9KHQsbyx1LG0pPT4oYS5fT3J0Q3JlYXRlUnVuT3B0aW9ucz1QLmFhKSh0LG8sdSxtKSxhLl9PcnRBZGRSdW5Db25maWdFbnRyeT0odCxvLHUpPT4oYS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9UC5iYSkodCxvLHUpLGEuX09ydFJlbGVhc2VSdW5PcHRpb25zPXQ9PihhLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1QLmNhKSh0KSxhLl9PcnRDcmVhdGVCaW5kaW5nPXQ9PihhLl9PcnRDcmVhdGVCaW5kaW5nPVAuZGEpKHQpLGEuX09ydEJpbmRJbnB1dD0odCxvLHUpPT4oYS5fT3J0QmluZElucHV0PVAuZWEpKHQsbyx1KSxhLl9PcnRCaW5kT3V0cHV0PSh0LG8sdSxtKT0+KGEuX09ydEJpbmRPdXRwdXQ9UC5mYSkodCxvLHUsbSksYS5fT3J0Q2xlYXJCb3VuZE91dHB1dHM9dD0+KGEuX09ydENsZWFyQm91bmRPdXRwdXRzPVAuZ2EpKHQpLGEuX09ydFJlbGVhc2VCaW5kaW5nPXQ9PihhLl9PcnRSZWxlYXNlQmluZGluZz1QLmhhKSh0KSxhLl9PcnRSdW5XaXRoQmluZGluZz0odCxvLHUsbSxPKT0+KGEuX09ydFJ1bldpdGhCaW5kaW5nPVAuaWEpKHQsbyx1LG0sTyksYS5fT3J0UnVuPSh0LG8sdSxtLE8sRSxVLGVlKT0+KGEuX09ydFJ1bj1QLmphKSh0LG8sdSxtLE8sRSxVLGVlKSxhLl9PcnRFbmRQcm9maWxpbmc9dD0+KGEuX09ydEVuZFByb2ZpbGluZz1QLmthKSh0KSxhLl9tYWxsb2M9dD0+KGEuX21hbGxvYz1QLmxhKSh0KSxhLl9mcmVlPXQ9PihhLl9mcmVlPVAubWEpKHQpO3ZhciBKZT10PT4oSmU9UC5vYSkodCksb3Q9dD0+KG90PVAucGEpKHQpLE09dD0+KE09UC5xYSkodCksTmU9KCk9PihOZT1QLnJhKSgpO2Z1bmN0aW9uIHN0KCl7dmFyIHQ9UDt0PU9iamVjdC5hc3NpZ24oe30sdCk7dmFyIG89dT0+bT0+dShtKT4+PjA7cmV0dXJuIHQubGE9byh0LmxhKSx0LnFhPW8odC5xYSksdC5yYT0odT0+KCk9PnUoKT4+PjApKHQucmEpLHR9YS5zdGFja1NhdmU9KCk9Pk5lKCksYS5zdGFja1Jlc3RvcmU9dD0+b3QodCksYS5zdGFja0FsbG9jPXQ9Pk0odCksYS5VVEY4VG9TdHJpbmc9dWUsYS5zdHJpbmdUb1VURjg9KHQsbyx1KT0+U2UodCxaLG8sdSksYS5sZW5ndGhCeXRlc1VURjg9RWU7dmFyIEZlO0Y9ZnVuY3Rpb24gdCgpe0ZlfHxYZSgpLEZlfHwoRj10KX07ZnVuY3Rpb24gWGUoKXtpZighKDA8d2UpKXtpZihhLnByZVJ1bilmb3IodHlwZW9mIGEucHJlUnVuPT0iZnVuY3Rpb24iJiYoYS5wcmVSdW49W2EucHJlUnVuXSk7YS5wcmVSdW4ubGVuZ3RoOyl7dmFyIHQ9YS5wcmVSdW4uc2hpZnQoKTtJZS51bnNoaWZ0KHQpfWZvcig7MDxJZS5sZW5ndGg7KUllLnNoaWZ0KCkoYSk7aWYoISgwPHdlfHxGZXx8KEZlPSEwLGEuY2FsbGVkUnVuPSEwLGRlKSkpe2Zvcig7MDxuZS5sZW5ndGg7KW5lLnNoaWZ0KCkoYSk7Zm9yKGgoYSk7MDxYLmxlbmd0aDspWC5zaGlmdCgpKGEpfX19cmV0dXJuIFhlKCksd319KSgpO3R5cGVvZiBkcj09Im9iamVjdCImJnR5cGVvZiBDdD09Im9iamVjdCI/Q3QuZXhwb3J0cz1jcjp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoW10sKCk9PmNyKX0pO3ZhciBtcj1LZSgoKT0+e30pO3ZhciBncj1LZSgoKT0+e30pO3ZhciBocj17fTtFdChocix7Y3B1czooKT0+ZW59KTt2YXIgZW4sYnI9X3QoKCk9Pntlbj12b2lkIDB9KTt2YXIgT3I9S2UoKHdyLER0KT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgeXI9KCgpPT57dmFyIGk9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5jdXJyZW50U2NyaXB0Py5zcmM6dm9pZCAwO3JldHVybiB0eXBlb2YgX19maWxlbmFtZTwidSImJihpfHw9X19maWxlbmFtZSksZnVuY3Rpb24oYz17fSl7ZnVuY3Rpb24gYSgpe3JldHVybiBYLmJ1ZmZlciE9aWUuYnVmZmVyJiZLKCksaWV9ZnVuY3Rpb24gaCgpe3JldHVybiBYLmJ1ZmZlciE9aWUuYnVmZmVyJiZLKCkseGV9ZnVuY3Rpb24gZigpe3JldHVybiBYLmJ1ZmZlciE9aWUuYnVmZmVyJiZLKCksY2V9ZnVuY3Rpb24gdygpe3JldHVybiBYLmJ1ZmZlciE9aWUuYnVmZmVyJiZLKCksYmV9ZnVuY3Rpb24gZygpe3JldHVybiBYLmJ1ZmZlciE9aWUuYnVmZmVyJiZLKCksYWV9dmFyIHM9YyxTLHgsSD1uZXcgUHJvbWlzZSgoZSxyKT0+e1M9ZSx4PXJ9KSxBPU9iamVjdC5hc3NpZ24oe30scyksST0iLi90aGlzLnByb2dyYW0iLFY9KGUscik9Pnt0aHJvdyByfSxSPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiLEI9dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsRD10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZT09InN0cmluZyIsVD1zLkVOVklST05NRU5UX0lTX1BUSFJFQUR8fCExLEw9IiI7ZnVuY3Rpb24gVyhlKXtyZXR1cm4gcy5sb2NhdGVGaWxlP3MubG9jYXRlRmlsZShlLEwpOkwrZX12YXIgZGUscGUsWjtpZihEKXt2YXIgXz0oQXQoKSxldChTdCkpLEo9KE10KCksZXQoVHQpKTtMPUI/Si5kaXJuYW1lKEwpKyIvIjpfX2Rpcm5hbWUrIi8iLGRlPShlLHIpPT4oZT11ZShlKT9uZXcgVVJMKGUpOkoubm9ybWFsaXplKGUpLF8ucmVhZEZpbGVTeW5jKGUscj92b2lkIDA6InV0ZjgiKSksWj1lPT4oZT1kZShlLCEwKSxlLmJ1ZmZlcnx8KGU9bmV3IFVpbnQ4QXJyYXkoZSkpLGUpLHBlPShlLHIsbixsPSEwKT0+e2U9dWUoZSk/bmV3IFVSTChlKTpKLm5vcm1hbGl6ZShlKSxfLnJlYWRGaWxlKGUsbD92b2lkIDA6InV0ZjgiLCh5LGIpPT57eT9uKHkpOnIobD9iLmJ1ZmZlcjpiKX0pfSwhcy50aGlzUHJvZ3JhbSYmMTxwcm9jZXNzLmFyZ3YubGVuZ3RoJiYoST1wcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxWPShlLHIpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1lLHJ9LGdsb2JhbC5Xb3JrZXI9bXIoKS5Xb3JrZXJ9ZWxzZShSfHxCKSYmKEI/TD1zZWxmLmxvY2F0aW9uLmhyZWY6dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKEw9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHR5cGVvZiBpPCJ1IiYmaSYmKEw9aSksTC5zdGFydHNXaXRoKCJibG9iOiIpP0w9IiI6TD1MLnN1YnN0cigwLEwucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxEfHwoZGU9ZT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gci5vcGVuKCJHRVQiLGUsITEpLHIuc2VuZChudWxsKSxyLnJlc3BvbnNlVGV4dH0sQiYmKFo9ZT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gci5vcGVuKCJHRVQiLGUsITEpLHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsci5zZW5kKG51bGwpLG5ldyBVaW50OEFycmF5KHIucmVzcG9uc2UpfSkscGU9KGUscixuKT0+e3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9wZW4oIkdFVCIsZSwhMCksbC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixsLm9ubG9hZD0oKT0+e2wuc3RhdHVzPT0yMDB8fGwuc3RhdHVzPT0wJiZsLnJlc3BvbnNlP3IobC5yZXNwb25zZSk6bigpfSxsLm9uZXJyb3I9bixsLnNlbmQobnVsbCl9KSk7RCYmdHlwZW9mIHBlcmZvcm1hbmNlPiJ1IiYmKGdsb2JhbC5wZXJmb3JtYW5jZT1ncigpLnBlcmZvcm1hbmNlKTt2YXIgUGU9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxsZT1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7RCYmKFBlPSguLi5lKT0+Xy53cml0ZVN5bmMoMSxlLmpvaW4oIiAiKStgXG5gKSxsZT0oLi4uZSk9Pl8ud3JpdGVTeW5jKDIsZS5qb2luKCIgIikrYFxuYCkpO3ZhciBJZT1QZSxuZT1sZTtPYmplY3QuYXNzaWduKHMsQSksQT1udWxsO3ZhciBYLHdlLG1lPSExLEYsaWUseGUsY2UsYmUsYWU7ZnVuY3Rpb24gSygpe3ZhciBlPVguYnVmZmVyO3MuSEVBUDg9aWU9bmV3IEludDhBcnJheShlKSxzLkhFQVAxNj1uZXcgSW50MTZBcnJheShlKSxzLkhFQVBVOD14ZT1uZXcgVWludDhBcnJheShlKSxzLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLHMuSEVBUDMyPWNlPW5ldyBJbnQzMkFycmF5KGUpLHMuSEVBUFUzMj1iZT1uZXcgVWludDMyQXJyYXkoZSkscy5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoZSkscy5IRUFQRjY0PWFlPW5ldyBGbG9hdDY0QXJyYXkoZSl9dmFyIGplPTE2Nzc3MjE2O2lmKFQpWD1zLndhc21NZW1vcnk7ZWxzZSBpZihzLndhc21NZW1vcnkpWD1zLndhc21NZW1vcnk7ZWxzZSBpZihYPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6amUvNjU1MzYsbWF4aW11bTo2NTUzNixzaGFyZWQ6ITB9KSwhKFguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IG5lKCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWciKSxEJiZuZSgiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQvb3IgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtLKCksamU9WC5idWZmZXIuYnl0ZUxlbmd0aDt2YXIgT2U9W10sVWU9W10sdmU9W10sQWU9MCxfZT1udWxsLGdlPW51bGw7ZnVuY3Rpb24gQmUoKXtpZihBZS0tLEFlPT0wJiYoX2UhPT1udWxsJiYoY2xlYXJJbnRlcnZhbChfZSksX2U9bnVsbCksZ2UpKXt2YXIgZT1nZTtnZT1udWxsLGUoKX19ZnVuY3Rpb24gdGUoZSl7dGhyb3cgZT0iQWJvcnRlZCgiK2UrIikiLG5lKGUpLG1lPSEwLEY9MSxlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoZSsiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiIpLHgoZSksZX12YXIgcmU9ZT0+ZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIiksdWU9ZT0+ZS5zdGFydHNXaXRoKCJmaWxlOi8vIiksRWU7RWU9Im9ydC13YXNtLXRocmVhZGVkLndhc20iLHJlKEVlKXx8KEVlPVcoRWUpKTtmdW5jdGlvbiBTZShlKXtpZihaKXJldHVybiBaKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBMZShlKXtpZihSfHxCKXtpZih0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJiF1ZShlKSlyZXR1cm4gZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgXCcke2V9XCdgO3JldHVybiByLmFycmF5QnVmZmVyKCl9KS5jYXRjaCgoKT0+U2UoZSkpO2lmKHBlKXJldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e3BlKGUsbD0+cihuZXcgVWludDhBcnJheShsKSksbil9KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+U2UoZSkpfWZ1bmN0aW9uIHplKGUscixuKXtyZXR1cm4gTGUoZSkudGhlbihsPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShsLHIpKS50aGVuKG4sbD0+e25lKGBmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAke2x9YCksdGUobCl9KX1mdW5jdGlvbiBydChlLHIpe3ZhciBuPUVlO3JldHVybiB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmchPSJmdW5jdGlvbiJ8fHJlKG4pfHx1ZShuKXx8RHx8dHlwZW9mIGZldGNoIT0iZnVuY3Rpb24iP3plKG4sZSxyKTpmZXRjaChuLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihsPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhsLGUpLnRoZW4ocixmdW5jdGlvbih5KXtyZXR1cm4gbmUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3l9YCksbmUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksemUobixlLHIpfSkpfXZhciBUZSxHZT17Nzk5NDQ0OihlLHIsbixsKT0+e2lmKHR5cGVvZiBzPiJ1Inx8IXMuYmIpcmV0dXJuIDE7aWYoZT1lZShlPj4+MCksZS5zdGFydHNXaXRoKCIuLyIpJiYoZT1lLnN1YnN0cmluZygyKSksZT1zLmJiLmdldChlKSwhZSlyZXR1cm4gMjtpZihyPj4+PTAsbj4+Pj0wLGw+Pj49MCxyK24+ZS5ieXRlTGVuZ3RoKXJldHVybiAzO3RyeXtyZXR1cm4gaCgpLnNldChlLnN1YmFycmF5KHIscituKSxsPj4+MCksMH1jYXRjaHtyZXR1cm4gNH19fTtmdW5jdGlvbiBrZShlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZX12YXIgV2U9ZT0+e2UudGVybWluYXRlKCksZS5vbm1lc3NhZ2U9KCk9Pnt9fSxudD1lPT57TS5PYS5sZW5ndGg9PTAmJihKZSgpLE0uWGEoTS5PYVswXSkpO3ZhciByPU0uT2EucG9wKCk7aWYoIXIpcmV0dXJuIDY7TS5QYS5wdXNoKHIpLE0uTGFbZS5OYV09cixyLk5hPWUuTmE7dmFyIG49e2NtZDoicnVuIixzdGFydF9yb3V0aW5lOmUuZ2IsYXJnOmUuY2IscHRocmVhZF9wdHI6ZS5OYX07cmV0dXJuIEQmJnIudW5yZWYoKSxyLnBvc3RNZXNzYWdlKG4sZS5tYiksMH0sRGU9MCxhdD1lPT57dmFyIHI9T3QoKTtyZXR1cm4gZT1lKCksZnQociksZX0sRz0oZSxyLC4uLm4pPT5hdCgoKT0+e2Zvcih2YXIgbD1uLmxlbmd0aCx5PXd0KDgqbCksYj15Pj4+Myx2PTA7djxuLmxlbmd0aDt2Kyspe3ZhciB6PW5bdl07ZygpW2Irdj4+PjBdPXp9cmV0dXJuIHJyKGUsMCxsLHkscil9KTtmdW5jdGlvbiBxZShlKXtpZihUKXJldHVybiBHKDAsMSxlKTtGPWUsMDxEZXx8KE0uaGIoKSxzLm9uRXhpdD8uKGUpLG1lPSEwKSxWKGUsbmV3IGtlKGUpKX12YXIgVmU9ZT0+e2lmKEY9ZSxUKXRocm93IHN0KGUpLCJ1bndpbmQiO3FlKGUpfTtmdW5jdGlvbiBQKCl7Zm9yKHZhciBlPXMubnVtVGhyZWFkcztlLS07KUplKCk7T2UudW5zaGlmdCgoKT0+e0FlKyssb3QoKCk9PkJlKCkpfSl9ZnVuY3Rpb24gSmUoKXt2YXIgZT1XKCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtlPW5ldyBXb3JrZXIoZSksTS5PYS5wdXNoKGUpfWZ1bmN0aW9uIG90KGUpe1Q/ZSgpOlByb21pc2UuYWxsKE0uT2EubWFwKE0uWGEpKS50aGVuKGUpfXZhciBNPXtPYTpbXSxQYTpbXSxhYjpbXSxMYTp7fSxWYSgpe1Q/KE0ucmVjZWl2ZU9iamVjdFRyYW5zZmVyPU0uZmIsTS50aHJlYWRJbml0VExTPU0uJGEsTS5zZXRFeGl0U3RhdHVzPU0uWmEpOlAoKX0sWmE6ZT0+Rj1lLHBiOlsiJHRlcm1pbmF0ZVdvcmtlciJdLGhiOigpPT57Zm9yKHZhciBlIG9mIE0uUGEpV2UoZSk7Zm9yKGUgb2YgTS5PYSlXZShlKTtNLk9hPVtdLE0uUGE9W10sTS5MYT1bXX0sWWE6ZT0+e3ZhciByPWUuTmE7ZGVsZXRlIE0uTGFbcl0sTS5PYS5wdXNoKGUpLE0uUGEuc3BsaWNlKE0uUGEuaW5kZXhPZihlKSwxKSxlLk5hPTAsYnQocil9LGZiKCl7fSwkYSgpe00uYWIuZm9yRWFjaChlPT5lKCkpfSxYYTplPT5uZXcgUHJvbWlzZShyPT57ZS5vbm1lc3NhZ2U9Yj0+e2I9Yi5kYXRhO3ZhciB2PWIuY21kO2lmKGIudGFyZ2V0VGhyZWFkJiZiLnRhcmdldFRocmVhZCE9dXQoKSl7dmFyIHo9TS5MYVtiLnRhcmdldFRocmVhZF07ej96LnBvc3RNZXNzYWdlKGIsYi50cmFuc2Zlckxpc3QpOm5lKGBJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlICIke3Z9IiB0byB0YXJnZXQgcHRocmVhZCAke2IudGFyZ2V0VGhyZWFkfSwgYnV0IHRoYXQgdGhyZWFkIG5vIGxvbmdlciBleGlzdHMhYCl9ZWxzZSB2PT09ImNoZWNrTWFpbGJveCI/aXQoKTp2PT09InNwYXduVGhyZWFkIj9udChiKTp2PT09ImNsZWFudXBUaHJlYWQiP00uWWEoTS5MYVtiLnRocmVhZF0pOnY9PT0ia2lsbFRocmVhZCI/KGI9Yi50aHJlYWQsdj1NLkxhW2JdLGRlbGV0ZSBNLkxhW2JdLFdlKHYpLGJ0KGIpLE0uUGEuc3BsaWNlKE0uUGEuaW5kZXhPZih2KSwxKSx2Lk5hPTApOnY9PT0iY2FuY2VsVGhyZWFkIj9NLkxhW2IudGhyZWFkXS5wb3N0TWVzc2FnZSh7Y21kOiJjYW5jZWwifSk6dj09PSJsb2FkZWQiPyhlLmxvYWRlZD0hMCxEJiYhZS5OYSYmZS51bnJlZigpLHIoZSkpOnY9PT0iYWxlcnQiP2FsZXJ0KGBUaHJlYWQgJHtiLnRocmVhZElkfTogJHtiLnRleHR9YCk6Yi50YXJnZXQ9PT0ic2V0aW1tZWRpYXRlIj9lLnBvc3RNZXNzYWdlKGIpOnY9PT0iY2FsbEhhbmRsZXIiP3NbYi5oYW5kbGVyXSguLi5iLmFyZ3MpOnYmJm5lKGB3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgJHt2fWApfSxlLm9uZXJyb3I9Yj0+e3Rocm93IG5lKGB3b3JrZXIgc2VudCBhbiBlcnJvciEgJHtiLmZpbGVuYW1lfToke2IubGluZW5vfTogJHtiLm1lc3NhZ2V9YCksYn0sRCYmKGUub24oIm1lc3NhZ2UiLGI9PmUub25tZXNzYWdlKHtkYXRhOmJ9KSksZS5vbigiZXJyb3IiLGI9PmUub25lcnJvcihiKSkpO3ZhciBuPVtdLGw9WyJvbkV4aXQiXSx5O2Zvcih5IG9mIGwpcy5oYXNPd25Qcm9wZXJ0eSh5KSYmbi5wdXNoKHkpO2UucG9zdE1lc3NhZ2Uoe2NtZDoibG9hZCIsaGFuZGxlcnM6bix1cmxPckJsb2I6cy5tYWluU2NyaXB0VXJsT3JCbG9ifHxpLHdhc21NZW1vcnk6WCx3YXNtTW9kdWxlOndlfSl9KX07cy5QVGhyZWFkPU07dmFyIE5lPWU9Pntmb3IoOzA8ZS5sZW5ndGg7KWUuc2hpZnQoKShzKX07cy5lc3RhYmxpc2hTdGFja1NwYWNlPSgpPT57dmFyIGU9dXQoKSxyPXcoKVtlKzUyPj4+Mj4+PjBdO2U9dygpW2UrNTY+Pj4yPj4+MF0sb3IocixyLWUpLGZ0KHIpfTtmdW5jdGlvbiBzdChlKXtpZihUKXJldHVybiBHKDEsMCxlKTtWZShlKX12YXIgRmU9W10sWGU7cy5pbnZva2VFbnRyeVBvaW50PShlLHIpPT57RGU9MDt2YXIgbj1GZVtlXTtufHwoZT49RmUubGVuZ3RoJiYoRmUubGVuZ3RoPWUrMSksRmVbZV09bj1YZS5nZXQoZSkpLGU9bihyKSwwPERlP00uWmEoZSk6eXQoZSl9O2NsYXNzIHR7Y29uc3RydWN0b3Iocil7dGhpcy5VYT1yLTI0fVZhKHIsbil7dygpW3RoaXMuVWErMTY+Pj4yPj4+MF09MCx3KClbdGhpcy5VYSs0Pj4+Mj4+PjBdPXIsdygpW3RoaXMuVWErOD4+PjI+Pj4wXT1ufX12YXIgbz0wLHU9MDtmdW5jdGlvbiBtKGUscixuLGwpe3JldHVybiBUP0coMiwxLGUscixuLGwpOk8oZSxyLG4sbCl9ZnVuY3Rpb24gTyhlLHIsbixsKXtpZihlPj4+PTAscj4+Pj0wLG4+Pj49MCxsPj4+PTAsdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPiJ1IilyZXR1cm4gbmUoIkN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTaGFyZWRBcnJheUJ1ZmZlciwgcHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhIiksNjt2YXIgeT1bXTtyZXR1cm4gVCYmeS5sZW5ndGg9PT0wP20oZSxyLG4sbCk6KGU9e2diOm4sTmE6ZSxjYjpsLG1iOnl9LFQ/KGUub2I9InNwYXduVGhyZWFkIixwb3N0TWVzc2FnZShlLHkpLDApOm50KGUpKX12YXIgRT10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxVPShlLHIsbik9PntyPj4+PTA7dmFyIGw9cituO2ZvcihuPXI7ZVtuXSYmIShuPj1sKTspKytuO2lmKDE2PG4tciYmZS5idWZmZXImJkUpcmV0dXJuIEUuZGVjb2RlKGUuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/ZS5zbGljZShyLG4pOmUuc3ViYXJyYXkocixuKSk7Zm9yKGw9IiI7cjxuOyl7dmFyIHk9ZVtyKytdO2lmKHkmMTI4KXt2YXIgYj1lW3IrK10mNjM7aWYoKHkmMjI0KT09MTkyKWwrPVN0cmluZy5mcm9tQ2hhckNvZGUoKHkmMzEpPDw2fGIpO2Vsc2V7dmFyIHY9ZVtyKytdJjYzO3k9KHkmMjQwKT09MjI0Pyh5JjE1KTw8MTJ8Yjw8Nnx2Oih5JjcpPDwxOHxiPDwxMnx2PDw2fGVbcisrXSY2Myw2NTUzNj55P2wrPVN0cmluZy5mcm9tQ2hhckNvZGUoeSk6KHktPTY1NTM2LGwrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8eT4+MTAsNTYzMjB8eSYxMDIzKSl9fWVsc2UgbCs9U3RyaW5nLmZyb21DaGFyQ29kZSh5KX1yZXR1cm4gbH0sZWU9KGUscik9PihlPj4+PTApP1UoaCgpLGUscik6IiI7ZnVuY3Rpb24geWUoZSxyLG4pe3JldHVybiBUP0coMywxLGUscixuKTowfWZ1bmN0aW9uIG9lKGUscil7aWYoVClyZXR1cm4gRyg0LDEsZSxyKX12YXIgc2U9ZT0+e2Zvcih2YXIgcj0wLG49MDtuPGUubGVuZ3RoOysrbil7dmFyIGw9ZS5jaGFyQ29kZUF0KG4pOzEyNz49bD9yKys6MjA0Nz49bD9yKz0yOjU1Mjk2PD1sJiY1NzM0Mz49bD8ocis9NCwrK24pOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsbixsKT0+e2lmKG4+Pj49MCwhKDA8bCkpcmV0dXJuIDA7dmFyIHk9bjtsPW4rbC0xO2Zvcih2YXIgYj0wO2I8ZS5sZW5ndGg7KytiKXt2YXIgdj1lLmNoYXJDb2RlQXQoYik7aWYoNTUyOTY8PXYmJjU3MzQzPj12KXt2YXIgej1lLmNoYXJDb2RlQXQoKytiKTt2PTY1NTM2KygodiYxMDIzKTw8MTApfHomMTAyM31pZigxMjc+PXYpe2lmKG4+PWwpYnJlYWs7cltuKys+Pj4wXT12fWVsc2V7aWYoMjA0Nz49dil7aWYobisxPj1sKWJyZWFrO3JbbisrPj4+MF09MTkyfHY+PjZ9ZWxzZXtpZig2NTUzNT49dil7aWYobisyPj1sKWJyZWFrO3JbbisrPj4+MF09MjI0fHY+PjEyfWVsc2V7aWYobiszPj1sKWJyZWFrO3JbbisrPj4+MF09MjQwfHY+PjE4LHJbbisrPj4+MF09MTI4fHY+PjEyJjYzfXJbbisrPj4+MF09MTI4fHY+PjYmNjN9cltuKys+Pj4wXT0xMjh8diY2M319cmV0dXJuIHJbbj4+PjBdPTAsbi15fSxSZT0oZSxyLG4pPT5RZShlLGgoKSxyLG4pO2Z1bmN0aW9uIGQoZSxyKXtpZihUKXJldHVybiBHKDUsMSxlLHIpfWZ1bmN0aW9uIGsoZSxyLG4pe2lmKFQpcmV0dXJuIEcoNiwxLGUscixuKX1mdW5jdGlvbiAkKGUscixuKXtyZXR1cm4gVD9HKDcsMSxlLHIsbik6MH1mdW5jdGlvbiBNZShlLHIpe2lmKFQpcmV0dXJuIEcoOCwxLGUscil9ZnVuY3Rpb24gWmUoZSxyLG4pe2lmKFQpcmV0dXJuIEcoOSwxLGUscixuKX1mdW5jdGlvbiBSdChlLHIsbixsKXtpZihUKXJldHVybiBHKDEwLDEsZSxyLG4sbCl9ZnVuY3Rpb24gSXQoZSxyLG4sbCl7aWYoVClyZXR1cm4gRygxMSwxLGUscixuLGwpfWZ1bmN0aW9uIEJ0KGUscixuLGwpe2lmKFQpcmV0dXJuIEcoMTIsMSxlLHIsbixsKX1mdW5jdGlvbiBrdChlKXtpZihUKXJldHVybiBHKDEzLDEsZSl9ZnVuY3Rpb24gV3QoZSxyKXtpZihUKXJldHVybiBHKDE0LDEsZSxyKX1mdW5jdGlvbiBOdChlLHIsbil7aWYoVClyZXR1cm4gRygxNSwxLGUscixuKX1mdW5jdGlvbiBkdChlKXtlPj4+PTAsdHlwZW9mIEF0b21pY3MubmI9PSJmdW5jdGlvbiImJihBdG9taWNzLm5iKGYoKSxlPj4+MixlKS52YWx1ZS50aGVuKGl0KSxlKz0xMjgsQXRvbWljcy5zdG9yZShmKCksZT4+PjIsMSkpfXMuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0PWR0O3ZhciBpdD0oKT0+e3ZhciBlPXV0KCk7aWYoZSYmKGR0KGUpLGU9bnIsIW1lKSl0cnl7aWYoZSgpLCEoMDxEZSkpdHJ5e1Q/eXQoRik6VmUoRil9Y2F0Y2gocil7ciBpbnN0YW5jZW9mIGtlfHxyPT0idW53aW5kInx8VigxLHIpfX1jYXRjaChyKXtyIGluc3RhbmNlb2Yga2V8fHI9PSJ1bndpbmQifHxWKDEscil9fTtzLmNoZWNrTWFpbGJveD1pdDt2YXIgcHQ9W10sJGU9ZT0+ZSU0PT09MCYmKGUlMTAwIT09MHx8ZSU0MDA9PT0wKSxIdD1bMCwzMSw2MCw5MSwxMjEsMTUyLDE4MiwyMTMsMjQ0LDI3NCwzMDUsMzM1XSxHdD1bMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0XTtmdW5jdGlvbiAkdChlLHIsbixsLHksYix2LHope3JldHVybiBUP0coMTYsMSxlLHIsbixsLHksYix2LHopOi01Mn1mdW5jdGlvbiBZdChlLHIsbixsLHksYix2KXtpZihUKXJldHVybiBHKDE3LDEsZSxyLG4sbCx5LGIsdil9dmFyIG10PVtdLGd0PXt9LGp0PSgpPT57aWYoIWh0KXt2YXIgZT17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOih0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmbmF2aWdhdG9yLmxhbmd1YWdlc1swXXx8IkMiKS5yZXBsYWNlKCItIiwiXyIpKyIuVVRGLTgiLF86SXx8Ii4vdGhpcy5wcm9ncmFtIn0scjtmb3IociBpbiBndClndFtyXT09PXZvaWQgMD9kZWxldGUgZVtyXTplW3JdPWd0W3JdO3ZhciBuPVtdO2ZvcihyIGluIGUpbi5wdXNoKGAke3J9PSR7ZVtyXX1gKTtodD1ufXJldHVybiBodH0saHQ7ZnVuY3Rpb24genQoZSxyKXtpZihUKXJldHVybiBHKDE4LDEsZSxyKTtlPj4+PTAscj4+Pj0wO3ZhciBuPTA7cmV0dXJuIGp0KCkuZm9yRWFjaCgobCx5KT0+e3ZhciBiPXIrbjtmb3IoeT13KClbZSs0Knk+Pj4yPj4+MF09YixiPTA7YjxsLmxlbmd0aDsrK2IpYSgpW3krKz4+PjBdPWwuY2hhckNvZGVBdChiKTthKClbeT4+PjBdPTAsbis9bC5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24gcXQoZSxyKXtpZihUKXJldHVybiBHKDE5LDEsZSxyKTtlPj4+PTAscj4+Pj0wO3ZhciBuPWp0KCk7dygpW2U+Pj4yPj4+MF09bi5sZW5ndGg7dmFyIGw9MDtyZXR1cm4gbi5mb3JFYWNoKHk9PmwrPXkubGVuZ3RoKzEpLHcoKVtyPj4+Mj4+PjBdPWwsMH1mdW5jdGlvbiBWdChlKXtyZXR1cm4gVD9HKDIwLDEsZSk6NTJ9ZnVuY3Rpb24gSnQoZSxyLG4sbCl7cmV0dXJuIFQ/RygyMSwxLGUscixuLGwpOjUyfWZ1bmN0aW9uIFh0KGUscixuLGwseSl7cmV0dXJuIFQ/RygyMiwxLGUscixuLGwseSk6NzB9dmFyIEhyPVtudWxsLFtdLFtdXTtmdW5jdGlvbiBRdChlLHIsbixsKXtpZihUKXJldHVybiBHKDIzLDEsZSxyLG4sbCk7cj4+Pj0wLG4+Pj49MCxsPj4+PTA7Zm9yKHZhciB5PTAsYj0wO2I8bjtiKyspe3ZhciB2PXcoKVtyPj4+Mj4+PjBdLHo9dygpW3IrND4+PjI+Pj4wXTtyKz04O2Zvcih2YXIgQ2U9MDtDZTx6O0NlKyspe3ZhciBmZT1oKClbditDZT4+PjBdLGhlPUhyW2VdO2ZlPT09MHx8ZmU9PT0xMD8oKGU9PT0xP0llOm5lKShVKGhlLDApKSxoZS5sZW5ndGg9MCk6aGUucHVzaChmZSl9eSs9en1yZXR1cm4gdygpW2w+Pj4yPj4+MF09eSwwfXZhciBadD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEt0PVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV07ZnVuY3Rpb24gR3IoZSl7dmFyIHI9QXJyYXkoc2UoZSkrMSk7cmV0dXJuIFFlKGUsciwwLHIubGVuZ3RoKSxyfXZhciAkcj0oZSxyKT0+e2EoKS5zZXQoZSxyPj4+MCl9O2Z1bmN0aW9uIGVyKGUscixuLGwpe2Z1bmN0aW9uIHkocCxOLHEpe2ZvcihwPXR5cGVvZiBwPT0ibnVtYmVyIj9wLnRvU3RyaW5nKCk6cHx8IiI7cC5sZW5ndGg8TjspcD1xWzBdK3A7cmV0dXJuIHB9ZnVuY3Rpb24gYihwLE4pe3JldHVybiB5KHAsTiwiMCIpfWZ1bmN0aW9uIHYocCxOKXtmdW5jdGlvbiBxKGZyKXtyZXR1cm4gMD5mcj8tMTowPGZyPzE6MH12YXIgSGU7cmV0dXJuKEhlPXEocC5nZXRGdWxsWWVhcigpLU4uZ2V0RnVsbFllYXIoKSkpPT09MCYmKEhlPXEocC5nZXRNb250aCgpLU4uZ2V0TW9udGgoKSkpPT09MCYmKEhlPXEocC5nZXREYXRlKCktTi5nZXREYXRlKCkpKSxIZX1mdW5jdGlvbiB6KHApe3N3aXRjaChwLmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHA7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUocC5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIENlKHApe3ZhciBOPXAuUWE7Zm9yKHA9bmV3IERhdGUobmV3IERhdGUocC5SYSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPE47KXt2YXIgcT1wLmdldE1vbnRoKCksSGU9KCRlKHAuZ2V0RnVsbFllYXIoKSk/WnQ6S3QpW3FdO2lmKE4+SGUtcC5nZXREYXRlKCkpTi09SGUtcC5nZXREYXRlKCkrMSxwLnNldERhdGUoMSksMTE+cT9wLnNldE1vbnRoKHErMSk6KHAuc2V0TW9udGgoMCkscC5zZXRGdWxsWWVhcihwLmdldEZ1bGxZZWFyKCkrMSkpO2Vsc2V7cC5zZXREYXRlKHAuZ2V0RGF0ZSgpK04pO2JyZWFrfX1yZXR1cm4gcT1uZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkrMSwwLDQpLE49eihuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCksMCw0KSkscT16KHEpLDA+PXYoTixwKT8wPj12KHEscCk/cC5nZXRGdWxsWWVhcigpKzE6cC5nZXRGdWxsWWVhcigpOnAuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCxyPj4+PTAsbj4+Pj0wLGw+Pj49MDt2YXIgZmU9dygpW2wrNDA+Pj4yPj4+MF07bD17a2I6ZigpW2w+Pj4yPj4+MF0samI6ZigpW2wrND4+PjI+Pj4wXSxTYTpmKClbbCs4Pj4+Mj4+PjBdLFdhOmYoKVtsKzEyPj4+Mj4+PjBdLFRhOmYoKVtsKzE2Pj4+Mj4+PjBdLFJhOmYoKVtsKzIwPj4+Mj4+PjBdLE1hOmYoKVtsKzI0Pj4+Mj4+PjBdLFFhOmYoKVtsKzI4Pj4+Mj4+PjBdLHFiOmYoKVtsKzMyPj4+Mj4+PjBdLGliOmYoKVtsKzM2Pj4+Mj4+PjBdLGxiOmZlP2VlKGZlKToiIn0sbj1lZShuKSxmZT17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In07Zm9yKHZhciBoZSBpbiBmZSluPW4ucmVwbGFjZShuZXcgUmVnRXhwKGhlLCJnIiksZmVbaGVdKTt2YXIgaXI9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLHVyPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZlPXsiJWEiOnA9PmlyW3AuTWFdLnN1YnN0cmluZygwLDMpLCIlQSI6cD0+aXJbcC5NYV0sIiViIjpwPT51cltwLlRhXS5zdWJzdHJpbmcoMCwzKSwiJUIiOnA9PnVyW3AuVGFdLCIlQyI6cD0+YigocC5SYSsxOTAwKS8xMDB8MCwyKSwiJWQiOnA9PmIocC5XYSwyKSwiJWUiOnA9PnkocC5XYSwyLCIgIiksIiVnIjpwPT5DZShwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOkNlLCIlSCI6cD0+YihwLlNhLDIpLCIlSSI6cD0+KHA9cC5TYSxwPT0wP3A9MTI6MTI8cCYmKHAtPTEyKSxiKHAsMikpLCIlaiI6cD0+e2Zvcih2YXIgTj0wLHE9MDtxPD1wLlRhLTE7Tis9KCRlKHAuUmErMTkwMCk/WnQ6S3QpW3ErK10pO3JldHVybiBiKHAuV2ErTiwzKX0sIiVtIjpwPT5iKHAuVGErMSwyKSwiJU0iOnA9PmIocC5qYiwyKSwiJW4iOigpPT5gXG5gLCIlcCI6cD0+MDw9cC5TYSYmMTI+cC5TYT8iQU0iOiJQTSIsIiVTIjpwPT5iKHAua2IsMiksIiV0IjooKT0+IgkiLCIldSI6cD0+cC5NYXx8NywiJVUiOnA9PmIoTWF0aC5mbG9vcigocC5RYSs3LXAuTWEpLzcpLDIpLCIlViI6cD0+e3ZhciBOPU1hdGguZmxvb3IoKHAuUWErNy0ocC5NYSs2KSU3KS83KTtpZigyPj0ocC5NYSszNzEtcC5RYS0yKSU3JiZOKyssTilOPT01MyYmKHE9KHAuTWErMzcxLXAuUWEpJTcscT09NHx8cT09MyYmJGUocC5SYSl8fChOPTEpKTtlbHNle049NTI7dmFyIHE9KHAuTWErNy1wLlFhLTEpJTc7KHE9PTR8fHE9PTUmJiRlKHAuUmElNDAwLTEpKSYmTisrfXJldHVybiBiKE4sMil9LCIldyI6cD0+cC5NYSwiJVciOnA9PmIoTWF0aC5mbG9vcigocC5RYSs3LShwLk1hKzYpJTcpLzcpLDIpLCIleSI6cD0+KHAuUmErMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjpwPT5wLlJhKzE5MDAsIiV6IjpwPT57cD1wLmliO3ZhciBOPTA8PXA7cmV0dXJuIHA9TWF0aC5hYnMocCkvNjAsKE4/IisiOiItIikrKCIwMDAwIisocC82MCoxMDArcCU2MCkpLnNsaWNlKC00KX0sIiVaIjpwPT5wLmxiLCIlJSI6KCk9PiIlIn0sbj1uLnJlcGxhY2UoLyUlL2csIlxcMFxcMCIpO2ZvcihoZSBpbiBmZSluLmluY2x1ZGVzKGhlKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAoaGUsImciKSxmZVtoZV0obCkpKTtyZXR1cm4gbj1uLnJlcGxhY2UoL1xcMFxcMC9nLCIlIiksaGU9R3IobiksaGUubGVuZ3RoPnI/MDooJHIoaGUsZSksaGUubGVuZ3RoLTEpfU0uVmEoKTt2YXIgWXI9W3FlLHN0LG0seWUsb2UsZCxrLCQsTWUsWmUsUnQsSXQsQnQsa3QsV3QsTnQsJHQsWXQsenQscXQsVnQsSnQsWHQsUXRdLGpyPXtiOmZ1bmN0aW9uKGUscixuKXt0aHJvdyBlPj4+PTAsbmV3IHQoZSkuVmEocj4+PjAsbj4+PjApLG89ZSx1Kyssb30sTDpmdW5jdGlvbihlKXt0cihlPj4+MCwhQiwxLCFSLDEzMTA3MiwhMSksTS4kYSgpfSxqOmZ1bmN0aW9uKGUpe2U+Pj49MCxUP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6TS5ZYShNLkxhW2VdKX0sSDpPLGg6eWUsUzpvZSxEOmQsRjprLFQ6JCxROk1lLEo6WmUsUDpSdCxuOkl0LEU6QnQsQjprdCxSOld0LEM6TnQscDooKT0+MSx6OmZ1bmN0aW9uKGUscil7ZT4+Pj0wLGU9PXI+Pj4wP3NldFRpbWVvdXQoaXQpOlQ/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPU0uTGFbZV0pJiZlLnBvc3RNZXNzYWdlKHtjbWQ6ImNoZWNrTWFpbGJveCJ9KX0sSTpmdW5jdGlvbihlLHIsbixsLHkpe3I+Pj49MCxuPj4+PTAscHQubGVuZ3RoPWwseT15Pj4+MD4+PjM7Zm9yKHZhciBiPTA7YjxsO2IrKylwdFtiXT1nKClbeStiPj4+MF07cmV0dXJuIGU9cj9HZVtyXTpZcltlXSxNLmViPW4sbj1lKC4uLnB0KSxNLmViPTAsbn0sSzpkdCxvOmZ1bmN0aW9uKGUpe0QmJk0uTGFbZT4+PjBdLnJlZigpfSxzOmZ1bmN0aW9uKGUscixuKXtlPXIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnI6TmFOLG4+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxmKClbbj4+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxmKClbbis0Pj4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLGYoKVtuKzg+Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLGYoKVtuKzEyPj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGYoKVtuKzE2Pj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxmKClbbisyMD4+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxmKClbbisyND4+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsZigpW24rMjg+Pj4yPj4+MF09ZX0sdDpmdW5jdGlvbihlLHIsbil7ZT1yKzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5NipyOk5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksZigpW24+Pj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksZigpW24rND4+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxmKClbbis4Pj4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxmKClbbisxMj4+PjI+Pj4wXT1lLmdldERhdGUoKSxmKClbbisxNj4+PjI+Pj4wXT1lLmdldE1vbnRoKCksZigpW24rMjA+Pj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsZigpW24rMjQ+Pj4yPj4+MF09ZS5nZXREYXkoKSxyPSgkZShlLmdldEZ1bGxZZWFyKCkpP0h0Okd0KVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxmKClbbisyOD4+PjI+Pj4wXT1yLGYoKVtuKzM2Pj4+Mj4+PjBdPS0oNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpKSxyPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIGw9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtlPShyIT1sJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKGwscikpfDAsZigpW24rMzI+Pj4yPj4+MF09ZX0sdTpmdW5jdGlvbihlKXtlPj4+PTA7dmFyIHI9bmV3IERhdGUoZigpW2UrMjA+Pj4yPj4+MF0rMTkwMCxmKClbZSsxNj4+PjI+Pj4wXSxmKClbZSsxMj4+PjI+Pj4wXSxmKClbZSs4Pj4+Mj4+PjBdLGYoKVtlKzQ+Pj4yPj4+MF0sZigpW2U+Pj4yPj4+MF0sMCksbj1mKClbZSszMj4+PjI+Pj4wXSxsPXIuZ2V0VGltZXpvbmVPZmZzZXQoKSx5PW5ldyBEYXRlKHIuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksYj1uZXcgRGF0ZShyLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLHY9TWF0aC5taW4oYix5KTtyZXR1cm4gMD5uP2YoKVtlKzMyPj4+Mj4+PjBdPSsoeSE9YiYmdj09bCk6MDxuIT0odj09bCkmJih5PU1hdGgubWF4KGIseSksci5zZXRUaW1lKHIuZ2V0VGltZSgpKzZlNCooKDA8bj92OnkpLWwpKSksZigpW2UrMjQ+Pj4yPj4+MF09ci5nZXREYXkoKSxuPSgkZShyLmdldEZ1bGxZZWFyKCkpP0h0Okd0KVtyLmdldE1vbnRoKCldK3IuZ2V0RGF0ZSgpLTF8MCxmKClbZSsyOD4+PjI+Pj4wXT1uLGYoKVtlPj4+Mj4+PjBdPXIuZ2V0U2Vjb25kcygpLGYoKVtlKzQ+Pj4yPj4+MF09ci5nZXRNaW51dGVzKCksZigpW2UrOD4+PjI+Pj4wXT1yLmdldEhvdXJzKCksZigpW2UrMTI+Pj4yPj4+MF09ci5nZXREYXRlKCksZigpW2UrMTY+Pj4yPj4+MF09ci5nZXRNb250aCgpLGYoKVtlKzIwPj4+Mj4+PjBdPXIuZ2V0WWVhcigpLGU9ci5nZXRUaW1lKCksZT1pc05hTihlKT8tMTplLzFlMyxhcigoVGU9ZSwxPD0rTWF0aC5hYnMoVGUpPzA8VGU/K01hdGguZmxvb3IoVGUvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoVGUtKyh+flRlPj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKSksZT4+PjB9LHE6JHQscjpZdCx5OmZ1bmN0aW9uKGUscixuLGwpe2U+Pj49MCxyPj4+PTAsbj4+Pj0wLGw+Pj49MDt2YXIgeT1uZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksYj1uZXcgRGF0ZSh5LDAsMSksdj1uZXcgRGF0ZSh5LDYsMSk7eT1iLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIHo9di5nZXRUaW1lem9uZU9mZnNldCgpLENlPU1hdGgubWF4KHkseik7dygpW2U+Pj4yPj4+MF09NjAqQ2UsZigpW3I+Pj4yPj4+MF09Kyh5IT16KSxlPWZlPT5mZS50b0xvY2FsZVRpbWVTdHJpbmcodm9pZCAwLHtob3VyMTI6ITEsdGltZVpvbmVOYW1lOiJzaG9ydCJ9KS5zcGxpdCgiICIpWzFdLGI9ZShiKSx2PWUodiksejx5PyhSZShiLG4sMTcpLFJlKHYsbCwxNykpOihSZShiLGwsMTcpLFJlKHYsbiwxNykpfSxjOigpPT57dGUoIiIpfSxPOmZ1bmN0aW9uKGUscixuKXtlPj4+PTAscj4+Pj0wLG4+Pj49MCxtdC5sZW5ndGg9MDtmb3IodmFyIGw7bD1oKClbcisrPj4+MF07KXt2YXIgeT1sIT0xMDU7eSY9bCE9MTEyLG4rPXkmJm4lOD80OjAsbXQucHVzaChsPT0xMTI/dygpW24+Pj4yPj4+MF06bD09MTA1P2YoKVtuPj4+Mj4+PjBdOmcoKVtuPj4+Mz4+PjBdKSxuKz15Pzg6NH1yZXR1cm4gR2VbZV0oLi4ubXQpfSxrOigpPT57fSxpOigpPT5EYXRlLm5vdygpLFU6KCk9Pnt0aHJvdyBEZSs9MSwidW53aW5kIn0sQTpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxlOigpPT5wZXJmb3JtYW5jZS50aW1lT3JpZ2luK3BlcmZvcm1hbmNlLm5vdygpLGY6KCk9PkQ/KGJyKCksZXQoaHIpKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LHg6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciByPWgoKS5sZW5ndGg7aWYoZTw9cnx8NDI5NDkwMTc2MDxlKXJldHVybiExO2Zvcih2YXIgbj0xOzQ+PW47bio9Mil7dmFyIGw9ciooMSsuMi9uKTtsPU1hdGgubWluKGwsZSsxMDA2NjMyOTYpO3ZhciB5PU1hdGg7bD1NYXRoLm1heChlLGwpO2U6e3k9KHkubWluLmNhbGwoeSw0Mjk0OTAxNzYwLGwrKDY1NTM2LWwlNjU1MzYpJTY1NTM2KS1YLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1KS82NTUzNjt0cnl7WC5ncm93KHkpLEsoKTt2YXIgYj0xO2JyZWFrIGV9Y2F0Y2h7fWI9dm9pZCAwfWlmKGIpcmV0dXJuITB9cmV0dXJuITF9LE06enQsTjpxdCxHOlZlLGc6VnQsbTpKdCx2Olh0LGw6UXQsYTpYfHxzLndhc21NZW1vcnksdzplcixkOmZ1bmN0aW9uKGUscixuLGwpe3JldHVybiBlcihlPj4+MCxyPj4+MCxuPj4+MCxsPj4+MCl9fSxDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShuLGwpe3JldHVybiBDPW4uZXhwb3J0cyxDPXpyKCksTS5hYi5wdXNoKEMueWEpLFhlPUMuemEsVWUudW5zaGlmdChDLlYpLHdlPWwsQmUoKSxDfXZhciByPXthOmpyfTtpZihBZSsrLHMuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gcy5pbnN0YW50aWF0ZVdhc20ocixlKX1jYXRjaChuKXtuZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLHgobil9cmV0dXJuIHJ0KHIsZnVuY3Rpb24obil7ZShuLmluc3RhbmNlLG4ubW9kdWxlKX0pLmNhdGNoKHgpLHt9fSgpO3MuX09ydEluaXQ9KGUscik9PihzLl9PcnRJbml0PUMuVykoZSxyKSxzLl9PcnRHZXRMYXN0RXJyb3I9KGUscik9PihzLl9PcnRHZXRMYXN0RXJyb3I9Qy5YKShlLHIpLHMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHIsbixsLHksYix2LHosQ2UsZmUpPT4ocy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9Qy5ZKShlLHIsbixsLHksYix2LHosQ2UsZmUpLHMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPShlLHIpPT4ocy5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9Qy5aKShlLHIpLHMuX09ydEFkZEZyZWVEaW1lbnNpb25PdmVycmlkZT0oZSxyLG4pPT4ocy5fT3J0QWRkRnJlZURpbWVuc2lvbk92ZXJyaWRlPUMuXykoZSxyLG4pLHMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT0oZSxyLG4pPT4ocy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PUMuJCkoZSxyLG4pLHMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1lPT4ocy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPUMuYWEpKGUpLHMuX09ydENyZWF0ZVNlc3Npb249KGUscixuKT0+KHMuX09ydENyZWF0ZVNlc3Npb249Qy5iYSkoZSxyLG4pLHMuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihzLl9PcnRSZWxlYXNlU2Vzc2lvbj1DLmNhKShlKSxzLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PShlLHIsbik9PihzLl9PcnRHZXRJbnB1dE91dHB1dENvdW50PUMuZGEpKGUscixuKSxzLl9PcnRHZXRJbnB1dE5hbWU9KGUscik9PihzLl9PcnRHZXRJbnB1dE5hbWU9Qy5lYSkoZSxyKSxzLl9PcnRHZXRPdXRwdXROYW1lPShlLHIpPT4ocy5fT3J0R2V0T3V0cHV0TmFtZT1DLmZhKShlLHIpLHMuX09ydEZyZWU9ZT0+KHMuX09ydEZyZWU9Qy5nYSkoZSkscy5fT3J0Q3JlYXRlVGVuc29yPShlLHIsbixsLHksYik9PihzLl9PcnRDcmVhdGVUZW5zb3I9Qy5oYSkoZSxyLG4sbCx5LGIpLHMuX09ydEdldFRlbnNvckRhdGE9KGUscixuLGwseSk9PihzLl9PcnRHZXRUZW5zb3JEYXRhPUMuaWEpKGUscixuLGwseSkscy5fT3J0UmVsZWFzZVRlbnNvcj1lPT4ocy5fT3J0UmVsZWFzZVRlbnNvcj1DLmphKShlKSxzLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHIsbixsKT0+KHMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9Qy5rYSkoZSxyLG4sbCkscy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUscixuKT0+KHMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PUMubGEpKGUscixuKSxzLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4ocy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9Qy5tYSkoZSkscy5fT3J0Q3JlYXRlQmluZGluZz1lPT4ocy5fT3J0Q3JlYXRlQmluZGluZz1DLm5hKShlKSxzLl9PcnRCaW5kSW5wdXQ9KGUscixuKT0+KHMuX09ydEJpbmRJbnB1dD1DLm9hKShlLHIsbikscy5fT3J0QmluZE91dHB1dD0oZSxyLG4sbCk9PihzLl9PcnRCaW5kT3V0cHV0PUMucGEpKGUscixuLGwpLHMuX09ydENsZWFyQm91bmRPdXRwdXRzPWU9PihzLl9PcnRDbGVhckJvdW5kT3V0cHV0cz1DLnFhKShlKSxzLl9PcnRSZWxlYXNlQmluZGluZz1lPT4ocy5fT3J0UmVsZWFzZUJpbmRpbmc9Qy5yYSkoZSkscy5fT3J0UnVuV2l0aEJpbmRpbmc9KGUscixuLGwseSk9PihzLl9PcnRSdW5XaXRoQmluZGluZz1DLnNhKShlLHIsbixsLHkpLHMuX09ydFJ1bj0oZSxyLG4sbCx5LGIsdix6KT0+KHMuX09ydFJ1bj1DLnRhKShlLHIsbixsLHksYix2LHopLHMuX09ydEVuZFByb2ZpbGluZz1lPT4ocy5fT3J0RW5kUHJvZmlsaW5nPUMudWEpKGUpO3ZhciB1dD1zLl9wdGhyZWFkX3NlbGY9KCk9Pih1dD1zLl9wdGhyZWFkX3NlbGY9Qy52YSkoKTtzLl9tYWxsb2M9ZT0+KHMuX21hbGxvYz1DLndhKShlKSxzLl9mcmVlPWU9PihzLl9mcmVlPUMueGEpKGUpLHMuX19lbXNjcmlwdGVuX3Rsc19pbml0PSgpPT4ocy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9Qy55YSkoKTt2YXIgdHI9cy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9KGUscixuLGwseSxiKT0+KHRyPXMuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PUMuQWEpKGUscixuLGwseSxiKTtzLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD0oKT0+KHMuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPUMuQmEpKCk7dmFyIHJyPShlLHIsbixsLHkpPT4ocnI9Qy5DYSkoZSxyLG4sbCx5KSxidD1lPT4oYnQ9Qy5EYSkoZSkseXQ9cy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9ZT0+KHl0PXMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PUMuRWEpKGUpLG5yPSgpPT4obnI9Qy5GYSkoKSxhcj1lPT4oYXI9Qy5HYSkoZSksb3I9KGUscik9Pihvcj1DLkhhKShlLHIpLGZ0PWU9PihmdD1DLklhKShlKSx3dD1lPT4od3Q9Qy5KYSkoZSksT3Q9KCk9PihPdD1DLkthKSgpO2Z1bmN0aW9uIHpyKCl7dmFyIGU9QztlPU9iamVjdC5hc3NpZ24oe30sZSk7dmFyIHI9bD0+KCk9PmwoKT4+PjAsbj1sPT55PT5sKHkpPj4+MDtyZXR1cm4gZS52YT1yKGUudmEpLGUud2E9bihlLndhKSxlLmVtc2NyaXB0ZW5fbWFpbl9ydW50aW1lX3RocmVhZF9pZD1yKGUuZW1zY3JpcHRlbl9tYWluX3J1bnRpbWVfdGhyZWFkX2lkKSxlLkphPW4oZS5KYSksZS5LYT1yKGUuS2EpLGV9cy53YXNtTWVtb3J5PVgscy5zdGFja1NhdmU9KCk9Pk90KCkscy5zdGFja1Jlc3RvcmU9ZT0+ZnQoZSkscy5zdGFja0FsbG9jPWU9Pnd0KGUpLHMua2VlcFJ1bnRpbWVBbGl2ZT0oKT0+MDxEZSxzLlVURjhUb1N0cmluZz1lZSxzLnN0cmluZ1RvVVRGOD1SZSxzLmxlbmd0aEJ5dGVzVVRGOD1zZSxzLkV4aXRTdGF0dXM9a2Uscy5QVGhyZWFkPU07dmFyIGx0O2dlPWZ1bmN0aW9uIGUoKXtsdHx8c3IoKSxsdHx8KGdlPWUpfTtmdW5jdGlvbiBzcigpe2lmKCEoMDxBZSkpaWYoVClTKHMpLFR8fE5lKFVlKSxzdGFydFdvcmtlcihzKTtlbHNle2lmKHMucHJlUnVuKWZvcih0eXBlb2Ygcy5wcmVSdW49PSJmdW5jdGlvbiImJihzLnByZVJ1bj1bcy5wcmVSdW5dKTtzLnByZVJ1bi5sZW5ndGg7KU9lLnVuc2hpZnQocy5wcmVSdW4uc2hpZnQoKSk7TmUoT2UpLDA8QWV8fGx0fHwobHQ9ITAscy5jYWxsZWRSdW49ITAsbWV8fChUfHxOZShVZSksUyhzKSxUfHxOZSh2ZSkpKX19cmV0dXJuIHNyKCksSH19KSgpO3R5cGVvZiB3cj09Im9iamVjdCImJnR5cGVvZiBEdD09Im9iamVjdCI/RHQuZXhwb3J0cz15cjp0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoW10sKCk9PnlyKX0pO3ZhciB2cj1LZSgoeW4sdG4pPT57dG4uZXhwb3J0cz1cJyJ1c2Ugc3RyaWN0Ijt2YXIgTW9kdWxlPXt9LEVOVklST05NRU5UX0lTX05PREU9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucz09Im9iamVjdCImJnR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU9PSJzdHJpbmciO2lmKEVOVklST05NRU5UX0lTX05PREUpe3ZhciBub2RlV29ya2VyVGhyZWFkcz1yZXF1aXJlKCJ3b3JrZXJfdGhyZWFkcyIpLHBhcmVudFBvcnQ9bm9kZVdvcmtlclRocmVhZHMucGFyZW50UG9ydDtwYXJlbnRQb3J0Lm9uKCJtZXNzYWdlIixlPT5vbm1lc3NhZ2Uoe2RhdGE6ZX0pKTt2YXIgZnM9cmVxdWlyZSgiZnMiKSx2bT1yZXF1aXJlKCJ2bSIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlLE1vZHVsZSxsb2NhdGlvbjp7aHJlZjpfX2ZpbGVuYW1lfSxXb3JrZXI6bm9kZVdvcmtlclRocmVhZHMuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+dm0ucnVuSW5UaGlzQ29udGV4dChmcy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpLHtmaWxlbmFtZTplfSkscG9zdE1lc3NhZ2U6ZT0+cGFyZW50UG9ydC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIGluaXRpYWxpemVkSlM9ITE7ZnVuY3Rpb24gdGhyZWFkUHJpbnRFcnIoLi4uZSl7dmFyIGE9ZS5qb2luKCIgIik7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7ZnMud3JpdGVTeW5jKDIsYStgXFxuYCk7cmV0dXJufWNvbnNvbGUuZXJyb3IoYSl9ZnVuY3Rpb24gdGhyZWFkQWxlcnQoLi4uZSl7dmFyIGE9ZS5qb2luKCIgIik7cG9zdE1lc3NhZ2Uoe2NtZDoiYWxlcnQiLHRleHQ6YSx0aHJlYWRJZDpNb2R1bGUuX3B0aHJlYWRfc2VsZigpfSl9dmFyIGVycj10aHJlYWRQcmludEVycjtzZWxmLmFsZXJ0PXRocmVhZEFsZXJ0LE1vZHVsZS5pbnN0YW50aWF0ZVdhc209KGUsYSk9Pnt2YXIgcj1Nb2R1bGUud2FzbU1vZHVsZTtNb2R1bGUud2FzbU1vZHVsZT1udWxsO3ZhciB0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShyLGUpO3JldHVybiBhKHQpfSxzZWxmLm9udW5oYW5kbGVkcmVqZWN0aW9uPWU9Pnt0aHJvdyBlLnJlYXNvbnx8ZX07ZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShlKXt0cnl7aWYoZS5kYXRhLmNtZD09PSJsb2FkIil7bGV0IHI9W107c2VsZi5vbm1lc3NhZ2U9dD0+ci5wdXNoKHQpLHNlbGYuc3RhcnRXb3JrZXI9dD0+e01vZHVsZT10LHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtmb3IobGV0IHMgb2YgciloYW5kbGVNZXNzYWdlKHMpO3NlbGYub25tZXNzYWdlPWhhbmRsZU1lc3NhZ2V9LE1vZHVsZS53YXNtTW9kdWxlPWUuZGF0YS53YXNtTW9kdWxlO2Zvcihjb25zdCB0IG9mIGUuZGF0YS5oYW5kbGVycylNb2R1bGVbdF09KC4uLnMpPT57cG9zdE1lc3NhZ2Uoe2NtZDoiY2FsbEhhbmRsZXIiLGhhbmRsZXI6dCxhcmdzOnN9KX07aWYoTW9kdWxlLndhc21NZW1vcnk9ZS5kYXRhLndhc21NZW1vcnksTW9kdWxlLmJ1ZmZlcj1Nb2R1bGUud2FzbU1lbW9yeS5idWZmZXIsTW9kdWxlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsdHlwZW9mIGUuZGF0YS51cmxPckJsb2I9PSJzdHJpbmciKWltcG9ydFNjcmlwdHMoZS5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgYT1VUkwuY3JlYXRlT2JqZWN0VVJMKGUuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHMoYSksVVJMLnJldm9rZU9iamVjdFVSTChhKX1vcnRXYXNtVGhyZWFkZWQoTW9kdWxlKX1lbHNlIGlmKGUuZGF0YS5jbWQ9PT0icnVuIil7TW9kdWxlLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdChlLmRhdGEucHRocmVhZF9wdHIsMCwwLDEpLE1vZHVsZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQoZS5kYXRhLnB0aHJlYWRfcHRyKSxNb2R1bGUuZXN0YWJsaXNoU3RhY2tTcGFjZSgpLE1vZHVsZS5QVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihlLmRhdGEpLE1vZHVsZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxpbml0aWFsaXplZEpTfHwoaW5pdGlhbGl6ZWRKUz0hMCk7dHJ5e01vZHVsZS5pbnZva2VFbnRyeVBvaW50KGUuZGF0YS5zdGFydF9yb3V0aW5lLGUuZGF0YS5hcmcpfWNhdGNoKHIpe2lmKHIhPSJ1bndpbmQiKXRocm93IHJ9fWVsc2UgZS5kYXRhLmNtZD09PSJjYW5jZWwiP01vZHVsZS5fcHRocmVhZF9zZWxmKCkmJk1vZHVsZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQoLTEpOmUuZGF0YS50YXJnZXQ9PT0ic2V0aW1tZWRpYXRlInx8KGUuZGF0YS5jbWQ9PT0iY2hlY2tNYWlsYm94Ij9pbml0aWFsaXplZEpTJiZNb2R1bGUuY2hlY2tNYWlsYm94KCk6ZS5kYXRhLmNtZCYmKGVycihgd29ya2VyLmpzIHJlY2VpdmVkIHVua25vd24gY29tbWFuZCAke2UuZGF0YS5jbWR9YCksZXJyKGUuZGF0YSkpKX1jYXRjaChyKXt0aHJvdyBNb2R1bGUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPy4oKSxyfX1zZWxmLm9ubWVzc2FnZT1oYW5kbGVNZXNzYWdlO1xcblwnfSk7dmFyIEVyO0VyPXByKCk7dmFyIHJuPU9yKCksRnQsUHQ9ITEsY3Q9ITEsX3I9ITEsbm49aT0+e2lmKGk9PT0xKXJldHVybiExO2lmKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj4idSIpcmV0dXJuIHR5cGVvZiBzZWxmPCJ1IiYmIXNlbGYuY3Jvc3NPcmlnaW5Jc29sYXRlZCYmY29uc29sZS53YXJuKCJlbnYud2FzbS5udW1UaHJlYWRzIGlzIHNldCB0byAiK2krIiwgYnV0IHRoaXMgd2lsbCBub3Qgd29yayB1bmxlc3MgeW91IGVuYWJsZSBjcm9zc09yaWdpbklzb2xhdGVkIG1vZGUuIFNlZSBodHRwczovL3dlYi5kZXYvY3Jvc3Mtb3JpZ2luLWlzb2xhdGlvbi1ndWlkZS8gZm9yIG1vcmUgaW5mby4iKSwhMTt0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSYmY29uc29sZS53YXJuKCJlbnYud2FzbS5udW1UaHJlYWRzIGlzIHNldCB0byAiK2krIiwgaG93ZXZlciwgY3VycmVudGx5IG9ubnhydW50aW1lLXdlYiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLXRocmVhZHMgaW4gTm9kZS5qcy4gUGxlYXNlIGNvbnNpZGVyIHVzaW5nIG9ubnhydW50aW1lLW5vZGUgZm9yIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNjZW5hcmlvcy4iKTt0cnl7cmV0dXJuIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSImJm5ldyBNZXNzYWdlQ2hhbm5lbCgpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKX1jYXRjaHtyZXR1cm4hMX19LGFuPSgpPT57dHJ5e3JldHVybiBXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsMTAsMzAsMSwyOCwwLDY1LDAsMjUzLDE1LDI1MywxMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDI1MywxODYsMSwyNiwxMV0pKX1jYXRjaHtyZXR1cm4hMX19LG9uPShpLGMpPT5pP2M/Im9ydC13YXNtLXNpbWQtdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLXNpbWQud2FzbSI6Yz8ib3J0LXdhc20tdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLndhc20iLFNyPWFzeW5jIGk9PntpZihQdClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYoY3QpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZGV0ZWN0ZWQuIik7aWYoX3IpdGhyb3cgbmV3IEVycm9yKCJwcmV2aW91cyBjYWxsIHRvIFwnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KClcJyBmYWlsZWQuIik7Y3Q9ITA7bGV0IGM9aS5pbml0VGltZW91dCxhPWkubnVtVGhyZWFkcyxoPWkuc2ltZCxmPW5uKGEpLHc9aCYmYW4oKSxnPWkud2FzbVBhdGhzLHM9dHlwZW9mIGc9PSJzdHJpbmciP2c6dm9pZCAwLFM9b24odyxmKSx4PXR5cGVvZiBnPT0ib2JqZWN0Ij9nW1NdOnZvaWQgMCxIPSExLEE9W107aWYoYz4wJiZBLnB1c2gobmV3IFByb21pc2UoST0+e3NldFRpbWVvdXQoKCk9PntIPSEwLEkoKX0sYyl9KSksQS5wdXNoKG5ldyBQcm9taXNlKChJLFYpPT57bGV0IFI9Zj9ybjpFcixCPXtsb2NhdGVGaWxlOihELFQpPT5mJiZELmVuZHNXaXRoKCIud29ya2VyLmpzIikmJnR5cGVvZiBCbG9iPCJ1Ij9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt2cigpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTpELmVuZHNXaXRoKCIud2FzbSIpP3h8fChzPz9UKStTOlQrRH07aWYoZilpZihCLm51bVRocmVhZHM9YSx0eXBlb2YgQmxvYj4idSIpQi5tYWluU2NyaXB0VXJsT3JCbG9iPSh2b2lkIDApKF9fZGlybmFtZSwib3J0LXdhc20tdGhyZWFkZWQuanMiKTtlbHNle2xldCBEPWB2YXIgb3J0V2FzbVRocmVhZGVkPSR7Ui50b1N0cmluZygpfTtgO0IubWFpblNjcmlwdFVybE9yQmxvYj1uZXcgQmxvYihbRF0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KX1SKEIpLnRoZW4oRD0+e2N0PSExLFB0PSEwLEZ0PUQsSSgpfSxEPT57Y3Q9ITEsX3I9ITAsVihEKX0pfSkpLGF3YWl0IFByb21pc2UucmFjZShBKSxIKXRocm93IG5ldyBFcnJvcihgV2ViQXNzZW1ibHkgYmFja2VuZCBpbml0aWFsaXppbmcgZmFpbGVkIGR1ZSB0byB0aW1lb3V0OiAke2N9bXNgKX0sUT0oKT0+e2lmKFB0JiZGdClyZXR1cm4gRnQ7dGhyb3cgbmV3IEVycm9yKCJXZWJBc3NlbWJseSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiIpfTt2YXIgWT0oaSxjKT0+e2xldCBhPVEoKSxoPWEubGVuZ3RoQnl0ZXNVVEY4KGkpKzEsZj1hLl9tYWxsb2MoaCk7cmV0dXJuIGEuc3RyaW5nVG9VVEY4KGksZixoKSxjLnB1c2goZiksZn0sdHQ9KGksYyxhLGgpPT57aWYodHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbCl7aWYoYS5oYXMoaSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO2EuYWRkKGkpfU9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFtmLHddKT0+e2xldCBnPWM/YytmOmY7aWYodHlwZW9mIHc9PSJvYmplY3QiKXR0KHcsZysiLiIsYSxoKTtlbHNlIGlmKHR5cGVvZiB3PT0ic3RyaW5nInx8dHlwZW9mIHc9PSJudW1iZXIiKWgoZyx3LnRvU3RyaW5nKCkpO2Vsc2UgaWYodHlwZW9mIHc9PSJib29sZWFuIiloKGcsdz8iMSI6IjAiKTtlbHNlIHRocm93IG5ldyBFcnJvcihgQ2FuXCd0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogJHt0eXBlb2Ygd31gKX0pfSxqPWk9PntsZXQgYz1RKCksYT1jLnN0YWNrU2F2ZSgpO3RyeXtsZXQgaD1jLnN0YWNrQWxsb2MoOCk7Yy5fT3J0R2V0TGFzdEVycm9yKGgsaCs0KTtsZXQgZj1jLkhFQVAzMltoLzRdLHc9Yy5IRUFQVTMyW2gvNCsxXSxnPXc/Yy5VVEY4VG9TdHJpbmcodyk6IiI7dGhyb3cgbmV3IEVycm9yKGAke2l9IEVSUk9SX0NPREU6ICR7Zn0sIEVSUk9SX01FU1NBR0U6ICR7Z31gKX1maW5hbGx5e2Muc3RhY2tSZXN0b3JlKGEpfX07dmFyIEFyPWk9PntsZXQgYz1RKCksYT0wLGg9W10sZj1pfHx7fTt0cnl7aWYoaT8ubG9nU2V2ZXJpdHlMZXZlbD09PXZvaWQgMClmLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKHR5cGVvZiBpLmxvZ1NldmVyaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihpLmxvZ1NldmVyaXR5TGV2ZWwpfHxpLmxvZ1NldmVyaXR5TGV2ZWw8MHx8aS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtpLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYoaT8ubG9nVmVyYm9zaXR5TGV2ZWw9PT12b2lkIDApZi5sb2dWZXJib3NpdHlMZXZlbD0wO2Vsc2UgaWYodHlwZW9mIGkubG9nVmVyYm9zaXR5TGV2ZWwhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihpLmxvZ1ZlcmJvc2l0eUxldmVsKSl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2kubG9nVmVyYm9zaXR5TGV2ZWx9YCk7aT8udGVybWluYXRlPT09dm9pZCAwJiYoZi50ZXJtaW5hdGU9ITEpO2xldCB3PTA7cmV0dXJuIGk/LnRhZyE9PXZvaWQgMCYmKHc9WShpLnRhZyxoKSksYT1jLl9PcnRDcmVhdGVSdW5PcHRpb25zKGYubG9nU2V2ZXJpdHlMZXZlbCxmLmxvZ1ZlcmJvc2l0eUxldmVsLCEhZi50ZXJtaW5hdGUsdyksYT09PTAmJmooIkNhblwndCBjcmVhdGUgcnVuIG9wdGlvbnMuIiksaT8uZXh0cmEhPT12b2lkIDAmJnR0KGkuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKGcscyk9PntsZXQgUz1ZKGcsaCkseD1ZKHMsaCk7Yy5fT3J0QWRkUnVuQ29uZmlnRW50cnkoYSxTLHgpIT09MCYmaihgQ2FuXCd0IHNldCBhIHJ1biBjb25maWcgZW50cnk6ICR7Z30gLSAke3N9LmApfSksW2EsaF19Y2F0Y2godyl7dGhyb3cgYSE9PTAmJmMuX09ydFJlbGVhc2VSdW5PcHRpb25zKGEpLGguZm9yRWFjaChnPT5jLl9mcmVlKGcpKSx3fX07dmFyIHNuPWk9Pntzd2l0Y2goaSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2l9YCl9fSx1bj1pPT57c3dpdGNoKGkpe2Nhc2Uic2VxdWVudGlhbCI6cmV0dXJuIDA7Y2FzZSJwYXJhbGxlbCI6cmV0dXJuIDE7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGV4ZWN1dGlvbiBtb2RlOiAke2l9YCl9fSxmbj1pPT57aS5leHRyYXx8KGkuZXh0cmE9e30pLGkuZXh0cmEuc2Vzc2lvbnx8KGkuZXh0cmEuc2Vzc2lvbj17fSk7bGV0IGM9aS5leHRyYS5zZXNzaW9uO2MudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KGMudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGkuZXhlY3V0aW9uUHJvdmlkZXJzJiZpLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKGE9Pih0eXBlb2YgYT09InN0cmluZyI/YTphLm5hbWUpPT09IndlYmdwdSIpJiYoaS5lbmFibGVNZW1QYXR0ZXJuPSExKX0sbG49KGksYyxhKT0+e2ZvcihsZXQgaCBvZiBjKXtsZXQgZj10eXBlb2YgaD09InN0cmluZyI/aDpoLm5hbWU7c3dpdGNoKGYpe2Nhc2Uid2Vibm4iOmlmKGY9IldFQk5OIix0eXBlb2YgaCE9InN0cmluZyIpe2xldCBnPWg7aWYoZz8uZGV2aWNlVHlwZSl7bGV0IHM9WSgiZGV2aWNlVHlwZSIsYSksUz1ZKGcuZGV2aWNlVHlwZSxhKTtRKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShpLHMsUykhPT0wJiZqKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6IFwnZGV2aWNlVHlwZVwnIC0gJHtnLmRldmljZVR5cGV9LmApfWlmKGc/Lm51bVRocmVhZHMpe2xldCBzPWcubnVtVGhyZWFkczsodHlwZW9mIHMhPSJudW1iZXIifHwhTnVtYmVyLmlzSW50ZWdlcihzKXx8czwwKSYmKHM9MCk7bGV0IFM9WSgibnVtVGhyZWFkcyIsYSkseD1ZKHMudG9TdHJpbmcoKSxhKTtRKCkuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeShpLFMseCkhPT0wJiZqKGBDYW5cJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6IFwnbnVtVGhyZWFkc1wnIC0gJHtnLm51bVRocmVhZHN9LmApfWlmKGc/LnBvd2VyUHJlZmVyZW5jZSl7bGV0IHM9WSgicG93ZXJQcmVmZXJlbmNlIixhKSxTPVkoZy5wb3dlclByZWZlcmVuY2UsYSk7USgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoaSxzLFMpIT09MCYmaihgQ2FuXCd0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiBcJ3Bvd2VyUHJlZmVyZW5jZVwnIC0gJHtnLnBvd2VyUHJlZmVyZW5jZX0uYCl9fWJyZWFrO2Nhc2Uid2ViZ3B1IjppZihmPSJKUyIsdHlwZW9mIGghPSJzdHJpbmciKXtsZXQgZz1oO2lmKGc/LnByZWZlcnJlZExheW91dCl7aWYoZy5wcmVmZXJyZWRMYXlvdXQhPT0iTkNIVyImJmcucHJlZmVycmVkTGF5b3V0IT09Ik5IV0MiKXRocm93IG5ldyBFcnJvcihgcHJlZmVycmVkTGF5b3V0IG11c3QgYmUgZWl0aGVyIFwnTkNIV1wnIG9yIFwnTkhXQ1wnOiAke2cucHJlZmVycmVkTGF5b3V0fWApO2xldCBzPVkoInByZWZlcnJlZExheW91dCIsYSksUz1ZKGcucHJlZmVycmVkTGF5b3V0LGEpO1EoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGkscyxTKSE9PTAmJmooYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdwcmVmZXJyZWRMYXlvdXRcJyAtICR7Zy5wcmVmZXJyZWRMYXlvdXR9LmApfX1icmVhaztjYXNlIndhc20iOmNhc2UiY3B1Ijpjb250aW51ZTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7Zn1gKX1sZXQgdz1ZKGYsYSk7USgpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcihpLHcpIT09MCYmaihgQ2FuXCd0IGFwcGVuZCBleGVjdXRpb24gcHJvdmlkZXI6ICR7Zn0uYCl9fSxUcj1pPT57bGV0IGM9USgpLGE9MCxoPVtdLGY9aXx8e307Zm4oZik7dHJ5e2xldCB3PXNuKGYuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbD8/ImFsbCIpLGc9dW4oZi5leGVjdXRpb25Nb2RlPz8ic2VxdWVudGlhbCIpLHM9dHlwZW9mIGYubG9nSWQ9PSJzdHJpbmciP1koZi5sb2dJZCxoKTowLFM9Zi5sb2dTZXZlcml0eUxldmVsPz8yO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKFMpfHxTPDB8fFM+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke1N9YCk7bGV0IHg9Zi5sb2dWZXJib3NpdHlMZXZlbD8/MDtpZighTnVtYmVyLmlzSW50ZWdlcih4KXx8eDwwfHx4PjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHt4fWApO2xldCBIPXR5cGVvZiBmLm9wdGltaXplZE1vZGVsRmlsZVBhdGg9PSJzdHJpbmciP1koZi5vcHRpbWl6ZWRNb2RlbEZpbGVQYXRoLGgpOjA7aWYoYT1jLl9PcnRDcmVhdGVTZXNzaW9uT3B0aW9ucyh3LCEhZi5lbmFibGVDcHVNZW1BcmVuYSwhIWYuZW5hYmxlTWVtUGF0dGVybixnLCEhZi5lbmFibGVQcm9maWxpbmcsMCxzLFMseCxIKSxhPT09MCYmaigiQ2FuXCd0IGNyZWF0ZSBzZXNzaW9uIG9wdGlvbnMuIiksZi5leGVjdXRpb25Qcm92aWRlcnMmJmxuKGEsZi5leGVjdXRpb25Qcm92aWRlcnMsaCksZi5lbmFibGVHcmFwaENhcHR1cmUhPT12b2lkIDApe2lmKHR5cGVvZiBmLmVuYWJsZUdyYXBoQ2FwdHVyZSE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgZW5hYmxlR3JhcGhDYXB0dXJlIG11c3QgYmUgYSBib29sZWFuIHZhbHVlOiAke2YuZW5hYmxlR3JhcGhDYXB0dXJlfWApO2xldCBBPVkoImVuYWJsZUdyYXBoQ2FwdHVyZSIsaCksST1ZKGYuZW5hYmxlR3JhcGhDYXB0dXJlLnRvU3RyaW5nKCksaCk7Yy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGEsQSxJKSE9PTAmJmooYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdlbmFibGVHcmFwaENhcHR1cmVcJyAtICR7Zi5lbmFibGVHcmFwaENhcHR1cmV9LmApfWlmKGYuZnJlZURpbWVuc2lvbk92ZXJyaWRlcylmb3IobGV0W0EsSV1vZiBPYmplY3QuZW50cmllcyhmLmZyZWVEaW1lbnNpb25PdmVycmlkZXMpKXtpZih0eXBlb2YgQSE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKGBmcmVlIGRpbWVuc2lvbiBvdmVycmlkZSBuYW1lIG11c3QgYmUgYSBzdHJpbmc6ICR7QX1gKTtpZih0eXBlb2YgSSE9Im51bWJlciJ8fCFOdW1iZXIuaXNJbnRlZ2VyKEkpfHxJPDApdGhyb3cgbmV3IEVycm9yKGBmcmVlIGRpbWVuc2lvbiBvdmVycmlkZSB2YWx1ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXI6ICR7SX1gKTtsZXQgVj1ZKEEsaCk7Yy5fT3J0QWRkRnJlZURpbWVuc2lvbk92ZXJyaWRlKGEsVixJKSE9PTAmJmooYENhblwndCBzZXQgYSBmcmVlIGRpbWVuc2lvbiBvdmVycmlkZTogJHtBfSAtICR7SX0uYCl9cmV0dXJuIGYuZXh0cmEhPT12b2lkIDAmJnR0KGYuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKEEsSSk9PntsZXQgVj1ZKEEsaCksUj1ZKEksaCk7Yy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGEsVixSKSE9PTAmJmooYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJHtBfSAtICR7SX0uYCl9KSxbYSxoXX1jYXRjaCh3KXt0aHJvdyBhIT09MCYmYy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zKGEpLGguZm9yRWFjaChnPT5jLl9mcmVlKGcpKSx3fX07dmFyIHh0PWk9Pntzd2l0Y2goaSl7Y2FzZSJpbnQ4IjpyZXR1cm4gMztjYXNlInVpbnQ4IjpyZXR1cm4gMjtjYXNlImJvb2wiOnJldHVybiA5O2Nhc2UiaW50MTYiOnJldHVybiA1O2Nhc2UidWludDE2IjpyZXR1cm4gNDtjYXNlImludDMyIjpyZXR1cm4gNjtjYXNlInVpbnQzMiI6cmV0dXJuIDEyO2Nhc2UiZmxvYXQxNiI6cmV0dXJuIDEwO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIDE7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gMTE7Y2FzZSJzdHJpbmciOnJldHVybiA4O2Nhc2UiaW50NjQiOnJldHVybiA3O2Nhc2UidWludDY0IjpyZXR1cm4gMTM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtpfWApfX0sTXI9aT0+e3N3aXRjaChpKXtjYXNlIDM6cmV0dXJuImludDgiO2Nhc2UgMjpyZXR1cm4idWludDgiO2Nhc2UgOTpyZXR1cm4iYm9vbCI7Y2FzZSA1OnJldHVybiJpbnQxNiI7Y2FzZSA0OnJldHVybiJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4iaW50MzIiO2Nhc2UgMTI6cmV0dXJuInVpbnQzMiI7Y2FzZSAxMDpyZXR1cm4iZmxvYXQxNiI7Y2FzZSAxOnJldHVybiJmbG9hdDMyIjtjYXNlIDExOnJldHVybiJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuInN0cmluZyI7Y2FzZSA3OnJldHVybiJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4idWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2l9YCl9fSxVdD1pPT5bdm9pZCAwLDQsMSwxLDIsMiw0LDgsdm9pZCAwLDEsMiw4LDQsOCx2b2lkIDAsdm9pZCAwLHZvaWQgMF1baV0sQ3I9aT0+e3N3aXRjaChpKXtjYXNlImZsb2F0MTYiOnJldHVybiB0eXBlb2YgRmxvYXQxNkFycmF5PCJ1IiYmRmxvYXQxNkFycmF5LmZyb20/RmxvYXQxNkFycmF5OlVpbnQxNkFycmF5O2Nhc2UiZmxvYXQzMiI6cmV0dXJuIEZsb2F0MzJBcnJheTtjYXNlInVpbnQ4IjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImludDE2IjpyZXR1cm4gSW50MTZBcnJheTtjYXNlImludDMyIjpyZXR1cm4gSW50MzJBcnJheTtjYXNlImJvb2wiOnJldHVybiBVaW50OEFycmF5O2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIEZsb2F0NjRBcnJheTtjYXNlInVpbnQzMiI6cmV0dXJuIFVpbnQzMkFycmF5O2Nhc2UiaW50NjQiOnJldHVybiBCaWdJbnQ2NEFycmF5O2Nhc2UidWludDY0IjpyZXR1cm4gQmlnVWludDY0QXJyYXk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHR5cGU6ICR7aX1gKX19LERyPWk9Pntzd2l0Y2goaSl7Y2FzZSJ2ZXJib3NlIjpyZXR1cm4gMDtjYXNlImluZm8iOnJldHVybiAxO2Nhc2Uid2FybmluZyI6cmV0dXJuIDI7Y2FzZSJlcnJvciI6cmV0dXJuIDM7Y2FzZSJmYXRhbCI6cmV0dXJuIDQ7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGxvZ2dpbmcgbGV2ZWw6ICR7aX1gKX19LEZyPWk9Pmk9PT0iZmxvYXQzMiJ8fGk9PT0iZmxvYXQxNiJ8fGk9PT0iaW50MzIifHxpPT09ImludDY0Inx8aT09PSJ1aW50MzIifHxpPT09InVpbnQ4Inx8aT09PSJib29sIixQcj1pPT57c3dpdGNoKGkpe2Nhc2Uibm9uZSI6cmV0dXJuIDA7Y2FzZSJjcHUiOnJldHVybiAxO2Nhc2UiY3B1LXBpbm5lZCI6cmV0dXJuIDI7Y2FzZSJ0ZXh0dXJlIjpyZXR1cm4gMztjYXNlImdwdS1idWZmZXIiOnJldHVybiA0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIGxvY2F0aW9uOiAke2l9YCl9fTt2YXIgeHI9YXN5bmMgaT0+e2lmKHR5cGVvZiBpPT0ic3RyaW5nIilpZih0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl0cnl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0KHZvaWQgMCkoaSkpfWNhdGNoKGMpe2lmKGMuY29kZT09PSJFUlJfRlNfRklMRV9UT09fTEFSR0UiKXtsZXQgYT0odm9pZCAwKShpKSxoPVtdO2ZvciBhd2FpdChsZXQgZiBvZiBhKWgucHVzaChmKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChoKSl9dGhyb3cgY31lbHNle2xldCBjPWF3YWl0IGZldGNoKGkpO2lmKCFjLm9rKXRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGxvYWQgZXh0ZXJuYWwgZGF0YSBmaWxlOiAke2l9YCk7bGV0IGE9Yy5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKSxoPWE/cGFyc2VJbnQoYSwxMCk6MDtpZihoPDEwNzM3NDE4MjQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IGMuYXJyYXlCdWZmZXIoKSk7e2lmKCFjLmJvZHkpdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCBleHRlcm5hbCBkYXRhIGZpbGU6ICR7aX0sIG5vIHJlc3BvbnNlIGJvZHkuYCk7bGV0IGY9Yy5ib2R5LmdldFJlYWRlcigpLHc7dHJ5e3c9bmV3IEFycmF5QnVmZmVyKGgpfWNhdGNoKHMpe2lmKHMgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtsZXQgUz1NYXRoLmNlaWwoaC82NTUzNik7dz1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOlMsbWF4aW11bTpTfSkuYnVmZmVyfWVsc2UgdGhyb3cgc31sZXQgZz0wO2Zvcig7Oyl7bGV0e2RvbmU6cyx2YWx1ZTpTfT1hd2FpdCBmLnJlYWQoKTtpZihzKWJyZWFrO2xldCB4PVMuYnl0ZUxlbmd0aDtuZXcgVWludDhBcnJheSh3LGcseCkuc2V0KFMpLGcrPXh9cmV0dXJuIG5ldyBVaW50OEFycmF5KHcsMCxoKX19ZWxzZSByZXR1cm4gaSBpbnN0YW5jZW9mIEJsb2I/bmV3IFVpbnQ4QXJyYXkoYXdhaXQgaS5hcnJheUJ1ZmZlcigpKTppIGluc3RhbmNlb2YgVWludDhBcnJheT9pOm5ldyBVaW50OEFycmF5KGkpfTt2YXIgY249KGksYyk9PntRKCkuX09ydEluaXQoaSxjKSE9PTAmJmooIkNhblwndCBpbml0aWFsaXplIG9ubnhydW50aW1lLiIpfSxMcj1hc3luYyBpPT57Y24oaS53YXNtLm51bVRocmVhZHMsRHIoaS5sb2dMZXZlbCkpfSxScj1hc3luYyhpLGMpPT57fSxZZT1uZXcgTWFwLGRuPWk9PntsZXQgYz1RKCksYT1jLnN0YWNrU2F2ZSgpO3RyeXtsZXQgaD1jLnN0YWNrQWxsb2MoOCk7cmV0dXJuIGMuX09ydEdldElucHV0T3V0cHV0Q291bnQoaSxoLGgrNCkhPT0wJiZqKCJDYW5cJ3QgZ2V0IHNlc3Npb24gaW5wdXQvb3V0cHV0IGNvdW50LiIpLFtjLkhFQVAzMltoLzRdLGMuSEVBUDMyW2gvNCsxXV19ZmluYWxseXtjLnN0YWNrUmVzdG9yZShhKX19LEx0PWk9PntsZXQgYz1RKCksYT1jLl9tYWxsb2MoaS5ieXRlTGVuZ3RoKTtpZihhPT09MCl0aHJvdyBuZXcgRXJyb3IoYENhblwndCBjcmVhdGUgYSBzZXNzaW9uLiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSAke2kuYnl0ZUxlbmd0aH0uYCk7cmV0dXJuIGMuSEVBUFU4LnNldChpLGEpLFthLGkuYnl0ZUxlbmd0aF19LElyPWFzeW5jKGksYyk9PntsZXQgYSxoLGY9USgpO0FycmF5LmlzQXJyYXkoaSk/W2EsaF09aTppLmJ1ZmZlcj09PWYuSEVBUFU4LmJ1ZmZlcj9bYSxoXT1baS5ieXRlT2Zmc2V0LGkuYnl0ZUxlbmd0aF06W2EsaF09THQoaSk7bGV0IHc9MCxnPTAscz0wLFM9W10seD1bXSxIPVtdO3RyeXtpZihbZyxTXT1UcihjKSxjPy5leHRlcm5hbERhdGEmJmYubW91bnRFeHRlcm5hbERhdGEpe2xldCBMPVtdO2ZvcihsZXQgVyBvZiBjLmV4dGVybmFsRGF0YSl7bGV0IGRlPXR5cGVvZiBXPT0ic3RyaW5nIj9XOlcucGF0aDtMLnB1c2goeHIodHlwZW9mIFc9PSJzdHJpbmciP1c6Vy5kYXRhKS50aGVuKHBlPT57Zi5tb3VudEV4dGVybmFsRGF0YShkZSxwZSl9KSl9YXdhaXQgUHJvbWlzZS5hbGwoTCl9dz1hd2FpdCBmLl9PcnRDcmVhdGVTZXNzaW9uKGEsaCxnKSx3PT09MCYmaigiQ2FuXCd0IGNyZWF0ZSBhIHNlc3Npb24uIik7bGV0W0EsSV09ZG4odyksVj0hIWM/LmVuYWJsZUdyYXBoQ2FwdHVyZSxSPVtdLEI9W10sRD1bXTtmb3IobGV0IEw9MDtMPEE7TCsrKXtsZXQgVz1mLl9PcnRHZXRJbnB1dE5hbWUodyxMKTtXPT09MCYmaigiQ2FuXCd0IGdldCBhbiBpbnB1dCBuYW1lLiIpLHgucHVzaChXKSxSLnB1c2goZi5VVEY4VG9TdHJpbmcoVykpfWZvcihsZXQgTD0wO0w8STtMKyspe2xldCBXPWYuX09ydEdldE91dHB1dE5hbWUodyxMKTtXPT09MCYmaigiQ2FuXCd0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxILnB1c2goVyk7bGV0IGRlPWYuVVRGOFRvU3RyaW5nKFcpO0IucHVzaChkZSl9bGV0IFQ9bnVsbDtyZXR1cm4gWWUuc2V0KHcsW3cseCxILFQsViwhMV0pLFt3LFIsQl19Y2F0Y2goQSl7dGhyb3cgeC5mb3JFYWNoKEk9PmYuX09ydEZyZWUoSSkpLEguZm9yRWFjaChJPT5mLl9PcnRGcmVlKEkpKSxzIT09MCYmZi5fT3J0UmVsZWFzZUJpbmRpbmcocyksdyE9PTAmJmYuX09ydFJlbGVhc2VTZXNzaW9uKHcpLEF9ZmluYWxseXtmLl9mcmVlKGEpLGchPT0wJiZmLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMoZyksUy5mb3JFYWNoKEE9PmYuX2ZyZWUoQSkpLGYudW5tb3VudEV4dGVybmFsRGF0YT8uKCl9fSxCcj1pPT57bGV0IGM9USgpLGE9WWUuZ2V0KGkpO2lmKCFhKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlbGVhc2Ugc2Vzc2lvbi4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2l9YCk7bGV0W2gsZix3LGcsc109YTtnJiYocyYmYy5fT3J0Q2xlYXJCb3VuZE91dHB1dHMoZy5oYW5kbGUpLGMuX09ydFJlbGVhc2VCaW5kaW5nKGcuaGFuZGxlKSksYy5qc2VwT25SZWxlYXNlU2Vzc2lvbj8uKGkpLGYuZm9yRWFjaChTPT5jLl9PcnRGcmVlKFMpKSx3LmZvckVhY2goUz0+Yy5fT3J0RnJlZShTKSksYy5fT3J0UmVsZWFzZVNlc3Npb24oaCksWWUuZGVsZXRlKGkpfSxVcj0oaSxjLGEsaCxmLHc9ITEpPT57aWYoIWkpe2MucHVzaCgwKTtyZXR1cm59bGV0IGc9USgpLHM9aVswXSxTPWlbMV0seD1pWzNdLEgsQTtpZihzPT09InN0cmluZyImJng9PT0iZ3B1LWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKCJTdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgb24gR1BVLiIpO2lmKHcmJnghPT0iZ3B1LWJ1ZmZlciIpdGhyb3cgbmV3IEVycm9yKGBFeHRlcm5hbCBidWZmZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgaW5wdXQvb3V0cHV0IGluZGV4ICR7Zn0gd2hlbiBlbmFibGVHcmFwaENhcHR1cmUgaXMgdHJ1ZS5gKTtpZih4PT09ImdwdS1idWZmZXIiKXtsZXQgUj1pWzJdLmdwdUJ1ZmZlcixCPVV0KHh0KHMpKTtBPVMucmVkdWNlKChULEwpPT5UKkwsMSkqQjtsZXQgRD1nLmpzZXBSZWdpc3RlckJ1ZmZlcjtpZighRCl0aHJvdyBuZXcgRXJyb3IoXCdUZW5zb3IgbG9jYXRpb24gImdwdS1idWZmZXIiIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCB1c2luZyBXZWJHUFUuXCcpO0g9RChoLGYsUixBKX1lbHNle2xldCBSPWlbMl07aWYoQXJyYXkuaXNBcnJheShSKSl7QT00KlIubGVuZ3RoLEg9Zy5fbWFsbG9jKEEpLGEucHVzaChIKTtsZXQgQj1ILzQ7Zm9yKGxldCBEPTA7RDxSLmxlbmd0aDtEKyspe2lmKHR5cGVvZiBSW0RdIT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke0R9IGlzIG5vdCBhIHN0cmluZ2ApO2cuSEVBUFUzMltCKytdPVkoUltEXSxhKX19ZWxzZSBBPVIuYnl0ZUxlbmd0aCxIPWcuX21hbGxvYyhBKSxhLnB1c2goSCksZy5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KFIuYnVmZmVyLFIuYnl0ZU9mZnNldCxBKSxIKX1sZXQgST1nLnN0YWNrU2F2ZSgpLFY9Zy5zdGFja0FsbG9jKDQqUy5sZW5ndGgpO3RyeXtsZXQgUj1WLzQ7Uy5mb3JFYWNoKEQ9PmcuSEVBUDMyW1IrK109RCk7bGV0IEI9Zy5fT3J0Q3JlYXRlVGVuc29yKHh0KHMpLEgsQSxWLFMubGVuZ3RoLFByKHgpKTtCPT09MCYmaihgQ2FuXCd0IGNyZWF0ZSB0ZW5zb3IgZm9yIGlucHV0L291dHB1dC4gc2Vzc2lvbj0ke2h9LCBpbmRleD0ke2Z9LmApLGMucHVzaChCKX1maW5hbGx5e2cuc3RhY2tSZXN0b3JlKEkpfX0sa3I9YXN5bmMoaSxjLGEsaCxmLHcpPT57bGV0IGc9USgpLHM9WWUuZ2V0KGkpO2lmKCFzKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHtpfWApO2xldCBTPXNbMF0seD1zWzFdLEg9c1syXSxBPXNbM10sST1zWzRdLFY9c1s1XSxSPWMubGVuZ3RoLEI9aC5sZW5ndGgsRD0wLFQ9W10sTD1bXSxXPVtdLGRlPVtdLHBlPWcuc3RhY2tTYXZlKCksWj1nLnN0YWNrQWxsb2MoUio0KSxfPWcuc3RhY2tBbGxvYyhSKjQpLEo9Zy5zdGFja0FsbG9jKEIqNCksUGU9Zy5zdGFja0FsbG9jKEIqNCk7dHJ5e1tELFRdPUFyKHcpO2ZvcihsZXQgRj0wO0Y8UjtGKyspVXIoYVtGXSxMLGRlLGksY1tGXSxJKTtmb3IobGV0IEY9MDtGPEI7RisrKVVyKGZbRl0sVyxkZSxpLFIraFtGXSxJKTtsZXQgbGU9Wi80LEllPV8vNCxuZT1KLzQsWD1QZS80O2ZvcihsZXQgRj0wO0Y8UjtGKyspZy5IRUFQVTMyW2xlKytdPUxbRl0sZy5IRUFQVTMyW0llKytdPXhbY1tGXV07Zm9yKGxldCBGPTA7RjxCO0YrKylnLkhFQVBVMzJbbmUrK109V1tGXSxnLkhFQVBVMzJbWCsrXT1IW2hbRl1dO2cuanNlcE9uUnVuU3RhcnQ/LihTKTtsZXQgd2U7d2U9YXdhaXQgZy5fT3J0UnVuKFMsXyxaLFIsUGUsQixKLEQpLHdlIT09MCYmaigiZmFpbGVkIHRvIGNhbGwgT3J0UnVuKCkuIik7bGV0IG1lPVtdO2ZvcihsZXQgRj0wO0Y8QjtGKyspe2xldCBpZT1nLkhFQVBVMzJbSi80K0ZdO2lmKGllPT09V1tGXSl7bWUucHVzaChmW0ZdKTtjb250aW51ZX1sZXQgeGU9Zy5zdGFja1NhdmUoKSxjZT1nLnN0YWNrQWxsb2MoNCo0KSxiZT0hMSxhZSxLPTA7dHJ5e2cuX09ydEdldFRlbnNvckRhdGEoaWUsY2UsY2UrNCxjZSs4LGNlKzEyKSE9PTAmJmooYENhblwndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhIG9uIGluZGV4ICR7Rn0uYCk7bGV0IE9lPWNlLzQsVWU9Zy5IRUFQVTMyW09lKytdO0s9Zy5IRUFQVTMyW09lKytdO2xldCB2ZT1nLkhFQVBVMzJbT2UrK10sQWU9Zy5IRUFQVTMyW09lKytdLF9lPVtdO2ZvcihsZXQgdGU9MDt0ZTxBZTt0ZSsrKV9lLnB1c2goZy5IRUFQVTMyW3ZlLzQrdGVdKTtnLl9PcnRGcmVlKHZlKTtsZXQgZ2U9X2UucmVkdWNlKCh0ZSxyZSk9PnRlKnJlLDEpO2FlPU1yKFVlKTtsZXQgQmU9QT8ub3V0cHV0UHJlZmVycmVkTG9jYXRpb25zW2hbRl1dO2lmKGFlPT09InN0cmluZyIpe2lmKEJlPT09ImdwdS1idWZmZXIiKXRocm93IG5ldyBFcnJvcigiU3RyaW5nIHRlbnNvciBpcyBub3Qgc3VwcG9ydGVkIG9uIEdQVS4iKTtsZXQgdGU9W10scmU9Sy80O2ZvcihsZXQgdWU9MDt1ZTxnZTt1ZSsrKXtsZXQgRWU9Zy5IRUFQVTMyW3JlKytdLFNlPXVlPT09Z2UtMT92b2lkIDA6Zy5IRUFQVTMyW3JlXS1FZTt0ZS5wdXNoKGcuVVRGOFRvU3RyaW5nKEVlLFNlKSl9bWUucHVzaChbYWUsX2UsdGUsImNwdSJdKX1lbHNlIGlmKEJlPT09ImdwdS1idWZmZXIiJiZnZT4wKXtsZXQgdGU9Zy5qc2VwR2V0QnVmZmVyO2lmKCF0ZSl0aHJvdyBuZXcgRXJyb3IoXCdwcmVmZXJyZWRMb2NhdGlvbiAiZ3B1LWJ1ZmZlciIgaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IHVzaW5nIFdlYkdQVS5cJyk7bGV0IHJlPXRlKEspLHVlPVV0KFVlKTtpZih1ZT09PXZvaWQgMHx8IUZyKGFlKSl0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHthZX1gKTtiZT0hMCxtZS5wdXNoKFthZSxfZSx7Z3B1QnVmZmVyOnJlLGRvd25sb2FkOmcuanNlcENyZWF0ZURvd25sb2FkZXIocmUsZ2UqdWUsYWUpLGRpc3Bvc2U6KCk9PntnLl9PcnRSZWxlYXNlVGVuc29yKGllKX19LCJncHUtYnVmZmVyIl0pfWVsc2V7bGV0IHRlPUNyKGFlKSxyZT1uZXcgdGUoZ2UpO25ldyBVaW50OEFycmF5KHJlLmJ1ZmZlcixyZS5ieXRlT2Zmc2V0LHJlLmJ5dGVMZW5ndGgpLnNldChnLkhFQVBVOC5zdWJhcnJheShLLEsrcmUuYnl0ZUxlbmd0aCkpLG1lLnB1c2goW2FlLF9lLHJlLCJjcHUiXSl9fWZpbmFsbHl7Zy5zdGFja1Jlc3RvcmUoeGUpLGFlPT09InN0cmluZyImJksmJmcuX2ZyZWUoSyksYmV8fGcuX09ydFJlbGVhc2VUZW5zb3IoaWUpfX1yZXR1cm4gQSYmIUkmJihnLl9PcnRDbGVhckJvdW5kT3V0cHV0cyhBLmhhbmRsZSksWWUuc2V0KGksW1MseCxILEEsSSwhMV0pKSxtZX1maW5hbGx5e2cuc3RhY2tSZXN0b3JlKHBlKSxMLmZvckVhY2gobGU9PmcuX09ydFJlbGVhc2VUZW5zb3IobGUpKSxXLmZvckVhY2gobGU9PmcuX09ydFJlbGVhc2VUZW5zb3IobGUpKSxkZS5mb3JFYWNoKGxlPT5nLl9mcmVlKGxlKSksRCE9PTAmJmcuX09ydFJlbGVhc2VSdW5PcHRpb25zKEQpLFQuZm9yRWFjaChsZT0+Zy5fZnJlZShsZSkpfX0sV3I9aT0+e2xldCBjPVEoKSxhPVllLmdldChpKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2xldCBoPWFbMF0sZj1jLl9PcnRFbmRQcm9maWxpbmcoaCk7Zj09PTAmJmooIkNhblwndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUuIiksYy5fT3J0RnJlZShmKX0sTnI9aT0+e2xldCBjPVtdO2ZvcihsZXQgYSBvZiBpKXtsZXQgaD1hWzJdOyFBcnJheS5pc0FycmF5KGgpJiYiYnVmZmVyImluIGgmJmMucHVzaChoLmJ1ZmZlcil9cmV0dXJuIGN9O3NlbGYub25tZXNzYWdlPWk9PntsZXR7dHlwZTpjLGluOmF9PWkuZGF0YTt0cnl7c3dpdGNoKGMpe2Nhc2UiaW5pdC13YXNtIjpTcihhLndhc20pLnRoZW4oKCk9PntMcihhKS50aGVuKCgpPT57cG9zdE1lc3NhZ2Uoe3R5cGU6Y30pfSxoPT57cG9zdE1lc3NhZ2Uoe3R5cGU6YyxlcnI6aH0pfSl9LGg9Pntwb3N0TWVzc2FnZSh7dHlwZTpjLGVycjpofSl9KTticmVhaztjYXNlImluaXQtZXAiOntsZXR7ZXBOYW1lOmgsZW52OmZ9PWE7UnIoZixoKS50aGVuKCgpPT57cG9zdE1lc3NhZ2Uoe3R5cGU6Y30pfSx3PT57cG9zdE1lc3NhZ2Uoe3R5cGU6YyxlcnI6d30pfSk7YnJlYWt9Y2FzZSJjb3B5LWZyb20iOntsZXR7YnVmZmVyOmh9PWEsZj1MdChoKTtwb3N0TWVzc2FnZSh7dHlwZTpjLG91dDpmfSk7YnJlYWt9Y2FzZSJjcmVhdGUiOntsZXR7bW9kZWw6aCxvcHRpb25zOmZ9PWE7SXIoaCxmKS50aGVuKHc9Pntwb3N0TWVzc2FnZSh7dHlwZTpjLG91dDp3fSl9LHc9Pntwb3N0TWVzc2FnZSh7dHlwZTpjLGVycjp3fSl9KTticmVha31jYXNlInJlbGVhc2UiOkJyKGEpLHBvc3RNZXNzYWdlKHt0eXBlOmN9KTticmVhaztjYXNlInJ1biI6e2xldHtzZXNzaW9uSWQ6aCxpbnB1dEluZGljZXM6ZixpbnB1dHM6dyxvdXRwdXRJbmRpY2VzOmcsb3B0aW9uczpzfT1hO2tyKGgsZix3LGcsbmV3IEFycmF5KGcubGVuZ3RoKS5maWxsKG51bGwpLHMpLnRoZW4oUz0+e1Muc29tZSh4PT54WzNdIT09ImNwdSIpP3Bvc3RNZXNzYWdlKHt0eXBlOmMsZXJyOiJQcm94eSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1jcHUgdGVuc29yIGxvY2F0aW9uLiJ9KTpwb3N0TWVzc2FnZSh7dHlwZTpjLG91dDpTfSxOcihbLi4udywuLi5TXSkpfSxTPT57cG9zdE1lc3NhZ2Uoe3R5cGU6YyxlcnI6U30pfSk7YnJlYWt9Y2FzZSJlbmQtcHJvZmlsaW5nIjpXcihhKSxwb3N0TWVzc2FnZSh7dHlwZTpjfSk7YnJlYWs7ZGVmYXVsdDp9fWNhdGNoKGgpe3Bvc3RNZXNzYWdlKHt0eXBlOmMsZXJyOmh9KX19O30pKCk7XG4nfSk7dmFyIF9yLGd0LHluLERvLExvLGNhLHBhLFZyLFdyLFRnLEVvLG9kLGlkLGFkLHNkLHVkLGxkLGZkLGRhPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTtyZCgpO1VyKCk7X3I9KCk9PiEhWi53YXNtLnByb3h5JiZ0eXBlb2YgZG9jdW1lbnQ8InUiLHluPSExLERvPSExLExvPSExLHBhPW5ldyBNYXAsVnI9KGEsdCk9PntsZXQgbz1wYS5nZXQoYSk7bz9vLnB1c2godCk6cGEuc2V0KGEsW3RdKX0sV3I9KCk9PntpZih5bnx8IURvfHxMb3x8IWd0KXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxUZz1hPT57c3dpdGNoKGEuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6eW49ITEsYS5kYXRhLmVycj8oTG89ITAsY2FbMV0oYS5kYXRhLmVycikpOihEbz0hMCxjYVswXSgpKTticmVhaztjYXNlImluaXQtZXAiOmNhc2UiY29weS1mcm9tIjpjYXNlImNyZWF0ZSI6Y2FzZSJyZWxlYXNlIjpjYXNlInJ1biI6Y2FzZSJlbmQtcHJvZmlsaW5nIjp7bGV0IHQ9cGEuZ2V0KGEuZGF0YS50eXBlKTthLmRhdGEuZXJyP3Quc2hpZnQoKVsxXShhLmRhdGEuZXJyKTp0LnNoaWZ0KClbMF0oYS5kYXRhLm91dCk7YnJlYWt9ZGVmYXVsdDp9fSxFbz10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50Py5jdXJyZW50U2NyaXB0Py5zcmM6dm9pZCAwLG9kPWFzeW5jKCk9PntpZighRG8pe2lmKHluKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRXYXNtKCknIGRldGVjdGVkLiIpO2lmKExvKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdFdhc20oKScgZmFpbGVkLiIpO2lmKHluPSEwLF9yKCkpcmV0dXJuIFoud2FzbS53YXNtUGF0aHM9PT12b2lkIDAmJkVvJiZFby5pbmRleE9mKCJibG9iOiIpIT09MCYmKFoud2FzbS53YXNtUGF0aHM9RW8uc3Vic3RyKDAsK0VvLmxhc3RJbmRleE9mKCIvIikrMSkpLG5ldyBQcm9taXNlKChhLHQpPT57Z3Q/LnRlcm1pbmF0ZSgpO2xldCBvPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25kKCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpO2d0PW5ldyBXb3JrZXIobyx7bmFtZToib3J0LXdhc20tcHJveHktd29ya2VyIn0pLGd0Lm9uZXJyb3I9cj0+dChyKSxndC5vbm1lc3NhZ2U9VGcsVVJMLnJldm9rZU9iamVjdFVSTChvKSxjYT1bYSx0XTtsZXQgZT17dHlwZToiaW5pdC13YXNtIixpbjpafTtndC5wb3N0TWVzc2FnZShlKX0pO3RyeXthd2FpdCBNcChaLndhc20pLGF3YWl0IFhwKFopLERvPSEwfWNhdGNoKGEpe3Rocm93IExvPSEwLGF9ZmluYWxseXt5bj0hMX19fSxpZD1hc3luYyBhPT57aWYoX3IoKSlyZXR1cm4gV3IoKSxuZXcgUHJvbWlzZSgodCxvKT0+e1ZyKCJpbml0LWVwIixbdCxvXSk7bGV0IGU9e3R5cGU6ImluaXQtZXAiLGluOntlcE5hbWU6YSxlbnY6Wn19O2d0LnBvc3RNZXNzYWdlKGUpfSk7YXdhaXQgS3AoWixhKX0sYWQ9YXN5bmMgYT0+X3IoKT8oV3IoKSxuZXcgUHJvbWlzZSgodCxvKT0+e1ZyKCJjb3B5LWZyb20iLFt0LG9dKTtsZXQgZT17dHlwZToiY29weS1mcm9tIixpbjp7YnVmZmVyOmF9fTtndC5wb3N0TWVzc2FnZShlLFthLmJ1ZmZlcl0pfSkpOmZhKGEpLHNkPWFzeW5jKGEsdCk9PntpZihfcigpKXtpZih0Py5wcmVmZXJyZWRPdXRwdXRMb2NhdGlvbil0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb24gb3B0aW9uICJwcmVmZXJyZWRPdXRwdXRMb2NhdGlvbiIgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJveHkuJyk7cmV0dXJuIFdyKCksbmV3IFByb21pc2UoKG8sZSk9PntWcigiY3JlYXRlIixbbyxlXSk7bGV0IHI9e3R5cGU6ImNyZWF0ZSIsaW46e21vZGVsOmEsb3B0aW9uczp7Li4udH19fSxuPVtdO2EgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZuLnB1c2goYS5idWZmZXIpLGd0LnBvc3RNZXNzYWdlKHIsbil9KX1lbHNlIHJldHVybiBKcChhLHQpfSx1ZD1hc3luYyBhPT57aWYoX3IoKSlyZXR1cm4gV3IoKSxuZXcgUHJvbWlzZSgodCxvKT0+e1ZyKCJyZWxlYXNlIixbdCxvXSk7bGV0IGU9e3R5cGU6InJlbGVhc2UiLGluOmF9O2d0LnBvc3RNZXNzYWdlKGUpfSk7WnAoYSl9LGxkPWFzeW5jKGEsdCxvLGUscixuKT0+e2lmKF9yKCkpe2lmKG8uc29tZShzPT5zWzNdIT09ImNwdSIpKXRocm93IG5ldyBFcnJvcigiaW5wdXQgdGVuc29yIG9uIEdQVSBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm94eS4iKTtpZihyLnNvbWUocz0+cykpdGhyb3cgbmV3IEVycm9yKCJwcmUtYWxsb2NhdGVkIG91dHB1dCB0ZW5zb3IgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJveHkuIik7cmV0dXJuIFdyKCksbmV3IFByb21pc2UoKHMsaSk9PntWcigicnVuIixbcyxpXSk7bGV0IHU9byxsPXt0eXBlOiJydW4iLGluOntzZXNzaW9uSWQ6YSxpbnB1dEluZGljZXM6dCxpbnB1dHM6dSxvdXRwdXRJbmRpY2VzOmUsb3B0aW9uczpufX07Z3QucG9zdE1lc3NhZ2UobCx0ZCh1KSl9KX1lbHNlIHJldHVybiBRcChhLHQsbyxlLHIsbil9LGZkPWFzeW5jIGE9PntpZihfcigpKXJldHVybiBXcigpLG5ldyBQcm9taXNlKCh0LG8pPT57VnIoImVuZC1wcm9maWxpbmciLFt0LG9dKTtsZXQgZT17dHlwZToiZW5kLXByb2ZpbGluZyIsaW46YX07Z3QucG9zdE1lc3NhZ2UoZSl9KTtlZChhKX19KTt2YXIgY2QseGcsQ28scGQ9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtPdCgpO2RhKCk7dWEoKTtsYSgpO2NkPShhLHQpPT57c3dpdGNoKGEubG9jYXRpb24pe2Nhc2UiY3B1IjpyZXR1cm5bYS50eXBlLGEuZGltcyxhLmRhdGEsImNwdSJdO2Nhc2UiZ3B1LWJ1ZmZlciI6cmV0dXJuW2EudHlwZSxhLmRpbXMse2dwdUJ1ZmZlcjphLmdwdUJ1ZmZlcn0sImdwdS1idWZmZXIiXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIGxvY2F0aW9uOiAke2EubG9jYXRpb259IGZvciAke3QoKX1gKX19LHhnPWE9Pntzd2l0Y2goYVszXSl7Y2FzZSJjcHUiOnJldHVybiBuZXcgTWUoYVswXSxhWzJdLGFbMV0pO2Nhc2UiZ3B1LWJ1ZmZlciI6e2xldCB0PWFbMF07aWYoIVBvKHQpKXRocm93IG5ldyBFcnJvcihgbm90IHN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7dH0gZm9yIGRlc2VyaWFsaXppbmcgR1BVIHRlbnNvcmApO2xldHtncHVCdWZmZXI6byxkb3dubG9hZDplLGRpc3Bvc2U6cn09YVsyXTtyZXR1cm4gTWUuZnJvbUdwdUJ1ZmZlcihvLHtkYXRhVHlwZTp0LGRpbXM6YVsxXSxkb3dubG9hZDplLGRpc3Bvc2U6cn0pfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgbG9jYXRpb246ICR7YVszXX1gKX19LENvPWNsYXNze2FzeW5jIGZldGNoTW9kZWxBbmRDb3B5VG9XYXNtTWVtb3J5KHQpe3JldHVybiBhZChhd2FpdCBnbih0KSl9YXN5bmMgbG9hZE1vZGVsKHQsbyl7bHIoKTtsZXQgZTt0eXBlb2YgdD09InN0cmluZyI/dHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGU/ZT1hd2FpdCBnbih0KTplPWF3YWl0IHRoaXMuZmV0Y2hNb2RlbEFuZENvcHlUb1dhc21NZW1vcnkodCk6ZT10LFt0aGlzLnNlc3Npb25JZCx0aGlzLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lc109YXdhaXQgc2QoZSxvKSxmcigpfWFzeW5jIGRpc3Bvc2UoKXtyZXR1cm4gdWQodGhpcy5zZXNzaW9uSWQpfWFzeW5jIHJ1bih0LG8sZSl7bHIoKTtsZXQgcj1bXSxuPVtdO09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goZD0+e2xldCBUPWRbMF0sdz1kWzFdLHY9dGhpcy5pbnB1dE5hbWVzLmluZGV4T2YoVCk7aWYodj09PS0xKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnB1dCAnJHtUfSdgKTtyLnB1c2godyksbi5wdXNoKHYpfSk7bGV0IHM9W10saT1bXTtPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKGQ9PntsZXQgVD1kWzBdLHc9ZFsxXSx2PXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZihUKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dCAnJHtUfSdgKTtzLnB1c2godyksaS5wdXNoKHYpfSk7bGV0IHU9ci5tYXAoKGQsVCk9PmNkKGQsKCk9PmBpbnB1dCAiJHt0aGlzLmlucHV0TmFtZXNbbltUXV19ImApKSxsPXMubWFwKChkLFQpPT5kP2NkKGQsKCk9PmBvdXRwdXQgIiR7dGhpcy5vdXRwdXROYW1lc1tpW1RdXX0iYCk6bnVsbCksYz1hd2FpdCBsZCh0aGlzLnNlc3Npb25JZCxuLHUsaSxsLGUpLHA9e307Zm9yKGxldCBkPTA7ZDxjLmxlbmd0aDtkKyspcFt0aGlzLm91dHB1dE5hbWVzW2lbZF1dXT1zW2RdPz94ZyhjW2RdKTtyZXR1cm4gZnIoKSxwfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpe2ZkKHRoaXMuc2Vzc2lvbklkKX19fSk7dmFyIHdnLEZvLGRkPUwoKCk9PnsidXNlIHN0cmljdCI7T3QoKTtkYSgpO3BkKCk7d2c9KCk9PntpZigodHlwZW9mIFoud2FzbS5pbml0VGltZW91dCE9Im51bWJlciJ8fFoud2FzbS5pbml0VGltZW91dDwwKSYmKFoud2FzbS5pbml0VGltZW91dD0wKSx0eXBlb2YgWi53YXNtLnNpbWQhPSJib29sZWFuIiYmKFoud2FzbS5zaW1kPSEwKSx0eXBlb2YgWi53YXNtLnByb3h5IT0iYm9vbGVhbiImJihaLndhc20ucHJveHk9ITEpLHR5cGVvZiBaLndhc20udHJhY2UhPSJib29sZWFuIiYmKFoud2FzbS50cmFjZT0hMSksdHlwZW9mIFoud2FzbS5udW1UaHJlYWRzIT0ibnVtYmVyInx8IU51bWJlci5pc0ludGVnZXIoWi53YXNtLm51bVRocmVhZHMpfHxaLndhc20ubnVtVGhyZWFkczw9MCl7KHR5cGVvZiBzZWxmPCJ1IiYmIXNlbGYuY3Jvc3NPcmlnaW5Jc29sYXRlZHx8dHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLnZlcnNpb25zJiZwcm9jZXNzLnZlcnNpb25zLm5vZGUpJiYoWi53YXNtLm51bVRocmVhZHM9MSk7bGV0IGE9dHlwZW9mIG5hdmlnYXRvcj4idSI/KHZvaWQgMCkoKS5sZW5ndGg6bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7Wi53YXNtLm51bVRocmVhZHM9TWF0aC5taW4oNCxNYXRoLmNlaWwoKGF8fDEpLzIpKX19LEZvPWNsYXNze2FzeW5jIGluaXQodCl7d2coKSxhd2FpdCBvZCgpLGF3YWl0IGlkKHQpfWFzeW5jIGNyZWF0ZUluZmVyZW5jZVNlc3Npb25IYW5kbGVyKHQsbyl7bGV0IGU9bmV3IENvO3JldHVybiBhd2FpdCBlLmxvYWRNb2RlbCh0LG8pLFByb21pc2UucmVzb2x2ZShlKX19fSk7dmFyIGhkPXt9O1NyKGhkLHt3YXNtQmFja2VuZDooKT0+dmd9KTt2YXIgdmcsbWQ9TCgoKT0+eyJ1c2Ugc3RyaWN0IjtkZCgpO3ZnPW5ldyBGb30pO090KCk7T3QoKTtPdCgpO3ZhciBUcz0iMS4xOC4wIjt2YXIgak89cW87e2xldCBhPShPcCgpLGFyKF9wKSkub25ueGpzQmFja2VuZDtQcigid2ViZ2wiLGEsLTEwKX17bGV0IGE9KG1kKCksYXIoaGQpKS53YXNtQmFja2VuZDtQcigiY3B1IixhLDEwKSxQcigid2FzbSIsYSwxMCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KFoudmVyc2lvbnMsIndlYiIse3ZhbHVlOlRzLGVudW1lcmFibGU6ITB9KTtleHBvcnR7UGQgYXMgSW5mZXJlbmNlU2Vzc2lvbixscyBhcyBUUkFDRSxsciBhcyBUUkFDRV9GVU5DX0JFR0lOLGZyIGFzIFRSQUNFX0ZVTkNfRU5ELE1lIGFzIFRlbnNvcixEZCBhcyBUcmFpbmluZ1Nlc3Npb24sak8gYXMgZGVmYXVsdCxaIGFzIGVudixQciBhcyByZWdpc3RlckJhY2tlbmR9OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKbG9uZy9pbmRleC5qczoKICAoKioKICAgKiBAbGljZW5zZQogICAqIENvcHlyaWdodCAyMDA5IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycwogICAqIENvcHlyaWdodCAyMDIwIERhbmllbCBXaXJ0eiAvIFRoZSBsb25nLmpzIEF1dGhvcnMuCiAgICoKICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICoKICAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgICoKICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICoKICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogICAqKQoqLwovLyMgc291cmNlTWFwcGluZ1VSTD1vcnQubWluLmpzLm1hcAo=`);
+  const path = PATH_MAP[config.voiceId];
+  const input = JSON.stringify([{
+    text: config.text.trim()
+  }]);
+  const piperPhonemizeWasm = (await createBlobUrl(`${WASM_BASE}.wasm`)).url;
+  const piperPhonemizeData = (await createBlobUrl(`${WASM_BASE}.data`)).url;
+  ort.env.wasm.numThreads = navigator.hardwareConcurrency;
+  ort.env.wasm.wasmPaths = ONNX_BASE;
+  const modelConfigBlob = (await createBlobUrl(`${HF_BASE}/${path}.json`)).blob;
+  const modelConfig = JSON.parse(await modelConfigBlob.text());
+  const phonemeIds = await new Promise(async (resolve) => {
+    const module = await createPiperPhonemize({
+      print: (data) => {
+        resolve(JSON.parse(data).phoneme_ids);
+      }
+      ,
+      printErr: (message) => {
+        throw new Error(message);
+      }
+      ,
+      locateFile: (url) => {
+        if (url.endsWith(".wasm"))
+          return piperPhonemizeWasm;
+        if (url.endsWith(".data"))
+          return piperPhonemizeData;
+        return url;
+      }
+    });
+    module.callMain(["-l", modelConfig.espeak.voice, "--input", input, "--espeak_data", "/espeak-ng-data"]);
+  }
+  );
+  const sampleRate = modelConfig.audio.sample_rate;
+  const noiseScale = modelConfig.inference.noise_scale;
+  const lengthScale = modelConfig.inference.length_scale;
+  const noiseW = modelConfig.inference.noise_w;
+  const modelBlob = (await createBlobUrl(`${HF_BASE}/${path}`, callback)).url;
+  const session = await ort.InferenceSession.create(modelBlob);
+  const feeds = {
+    input: new ort.Tensor("int64",phonemeIds,[1, phonemeIds.length]),
+    input_lengths: new ort.Tensor("int64",[phonemeIds.length]),
+    scales: new ort.Tensor("float32",[noiseScale, lengthScale, noiseW])
+  };
+  if (Object.keys(modelConfig.speaker_id_map).length) {
+    Object.assign(feeds, {
+      sid: new ort.Tensor("int64",[0])
+    });
+  }
+  const {output: {data: pcm}} = await session.run(feeds);
+  return new Blob([pcm2wav(pcm, 1, sampleRate)],{
+    type: "audio/x-wav"
+  });
+}
+async function createBlobUrl(url, callback) {
+  let blob = await readBlob(url);
+  if (!blob) {
+    blob = await fetchBlob(url, callback);
+    await writeBlob(url, blob);
+  }
+  return {
+    url: URL.createObjectURL(blob),
+    blob
+  };
+}
+// export { predict as predict };
+async function download(voiceId, callback) {
+  const path = PATH_MAP[voiceId];
+  const urls = [`${HF_BASE}/${path}`, `${HF_BASE}/${path}.json`];
+  await Promise.all(urls.map(async (url) => {
+    writeBlob(url, await fetchBlob(url, url.endsWith('.onnx') ? callback : undefined));
+  }
+  ));
+}
+async function remove(voiceId) {
+  const path = PATH_MAP[voiceId];
+  const urls = [`${HF_BASE}/${path}`, `${HF_BASE}/${path}.json`];
+  await Promise.all(urls.map( (url) => removeBlob(url)));
+}
+async function stored() {
+  const root = await navigator.storage.getDirectory();
+  const dir = await root.getDirectoryHandle('piper', {
+    create: true
+  });
+  const result = [];
+  for await(const name of dir.keys()) {
+    const key = name.split('.')[0];
+    if (name.endsWith('.onnx') && key in PATH_MAP) {
+      result.push(key);
+    }
+  }
+  return result;
+}
+async function flush() {
+  try {
+    const root = await navigator.storage.getDirectory();
+    const dir = await root.getDirectoryHandle('piper');
+    await dir.remove({
+      recursive: true
+    });
+  } catch (e) {
+    console.error(e);
+  }
+}
+//export { download as download };
+//export { remove as remove };
+//export { stored as stored };
+//export { flush as flush };
+async function voices() {
+  const res = await fetch(`${HF_BASE}/voices.json`);
+  if (!res.ok) {
+    throw new Error('Could not retrieve voices file from huggingface');
+  }
+  return Object.values(await res.json());
+}
+//export { voices as voices };
+await download('en_US-hfc_female-medium', (progress) => {
+  console.log(`Downloading ${progress.url} - ${Math.round(progress.loaded * 100 / progress.total)}%`);
+}
+);
+
+var wav = await predict({
+  text: "Text to speech in the browser is amazing!",
+  voiceId: 'en_US-hfc_female-medium',
+});
+
+console.log(wav);
+
+var audio = new Audio(URL.createObjectURL(wav));
+
+audio.controls = true;
+audio.autoplay = true;
+
+document.body.appendChild(audio);